NFT
Overview
TokenID
175227
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Cryptostamp2
Compiler Version
v0.6.8+commit.0bbfe453
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-22 */ /* * Crypto stamp 2 * digital-physical collectible postage stamp * * Developed by Capacity Blockchain Solutions GmbH <capacity.at> * for Österreichische Post AG <post.at> */ // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.6.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/token/ERC721/IERC721.sol pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transfered 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`, `to` cannot be zero. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from`, `to` cannot be zero. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from`, `to` cannot be zero. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.6.2; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.6.2; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.6.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ abstract contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public virtual returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.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.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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(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(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(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(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: contracts/EnumerableRandomMapSimple.sol pragma solidity ^0.6.0; library EnumerableRandomMapSimple { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct Map { // Storage of map keys and values mapping(bytes32 => bytes32) _entries; uint256 _length; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { bool newVal; if (map._entries[key] == bytes32("")) { // add new entry map._length++; newVal = true; } else if (value == bytes32("")) { // remove entry map._length--; newVal = false; } else { newVal = false; } map._entries[key] = value; return newVal; } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage /*map*/, bytes32 /*key*/) private pure returns (bool) { revert("No removal supported"); } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._entries[key] != bytes32(""); } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { bytes32 key = bytes32(index); require(_contains(map, key), "EnumerableMap: index out of bounds"); return (key, map._entries[key]); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { return _get(map, key, "EnumerableMap: nonexistent key"); } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { require(_contains(map, key), errorMessage); // Equivalent to contains(map, key) return map._entries[key]; } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint256(value))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key)))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key), errorMessage))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.6.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = byte(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: contracts/OZ_Clone/ERC721_simplemaps.sol pragma solidity ^0.6.0; // Clone of OpenZeppelin 3.0.0 token/ERC721/ERC721.sol with just imports adapted and EnumerableMap exchanged for EnumerableMapSimple, // and totalSupply() marked as virtual. /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableRandomMapSimple for EnumerableRandomMapSimple.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableRandomMapSimple.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev Gets the token name. * @return string representing the token name */ function name() public view override returns (string memory) { return _name; } /** * @dev Gets the token symbol. * @return string representing the token symbol */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev Returns the URI for a given token ID. May return an empty string. * * If a base URI is set (via {_setBaseURI}), it is added as a prefix to the * token's own URI (via {_setTokenURI}). * * If there is a base URI but no token URI, the token's ID will be used as * its URI when appending it to the base URI. This pattern for autogenerated * token URIs can lead to large gas savings. * * .Examples * |=== * |`_setBaseURI()` |`_setTokenURI()` |`tokenURI()` * | "" * | "" * | "" * | "" * | "token.uri/123" * | "token.uri/123" * | "token.uri/" * | "123" * | "token.uri/123" * | "token.uri/" * | "" * | "token.uri/<tokenId>" * |=== * * Requirements: * * - `tokenId` must exist. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. if (bytes(_baseURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(_baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(_baseURI, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner. * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view override virtual returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens. * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param operator operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Internal function to set the token URI for a given token. * * Reverts if the token ID does not exist. * * TIP: If all token IDs share a prefix (for example, if your URIs look like * `https://api.myproject.com/token/<id>`), use {_setBaseURI} to store * it and save gas. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - when `from` is zero, `tokenId` will be minted for `to`. * - when `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: contracts/ERC721SimpleMapsURI.sol pragma solidity ^0.6.0; /** * @title ERC721 With a nicer simple token URI * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721SimpleMapsURI is ERC721 { // Similar to ERC1155 URI() event, but without a token ID. event BaseURI(string value); constructor (string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) public { _setBaseURI(baseURI); } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}. */ function _setBaseURI(string memory baseURI_) internal override virtual { super._setBaseURI(baseURI_); emit BaseURI(baseURI()); } } // File: contracts/CS1ColorsI.sol /* Color store interface for Crypto stamp 1 */ pragma solidity ^0.6.0; interface CS1ColorsI { enum Colors { Black, Green, Blue, Yellow, Red } // Returns the color of a given token ID function getColor(uint256 tokenId) external view returns (Colors); } // File: contracts/CS2PropertiesI.sol /* Interface for CS2 properties. */ pragma solidity ^0.6.0; interface CS2PropertiesI { enum AssetType { Honeybadger, Llama, Panda, Doge } enum Colors { Black, Green, Blue, Yellow, Red } function getType(uint256 tokenId) external view returns (AssetType); function getColor(uint256 tokenId) external view returns (Colors); } // File: contracts/ENSReverseRegistrarI.sol /* * Interfaces for ENS Reverse Registrar * See https://github.com/ensdomains/ens/blob/master/contracts/ReverseRegistrar.sol for full impl * Also see https://github.com/wealdtech/wealdtech-solidity/blob/master/contracts/ens/ENSReverseRegister.sol * * Use this as follows (registryAddress is the address of the ENS registry to use): * ----- * // This hex value is caclulated by namehash('addr.reverse') * bytes32 public constant ENS_ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2; * function registerReverseENS(address registryAddress, string memory calldata) external { * require(registryAddress != address(0), "need a valid registry"); * address reverseRegistrarAddress = ENSRegistryOwnerI(registryAddress).owner(ENS_ADDR_REVERSE_NODE) * require(reverseRegistrarAddress != address(0), "need a valid reverse registrar"); * ENSReverseRegistrarI(reverseRegistrarAddress).setName(name); * } * ----- * or * ----- * function registerReverseENS(address reverseRegistrarAddress, string memory calldata) external { * require(reverseRegistrarAddress != address(0), "need a valid reverse registrar"); * ENSReverseRegistrarI(reverseRegistrarAddress).setName(name); * } * ----- * ENS deployments can be found at https://docs.ens.domains/ens-deployments * E.g. Etherscan can be used to look up that owner on those contracts. * namehash.hash("addr.reverse") == "0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2" * Ropsten: ens.owner(namehash.hash("addr.reverse")) == "0x6F628b68b30Dc3c17f345c9dbBb1E483c2b7aE5c" * Mainnet: ens.owner(namehash.hash("addr.reverse")) == "0x084b1c3C81545d370f3634392De611CaaBFf8148" */ pragma solidity ^0.6.0; interface ENSRegistryOwnerI { function owner(bytes32 node) external view returns (address); } interface ENSReverseRegistrarI { function setName(string calldata name) external returns (bytes32 node); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/AchievementsUpgradingI.sol /* Interface for CS2 color upgrading support by achievements. */ pragma solidity ^0.6.0; interface AchievementsUpgradingI is IERC165 { /* * Calculate the interface ID for ERC 165: * * bytes4(keccak256('onContractAdded(bool)')) == 0x58cac597 */ /** * @notice Notify about changing a CS2 color as done by the "upgrading" mechanism * @dev The Cryptostamp2 smart contract calls this function when changing the color of any asset, * esp. as the result of upgrading. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onCS2ColorChanged.selector`. This * function MAY throw to revert and reject the transfer. * Note: the Collection contract address is always the message sender. * @param tokenId The token identifier which is being changed * @param previousColor The previous color held by the token * @param newColor The new color assigned to the token, which MUST match the current color at time of this call * @return bytes4 `bytes4(keccak256("onCS2ColorChanged(uint256,uint8,uint8)"))` */ function onCS2ColorChanged(uint256 tokenId, CS2PropertiesI.Colors previousColor, CS2PropertiesI.Colors newColor) external returns (bytes4); } // File: @openzeppelin/contracts/cryptography/ECDSA.sol pragma solidity ^0.6.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("ECDSA: invalid signature 's' value"); } if (v != 27 && v != 28) { revert("ECDSA: invalid signature 'v' value"); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: @openzeppelin/contracts/cryptography/MerkleProof.sol pragma solidity ^0.6.0; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ 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) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: contracts/Cryptostamp2.sol /* Implements ERC 721 Token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ pragma solidity ^0.6.0; /* The inheritance is very much the same as OpenZeppelin's ERC721Full, * but using simplified (and cheaper) versions of ERC721Enumerable and ERC721Metadata */ contract Cryptostamp2 is ERC721SimpleMapsURI, CS2PropertiesI { using SafeMath for uint256; bytes4 private constant _INTERFACE_ID_ACHIEVEMENTS_UPGRADING = 0x58cac597; uint8 private constant COLORBITS = 4; uint8 private constant COLORMOD = uint8(2) ** COLORBITS; address public createControl; address public tokenAssignmentControl; address public CS1Address; address public CS1ColorsAddress; AchievementsUpgradingI public achievementsContract; uint256 immutable finalSupply; uint256 constant maxSupportedSupply = 2 ** 24; bool public allowPublicMinting = false; bytes32 public dataRoot; uint256 public upgradesDone = 0; uint256 public upgradeMaximum; uint8[maxSupportedSupply] private properties; uint256[5][4] public typeColorSupply; // Note that numbers are reversed in Solidity compared to other languages! mapping(uint256 => bool) public usedInUpgrade; mapping(uint256 => bool) public usedInUpgradeCS1; mapping(address => uint256) public signedTransferNonce; event CreateControlTransferred(address indexed previousCreateControl, address indexed newCreateControl); event TokenAssignmentControlTransferred(address indexed previousTokenAssignmentControl, address indexed newTokenAssignmentControl); event AchievementsContractSet(address indexed achievementsContractAddress); event UpgradeMaximumChanged(uint256 previousUpgradeMaximum, uint256 newUpgradeMaximum); event DataRootSet(bytes32 dataRoot); event PublicMintingEnabled(); event PublicMintingDisabled(); event MintedWithProof(address operator, uint256 indexed tokenId, address indexed owner, AssetType aType, Colors color); event SignedTransfer(address operator, address indexed from, address indexed to, uint256 indexed tokenId, uint256 signedTransferNonce); event StampUpgraded(uint256 indexed changedTokenId, Colors previousColor, Colors newColor, bool withJoker, uint256 usedTokedId1, uint256 usedTokenId2); // TestAchievementsUpgrading event - never emitted in this contract but helpful for running our tests. event SeenCS2ColorChanged(uint256 tokenId, Colors previousColor, Colors newColor); constructor(address _createControl, address _tokenAssignmentControl, address _CS1Address, address _CS1ColorsAddress, uint256 _finalSupply, uint256 _upgradeMaximum) ERC721SimpleMapsURI("Crypto stamp Edition 2", "CS2", "https://test.crypto.post.at/CS2/meta/") public { createControl = _createControl; require(address(createControl) != address(0x0), "You need to provide an actual createControl address."); tokenAssignmentControl = _tokenAssignmentControl; require(address(tokenAssignmentControl) != address(0x0), "You need to provide an actual tokenAssignmentControl address."); CS1ColorsAddress = _CS1ColorsAddress; require(address(CS1ColorsAddress) != address(0x0), "You need to provide an actual CS1 colors address."); CS1Address = _CS1Address; require(address(CS1Address) != address(0x0), "You need to provide an actual CS1 address."); finalSupply = _finalSupply; require(_finalSupply <= maxSupportedSupply, "The final supply is too high."); upgradeMaximum = _upgradeMaximum; } modifier onlyCreateControl() { require(msg.sender == createControl, "createControl key required for this function."); _; } modifier onlyTokenAssignmentControl() { require(msg.sender == tokenAssignmentControl, "tokenAssignmentControl key required for this function."); _; } modifier requireMinting() { require(mintingFinished() == false, "This call only works when minting is not finished."); _; } /*** Enable adjusting variables after deployment ***/ function transferTokenAssignmentControl(address _newTokenAssignmentControl) public onlyTokenAssignmentControl { require(_newTokenAssignmentControl != address(0), "tokenAssignmentControl cannot be the zero address."); emit TokenAssignmentControlTransferred(tokenAssignmentControl, _newTokenAssignmentControl); tokenAssignmentControl = _newTokenAssignmentControl; } function transferCreateControl(address _newCreateControl) public onlyCreateControl { require(_newCreateControl != address(0), "createControl cannot be the zero address."); emit CreateControlTransferred(createControl, _newCreateControl); createControl = _newCreateControl; } // Set an achievements contract. function setAchievementsContract(address _achievementsAddress) public onlyCreateControl { achievementsContract = AchievementsUpgradingI(_achievementsAddress); emit AchievementsContractSet(_achievementsAddress); if (_achievementsAddress != address(0)) { require(IERC165(achievementsContract).supportsInterface(_INTERFACE_ID_ACHIEVEMENTS_UPGRADING), "Need to implement the achievements upgrading interface!"); } } function setUpgradeMaximum(uint256 _newUpgradeMaximum) public onlyCreateControl { require(upgradesDone <= _newUpgradeMaximum, "Already more upgrades done than the requested limit."); emit UpgradeMaximumChanged(upgradeMaximum, _newUpgradeMaximum); upgradeMaximum = _newUpgradeMaximum; } function setDataRoot(bytes32 _newDataRoot) public onlyCreateControl { require(dataRoot == bytes32(""), "Can only set root once."); emit DataRootSet(_newDataRoot); dataRoot = _newDataRoot; } /*** Base functionality: minting, URI, property getters, etc. ***/ // Override totalSupply() so it reports the target final supply. /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view override returns (uint256) { return finalSupply; } /** * @dev Gets the actually minted amount of tokens in the contract. * @return uint256 representing the minted amount of tokens */ function mintedSupply() public view returns (uint256) { return super.totalSupply(); } // Issue a new crypto stamp asset, giving it to a specific owner address. // As appending the ID into a URI in Solidity is complicated, generate both // externally and hand them over to the asset here. function create(uint256 _tokenId, address _owner, AssetType _type, Colors _color) public onlyCreateControl requireMinting { // _mint already ends up checking if owner != 0 and that tokenId doesn't exist yet. _mintWithProperties(_tokenId, _owner, _type, _color); } // Batch-issue multiple crypto stamps with adjacent IDs. function createMulti(uint256 _tokenIdStart, address[] memory _owners, AssetType[] memory _types, Colors[] memory _colors) public onlyCreateControl requireMinting { require(_owners.length == _types.length && _owners.length == _colors.length, "All given arrays need to be the same length."); uint256 addrcount = _owners.length; for (uint256 i = 0; i < addrcount; i++) { // Make sure this is in sync with what create() does. _mintWithProperties(_tokenIdStart + i, _owners[i], _types[i], _colors[i]); } } // Issue a crypto stamp with a merkle proof. function createWithProof(bytes32 tokenData, bytes32[] memory merkleProof) public requireMinting returns (uint256) { require(publicMintingAllowed(), "Public minting needs to be allowed."); (uint256 tokenId, address owner, AssetType aType, Colors color) = getDataFieldsFromProof(tokenData, merkleProof); require(!_exists(tokenId), "Token already exists."); emit MintedWithProof(msg.sender, tokenId, owner, aType, color); _mintWithProperties(tokenId, owner, aType, color); return tokenId; } /** * @dev Gets the token ID of the specified token ID * @param tokenData bytes32 token data : 11 bytes TokenId | 1 byte properties split in 4 bits + 4 bits | 20 bytes owner * @param merkleProof bytes32[] memory array of a storage proof * @return address currently marked as the owner of the given token ID, if manifested explicitly or if the proof matches */ function getTokenIdFromProof(bytes32 tokenData, bytes32[] memory merkleProof) public view returns (uint256) { (uint256 tokenId, /*address owner*/, /*AssetType aType*/, /*Colors color*/) = getDataFieldsFromProof(tokenData, merkleProof); return tokenId; } /** * @dev Gets the owner of the specified token ID * @param tokenData bytes32 token data : 11 bytes TokenId | 1 byte properties split in 4 bits + 4 bits | 20 bytes owner * @param merkleProof bytes32[] memory array of a storage proof * @return address currently marked as the owner of the given token ID, if manifested explicitly or if the proof matches */ function getOwnerFromProof(bytes32 tokenData, bytes32[] memory merkleProof) public view returns (address) { (uint256 tokenId, address owner, /*AssetType aType*/, /*Colors color*/) = getDataFieldsFromProof(tokenData, merkleProof); if (_exists(tokenId)) return ownerOf(tokenId); return owner; } /** * @dev Gets the owner of the specified token ID * @param tokenData bytes32 token data : 11 bytes TokenId | 1 byte properties split in 4 bits + 4 bits | 20 bytes owner * @param merkleProof bytes32[] memory array of a storage proof * @return AssetType of the given token. */ function getTypeFromProof(bytes32 tokenData, bytes32[] memory merkleProof) public view returns (AssetType) { (uint256 tokenId, /*address owner*/, AssetType aType, /*Colors color*/) = getDataFieldsFromProof(tokenData, merkleProof); if (_exists(tokenId)) return getType(tokenId); return aType; } /** * @dev Gets the color of the specified token ID even if not manifested yet. * @param tokenData bytes32 token data : 11 bytes TokenId | 1 byte properties split in 4 bits + 4 bits | 20 bytes owner * @param merkleProof bytes32[] memory array of a storage proof * @return color of the given token. */ function getColorFromProof(bytes32 tokenData, bytes32[] memory merkleProof) public view returns (Colors) { (uint256 tokenId, /*address owner*/, /*AssetType aType*/, Colors color) = getDataFieldsFromProof(tokenData, merkleProof); if (_exists(tokenId)) return getColor(tokenId); return color; } /** * @dev Gets the tokenId, owner, type and color from the specified token proof. * @param tokenData bytes32 token data : 11 bytes TokenId | 1 byte properties split in 4 bits + 4 bits | 20 bytes owner * @param merkleProof bytes32[] memory array of a storage proof * @return tokenId, owner, type and color of the given token. */ function getDataFieldsFromProof(bytes32 tokenData, bytes32[] memory merkleProof) public view returns (uint256, address, AssetType, Colors) { require(dataRoot != bytes32(""), "Root needs to be set."); require(MerkleProof.verify(merkleProof, dataRoot, tokenData), "Verification failed."); uint256 tokenId = uint256(tokenData >> 168); // shift by 20 bytes for address and 1 byte for properties AssetType aType = AssetType(uint8(tokenData[11]) >> COLORBITS); Colors color = Colors(uint8(tokenData[11]) % COLORMOD); address owner = address(uint256(tokenData)); // address() cuts off everything except the lower 160 bits require(owner != address(0), "tokenData needs to contain an owner."); return (tokenId, owner, aType, color); } // Actually issue a crypto stamp with its properties, or just check the properties if it already exists. function _mintWithProperties(uint256 _tokenId, address _owner, AssetType _type, Colors _color) internal { if (_exists(_tokenId)) { require(getType(_tokenId) == _type, "Type mismatch with existing token."); if (upgradesDone == 0) { // Once any upgrades have been done, we don't know if the minted color is still set necessarily. require(getColor(_tokenId) == _color, "Color mismatch with existing token."); } } else { _mint(_owner, _tokenId); // Store the type in the higher bits of the unit and the color in the lower bits. properties[_tokenId] = uint8(_type) * COLORMOD + uint8(_color); typeColorSupply[uint(_type)][uint(_color)] = typeColorSupply[uint(_type)][uint(_color)].add(1); } } // Determine if the creation/minting process is done. function mintingFinished() public view returns (bool) { return (super.totalSupply() >= finalSupply); } // Allow creation/minting by anyone who can show a valid merkle proof. function enablePublicMinting() public onlyCreateControl { require(dataRoot != bytes32(""), "Root needs to be set."); allowPublicMinting = true; emit PublicMintingEnabled(); } // deactive public creation/minting. function disablePublicMinting() public onlyCreateControl { allowPublicMinting = false; emit PublicMintingDisabled(); } // Determine if the creation/minting process is done. function publicMintingAllowed() public view returns (bool) { return (!mintingFinished() && allowPublicMinting); } // Set new base for the token URI. function setBaseURI(string memory _newBaseURI) public onlyCreateControl { super._setBaseURI(_newBaseURI); } // Get type of the given token. function getType(uint256 tokenId) public view override returns (AssetType) { require(_exists(tokenId), "Token ID needs to exist."); return AssetType(properties[tokenId] >> COLORBITS); } // Get color of the given token. function getColor(uint256 tokenId) public view override returns (Colors) { require(_exists(tokenId), "Token ID needs to exist."); return Colors(properties[tokenId] % COLORMOD); } // Returns whether the specified token exists function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function typeSupply(AssetType _type) public view returns (uint256) { uint256 thisTypeSupply = 0; for (uint256 i = 0; i < typeColorSupply[uint(_type)].length; i++) { thisTypeSupply = thisTypeSupply.add(typeColorSupply[uint(_type)][i]); } return thisTypeSupply; } function colorSupply(Colors _color) public view returns (uint256) { uint256 thisColorSupply = 0; for (uint256 i = 0; i < typeColorSupply.length; i++) { thisColorSupply = thisColorSupply.add(typeColorSupply[i][uint(_color)]); } return thisColorSupply; } /*** Allows any user to initiate a transfer with the signature of the current stamp owner ***/ // Outward-facing function for signed transfer: assembles the expected data and then calls the internal function to do the rest. // Can called by anyone knowing about the right signature, but can only transfer to the given specific target. function signedTransfer(uint256 _tokenId, address _to, bytes memory _signature) public { address currentOwner = ownerOf(_tokenId); // The signed data contains the token ID, the transfer target and a nonce. bytes32 data = keccak256(abi.encodePacked(address(this), this.signedTransfer.selector, currentOwner, _to, _tokenId, signedTransferNonce[currentOwner])); _signedTransferInternal(currentOwner, data, _tokenId, _to, _signature); } // Outward-facing function for operator-driven signed transfer: assembles the expected data and then calls the internal function to do the rest. // Can transfer to any target, but only be called by the trusted operator contained in the signature. function signedTransferWithOperator(uint256 _tokenId, address _to, bytes memory _signature) public { address currentOwner = ownerOf(_tokenId); // The signed data contains the operator, the token ID, and a nonce. Note that we use the selector of the external function here! bytes32 data = keccak256(abi.encodePacked(address(this), this.signedTransferWithOperator.selector, msg.sender, currentOwner, _tokenId, signedTransferNonce[currentOwner])); _signedTransferInternal(currentOwner, data, _tokenId, _to, _signature); } // Actually check the signature and perform a signed transfer. function _signedTransferInternal(address _currentOwner, bytes32 _data, uint256 _tokenId, address _to, bytes memory _signature) internal { bytes32 hash = ECDSA.toEthSignedMessageHash(_data); address signer = ECDSA.recover(hash, _signature); require(signer == _currentOwner, "Signature needs to match parameters, nonce, and current owner."); // Now that we checked that the signature is correct, do the actual transfer and increase the nonce. emit SignedTransfer(msg.sender, _currentOwner, _to, _tokenId, signedTransferNonce[_currentOwner]); signedTransferNonce[_currentOwner] = signedTransferNonce[_currentOwner].add(1); _safeTransfer(_currentOwner, _to, _tokenId, ""); } // Mint token and transfer it in the same transaction. // Can called by anyone knowing about the right signature (and proof), but can only transfer to the given specific target. function signedTransferWithMintProof(bytes32 tokenData, address _to, bytes calldata _signature, bytes32[] calldata merkleProof) external { uint256 tokenId = createWithProof(tokenData, merkleProof); signedTransfer(tokenId, _to, _signature); } // Mint token and transfer it in the same transaction. // Can transfer to any target, but only be called by the trusted operator contained in the signature. function signedTransferWithOperatorAndMintProof(bytes32 tokenData, address _to, bytes calldata _signature, bytes32[] calldata merkleProof) external { uint256 tokenId = createWithProof(tokenData, merkleProof); signedTransferWithOperator(tokenId, _to, _signature); } /*** Upgrading functionality: upgrade color of the stamp using other stamps of the same color ***/ // Returns whether upgrading is possible at this time. function upgradesAllowed() public view returns (bool) { return (address(achievementsContract) != address(0) && upgradesDone < upgradeMaximum); } // Upgrade 1 CS2 stamp by "upgrading" with 2 other CS2 of same type and color. function upgradeStamp(uint256 _upgradeTokenId, uint256 _helperTokenId1, uint256 _helperTokenId2) public { require(address(achievementsContract) != address(0), "No achievements contract set"); require(upgradesDone < upgradeMaximum, "Maximum upgrades reached"); require(_upgradeTokenId != _helperTokenId1 && _upgradeTokenId != _helperTokenId2 && _helperTokenId1 != _helperTokenId2, "You actually need to use 3 different tokens to upgrade"); require(msg.sender == ownerOf(_upgradeTokenId) && msg.sender == ownerOf(_helperTokenId1) && msg.sender == ownerOf(_helperTokenId2), "Caller has to be owner of all tokens."); require(usedInUpgrade[_upgradeTokenId] == false && usedInUpgrade[_helperTokenId1] == false && usedInUpgrade[_helperTokenId2] == false, "Cannot used stamps already used in a upgrade."); Colors previousColor = getColor(_upgradeTokenId); AssetType aType = getType(_upgradeTokenId); require(getType(_helperTokenId1) == aType && getColor(_helperTokenId1) == previousColor && getType(_helperTokenId2) == aType && getColor(_helperTokenId2) == previousColor, "All tokens involved must have the same type and color"); usedInUpgrade[_helperTokenId1] = true; usedInUpgrade[_helperTokenId2] = true; // Now, actually upgrade the color and notify the achievements contract. Colors newColor = _upgradeColor(_upgradeTokenId, aType, previousColor); emit StampUpgraded(_upgradeTokenId, previousColor, newColor, false, _helperTokenId1, _helperTokenId2); } // Upgrade 1 CS2 stamp by "upgrading" with 1 other CS2 of same type and color and 1 CS1 of same color (as a "joker"). function upgradeStampWithJoker(uint256 _upgradeTokenId, uint256 _helperTokenId, uint256 _helperCS1TokenId) public { require(address(achievementsContract) != address(0), "No achievements contract set"); require(upgradesDone < upgradeMaximum, "Maximum upgrades reached"); require(_upgradeTokenId != _helperTokenId, "You actually need to use different tokens to upgrade"); IERC721 CS1 = IERC721(CS1Address); CS1ColorsI CS1Colors = CS1ColorsI(CS1ColorsAddress); require(msg.sender == ownerOf(_upgradeTokenId) && msg.sender == ownerOf(_helperTokenId) && msg.sender == CS1.ownerOf(_helperCS1TokenId), "Caller has to be owner of all tokens."); require(usedInUpgrade[_upgradeTokenId] == false && usedInUpgrade[_helperTokenId] == false && usedInUpgradeCS1[_helperCS1TokenId] == false, "Cannot used stamps already used in a upgrade."); Colors previousColor = getColor(_upgradeTokenId); AssetType aType = getType(_upgradeTokenId); // Note: The second line below ONLY works because the Colors enums are the same on both contracts! require(getType(_helperTokenId) == aType && getColor(_helperTokenId) == previousColor && CS1Colors.getColor(_helperCS1TokenId) == CS1ColorsI.Colors(uint8(previousColor)), "All tokens involved must have the same color, and all CS2 tokens the same type"); usedInUpgrade[_helperTokenId] = true; usedInUpgradeCS1[_helperCS1TokenId] = true; // Now, actually upgrade the color and notify the achievements contract. Colors newColor = _upgradeColor(_upgradeTokenId, aType, previousColor); emit StampUpgraded(_upgradeTokenId, previousColor, newColor, true, _helperTokenId, _helperCS1TokenId); } function _upgradeColor(uint256 _upgradeTokenId, AssetType _assetType, Colors _previousColor) private returns(Colors) { Colors newColor = Colors(uint256(_previousColor).add(1)); properties[_upgradeTokenId] = uint8(_assetType) * COLORMOD + uint8(newColor); typeColorSupply[uint(_assetType)][uint(_previousColor)] = typeColorSupply[uint(_assetType)][uint(_previousColor)].sub(1); typeColorSupply[uint(_assetType)][uint(newColor)] = typeColorSupply[uint(_assetType)][uint(newColor)].add(1); upgradesDone = upgradesDone.add(1); require( achievementsContract.onCS2ColorChanged(_upgradeTokenId, _previousColor, newColor) == achievementsContract.onCS2ColorChanged.selector, "Achievements upgrading: got unknown value from onCS2ColorChanged" ); return newColor; } /*** Enable reverse ENS registration ***/ // Call this with the address of the reverse registrar for the respecitve network and the ENS name to register. // The reverse registrar can be found as the owner of 'addr.reverse' in the ENS system. // See https://docs.ens.domains/ens-deployments for address of ENS deployments, e.g. Etherscan can be used to look up that owner on those. // namehash.hash("addr.reverse") == "0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2" // Ropsten: ens.owner(namehash.hash("addr.reverse")) == "0x6F628b68b30Dc3c17f345c9dbBb1E483c2b7aE5c" // Mainnet: ens.owner(namehash.hash("addr.reverse")) == "0x084b1c3C81545d370f3634392De611CaaBFf8148" function registerReverseENS(address _reverseRegistrarAddress, string calldata _name) external onlyTokenAssignmentControl { require(_reverseRegistrarAddress != address(0), "need a valid reverse registrar"); ENSReverseRegistrarI(_reverseRegistrarAddress).setName(_name); } /*** Make sure currency doesn't get stranded in this contract ***/ // If this contract gets a balance in some ERC20 contract after it's finished, then we can rescue it. function rescueToken(IERC20 _foreignToken, address _to) external onlyTokenAssignmentControl { _foreignToken.transfer(_to, _foreignToken.balanceOf(address(this))); } // If this contract gets a balance in some ERC721 contract after it's finished, then we can rescue it. function approveNFTrescue(IERC721 _foreignNFT, address _to) external onlyTokenAssignmentControl { _foreignNFT.setApprovalForAll(_to, true); } // Make sure this contract cannot receive ETH. receive() external payable { revert("The contract cannot receive ETH payments."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_createControl","type":"address"},{"internalType":"address","name":"_tokenAssignmentControl","type":"address"},{"internalType":"address","name":"_CS1Address","type":"address"},{"internalType":"address","name":"_CS1ColorsAddress","type":"address"},{"internalType":"uint256","name":"_finalSupply","type":"uint256"},{"internalType":"uint256","name":"_upgradeMaximum","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"achievementsContractAddress","type":"address"}],"name":"AchievementsContractSet","type":"event"},{"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":false,"internalType":"string","name":"value","type":"string"}],"name":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousCreateControl","type":"address"},{"indexed":true,"internalType":"address","name":"newCreateControl","type":"address"}],"name":"CreateControlTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"dataRoot","type":"bytes32"}],"name":"DataRootSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"enum CS2PropertiesI.AssetType","name":"aType","type":"uint8"},{"indexed":false,"internalType":"enum CS2PropertiesI.Colors","name":"color","type":"uint8"}],"name":"MintedWithProof","type":"event"},{"anonymous":false,"inputs":[],"name":"PublicMintingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"PublicMintingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"enum CS2PropertiesI.Colors","name":"previousColor","type":"uint8"},{"indexed":false,"internalType":"enum CS2PropertiesI.Colors","name":"newColor","type":"uint8"}],"name":"SeenCS2ColorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"signedTransferNonce","type":"uint256"}],"name":"SignedTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"changedTokenId","type":"uint256"},{"indexed":false,"internalType":"enum CS2PropertiesI.Colors","name":"previousColor","type":"uint8"},{"indexed":false,"internalType":"enum CS2PropertiesI.Colors","name":"newColor","type":"uint8"},{"indexed":false,"internalType":"bool","name":"withJoker","type":"bool"},{"indexed":false,"internalType":"uint256","name":"usedTokedId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usedTokenId2","type":"uint256"}],"name":"StampUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTokenAssignmentControl","type":"address"},{"indexed":true,"internalType":"address","name":"newTokenAssignmentControl","type":"address"}],"name":"TokenAssignmentControlTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousUpgradeMaximum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newUpgradeMaximum","type":"uint256"}],"name":"UpgradeMaximumChanged","type":"event"},{"inputs":[],"name":"CS1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CS1ColorsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"achievementsContract","outputs":[{"internalType":"contract AchievementsUpgradingI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowPublicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_foreignNFT","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"approveNFTrescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum CS2PropertiesI.Colors","name":"_color","type":"uint8"}],"name":"colorSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"enum CS2PropertiesI.AssetType","name":"_type","type":"uint8"},{"internalType":"enum CS2PropertiesI.Colors","name":"_color","type":"uint8"}],"name":"create","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createControl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenIdStart","type":"uint256"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"enum CS2PropertiesI.AssetType[]","name":"_types","type":"uint8[]"},{"internalType":"enum CS2PropertiesI.Colors[]","name":"_colors","type":"uint8[]"}],"name":"createMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"createWithProof","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dataRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"enum CS2PropertiesI.Colors","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getColorFromProof","outputs":[{"internalType":"enum CS2PropertiesI.Colors","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getDataFieldsFromProof","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"enum CS2PropertiesI.AssetType","name":"","type":"uint8"},{"internalType":"enum CS2PropertiesI.Colors","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getOwnerFromProof","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getTokenIdFromProof","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","outputs":[{"internalType":"enum CS2PropertiesI.AssetType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getTypeFromProof","outputs":[{"internalType":"enum CS2PropertiesI.AssetType","name":"","type":"uint8"}],"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":"mintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reverseRegistrarAddress","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"registerReverseENS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_foreignToken","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_achievementsAddress","type":"address"}],"name":"setAchievementsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newDataRoot","type":"bytes32"}],"name":"setDataRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newUpgradeMaximum","type":"uint256"}],"name":"setUpgradeMaximum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"signedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signedTransferNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"signedTransferWithMintProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"signedTransferWithOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenData","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"signedTransferWithOperatorAndMintProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAssignmentControl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_newCreateControl","type":"address"}],"name":"transferCreateControl","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTokenAssignmentControl","type":"address"}],"name":"transferTokenAssignmentControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeColorSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum CS2PropertiesI.AssetType","name":"_type","type":"uint8"}],"name":"typeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upgradeMaximum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_upgradeTokenId","type":"uint256"},{"internalType":"uint256","name":"_helperTokenId1","type":"uint256"},{"internalType":"uint256","name":"_helperTokenId2","type":"uint256"}],"name":"upgradeStamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_upgradeTokenId","type":"uint256"},{"internalType":"uint256","name":"_helperTokenId","type":"uint256"},{"internalType":"uint256","name":"_helperCS1TokenId","type":"uint256"}],"name":"upgradeStampWithJoker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradesAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upgradesDone","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedInUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedInUpgradeCS1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052600e805460ff60a01b1916905560006010553480156200002357600080fd5b50604051620060b6380380620060b6833981810160405260c08110156200004957600080fd5b508051602080830151604080850151606080870151608088015160a09098015184518086018652601681527f43727970746f207374616d702045646974696f6e2032000000000000000000008189015285518087018752600381526221a99960e91b818a01528651948501909652602580855298999698949792969591949093919262006020908301398282620000f06301ffc9a760e01b6001600160e01b036200037416565b81516200010590600690602085019062000571565b5080516200011b90600790602084019062000571565b50620001376380ac58cd60e01b6001600160e01b036200037416565b62000152635b5e139f60e01b6001600160e01b036200037416565b6200016d63780e9d6360e01b6001600160e01b036200037416565b50620001849050816001600160e01b03620003f916565b5050600a80546001600160a01b0319166001600160a01b0389811691909117918290551615159050620001e95760405162461bcd60e51b8152600401808060200182810382526034815260200180620060826034913960400191505060405180910390fd5b600b80546001600160a01b0319166001600160a01b03878116919091179182905516620002485760405162461bcd60e51b815260040180806020018281038252603d81526020018062006045603d913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b03858116919091179182905516620002a75760405162461bcd60e51b815260040180806020018281038252603181526020018062005fc56031913960400191505060405180910390fd5b600c80546001600160a01b0319166001600160a01b03868116919091179182905516620003065760405162461bcd60e51b815260040180806020018281038252602a81526020018062005ff6602a913960400191505060405180910390fd5b6080829052630100000082111562000365576040805162461bcd60e51b815260206004820152601d60248201527f5468652066696e616c20737570706c7920697320746f6f20686967682e000000604482015290519081900360640190fd5b60115550620006139350505050565b6001600160e01b03198082161415620003d4576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6200040f81620004bd60201b62003da31760201c565b7f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72620004436001600160e01b03620004d616565b6040805160208082528351818301528351919283929083019185019080838360005b838110156200047f57818101518382015260200162000465565b50505050905090810190601f168015620004ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b8051620004d290600990602084019062000571565b5050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620005665780601f106200053a5761010080835404028352916020019162000566565b820191906000526020600020905b8154815290600101906020018083116200054857829003601f168201915b505050505090505b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620005b457805160ff1916838001178555620005e4565b82800160010185558215620005e4579182015b82811115620005e4578251825591602001919060010190620005c7565b50620005f2929150620005f6565b5090565b6200056e91905b80821115620005f25760008155600101620005fd565b608051615992620006336000398061188b5280611c3152506159926000f3fe6080604052600436106103c75760003560e01c806370a08231116101f2578063c6fbe0871161010d578063e66075c2116100a0578063ef4c1bb31161006f578063ef4c1bb3146117c0578063f2d476bd146117d5578063f744c736146117ea578063f7beb98a1461183457610403565b8063e66075c21461158d578063e93ad0e9146115a2578063e985e9c51461175b578063eed807c71461179657610403565b8063d36febaa116100dc578063d36febaa14611418578063db338508146114f8578063dd48f77414611528578063dd5924781461156357610403565b8063c6fbe08714611373578063c87b56dd146113a6578063c8c2ed54146113d0578063d0763c95146113e557610403565b8063a4846d3d11610185578063b88d4fde11610154578063b88d4fde14611263578063c1bd8cf914611334578063c2a55e6514611349578063c5762ef71461135e57610403565b8063a4846d3d1461104f578063a95588711461107c578063b5db6cd214611131578063b6e68b8c1461115e57610403565b80639190ad47116101c15780639190ad4714610fc057806395d89b4114610fd5578063a22cb46514610fea578063a2cfb1691461102557610403565b806370a0823114610e1257806371f0379314610e4557806380057b9a14610f0b5780638e8fa11f14610f3557610403565b80633b18cabc116102e257806350fb4d87116102755780636352211e116102445780636352211e14610d8b57806368f2cd3114610db55780636c0360eb14610de85780636dff358414610dfd57610403565b806350fb4d8714610bcd57806353a1397c14610c92578063548d0a2314610cc557806355f804b314610cda57610403565b806342842e0e116102b157806342842e0e14610afb5780634707d00014610b3e5780634f558e7914610b795780634f6ccce714610ba357610403565b80633b18cabc146108635780633d64ae77146109185780634036ab78146109f8578063411b054f14610a4657610403565b80630a800a5f1161035a57806323b872dd1161032957806323b872dd1461077b5780632dabf8fd146107be5780632f745c59146107f457806335567f751461082d57610403565b80630a800a5f146106765780630f5746251461068b578063119485d61461075157806318160ddd1461076657610403565b806306fdde031161039657806306fdde0314610558578063081812fc146105e2578063095ea7b314610628578063099ea2d31461066157610403565b806301ffc9a71461040857806302244af31461045057806305d2035b1461051757806305e0ddcb1461052c57610403565b366104035760405162461bcd60e51b81526004018080602001828103825260298152602001806153846029913960400191505060405180910390fd5b600080fd5b34801561041457600080fd5b5061043c6004803603602081101561042b57600080fd5b50356001600160e01b031916611849565b604080519115158252519081900360200190f35b34801561045c57600080fd5b506105056004803603604081101561047357600080fd5b81359190810190604081016020820135600160201b81111561049457600080fd5b8201836020820111156104a657600080fd5b803590602001918460208302840111600160201b831117156104c757600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061186c945050505050565b60408051918252519081900360200190f35b34801561052357600080fd5b5061043c611887565b34801561053857600080fd5b506105566004803603602081101561054f57600080fd5b50356118ba565b005b34801561056457600080fd5b5061056d611986565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105a757818101518382015260200161058f565b50505050905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105ee57600080fd5b5061060c6004803603602081101561060557600080fd5b5035611a1c565b604080516001600160a01b039092168252519081900360200190f35b34801561063457600080fd5b506105566004803603604081101561064b57600080fd5b506001600160a01b038135169060200135611a7e565b34801561066d57600080fd5b5061043c611b59565b34801561068257600080fd5b5061060c611b7e565b34801561069757600080fd5b50610556600480360360608110156106ae57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b8111156106dd57600080fd5b8201836020820111156106ef57600080fd5b803590602001918460018302840111600160201b8311171561071057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b34801561075d57600080fd5b50610505611c29565b34801561077257600080fd5b50610505611c2f565b34801561078757600080fd5b506105566004803603606081101561079e57600080fd5b506001600160a01b03813581169160208101359091169060400135611c53565b3480156107ca57600080fd5b50610556600480360360608110156107e157600080fd5b5080359060208101359060400135611caa565b34801561080057600080fd5b506105056004803603604081101561081757600080fd5b506001600160a01b038135169060200135612086565b34801561083957600080fd5b506105566004803603606081101561085057600080fd5b50803590602081013590604001356120b5565b34801561086f57600080fd5b5061060c6004803603604081101561088657600080fd5b81359190810190604081016020820135600160201b8111156108a757600080fd5b8201836020820111156108b957600080fd5b803590602001918460208302840111600160201b831117156108da57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061254c945050505050565b34801561092457600080fd5b506105566004803603608081101561093b57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561096a57600080fd5b82018360208201111561097c57600080fd5b803590602001918460018302840111600160201b8311171561099d57600080fd5b919390929091602081019035600160201b8111156109ba57600080fd5b8201836020820111156109cc57600080fd5b803590602001918460208302840111600160201b831117156109ed57600080fd5b509092509050612589565b348015610a0457600080fd5b50610a2260048036036020811015610a1b57600080fd5b5035612614565b60405180826003811115610a3257fe5b60ff16815260200191505060405180910390f35b348015610a5257600080fd5b5061050560048036036040811015610a6957600080fd5b81359190810190604081016020820135600160201b811115610a8a57600080fd5b820183602082011115610a9c57600080fd5b803590602001918460208302840111600160201b83111715610abd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126a3945050505050565b348015610b0757600080fd5b5061055660048036036060811015610b1e57600080fd5b506001600160a01b0381358116916020810135909116906040013561282e565b348015610b4a57600080fd5b5061055660048036036040811015610b6157600080fd5b506001600160a01b0381358116916020013516612849565b348015610b8557600080fd5b5061043c60048036036020811015610b9c57600080fd5b503561298e565b348015610baf57600080fd5b5061050560048036036020811015610bc657600080fd5b5035612999565b348015610bd957600080fd5b50610c8260048036036040811015610bf057600080fd5b81359190810190604081016020820135600160201b811115610c1157600080fd5b820183602082011115610c2357600080fd5b803590602001918460208302840111600160201b83111715610c4457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506129b5945050505050565b60405180826004811115610a3257fe5b348015610c9e57600080fd5b5061050560048036036020811015610cb557600080fd5b50356001600160a01b03166129e1565b348015610cd157600080fd5b506105056129f5565b348015610ce657600080fd5b5061055660048036036020811015610cfd57600080fd5b810190602081018135600160201b811115610d1757600080fd5b820183602082011115610d2957600080fd5b803590602001918460018302840111600160201b83111715610d4a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506129fb945050505050565b348015610d9757600080fd5b5061060c60048036036020811015610dae57600080fd5b5035612a50565b348015610dc157600080fd5b5061055660048036036020811015610dd857600080fd5b50356001600160a01b0316612a7e565b348015610df457600080fd5b5061056d612b68565b348015610e0957600080fd5b50610505612bc9565b348015610e1e57600080fd5b5061050560048036036020811015610e3557600080fd5b50356001600160a01b0316612bcf565b348015610e5157600080fd5b5061055660048036036060811015610e6857600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610e9757600080fd5b820183602082011115610ea957600080fd5b803590602001918460018302840111600160201b83111715610eca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612c37945050505050565b348015610f1757600080fd5b50610c8260048036036020811015610f2e57600080fd5b5035612cce565b348015610f4157600080fd5b5061055660048036036040811015610f5857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610f8257600080fd5b820183602082011115610f9457600080fd5b803590602001918460018302840111600160201b83111715610fb557600080fd5b509092509050612d63565b348015610fcc57600080fd5b50610556612ea5565b348015610fe157600080fd5b5061056d612f26565b348015610ff657600080fd5b506105566004803603604081101561100d57600080fd5b506001600160a01b0381351690602001351515612f87565b34801561103157600080fd5b5061043c6004803603602081101561104857600080fd5b503561308c565b34801561105b57600080fd5b506105056004803603602081101561107257600080fd5b503560ff166130a3565b34801561108857600080fd5b50610a226004803603604081101561109f57600080fd5b81359190810190604081016020820135600160201b8111156110c057600080fd5b8201836020820111156110d257600080fd5b803590602001918460208302840111600160201b831117156110f357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613119945050505050565b34801561113d57600080fd5b506105056004803603602081101561115457600080fd5b503560ff16613145565b34801561116a57600080fd5b506112136004803603604081101561118157600080fd5b81359190810190604081016020820135600160201b8111156111a257600080fd5b8201836020820111156111b457600080fd5b803590602001918460208302840111600160201b831117156111d557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613189945050505050565b604080518581526001600160a01b038516602082015290810183600381111561123857fe5b60ff16815260200182600481111561124c57fe5b60ff16815260200194505050505060405180910390f35b34801561126f57600080fd5b506105566004803603608081101561128657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156112c057600080fd5b8201836020820111156112d257600080fd5b803590602001918460018302840111600160201b831117156112f357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506132cc945050505050565b34801561134057600080fd5b50610505613324565b34801561135557600080fd5b5061060c61332e565b34801561136a57600080fd5b5061043c61333d565b34801561137f57600080fd5b506105566004803603602081101561139657600080fd5b50356001600160a01b031661334d565b3480156113b257600080fd5b5061056d600480360360208110156113c957600080fd5b50356134a5565b3480156113dc57600080fd5b5061060c61374c565b3480156113f157600080fd5b506105566004803603602081101561140857600080fd5b50356001600160a01b031661375b565b34801561142457600080fd5b506105566004803603608081101561143b57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561146a57600080fd5b82018360208201111561147c57600080fd5b803590602001918460018302840111600160201b8311171561149d57600080fd5b919390929091602081019035600160201b8111156114ba57600080fd5b8201836020820111156114cc57600080fd5b803590602001918460208302840111600160201b831117156114ed57600080fd5b509092509050613845565b34801561150457600080fd5b506105056004803603604081101561151b57600080fd5b50803590602001356138c7565b34801561153457600080fd5b506105566004803603604081101561154b57600080fd5b506001600160a01b03813581169160200135166138ee565b34801561156f57600080fd5b5061043c6004803603602081101561158657600080fd5b50356139a5565b34801561159957600080fd5b5061060c6139bc565b3480156115ae57600080fd5b50610556600480360360808110156115c557600080fd5b81359190810190604081016020820135600160201b8111156115e657600080fd5b8201836020820111156115f857600080fd5b803590602001918460208302840111600160201b8311171561161957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561166857600080fd5b82018360208201111561167a57600080fd5b803590602001918460208302840111600160201b8311171561169b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156116ea57600080fd5b8201836020820111156116fc57600080fd5b803590602001918460208302840111600160201b8311171561171d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506139cb945050505050565b34801561176757600080fd5b5061043c6004803603604081101561177e57600080fd5b506001600160a01b0381358116916020013516613b01565b3480156117a257600080fd5b50610556600480360360208110156117b957600080fd5b5035613b2f565b3480156117cc57600080fd5b5061043c613c05565b3480156117e157600080fd5b5061060c613c28565b3480156117f657600080fd5b506105566004803603608081101561180d57600080fd5b508035906001600160a01b036020820135169060ff60408201358116916060013516613c37565b34801561184057600080fd5b50610556613cd0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6000806118798484613189565b509193505050505b92915050565b60007f00000000000000000000000000000000000000000000000000000000000000006118b2613dba565b101590505b90565b600a546001600160a01b031633146119035760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b8060105411156119445760405162461bcd60e51b81526004018080602001828103825260348152602001806158ae6034913960400191505060405180910390fd5b601154604080519182526020820183905280517f3651ff1393f20c815aec9fd17e87b2e765be1a16a740d604a1803a4d66fc6eb09281900390910190a1601155565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611a125780601f106119e757610100808354040283529160200191611a12565b820191906000526020600020905b8154815290600101906020018083116119f557829003601f168201915b5050505050905090565b6000611a2782613dc6565b611a625760405162461bcd60e51b815260040180806020018281038252602c8152602001806156db602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000611a8982612a50565b9050806001600160a01b0316836001600160a01b03161415611adc5760405162461bcd60e51b81526004018080602001828103825260218152602001806158066021913960400191505060405180910390fd5b806001600160a01b0316611aee613dd9565b6001600160a01b03161480611b0f5750611b0f81611b0a613dd9565b613b01565b611b4a5760405162461bcd60e51b81526004018080602001828103825260388152602001806155126038913960400191505060405180910390fd5b611b548383613ddd565b505050565b600e546000906001600160a01b031615801590611b795750601154601054105b905090565b600c546001600160a01b031681565b6000611b9884612a50565b6001600160a01b038116600090815262080028602090815260409182902054825130606090811b82850152630f57462560e01b603483015233811b60388301526bffffffffffffffffffffffff1986821b16604c83015281018990526080808201929092528351808203909201825260a0019092528151910120909150611c228282878787613e4b565b5050505050565b60105481565b7f000000000000000000000000000000000000000000000000000000000000000090565b611c64611c5e613dd9565b82613f81565b611c9f5760405162461bcd60e51b81526004018080602001828103825260318152602001806158496031913960400191505060405180910390fd5b611b5483838361401d565b600e546001600160a01b0316611d07576040805162461bcd60e51b815260206004820152601c60248201527f4e6f20616368696576656d656e747320636f6e74726163742073657400000000604482015290519081900360640190fd5b60115460105410611d5a576040805162461bcd60e51b815260206004820152601860248201527713585e1a5b5d5b481d5c19dc9859195cc81c995858da195960421b604482015290519081900360640190fd5b818314158015611d6a5750808314155b8015611d765750808214155b611db15760405162461bcd60e51b81526004018080602001828103825260368152602001806154566036913960400191505060405180910390fd5b611dba83612a50565b6001600160a01b0316336001600160a01b0316148015611df35750611dde82612a50565b6001600160a01b0316336001600160a01b0316145b8015611e185750611e0381612a50565b6001600160a01b0316336001600160a01b0316145b611e535760405162461bcd60e51b81526004018080602001828103825260258152602001806159386025913960400191505060405180910390fd5b600083815262080026602052604090205460ff16158015611e855750600082815262080026602052604090205460ff16155b8015611ea25750600081815262080026602052604090205460ff16155b611edd5760405162461bcd60e51b815260040180806020018281038252602d8152602001806154b8602d913960400191505060405180910390fd5b6000611ee884612cce565b90506000611ef585612614565b9050806003811115611f0357fe5b611f0c85612614565b6003811115611f1757fe5b148015611f415750816004811115611f2b57fe5b611f3485612cce565b6004811115611f3f57fe5b145b8015611f6a5750806003811115611f5457fe5b611f5d84612614565b6003811115611f6857fe5b145b8015611f935750816004811115611f7d57fe5b611f8684612cce565b6004811115611f9157fe5b145b611fce5760405162461bcd60e51b815260040180806020018281038252603581526020018061559d6035913960400191505060405180910390fd5b60008481526208002660205260408082208054600160ff199182168117909255868452918320805490921617905561200786838561417b565b9050857f247f7fffe9e25090b6c920fec5bb6b2181f3b1f96b89874234afac8aba90212f8483600089896040518086600481111561204157fe5b60ff16815260200185600481111561205557fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a2505050505050565b6001600160a01b03821660009081526001602052604081206120ae908363ffffffff6143f516565b9392505050565b600e546001600160a01b0316612112576040805162461bcd60e51b815260206004820152601c60248201527f4e6f20616368696576656d656e747320636f6e74726163742073657400000000604482015290519081900360640190fd5b60115460105410612165576040805162461bcd60e51b815260206004820152601860248201527713585e1a5b5d5b481d5c19dc9859195cc81c995858da195960421b604482015290519081900360640190fd5b818314156121a45760405162461bcd60e51b815260040180806020018281038252603481526020018061587a6034913960400191505060405180910390fd5b600c54600d546001600160a01b0391821691166121c085612a50565b6001600160a01b0316336001600160a01b03161480156121f957506121e484612a50565b6001600160a01b0316336001600160a01b0316145b801561227c5750816001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d602081101561226e57600080fd5b50516001600160a01b031633145b6122b75760405162461bcd60e51b81526004018080602001828103825260258152602001806159386025913960400191505060405180910390fd5b600085815262080026602052604090205460ff161580156122e95750600084815262080026602052604090205460ff16155b80156123065750600083815262080027602052604090205460ff16155b6123415760405162461bcd60e51b815260040180806020018281038252602d8152602001806154b8602d913960400191505060405180910390fd5b600061234c86612cce565b9050600061235987612614565b905080600381111561236757fe5b61237087612614565b600381111561237b57fe5b1480156123a5575081600481111561238f57fe5b61239887612cce565b60048111156123a357fe5b145b801561244e57508160048111156123b857fe5b60ff1660048111156123c657fe5b60048111156123d157fe5b836001600160a01b03166380057b9a876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561241557600080fd5b505afa158015612429573d6000803e3d6000fd5b505050506040513d602081101561243f57600080fd5b5051600481111561244c57fe5b145b6124895760405162461bcd60e51b815260040180806020018281038252604e815260200180615782604e913960600191505060405180910390fd5b600086815262080026602090815260408083208054600160ff1991821681179092558985526208002790935290832080549092161790556124cb88838561417b565b9050877f247f7fffe9e25090b6c920fec5bb6b2181f3b1f96b89874234afac8aba90212f848360018b8b6040518086600481111561250557fe5b60ff16815260200185600481111561251957fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a25050505050505050565b600080600061255b8585613189565b50509150915061256a82613dc6565b156125815761257882612a50565b92505050611881565b949350505050565b60006125c8878484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126a392505050565b905061260b818787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c3792505050565b50505050505050565b600061261f82613dc6565b61266b576040805162461bcd60e51b81526020600482015260186024820152772a37b5b2b71024a2103732b2b239903a379032bc34b9ba1760411b604482015290519081900360640190fd5b60046012836301000000811061267d57fe5b602081049091015460ff601f9092166101000a9004811690911c16600381111561188157fe5b60006126ad611887565b156126e95760405162461bcd60e51b81526004018080602001828103825260328152602001806159066032913960400191505060405180910390fd5b6126f1613c05565b61272c5760405162461bcd60e51b81526004018080602001828103825260238152602001806154116023913960400191505060405180910390fd5b60008060008061273c8787613189565b935093509350935061274d84613dc6565b15612797576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b71030b63932b0b23c9032bc34b9ba399760591b604482015290519081900360640190fd5b826001600160a01b0316847fdc90809cda0412ce45d4af87d938ca9961cad0864201f891447f2b02a191397b33858560405180846001600160a01b03166001600160a01b031681526020018360038111156127ee57fe5b60ff16815260200182600481111561280257fe5b60ff168152602001935050505060405180910390a361282384848484614401565b509195945050505050565b611b54838383604051806020016040528060008152506132cc565b600b546001600160a01b031633146128925760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b604080516370a0823160e01b815230600482015290516001600160a01b0384169163a9059cbb91849184916370a0823191602480820192602092909190829003018186803b1580156128e357600080fd5b505afa1580156128f7573d6000803e3d6000fd5b505050506040513d602081101561290d57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561295e57600080fd5b505af1158015612972573d6000803e3d6000fd5b505050506040513d602081101561298857600080fd5b50505050565b600061188182613dc6565b6000806129ad60028463ffffffff61457a16565b509392505050565b60008060006129c48585613189565b9350505091506129d382613dc6565b156125815761257882612cce565b620800286020526000908152604090205481565b60115481565b600a546001600160a01b03163314612a445760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b612a4d81614596565b50565b600061188182604051806060016040528060298152602001615574602991396002919063ffffffff61463f16565b600a546001600160a01b03163314612ac75760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b6001600160a01b038116612b0c5760405162461bcd60e51b81526004018080602001828103825260298152602001806156b26029913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907fa3294bd3c62ef75af9339cf8fe3dd1225c58c03e6ea1bfcbae8c49436fade37a90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611a125780601f106119e757610100808354040283529160200191611a12565b600f5481565b60006001600160a01b038216612c165760405162461bcd60e51b815260040180806020018281038252602a81526020018061554a602a913960400191505060405180910390fd5b6001600160a01b03821660009081526001602052604090206118819061464c565b6000612c4284612a50565b6001600160a01b038116600090815262080028602090815260409182902054825130606090811b828501526371f0379360e01b60348301526bffffffffffffffffffffffff1986821b8116603884015289821b16604c83015281018990526080808201929092528351808203909201825260a0019092528151910120909150611c228282878787613e4b565b6000612cd982613dc6565b612d25576040805162461bcd60e51b81526020600482015260186024820152772a37b5b2b71024a2103732b2b239903a379032bc34b9ba1760411b604482015290519081900360640190fd5b601060128363010000008110612d3757fe5b602081049091015460ff601f9092166101000a90041681612d5457fe5b0660ff16600481111561188157fe5b600b546001600160a01b03163314612dac5760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b6001600160a01b038316612e07576040805162461bcd60e51b815260206004820152601e60248201527f6e65656420612076616c69642072657665727365207265676973747261720000604482015290519081900360640190fd5b60405163c47f002760e01b8152602060048201908152602482018390526001600160a01b0385169163c47f00279185918591908190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b158015612e7b57600080fd5b505af1158015612e8f573d6000803e3d6000fd5b505050506040513d6020811015611c2257600080fd5b600a546001600160a01b03163314612eee5760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600e805460ff60a01b191690556040517febe230014056e5cb4ca6d8e534189bf5bfb0759489f16170654dce7c014b669990600090a1565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611a125780601f106119e757610100808354040283529160200191611a12565b612f8f613dd9565b6001600160a01b0316826001600160a01b03161415612ff5576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000613002613dd9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155613046613dd9565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b620800266020526000908152604090205460ff1681565b600080805b620800128460038111156130b857fe5b600481106130c257fe5b5050600581101561311257613108620800128560038111156130e057fe5b600481106130ea57fe5b6005020182600581106130f957fe5b0154839063ffffffff61465716565b91506001016130a8565b5092915050565b60008060006131288585613189565b50925050915061313782613dc6565b156125815761257882612614565b600080805b60048110156131125761317f62080012826004811061316557fe5b6005020185600481111561317557fe5b600581106130f957fe5b915060010161314a565b6000806000806000801916600f5414156131e2576040805162461bcd60e51b81526020600482015260156024820152742937b7ba103732b2b239903a379031329039b2ba1760591b604482015290519081900360640190fd5b6131ef85600f54886146b1565b613237576040805162461bcd60e51b81526020600482015260146024820152732b32b934b334b1b0ba34b7b7103330b4b632b21760611b604482015290519081900360640190fd5b60a886901c6000600488600b1a901c60ff16600381111561325457fe5b90506000601089600b1a8161326557fe5b0660ff16600481111561327457fe5b9050886001600160a01b0381166132bc5760405162461bcd60e51b81526004018080602001828103825260248152602001806158e26024913960400191505060405180910390fd5b9299929850909650945092505050565b6132dd6132d7613dd9565b83613f81565b6133185760405162461bcd60e51b81526004018080602001828103825260318152602001806158496031913960400191505060405180910390fd5b6129888484848461475a565b6000611b79613dba565b600e546001600160a01b031681565b600e54600160a01b900460ff1681565b600a546001600160a01b031633146133965760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fbcbd71db7b4316a53879e015e1d9b40b027737232537d68494da4f0c2012477e90600090a26001600160a01b03811615612a4d57600e54604080516301ffc9a760e01b81526358cac59760e01b600482015290516001600160a01b03909216916301ffc9a791602480820192602092909190829003018186803b15801561343e57600080fd5b505afa158015613452573d6000803e3d6000fd5b505050506040513d602081101561346857600080fd5b5051612a4d5760405162461bcd60e51b815260040180806020018281038252603781526020018061534d6037913960400191505060405180910390fd5b60606134b082613dc6565b6134eb5760405162461bcd60e51b815260040180806020018281038252602f815260200180615730602f913960400191505060405180910390fd5b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156135805780601f1061355557610100808354040283529160200191613580565b820191906000526020600020905b81548152906001019060200180831161356357829003601f168201915b5050600954939450505050600260001961010060018416150201909116046135a9579050611867565b80511561367a5760098160405160200180838054600181600116156101000203166002900480156136115780601f106135ef576101008083540402835291820191613611565b820191906000526020600020905b8154815290600101906020018083116135fd575b5050825160208401908083835b6020831061363d5780518252601f19909201916020918201910161361e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050611867565b6009613685846147ac565b60405160200180838054600181600116156101000203166002900480156136e35780601f106136c15761010080835404028352918201916136e3565b820191906000526020600020905b8154815290600101906020018083116136cf575b5050825160208401908083835b6020831061370f5780518252601f1990920191602091820191016136f0565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b600b546001600160a01b031681565b600b546001600160a01b031633146137a45760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b6001600160a01b0381166137e95760405162461bcd60e51b81526004018080602001828103825260328152602001806156106032913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907fe74ad8e35ae0d7f4389ff1318666007250321a66dd644dca021b5e2e30fa2a5c90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000613884878484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126a392505050565b905061260b818787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8d92505050565b6208001282600481106138d657fe5b6005020181600581106138e557fe5b01549150829050565b600b546001600160a01b031633146139375760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b6040805163a22cb46560e01b81526001600160a01b0383811660048301526001602483015291519184169163a22cb4659160448082019260009290919082900301818387803b15801561398957600080fd5b505af115801561399d573d6000803e3d6000fd5b505050505050565b620800276020526000908152604090205460ff1681565b600a546001600160a01b031681565b600a546001600160a01b03163314613a145760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b613a1c611887565b15613a585760405162461bcd60e51b81526004018080602001828103825260328152602001806159066032913960400191505060405180910390fd5b81518351148015613a6a575080518351145b613aa55760405162461bcd60e51b815260040180806020018281038252602c815260200180615642602c913960400191505060405180910390fd5b825160005b8181101561399d57613af9818701868381518110613ac457fe5b6020026020010151868481518110613ad857fe5b6020026020010151868581518110613aec57fe5b6020026020010151614401565b600101613aaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314613b785760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600f5415613bcd576040805162461bcd60e51b815260206004820152601760248201527f43616e206f6e6c792073657420726f6f74206f6e63652e000000000000000000604482015290519081900360640190fd5b6040805182815290517f8da3b39d20c8b9bb14a9b3572001c5f931b42ddb39565ba2b0fd2d1fa68169b39181900360200190a1600f55565b6000613c0f611887565b158015611b79575050600e54600160a01b900460ff1690565b600d546001600160a01b031681565b600a546001600160a01b03163314613c805760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b613c88611887565b15613cc45760405162461bcd60e51b81526004018080602001828103825260328152602001806159066032913960400191505060405180910390fd5b61298884848484614401565b600a546001600160a01b03163314613d195760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600f54613d65576040805162461bcd60e51b81526020600482015260156024820152742937b7ba103732b2b239903a379031329039b2ba1760591b604482015290519081900360640190fd5b600e805460ff60a01b1916600160a01b1790556040517f8ff3deee4c40ab085dd8d7d0c848cb5295e4ab5faa32e5b60e3936cf1bdc77bf90600090a1565b8051613db6906009906020840190615260565b5050565b6000611b796002614887565b600061188160028363ffffffff61489216565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613e1282612a50565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613e568561489e565b90506000613e6482846148ef565b9050866001600160a01b0316816001600160a01b031614613eb65760405162461bcd60e51b815260040180806020018281038252603e8152602001806155d2603e913960400191505060405180910390fd5b6001600160a01b0387811660008181526208002860209081526040918290205482513381529182015281518994891693927fba05f551fcc429cba611372aa0055e3573f26273f66d1a48bdb5b4f7896bf022928290030190a46001600160a01b0387166000908152620800286020526040902054613f3b90600163ffffffff61465716565b620800286000896001600160a01b03166001600160a01b031681526020019081526020016000208190555061260b8785876040518060200160405280600081525061475a565b6000613f8c82613dc6565b613fc75760405162461bcd60e51b815260040180806020018281038252602c81526020018061548c602c913960400191505060405180910390fd5b6000613fd283612a50565b9050806001600160a01b0316846001600160a01b0316148061400d5750836001600160a01b031661400284611a1c565b6001600160a01b0316145b8061258157506125818185613b01565b826001600160a01b031661403082612a50565b6001600160a01b0316146140755760405162461bcd60e51b81526004018080602001828103825260298152602001806157076029913960400191505060405180910390fd5b6001600160a01b0382166140ba5760405162461bcd60e51b81526004018080602001828103825260248152602001806153ed6024913960400191505060405180910390fd5b6140c5838383611b54565b6140d0600082613ddd565b6001600160a01b03831660009081526001602052604090206140f8908263ffffffff614ad616565b506001600160a01b0382166000908152600160205260409020614121908263ffffffff614ae216565b506141346002828463ffffffff614aee16565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008061419b600184600481111561418f57fe5b9063ffffffff61465716565b60048111156141a657fe5b90508060048111156141b457fe5b60108560038111156141c257fe5b0201601286630100000081106141d457fe5b602091828204019190066101000a81548160ff021916908360ff16021790555061423b60016208001286600381111561420957fe5b6004811061421357fe5b6005020185600481111561422357fe5b6005811061422d57fe5b01549063ffffffff614b0416565b6208001285600381111561424b57fe5b6004811061425557fe5b6005020184600481111561426557fe5b6005811061426f57fe5b01556142b860016208001286600381111561428657fe5b6004811061429057fe5b600502018360048111156142a057fe5b600581106142aa57fe5b01549063ffffffff61465716565b620800128560038111156142c857fe5b600481106142d257fe5b600502018260048111156142e257fe5b600581106142ec57fe5b015560105461430290600163ffffffff61465716565b601055600e546040516358cac59760e01b808252600480830189815291936001600160a01b0316926358cac597928a928992889291602490910190849081111561434857fe5b60ff16815260200182600481111561435c57fe5b60ff1681526020019350505050602060405180830381600087803b15801561438357600080fd5b505af1158015614397573d6000803e3d6000fd5b505050506040513d60208110156143ad57600080fd5b50516001600160e01b031916146125815760405162461bcd60e51b81526004018080602001828103825260408152602001806153ad6040913960400191505060405180910390fd5b60006120ae8383614b46565b61440a84613dc6565b156144d35781600381111561441b57fe5b61442485612614565b600381111561442f57fe5b1461446b5760405162461bcd60e51b81526004018080602001828103825260228152602001806158276022913960400191505060405180910390fd5b6010546144ce5780600481111561447e57fe5b61448785612cce565b600481111561449257fe5b146144ce5760405162461bcd60e51b815260040180806020018281038252602381526020018061575f6023913960400191505060405180910390fd5b612988565b6144dd8385614baa565b8060048111156144e957fe5b60108360038111156144f757fe5b02016012856301000000811061450957fe5b602091828204019190066101000a81548160ff021916908360ff16021790555061453e60016208001284600381111561428657fe5b6208001283600381111561454e57fe5b6004811061455857fe5b6005020182600481111561456857fe5b6005811061457257fe5b015550505050565b60008080806145898686614ce4565b9097909650945050505050565b61459f81613da3565b7f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea726145c8612b68565b6040805160208082528351818301528351919283929083019185019080838360005b838110156146025781810151838201526020016145ea565b50505050905090810190601f16801561462f5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6000612581848484614d46565b600061188182614df2565b6000828201838110156120ae576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081815b855181101561474f5760008682815181106146cd57fe5b602002602001015190508083116147145782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250614746565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b506001016146b6565b509092149392505050565b61476584848461401d565b61477184848484614df6565b6129885760405162461bcd60e51b815260040180806020018281038252603281526020018061531b6032913960400191505060405180910390fd5b6060816147d157506040805180820190915260018152600360fc1b6020820152611867565b8160005b81156147e957600101600a820491506147d5565b60608167ffffffffffffffff8111801561480257600080fd5b506040519080825280601f01601f19166020018201604052801561482d576020820181803683370190505b50859350905060001982015b831561487e57600a840660300160f81b8282806001900393508151811061485c57fe5b60200101906001600160f81b031916908160001a905350600a84049350614839565b50949350505050565b600061188182615031565b60006120ae8383615038565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114614947576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156149b85760405162461bcd60e51b81526004018080602001828103825260228152602001806154346022913960400191505060405180910390fd5b8060ff16601b141580156149d057508060ff16601c14155b15614a0c5760405162461bcd60e51b815260040180806020018281038252602281526020018061566e6022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015614a64573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614acc576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b60006120ae838361504d565b60006120ae8383615113565b600061258184846001600160a01b03851661515d565b60006120ae83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506151b5565b81546000908210614b885760405162461bcd60e51b81526004018080602001828103825260228152602001806152f96022913960400191505060405180910390fd5b826000018281548110614b9757fe5b9060005260206000200154905092915050565b6001600160a01b038216614c05576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614c0e81613dc6565b15614c60576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b614c6c60008383611b54565b6001600160a01b0382166000908152600160205260409020614c94908263ffffffff614ae216565b50614ca76002828463ffffffff614aee16565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008082614cf28582615038565b614d2d5760405162461bcd60e51b81526004018080602001828103825260228152602001806156906022913960400191505060405180910390fd5b6000818152602095909552604090942054939492505050565b6000614d528484615038565b8290614ddc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614da1578181015183820152602001614d89565b50505050905090810190601f168015614dce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050506000908152602091909152604090205490565b5490565b6000614e0a846001600160a01b031661520f565b614e1657506001612581565b600060606001600160a01b038616630a85bd0160e11b614e34613dd9565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614ead578181015183820152602001614e95565b50505050905090810190601f168015614eda5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310614f425780518252601f199092019160209182019101614f23565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614fa4576040519150601f19603f3d011682016040523d82523d6000602084013e614fa9565b606091505b509150915081614ffa57805115614fc35780518082602001fd5b60405162461bcd60e51b815260040180806020018281038252603281526020018061531b6032913960400191505060405180910390fd5b600081806020019051602081101561501157600080fd5b50516001600160e01b031916630a85bd0160e11b14935061258192505050565b6001015490565b60009081526020919091526040902054151590565b60008181526001830160205260408120548015615109578354600019808301919081019060009087908390811061508057fe5b906000526020600020015490508087600001848154811061509d57fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806150cd57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611881565b6000915050611881565b600061511f8383615248565b61515557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611881565b506000611881565b6000828152602084905260408120548190615183575060018085018054820190556151a0565b8261519c575060018401805460001901905560006151a0565b5060005b60009384526020949094525060409091205590565b600081848411156152075760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614da1578181015183820152602001614d89565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612581575050151592915050565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106152a157805160ff19168380011785556152ce565b828001600101855582156152ce579182015b828111156152ce5782518255916020019190600101906152b3565b506152da9291506152de565b5090565b6118b791905b808211156152da57600081556001016152e456fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724e65656420746f20696d706c656d656e742074686520616368696576656d656e747320757067726164696e6720696e746572666163652154686520636f6e74726163742063616e6e6f74207265636569766520455448207061796d656e74732e416368696576656d656e747320757067726164696e673a20676f7420756e6b6e6f776e2076616c75652066726f6d206f6e435332436f6c6f724368616e6765644552433732313a207472616e7366657220746f20746865207a65726f20616464726573735075626c6963206d696e74696e67206e6565647320746f20626520616c6c6f7765642e45434453413a20696e76616c6964207369676e6174757265202773272076616c7565596f752061637475616c6c79206e65656420746f20757365203320646966666572656e7420746f6b656e7320746f20757067726164654552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e6e6f742075736564207374616d707320616c7265616479207573656420696e206120757067726164652e637265617465436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e416c6c20746f6b656e7320696e766f6c766564206d7573742068617665207468652073616d65207479706520616e6420636f6c6f725369676e6174757265206e6565647320746f206d6174636820706172616d65746572732c206e6f6e63652c20616e642063757272656e74206f776e65722e746f6b656e41737369676e6d656e74436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e416c6c20676976656e20617272617973206e65656420746f206265207468652073616d65206c656e6774682e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473637265617465436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e436f6c6f72206d69736d617463682077697468206578697374696e6720746f6b656e2e416c6c20746f6b656e7320696e766f6c766564206d7573742068617665207468652073616d6520636f6c6f722c20616e6420616c6c2043533220746f6b656e73207468652073616d652074797065746f6b656e41737369676e6d656e74436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e4552433732313a20617070726f76616c20746f2063757272656e74206f776e657254797065206d69736d617463682077697468206578697374696e6720746f6b656e2e4552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564596f752061637475616c6c79206e65656420746f2075736520646966666572656e7420746f6b656e7320746f2075706772616465416c7265616479206d6f726520757067726164657320646f6e65207468616e2074686520726571756573746564206c696d69742e746f6b656e44617461206e6565647320746f20636f6e7461696e20616e206f776e65722e546869732063616c6c206f6e6c7920776f726b73207768656e206d696e74696e67206973206e6f742066696e69736865642e43616c6c65722068617320746f206265206f776e6572206f6620616c6c20746f6b656e732ea2646970667358221220621e5be191a6a40b4990ad61c0d1acb118c68d2078ddfbce92f383423741391d64736f6c63430006080033596f75206e65656420746f2070726f7669646520616e2061637475616c2043533120636f6c6f727320616464726573732e596f75206e65656420746f2070726f7669646520616e2061637475616c2043533120616464726573732e68747470733a2f2f746573742e63727970746f2e706f73742e61742f4353322f6d6574612f596f75206e65656420746f2070726f7669646520616e2061637475616c20746f6b656e41737369676e6d656e74436f6e74726f6c20616464726573732e596f75206e65656420746f2070726f7669646520616e2061637475616c20637265617465436f6e74726f6c20616464726573732e000000000000000000000000d39a7ad8ebe8c57aab85f868fe0d454e1aa5349e000000000000000000000000596e620e175c2c37a5f35a41d9f2305a991ffc890000000000000000000000007e789e2dd1340971de0a9bca35b14ac0939aa3300000000000000000000000006b0ec039d368b9a9d044391de2437ba24131e87b000000000000000000000000000000000000000000000000000000000003a9800000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103c75760003560e01c806370a08231116101f2578063c6fbe0871161010d578063e66075c2116100a0578063ef4c1bb31161006f578063ef4c1bb3146117c0578063f2d476bd146117d5578063f744c736146117ea578063f7beb98a1461183457610403565b8063e66075c21461158d578063e93ad0e9146115a2578063e985e9c51461175b578063eed807c71461179657610403565b8063d36febaa116100dc578063d36febaa14611418578063db338508146114f8578063dd48f77414611528578063dd5924781461156357610403565b8063c6fbe08714611373578063c87b56dd146113a6578063c8c2ed54146113d0578063d0763c95146113e557610403565b8063a4846d3d11610185578063b88d4fde11610154578063b88d4fde14611263578063c1bd8cf914611334578063c2a55e6514611349578063c5762ef71461135e57610403565b8063a4846d3d1461104f578063a95588711461107c578063b5db6cd214611131578063b6e68b8c1461115e57610403565b80639190ad47116101c15780639190ad4714610fc057806395d89b4114610fd5578063a22cb46514610fea578063a2cfb1691461102557610403565b806370a0823114610e1257806371f0379314610e4557806380057b9a14610f0b5780638e8fa11f14610f3557610403565b80633b18cabc116102e257806350fb4d87116102755780636352211e116102445780636352211e14610d8b57806368f2cd3114610db55780636c0360eb14610de85780636dff358414610dfd57610403565b806350fb4d8714610bcd57806353a1397c14610c92578063548d0a2314610cc557806355f804b314610cda57610403565b806342842e0e116102b157806342842e0e14610afb5780634707d00014610b3e5780634f558e7914610b795780634f6ccce714610ba357610403565b80633b18cabc146108635780633d64ae77146109185780634036ab78146109f8578063411b054f14610a4657610403565b80630a800a5f1161035a57806323b872dd1161032957806323b872dd1461077b5780632dabf8fd146107be5780632f745c59146107f457806335567f751461082d57610403565b80630a800a5f146106765780630f5746251461068b578063119485d61461075157806318160ddd1461076657610403565b806306fdde031161039657806306fdde0314610558578063081812fc146105e2578063095ea7b314610628578063099ea2d31461066157610403565b806301ffc9a71461040857806302244af31461045057806305d2035b1461051757806305e0ddcb1461052c57610403565b366104035760405162461bcd60e51b81526004018080602001828103825260298152602001806153846029913960400191505060405180910390fd5b600080fd5b34801561041457600080fd5b5061043c6004803603602081101561042b57600080fd5b50356001600160e01b031916611849565b604080519115158252519081900360200190f35b34801561045c57600080fd5b506105056004803603604081101561047357600080fd5b81359190810190604081016020820135600160201b81111561049457600080fd5b8201836020820111156104a657600080fd5b803590602001918460208302840111600160201b831117156104c757600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061186c945050505050565b60408051918252519081900360200190f35b34801561052357600080fd5b5061043c611887565b34801561053857600080fd5b506105566004803603602081101561054f57600080fd5b50356118ba565b005b34801561056457600080fd5b5061056d611986565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105a757818101518382015260200161058f565b50505050905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105ee57600080fd5b5061060c6004803603602081101561060557600080fd5b5035611a1c565b604080516001600160a01b039092168252519081900360200190f35b34801561063457600080fd5b506105566004803603604081101561064b57600080fd5b506001600160a01b038135169060200135611a7e565b34801561066d57600080fd5b5061043c611b59565b34801561068257600080fd5b5061060c611b7e565b34801561069757600080fd5b50610556600480360360608110156106ae57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b8111156106dd57600080fd5b8201836020820111156106ef57600080fd5b803590602001918460018302840111600160201b8311171561071057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b34801561075d57600080fd5b50610505611c29565b34801561077257600080fd5b50610505611c2f565b34801561078757600080fd5b506105566004803603606081101561079e57600080fd5b506001600160a01b03813581169160208101359091169060400135611c53565b3480156107ca57600080fd5b50610556600480360360608110156107e157600080fd5b5080359060208101359060400135611caa565b34801561080057600080fd5b506105056004803603604081101561081757600080fd5b506001600160a01b038135169060200135612086565b34801561083957600080fd5b506105566004803603606081101561085057600080fd5b50803590602081013590604001356120b5565b34801561086f57600080fd5b5061060c6004803603604081101561088657600080fd5b81359190810190604081016020820135600160201b8111156108a757600080fd5b8201836020820111156108b957600080fd5b803590602001918460208302840111600160201b831117156108da57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061254c945050505050565b34801561092457600080fd5b506105566004803603608081101561093b57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561096a57600080fd5b82018360208201111561097c57600080fd5b803590602001918460018302840111600160201b8311171561099d57600080fd5b919390929091602081019035600160201b8111156109ba57600080fd5b8201836020820111156109cc57600080fd5b803590602001918460208302840111600160201b831117156109ed57600080fd5b509092509050612589565b348015610a0457600080fd5b50610a2260048036036020811015610a1b57600080fd5b5035612614565b60405180826003811115610a3257fe5b60ff16815260200191505060405180910390f35b348015610a5257600080fd5b5061050560048036036040811015610a6957600080fd5b81359190810190604081016020820135600160201b811115610a8a57600080fd5b820183602082011115610a9c57600080fd5b803590602001918460208302840111600160201b83111715610abd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126a3945050505050565b348015610b0757600080fd5b5061055660048036036060811015610b1e57600080fd5b506001600160a01b0381358116916020810135909116906040013561282e565b348015610b4a57600080fd5b5061055660048036036040811015610b6157600080fd5b506001600160a01b0381358116916020013516612849565b348015610b8557600080fd5b5061043c60048036036020811015610b9c57600080fd5b503561298e565b348015610baf57600080fd5b5061050560048036036020811015610bc657600080fd5b5035612999565b348015610bd957600080fd5b50610c8260048036036040811015610bf057600080fd5b81359190810190604081016020820135600160201b811115610c1157600080fd5b820183602082011115610c2357600080fd5b803590602001918460208302840111600160201b83111715610c4457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506129b5945050505050565b60405180826004811115610a3257fe5b348015610c9e57600080fd5b5061050560048036036020811015610cb557600080fd5b50356001600160a01b03166129e1565b348015610cd157600080fd5b506105056129f5565b348015610ce657600080fd5b5061055660048036036020811015610cfd57600080fd5b810190602081018135600160201b811115610d1757600080fd5b820183602082011115610d2957600080fd5b803590602001918460018302840111600160201b83111715610d4a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506129fb945050505050565b348015610d9757600080fd5b5061060c60048036036020811015610dae57600080fd5b5035612a50565b348015610dc157600080fd5b5061055660048036036020811015610dd857600080fd5b50356001600160a01b0316612a7e565b348015610df457600080fd5b5061056d612b68565b348015610e0957600080fd5b50610505612bc9565b348015610e1e57600080fd5b5061050560048036036020811015610e3557600080fd5b50356001600160a01b0316612bcf565b348015610e5157600080fd5b5061055660048036036060811015610e6857600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b811115610e9757600080fd5b820183602082011115610ea957600080fd5b803590602001918460018302840111600160201b83111715610eca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612c37945050505050565b348015610f1757600080fd5b50610c8260048036036020811015610f2e57600080fd5b5035612cce565b348015610f4157600080fd5b5061055660048036036040811015610f5857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610f8257600080fd5b820183602082011115610f9457600080fd5b803590602001918460018302840111600160201b83111715610fb557600080fd5b509092509050612d63565b348015610fcc57600080fd5b50610556612ea5565b348015610fe157600080fd5b5061056d612f26565b348015610ff657600080fd5b506105566004803603604081101561100d57600080fd5b506001600160a01b0381351690602001351515612f87565b34801561103157600080fd5b5061043c6004803603602081101561104857600080fd5b503561308c565b34801561105b57600080fd5b506105056004803603602081101561107257600080fd5b503560ff166130a3565b34801561108857600080fd5b50610a226004803603604081101561109f57600080fd5b81359190810190604081016020820135600160201b8111156110c057600080fd5b8201836020820111156110d257600080fd5b803590602001918460208302840111600160201b831117156110f357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613119945050505050565b34801561113d57600080fd5b506105056004803603602081101561115457600080fd5b503560ff16613145565b34801561116a57600080fd5b506112136004803603604081101561118157600080fd5b81359190810190604081016020820135600160201b8111156111a257600080fd5b8201836020820111156111b457600080fd5b803590602001918460208302840111600160201b831117156111d557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613189945050505050565b604080518581526001600160a01b038516602082015290810183600381111561123857fe5b60ff16815260200182600481111561124c57fe5b60ff16815260200194505050505060405180910390f35b34801561126f57600080fd5b506105566004803603608081101561128657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156112c057600080fd5b8201836020820111156112d257600080fd5b803590602001918460018302840111600160201b831117156112f357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506132cc945050505050565b34801561134057600080fd5b50610505613324565b34801561135557600080fd5b5061060c61332e565b34801561136a57600080fd5b5061043c61333d565b34801561137f57600080fd5b506105566004803603602081101561139657600080fd5b50356001600160a01b031661334d565b3480156113b257600080fd5b5061056d600480360360208110156113c957600080fd5b50356134a5565b3480156113dc57600080fd5b5061060c61374c565b3480156113f157600080fd5b506105566004803603602081101561140857600080fd5b50356001600160a01b031661375b565b34801561142457600080fd5b506105566004803603608081101561143b57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561146a57600080fd5b82018360208201111561147c57600080fd5b803590602001918460018302840111600160201b8311171561149d57600080fd5b919390929091602081019035600160201b8111156114ba57600080fd5b8201836020820111156114cc57600080fd5b803590602001918460208302840111600160201b831117156114ed57600080fd5b509092509050613845565b34801561150457600080fd5b506105056004803603604081101561151b57600080fd5b50803590602001356138c7565b34801561153457600080fd5b506105566004803603604081101561154b57600080fd5b506001600160a01b03813581169160200135166138ee565b34801561156f57600080fd5b5061043c6004803603602081101561158657600080fd5b50356139a5565b34801561159957600080fd5b5061060c6139bc565b3480156115ae57600080fd5b50610556600480360360808110156115c557600080fd5b81359190810190604081016020820135600160201b8111156115e657600080fd5b8201836020820111156115f857600080fd5b803590602001918460208302840111600160201b8311171561161957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561166857600080fd5b82018360208201111561167a57600080fd5b803590602001918460208302840111600160201b8311171561169b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156116ea57600080fd5b8201836020820111156116fc57600080fd5b803590602001918460208302840111600160201b8311171561171d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506139cb945050505050565b34801561176757600080fd5b5061043c6004803603604081101561177e57600080fd5b506001600160a01b0381358116916020013516613b01565b3480156117a257600080fd5b50610556600480360360208110156117b957600080fd5b5035613b2f565b3480156117cc57600080fd5b5061043c613c05565b3480156117e157600080fd5b5061060c613c28565b3480156117f657600080fd5b506105566004803603608081101561180d57600080fd5b508035906001600160a01b036020820135169060ff60408201358116916060013516613c37565b34801561184057600080fd5b50610556613cd0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6000806118798484613189565b509193505050505b92915050565b60007f000000000000000000000000000000000000000000000000000000000003a9806118b2613dba565b101590505b90565b600a546001600160a01b031633146119035760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b8060105411156119445760405162461bcd60e51b81526004018080602001828103825260348152602001806158ae6034913960400191505060405180910390fd5b601154604080519182526020820183905280517f3651ff1393f20c815aec9fd17e87b2e765be1a16a740d604a1803a4d66fc6eb09281900390910190a1601155565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611a125780601f106119e757610100808354040283529160200191611a12565b820191906000526020600020905b8154815290600101906020018083116119f557829003601f168201915b5050505050905090565b6000611a2782613dc6565b611a625760405162461bcd60e51b815260040180806020018281038252602c8152602001806156db602c913960400191505060405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000611a8982612a50565b9050806001600160a01b0316836001600160a01b03161415611adc5760405162461bcd60e51b81526004018080602001828103825260218152602001806158066021913960400191505060405180910390fd5b806001600160a01b0316611aee613dd9565b6001600160a01b03161480611b0f5750611b0f81611b0a613dd9565b613b01565b611b4a5760405162461bcd60e51b81526004018080602001828103825260388152602001806155126038913960400191505060405180910390fd5b611b548383613ddd565b505050565b600e546000906001600160a01b031615801590611b795750601154601054105b905090565b600c546001600160a01b031681565b6000611b9884612a50565b6001600160a01b038116600090815262080028602090815260409182902054825130606090811b82850152630f57462560e01b603483015233811b60388301526bffffffffffffffffffffffff1986821b16604c83015281018990526080808201929092528351808203909201825260a0019092528151910120909150611c228282878787613e4b565b5050505050565b60105481565b7f000000000000000000000000000000000000000000000000000000000003a98090565b611c64611c5e613dd9565b82613f81565b611c9f5760405162461bcd60e51b81526004018080602001828103825260318152602001806158496031913960400191505060405180910390fd5b611b5483838361401d565b600e546001600160a01b0316611d07576040805162461bcd60e51b815260206004820152601c60248201527f4e6f20616368696576656d656e747320636f6e74726163742073657400000000604482015290519081900360640190fd5b60115460105410611d5a576040805162461bcd60e51b815260206004820152601860248201527713585e1a5b5d5b481d5c19dc9859195cc81c995858da195960421b604482015290519081900360640190fd5b818314158015611d6a5750808314155b8015611d765750808214155b611db15760405162461bcd60e51b81526004018080602001828103825260368152602001806154566036913960400191505060405180910390fd5b611dba83612a50565b6001600160a01b0316336001600160a01b0316148015611df35750611dde82612a50565b6001600160a01b0316336001600160a01b0316145b8015611e185750611e0381612a50565b6001600160a01b0316336001600160a01b0316145b611e535760405162461bcd60e51b81526004018080602001828103825260258152602001806159386025913960400191505060405180910390fd5b600083815262080026602052604090205460ff16158015611e855750600082815262080026602052604090205460ff16155b8015611ea25750600081815262080026602052604090205460ff16155b611edd5760405162461bcd60e51b815260040180806020018281038252602d8152602001806154b8602d913960400191505060405180910390fd5b6000611ee884612cce565b90506000611ef585612614565b9050806003811115611f0357fe5b611f0c85612614565b6003811115611f1757fe5b148015611f415750816004811115611f2b57fe5b611f3485612cce565b6004811115611f3f57fe5b145b8015611f6a5750806003811115611f5457fe5b611f5d84612614565b6003811115611f6857fe5b145b8015611f935750816004811115611f7d57fe5b611f8684612cce565b6004811115611f9157fe5b145b611fce5760405162461bcd60e51b815260040180806020018281038252603581526020018061559d6035913960400191505060405180910390fd5b60008481526208002660205260408082208054600160ff199182168117909255868452918320805490921617905561200786838561417b565b9050857f247f7fffe9e25090b6c920fec5bb6b2181f3b1f96b89874234afac8aba90212f8483600089896040518086600481111561204157fe5b60ff16815260200185600481111561205557fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a2505050505050565b6001600160a01b03821660009081526001602052604081206120ae908363ffffffff6143f516565b9392505050565b600e546001600160a01b0316612112576040805162461bcd60e51b815260206004820152601c60248201527f4e6f20616368696576656d656e747320636f6e74726163742073657400000000604482015290519081900360640190fd5b60115460105410612165576040805162461bcd60e51b815260206004820152601860248201527713585e1a5b5d5b481d5c19dc9859195cc81c995858da195960421b604482015290519081900360640190fd5b818314156121a45760405162461bcd60e51b815260040180806020018281038252603481526020018061587a6034913960400191505060405180910390fd5b600c54600d546001600160a01b0391821691166121c085612a50565b6001600160a01b0316336001600160a01b03161480156121f957506121e484612a50565b6001600160a01b0316336001600160a01b0316145b801561227c5750816001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d602081101561226e57600080fd5b50516001600160a01b031633145b6122b75760405162461bcd60e51b81526004018080602001828103825260258152602001806159386025913960400191505060405180910390fd5b600085815262080026602052604090205460ff161580156122e95750600084815262080026602052604090205460ff16155b80156123065750600083815262080027602052604090205460ff16155b6123415760405162461bcd60e51b815260040180806020018281038252602d8152602001806154b8602d913960400191505060405180910390fd5b600061234c86612cce565b9050600061235987612614565b905080600381111561236757fe5b61237087612614565b600381111561237b57fe5b1480156123a5575081600481111561238f57fe5b61239887612cce565b60048111156123a357fe5b145b801561244e57508160048111156123b857fe5b60ff1660048111156123c657fe5b60048111156123d157fe5b836001600160a01b03166380057b9a876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561241557600080fd5b505afa158015612429573d6000803e3d6000fd5b505050506040513d602081101561243f57600080fd5b5051600481111561244c57fe5b145b6124895760405162461bcd60e51b815260040180806020018281038252604e815260200180615782604e913960600191505060405180910390fd5b600086815262080026602090815260408083208054600160ff1991821681179092558985526208002790935290832080549092161790556124cb88838561417b565b9050877f247f7fffe9e25090b6c920fec5bb6b2181f3b1f96b89874234afac8aba90212f848360018b8b6040518086600481111561250557fe5b60ff16815260200185600481111561251957fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a25050505050505050565b600080600061255b8585613189565b50509150915061256a82613dc6565b156125815761257882612a50565b92505050611881565b949350505050565b60006125c8878484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126a392505050565b905061260b818787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c3792505050565b50505050505050565b600061261f82613dc6565b61266b576040805162461bcd60e51b81526020600482015260186024820152772a37b5b2b71024a2103732b2b239903a379032bc34b9ba1760411b604482015290519081900360640190fd5b60046012836301000000811061267d57fe5b602081049091015460ff601f9092166101000a9004811690911c16600381111561188157fe5b60006126ad611887565b156126e95760405162461bcd60e51b81526004018080602001828103825260328152602001806159066032913960400191505060405180910390fd5b6126f1613c05565b61272c5760405162461bcd60e51b81526004018080602001828103825260238152602001806154116023913960400191505060405180910390fd5b60008060008061273c8787613189565b935093509350935061274d84613dc6565b15612797576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b71030b63932b0b23c9032bc34b9ba399760591b604482015290519081900360640190fd5b826001600160a01b0316847fdc90809cda0412ce45d4af87d938ca9961cad0864201f891447f2b02a191397b33858560405180846001600160a01b03166001600160a01b031681526020018360038111156127ee57fe5b60ff16815260200182600481111561280257fe5b60ff168152602001935050505060405180910390a361282384848484614401565b509195945050505050565b611b54838383604051806020016040528060008152506132cc565b600b546001600160a01b031633146128925760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b604080516370a0823160e01b815230600482015290516001600160a01b0384169163a9059cbb91849184916370a0823191602480820192602092909190829003018186803b1580156128e357600080fd5b505afa1580156128f7573d6000803e3d6000fd5b505050506040513d602081101561290d57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561295e57600080fd5b505af1158015612972573d6000803e3d6000fd5b505050506040513d602081101561298857600080fd5b50505050565b600061188182613dc6565b6000806129ad60028463ffffffff61457a16565b509392505050565b60008060006129c48585613189565b9350505091506129d382613dc6565b156125815761257882612cce565b620800286020526000908152604090205481565b60115481565b600a546001600160a01b03163314612a445760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b612a4d81614596565b50565b600061188182604051806060016040528060298152602001615574602991396002919063ffffffff61463f16565b600a546001600160a01b03163314612ac75760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b6001600160a01b038116612b0c5760405162461bcd60e51b81526004018080602001828103825260298152602001806156b26029913960400191505060405180910390fd5b600a546040516001600160a01b038084169216907fa3294bd3c62ef75af9339cf8fe3dd1225c58c03e6ea1bfcbae8c49436fade37a90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611a125780601f106119e757610100808354040283529160200191611a12565b600f5481565b60006001600160a01b038216612c165760405162461bcd60e51b815260040180806020018281038252602a81526020018061554a602a913960400191505060405180910390fd5b6001600160a01b03821660009081526001602052604090206118819061464c565b6000612c4284612a50565b6001600160a01b038116600090815262080028602090815260409182902054825130606090811b828501526371f0379360e01b60348301526bffffffffffffffffffffffff1986821b8116603884015289821b16604c83015281018990526080808201929092528351808203909201825260a0019092528151910120909150611c228282878787613e4b565b6000612cd982613dc6565b612d25576040805162461bcd60e51b81526020600482015260186024820152772a37b5b2b71024a2103732b2b239903a379032bc34b9ba1760411b604482015290519081900360640190fd5b601060128363010000008110612d3757fe5b602081049091015460ff601f9092166101000a90041681612d5457fe5b0660ff16600481111561188157fe5b600b546001600160a01b03163314612dac5760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b6001600160a01b038316612e07576040805162461bcd60e51b815260206004820152601e60248201527f6e65656420612076616c69642072657665727365207265676973747261720000604482015290519081900360640190fd5b60405163c47f002760e01b8152602060048201908152602482018390526001600160a01b0385169163c47f00279185918591908190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b158015612e7b57600080fd5b505af1158015612e8f573d6000803e3d6000fd5b505050506040513d6020811015611c2257600080fd5b600a546001600160a01b03163314612eee5760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600e805460ff60a01b191690556040517febe230014056e5cb4ca6d8e534189bf5bfb0759489f16170654dce7c014b669990600090a1565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611a125780601f106119e757610100808354040283529160200191611a12565b612f8f613dd9565b6001600160a01b0316826001600160a01b03161415612ff5576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060056000613002613dd9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155613046613dd9565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b620800266020526000908152604090205460ff1681565b600080805b620800128460038111156130b857fe5b600481106130c257fe5b5050600581101561311257613108620800128560038111156130e057fe5b600481106130ea57fe5b6005020182600581106130f957fe5b0154839063ffffffff61465716565b91506001016130a8565b5092915050565b60008060006131288585613189565b50925050915061313782613dc6565b156125815761257882612614565b600080805b60048110156131125761317f62080012826004811061316557fe5b6005020185600481111561317557fe5b600581106130f957fe5b915060010161314a565b6000806000806000801916600f5414156131e2576040805162461bcd60e51b81526020600482015260156024820152742937b7ba103732b2b239903a379031329039b2ba1760591b604482015290519081900360640190fd5b6131ef85600f54886146b1565b613237576040805162461bcd60e51b81526020600482015260146024820152732b32b934b334b1b0ba34b7b7103330b4b632b21760611b604482015290519081900360640190fd5b60a886901c6000600488600b1a901c60ff16600381111561325457fe5b90506000601089600b1a8161326557fe5b0660ff16600481111561327457fe5b9050886001600160a01b0381166132bc5760405162461bcd60e51b81526004018080602001828103825260248152602001806158e26024913960400191505060405180910390fd5b9299929850909650945092505050565b6132dd6132d7613dd9565b83613f81565b6133185760405162461bcd60e51b81526004018080602001828103825260318152602001806158496031913960400191505060405180910390fd5b6129888484848461475a565b6000611b79613dba565b600e546001600160a01b031681565b600e54600160a01b900460ff1681565b600a546001600160a01b031633146133965760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fbcbd71db7b4316a53879e015e1d9b40b027737232537d68494da4f0c2012477e90600090a26001600160a01b03811615612a4d57600e54604080516301ffc9a760e01b81526358cac59760e01b600482015290516001600160a01b03909216916301ffc9a791602480820192602092909190829003018186803b15801561343e57600080fd5b505afa158015613452573d6000803e3d6000fd5b505050506040513d602081101561346857600080fd5b5051612a4d5760405162461bcd60e51b815260040180806020018281038252603781526020018061534d6037913960400191505060405180910390fd5b60606134b082613dc6565b6134eb5760405162461bcd60e51b815260040180806020018281038252602f815260200180615730602f913960400191505060405180910390fd5b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156135805780601f1061355557610100808354040283529160200191613580565b820191906000526020600020905b81548152906001019060200180831161356357829003601f168201915b5050600954939450505050600260001961010060018416150201909116046135a9579050611867565b80511561367a5760098160405160200180838054600181600116156101000203166002900480156136115780601f106135ef576101008083540402835291820191613611565b820191906000526020600020905b8154815290600101906020018083116135fd575b5050825160208401908083835b6020831061363d5780518252601f19909201916020918201910161361e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050611867565b6009613685846147ac565b60405160200180838054600181600116156101000203166002900480156136e35780601f106136c15761010080835404028352918201916136e3565b820191906000526020600020905b8154815290600101906020018083116136cf575b5050825160208401908083835b6020831061370f5780518252601f1990920191602091820191016136f0565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b600b546001600160a01b031681565b600b546001600160a01b031633146137a45760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b6001600160a01b0381166137e95760405162461bcd60e51b81526004018080602001828103825260328152602001806156106032913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907fe74ad8e35ae0d7f4389ff1318666007250321a66dd644dca021b5e2e30fa2a5c90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000613884878484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506126a392505050565b905061260b818787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8d92505050565b6208001282600481106138d657fe5b6005020181600581106138e557fe5b01549150829050565b600b546001600160a01b031633146139375760405162461bcd60e51b81526004018080602001828103825260368152602001806157d06036913960400191505060405180910390fd5b6040805163a22cb46560e01b81526001600160a01b0383811660048301526001602483015291519184169163a22cb4659160448082019260009290919082900301818387803b15801561398957600080fd5b505af115801561399d573d6000803e3d6000fd5b505050505050565b620800276020526000908152604090205460ff1681565b600a546001600160a01b031681565b600a546001600160a01b03163314613a145760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b613a1c611887565b15613a585760405162461bcd60e51b81526004018080602001828103825260328152602001806159066032913960400191505060405180910390fd5b81518351148015613a6a575080518351145b613aa55760405162461bcd60e51b815260040180806020018281038252602c815260200180615642602c913960400191505060405180910390fd5b825160005b8181101561399d57613af9818701868381518110613ac457fe5b6020026020010151868481518110613ad857fe5b6020026020010151868581518110613aec57fe5b6020026020010151614401565b600101613aaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314613b785760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600f5415613bcd576040805162461bcd60e51b815260206004820152601760248201527f43616e206f6e6c792073657420726f6f74206f6e63652e000000000000000000604482015290519081900360640190fd5b6040805182815290517f8da3b39d20c8b9bb14a9b3572001c5f931b42ddb39565ba2b0fd2d1fa68169b39181900360200190a1600f55565b6000613c0f611887565b158015611b79575050600e54600160a01b900460ff1690565b600d546001600160a01b031681565b600a546001600160a01b03163314613c805760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b613c88611887565b15613cc45760405162461bcd60e51b81526004018080602001828103825260328152602001806159066032913960400191505060405180910390fd5b61298884848484614401565b600a546001600160a01b03163314613d195760405162461bcd60e51b815260040180806020018281038252602d8152602001806154e5602d913960400191505060405180910390fd5b600f54613d65576040805162461bcd60e51b81526020600482015260156024820152742937b7ba103732b2b239903a379031329039b2ba1760591b604482015290519081900360640190fd5b600e805460ff60a01b1916600160a01b1790556040517f8ff3deee4c40ab085dd8d7d0c848cb5295e4ab5faa32e5b60e3936cf1bdc77bf90600090a1565b8051613db6906009906020840190615260565b5050565b6000611b796002614887565b600061188160028363ffffffff61489216565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613e1282612a50565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613e568561489e565b90506000613e6482846148ef565b9050866001600160a01b0316816001600160a01b031614613eb65760405162461bcd60e51b815260040180806020018281038252603e8152602001806155d2603e913960400191505060405180910390fd5b6001600160a01b0387811660008181526208002860209081526040918290205482513381529182015281518994891693927fba05f551fcc429cba611372aa0055e3573f26273f66d1a48bdb5b4f7896bf022928290030190a46001600160a01b0387166000908152620800286020526040902054613f3b90600163ffffffff61465716565b620800286000896001600160a01b03166001600160a01b031681526020019081526020016000208190555061260b8785876040518060200160405280600081525061475a565b6000613f8c82613dc6565b613fc75760405162461bcd60e51b815260040180806020018281038252602c81526020018061548c602c913960400191505060405180910390fd5b6000613fd283612a50565b9050806001600160a01b0316846001600160a01b0316148061400d5750836001600160a01b031661400284611a1c565b6001600160a01b0316145b8061258157506125818185613b01565b826001600160a01b031661403082612a50565b6001600160a01b0316146140755760405162461bcd60e51b81526004018080602001828103825260298152602001806157076029913960400191505060405180910390fd5b6001600160a01b0382166140ba5760405162461bcd60e51b81526004018080602001828103825260248152602001806153ed6024913960400191505060405180910390fd5b6140c5838383611b54565b6140d0600082613ddd565b6001600160a01b03831660009081526001602052604090206140f8908263ffffffff614ad616565b506001600160a01b0382166000908152600160205260409020614121908263ffffffff614ae216565b506141346002828463ffffffff614aee16565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008061419b600184600481111561418f57fe5b9063ffffffff61465716565b60048111156141a657fe5b90508060048111156141b457fe5b60108560038111156141c257fe5b0201601286630100000081106141d457fe5b602091828204019190066101000a81548160ff021916908360ff16021790555061423b60016208001286600381111561420957fe5b6004811061421357fe5b6005020185600481111561422357fe5b6005811061422d57fe5b01549063ffffffff614b0416565b6208001285600381111561424b57fe5b6004811061425557fe5b6005020184600481111561426557fe5b6005811061426f57fe5b01556142b860016208001286600381111561428657fe5b6004811061429057fe5b600502018360048111156142a057fe5b600581106142aa57fe5b01549063ffffffff61465716565b620800128560038111156142c857fe5b600481106142d257fe5b600502018260048111156142e257fe5b600581106142ec57fe5b015560105461430290600163ffffffff61465716565b601055600e546040516358cac59760e01b808252600480830189815291936001600160a01b0316926358cac597928a928992889291602490910190849081111561434857fe5b60ff16815260200182600481111561435c57fe5b60ff1681526020019350505050602060405180830381600087803b15801561438357600080fd5b505af1158015614397573d6000803e3d6000fd5b505050506040513d60208110156143ad57600080fd5b50516001600160e01b031916146125815760405162461bcd60e51b81526004018080602001828103825260408152602001806153ad6040913960400191505060405180910390fd5b60006120ae8383614b46565b61440a84613dc6565b156144d35781600381111561441b57fe5b61442485612614565b600381111561442f57fe5b1461446b5760405162461bcd60e51b81526004018080602001828103825260228152602001806158276022913960400191505060405180910390fd5b6010546144ce5780600481111561447e57fe5b61448785612cce565b600481111561449257fe5b146144ce5760405162461bcd60e51b815260040180806020018281038252602381526020018061575f6023913960400191505060405180910390fd5b612988565b6144dd8385614baa565b8060048111156144e957fe5b60108360038111156144f757fe5b02016012856301000000811061450957fe5b602091828204019190066101000a81548160ff021916908360ff16021790555061453e60016208001284600381111561428657fe5b6208001283600381111561454e57fe5b6004811061455857fe5b6005020182600481111561456857fe5b6005811061457257fe5b015550505050565b60008080806145898686614ce4565b9097909650945050505050565b61459f81613da3565b7f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea726145c8612b68565b6040805160208082528351818301528351919283929083019185019080838360005b838110156146025781810151838201526020016145ea565b50505050905090810190601f16801561462f5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6000612581848484614d46565b600061188182614df2565b6000828201838110156120ae576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081815b855181101561474f5760008682815181106146cd57fe5b602002602001015190508083116147145782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250614746565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b506001016146b6565b509092149392505050565b61476584848461401d565b61477184848484614df6565b6129885760405162461bcd60e51b815260040180806020018281038252603281526020018061531b6032913960400191505060405180910390fd5b6060816147d157506040805180820190915260018152600360fc1b6020820152611867565b8160005b81156147e957600101600a820491506147d5565b60608167ffffffffffffffff8111801561480257600080fd5b506040519080825280601f01601f19166020018201604052801561482d576020820181803683370190505b50859350905060001982015b831561487e57600a840660300160f81b8282806001900393508151811061485c57fe5b60200101906001600160f81b031916908160001a905350600a84049350614839565b50949350505050565b600061188182615031565b60006120ae8383615038565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114614947576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156149b85760405162461bcd60e51b81526004018080602001828103825260228152602001806154346022913960400191505060405180910390fd5b8060ff16601b141580156149d057508060ff16601c14155b15614a0c5760405162461bcd60e51b815260040180806020018281038252602281526020018061566e6022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015614a64573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614acc576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b60006120ae838361504d565b60006120ae8383615113565b600061258184846001600160a01b03851661515d565b60006120ae83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506151b5565b81546000908210614b885760405162461bcd60e51b81526004018080602001828103825260228152602001806152f96022913960400191505060405180910390fd5b826000018281548110614b9757fe5b9060005260206000200154905092915050565b6001600160a01b038216614c05576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614c0e81613dc6565b15614c60576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b614c6c60008383611b54565b6001600160a01b0382166000908152600160205260409020614c94908263ffffffff614ae216565b50614ca76002828463ffffffff614aee16565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008082614cf28582615038565b614d2d5760405162461bcd60e51b81526004018080602001828103825260228152602001806156906022913960400191505060405180910390fd5b6000818152602095909552604090942054939492505050565b6000614d528484615038565b8290614ddc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614da1578181015183820152602001614d89565b50505050905090810190601f168015614dce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050506000908152602091909152604090205490565b5490565b6000614e0a846001600160a01b031661520f565b614e1657506001612581565b600060606001600160a01b038616630a85bd0160e11b614e34613dd9565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614ead578181015183820152602001614e95565b50505050905090810190601f168015614eda5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310614f425780518252601f199092019160209182019101614f23565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614fa4576040519150601f19603f3d011682016040523d82523d6000602084013e614fa9565b606091505b509150915081614ffa57805115614fc35780518082602001fd5b60405162461bcd60e51b815260040180806020018281038252603281526020018061531b6032913960400191505060405180910390fd5b600081806020019051602081101561501157600080fd5b50516001600160e01b031916630a85bd0160e11b14935061258192505050565b6001015490565b60009081526020919091526040902054151590565b60008181526001830160205260408120548015615109578354600019808301919081019060009087908390811061508057fe5b906000526020600020015490508087600001848154811061509d57fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806150cd57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611881565b6000915050611881565b600061511f8383615248565b61515557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611881565b506000611881565b6000828152602084905260408120548190615183575060018085018054820190556151a0565b8261519c575060018401805460001901905560006151a0565b5060005b60009384526020949094525060409091205590565b600081848411156152075760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614da1578181015183820152602001614d89565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612581575050151592915050565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106152a157805160ff19168380011785556152ce565b828001600101855582156152ce579182015b828111156152ce5782518255916020019190600101906152b3565b506152da9291506152de565b5090565b6118b791905b808211156152da57600081556001016152e456fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724e65656420746f20696d706c656d656e742074686520616368696576656d656e747320757067726164696e6720696e746572666163652154686520636f6e74726163742063616e6e6f74207265636569766520455448207061796d656e74732e416368696576656d656e747320757067726164696e673a20676f7420756e6b6e6f776e2076616c75652066726f6d206f6e435332436f6c6f724368616e6765644552433732313a207472616e7366657220746f20746865207a65726f20616464726573735075626c6963206d696e74696e67206e6565647320746f20626520616c6c6f7765642e45434453413a20696e76616c6964207369676e6174757265202773272076616c7565596f752061637475616c6c79206e65656420746f20757365203320646966666572656e7420746f6b656e7320746f20757067726164654552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e6e6f742075736564207374616d707320616c7265616479207573656420696e206120757067726164652e637265617465436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e416c6c20746f6b656e7320696e766f6c766564206d7573742068617665207468652073616d65207479706520616e6420636f6c6f725369676e6174757265206e6565647320746f206d6174636820706172616d65746572732c206e6f6e63652c20616e642063757272656e74206f776e65722e746f6b656e41737369676e6d656e74436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e416c6c20676976656e20617272617973206e65656420746f206265207468652073616d65206c656e6774682e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473637265617465436f6e74726f6c2063616e6e6f7420626520746865207a65726f20616464726573732e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e436f6c6f72206d69736d617463682077697468206578697374696e6720746f6b656e2e416c6c20746f6b656e7320696e766f6c766564206d7573742068617665207468652073616d6520636f6c6f722c20616e6420616c6c2043533220746f6b656e73207468652073616d652074797065746f6b656e41737369676e6d656e74436f6e74726f6c206b657920726571756972656420666f7220746869732066756e6374696f6e2e4552433732313a20617070726f76616c20746f2063757272656e74206f776e657254797065206d69736d617463682077697468206578697374696e6720746f6b656e2e4552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564596f752061637475616c6c79206e65656420746f2075736520646966666572656e7420746f6b656e7320746f2075706772616465416c7265616479206d6f726520757067726164657320646f6e65207468616e2074686520726571756573746564206c696d69742e746f6b656e44617461206e6565647320746f20636f6e7461696e20616e206f776e65722e546869732063616c6c206f6e6c7920776f726b73207768656e206d696e74696e67206973206e6f742066696e69736865642e43616c6c65722068617320746f206265206f776e6572206f6620616c6c20746f6b656e732ea2646970667358221220621e5be191a6a40b4990ad61c0d1acb118c68d2078ddfbce92f383423741391d64736f6c63430006080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d39a7ad8ebe8c57aab85f868fe0d454e1aa5349e000000000000000000000000596e620e175c2c37a5f35a41d9f2305a991ffc890000000000000000000000007e789e2dd1340971de0a9bca35b14ac0939aa3300000000000000000000000006b0ec039d368b9a9d044391de2437ba24131e87b000000000000000000000000000000000000000000000000000000000003a9800000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _createControl (address): 0xd39a7ad8ebE8C57aaB85f868fE0d454e1Aa5349E
Arg [1] : _tokenAssignmentControl (address): 0x596E620E175C2C37A5f35A41d9F2305A991fFc89
Arg [2] : _CS1Address (address): 0x7e789E2dd1340971De0A9bca35b14AC0939Aa330
Arg [3] : _CS1ColorsAddress (address): 0x6b0Ec039d368b9A9D044391DE2437BA24131E87b
Arg [4] : _finalSupply (uint256): 240000
Arg [5] : _upgradeMaximum (uint256): 0
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000d39a7ad8ebe8c57aab85f868fe0d454e1aa5349e
Arg [1] : 000000000000000000000000596e620e175c2c37a5f35a41d9f2305a991ffc89
Arg [2] : 0000000000000000000000007e789e2dd1340971de0a9bca35b14ac0939aa330
Arg [3] : 0000000000000000000000006b0ec039d368b9a9d044391de2437ba24131e87b
Arg [4] : 000000000000000000000000000000000000000000000000000000000003a980
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
70570:26077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96585:51;;-1:-1:-1;;;96585:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70570:26077;12:1:-1;9;2:12;10734:142:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10734:142:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10734:142:0;-1:-1:-1;;;;;;10734:142:0;;:::i;:::-;;;;;;;;;;;;;;;;;;79232:286;;5:9:-1;2:2;;;27:1;24;17:12;2:2;79232:286:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;79232:286:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;79232:286:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;79232:286:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;79232:286:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;79232:286:0;;-1:-1:-1;79232:286:0;;-1:-1:-1;;;;;79232:286:0:i;:::-;;;;;;;;;;;;;;;;83824:131;;5:9:-1;2:2;;;27:1;24;17:12;2:2;83824:131:0;;;:::i;75757:332::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;75757:332:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;75757:332:0;;:::i;:::-;;39248:92;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39248:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39248:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44040:213;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44040:213:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44040:213:0;;:::i;:::-;;;;-1:-1:-1;;;;;44040:213:0;;;;;;;;;;;;;;43357:390;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43357:390:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;43357:390:0;;;;;;;;:::i;89825:158::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;89825:158:0;;;:::i;70939:25::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70939:25:0;;;:::i;87316:569::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;87316:569:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;87316:569:0;;;-1:-1:-1;;;;;87316:569:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;87316:569:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;87316:569:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;87316:569:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;87316:569:0;;-1:-1:-1;87316:569:0;;-1:-1:-1;;;;;87316:569:0:i;71233:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71233:31:0;;;:::i;76636:109::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;76636:109:0;;;:::i;45788:305::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45788:305:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;45788:305:0;;;;;;;;;;;;;;;;;:::i;90075:1768::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;90075:1768:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;90075:1768:0;;;;;;;;;;;;:::i;41892:154::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41892:154:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;41892:154:0;;;;;;;;:::i;91974:1899::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;91974:1899:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;91974:1899:0;;;;;;;;;;;;:::i;79918:334::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;79918:334:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;79918:334:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;79918:334:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;79918:334:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;79918:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;79918:334:0;;-1:-1:-1;79918:334:0;;-1:-1:-1;;;;;79918:334:0:i;88905:274::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;88905:274:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;88905:274:0;;;-1:-1:-1;;;;;88905:274:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;88905:274:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;88905:274:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;88905:274:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;88905:274:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;88905:274:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;88905:274:0;;-1:-1:-1;88905:274:0;-1:-1:-1;88905:274:0;:::i;84904:218::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;84904:218:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;84904:218:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78263:566;;5:9:-1;2:2;;;27:1;24;17:12;2:2;78263:566:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;78263:566:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;78263:566:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;78263:566:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;78263:566:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;78263:566:0;;-1:-1:-1;78263:566:0;;-1:-1:-1;;;;;78263:566:0:i;46755:151::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46755:151:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;46755:151:0;;;;;;;;;;;;;;;;;:::i;95998:193::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;95998:193:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;95998:193:0;;;;;;;;;;:::i;85438:112::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;85438:112:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85438:112:0;;:::i;42762:164::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42762:164:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42762:164:0;;:::i;81252:334::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;81252:334:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;81252:334:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;81252:334:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;81252:334:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;81252:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;81252:334:0;;-1:-1:-1;81252:334:0;;-1:-1:-1;;;;;81252:334:0:i;:::-;;;;;;;;;;;;71587:54;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71587:54:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71587:54:0;-1:-1:-1;;;;;71587:54:0;;:::i;71271:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71271:29:0;;;:::i;84723:136::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;84723:136:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;84723:136:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;84723:136:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;84723:136:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;84723:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;84723:136:0;;-1:-1:-1;84723:136:0;;-1:-1:-1;;;;;84723:136:0:i;38968:169::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38968:169:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38968:169:0;;:::i;74882:320::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;74882:320:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;74882:320:0;-1:-1:-1;;;;;74882:320:0;;:::i;41421:89::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41421:89:0;;;:::i;71201:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71201:23:0;;;:::i;38527:215::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38527:215:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38527:215:0;-1:-1:-1;;;;;38527:215:0;;:::i;86568:483::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;86568:483:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;86568:483:0;;;-1:-1:-1;;;;;86568:483:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;86568:483:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;86568:483:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;86568:483:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;86568:483:0;;-1:-1:-1;86568:483:0;;-1:-1:-1;;;;;86568:483:0:i;85168:211::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;85168:211:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85168:211:0;;:::i;95503:306::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;95503:306:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;95503:306:0;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;95503:306:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;95503:306:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;95503:306:0;;-1:-1:-1;95503:306:0;-1:-1:-1;95503:306:0;:::i;84310:156::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;84310:156:0;;;:::i;39455:96::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39455:96:0;;;:::i;44560:295::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44560:295:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;44560:295:0;;;;;;;;;;:::i;71478:45::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71478:45:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71478:45:0;;:::i;85560:323::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;85560:323:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85560:323:0;;;;:::i;80572:335::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;80572:335:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;80572:335:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;80572:335:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;80572:335:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;80572:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;80572:335:0;;-1:-1:-1;80572:335:0;;-1:-1:-1;;;;;80572:335:0:i;85893:314::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;85893:314:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85893:314:0;;;;:::i;81959:817::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;81959:817:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;81959:817:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;81959:817:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;81959:817:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;81959:817:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;81959:817:0;;-1:-1:-1;81959:817:0;;-1:-1:-1;;;;;81959:817:0:i;:::-;;;;;;;-1:-1:-1;;;;;81959:817:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47643:285;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47643:285:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;47643:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;47643:285:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;47643:285:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47643:285:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;47643:285:0;;-1:-1:-1;47643:285:0;;-1:-1:-1;;;;;47643:285:0:i;76908:109::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;76908:109:0;;;:::i;71009:50::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71009:50:0;;;:::i;71156:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71156:38:0;;;:::i;75248:501::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;75248:501:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;75248:501:0;-1:-1:-1;;;;;75248:501:0;;:::i;40427:755::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40427:755:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40427:755:0;;:::i;70895:37::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70895:37:0;;;:::i;74464:410::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;74464:410:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;74464:410:0;-1:-1:-1;;;;;74464:410:0;;:::i;89354:297::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;89354:297:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;89354:297:0;;;-1:-1:-1;;;;;89354:297:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;89354:297:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;89354:297:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;89354:297:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;89354:297:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;89354:297:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;89354:297:0;;-1:-1:-1;89354:297:0;-1:-1:-1;89354:297:0;:::i;71360:36::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71360:36:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71360:36:0;;;;;;;:::i;96307:170::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;96307:170:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;96307:170:0;;;;;;;;;;:::i;71530:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71530:48:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71530:48:0;;:::i;70860:28::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70860:28:0;;;:::i;77618:587::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;77618:587:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;77618:587:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;77618:587:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;77618:587:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;77618:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;77618:587:0;;;;;;;;-1:-1:-1;77618:587:0;;-1:-1:-1;;;;;11:28;;8:2;;;52:1;49;42:12;8:2;77618:587:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;77618:587:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;77618:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;77618:587:0;;;;;;;;-1:-1:-1;77618:587:0;;-1:-1:-1;;;;;11:28;;8:2;;;52:1;49;42:12;8:2;77618:587:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;77618:587:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;77618:587:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;77618:587:0;;-1:-1:-1;77618:587:0;;-1:-1:-1;;;;;77618:587:0:i;45185:156::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45185:156:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;45185:156:0;;;;;;;;;;:::i;76097:236::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;76097:236:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;76097:236:0;;:::i;84533:142::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;84533:142:0;;;:::i;70971:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70971:31:0;;;:::i;77242:306::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;77242:306:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;77242:306:0;;;-1:-1:-1;;;;;77242:306:0;;;;;;;;;;;;;;;;;;;:::i;84039:221::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;84039:221:0;;;:::i;10734:142::-;-1:-1:-1;;;;;;10835:33:0;;10811:4;10835:33;;;;;;;;;;;;;10734:142;;;;:::o;79232:286::-;79341:7;79362:15;79439:46;79462:9;79473:11;79439:22;:46::i;:::-;-1:-1:-1;79361:124:0;;-1:-1:-1;;;;79232:286:0;;;;;:::o;83824:131::-;83882:4;83935:11;83912:19;:17;:19::i;:::-;:34;;83904:43;;83824:131;;:::o;75757:332::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75887:18:::1;75871:12;;:34;;75863:99;;;;-1:-1:-1::0;;;75863:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76000:14;::::0;75978:57:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;76046:14;:35:::0;75757:332::o;39248:92::-;39327:5;39320:12;;;;;;;;-1:-1:-1;;39320:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39294:13;;39320:12;;39327:5;;39320:12;;39327:5;39320:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39248:92;:::o;44040:213::-;44108:7;44136:16;44144:7;44136;:16::i;:::-;44128:73;;;;-1:-1:-1;;;44128:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44221:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44221:24:0;;44040:213::o;43357:390::-;43438:13;43454:16;43462:7;43454;:16::i;:::-;43438:32;;43495:5;-1:-1:-1;;;;;43489:11:0;:2;-1:-1:-1;;;;;43489:11:0;;;43481:57;;;;-1:-1:-1;;;43481:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43575:5;-1:-1:-1;;;;;43559:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;43559:21:0;;:62;;;;43584:37;43601:5;43608:12;:10;:12::i;:::-;43584:16;:37::i;:::-;43551:154;;;;-1:-1:-1;;;43551:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43718:21;43727:2;43731:7;43718:8;:21::i;:::-;43357:390;;;:::o;89825:158::-;89906:20;;89873:4;;-1:-1:-1;;;;;89906:20:0;89898:43;;;;:76;;;89960:14;;89945:12;;:29;89898:76;89890:85;;89825:158;:::o;70939:25::-;;;-1:-1:-1;;;;;70939:25:0;;:::o;87316:569::-;87436:20;87459:17;87467:8;87459:7;:17::i;:::-;-1:-1:-1;;;;;87761:33:0;;87626:12;87761:33;;;:19;:33;;;;;;;;;;87651:144;;87676:4;87651:144;;;;;;;;-1:-1:-1;;;87651:144:0;;;;87725:10;87651:144;;;;;;-1:-1:-1;;87651:144:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;87651:144:0;;;;;87641:155;;;;;87436:40;;-1:-1:-1;87807:70:0;87436:40;87641:155;87751:8;87861:3;87866:10;87807:23;:70::i;:::-;87316:569;;;;;:::o;71233:31::-;;;;:::o;76636:109::-;76726:11;76636:109;:::o;45788:305::-;45949:41;45968:12;:10;:12::i;:::-;45982:7;45949:18;:41::i;:::-;45941:103;;;;-1:-1:-1;;;45941:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46057:28;46067:4;46073:2;46077:7;46057:9;:28::i;90075:1768::-;90216:20;;-1:-1:-1;;;;;90216:20:0;90200:84;;;;;-1:-1:-1;;;90200:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;90318:14;;90303:12;;:29;90295:66;;;;;-1:-1:-1;;;90295:66:0;;;;;;;;;;;;-1:-1:-1;;;90295:66:0;;;;;;;;;;;;;;;90399:15;90380;:34;;:89;;;;;90454:15;90435;:34;;90380:89;:144;;;;;90509:15;90490;:34;;90380:144;90372:228;;;;-1:-1:-1;;;90372:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90633:24;90641:15;90633:7;:24::i;:::-;-1:-1:-1;;;;;90619:38:0;:10;-1:-1:-1;;;;;90619:38:0;;:97;;;;;90692:24;90700:15;90692:7;:24::i;:::-;-1:-1:-1;;;;;90678:38:0;:10;-1:-1:-1;;;;;90678:38:0;;90619:97;:156;;;;;90751:24;90759:15;90751:7;:24::i;:::-;-1:-1:-1;;;;;90737:38:0;:10;-1:-1:-1;;;;;90737:38:0;;90619:156;90611:223;;;;-1:-1:-1;;;90611:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90853:30;;;;:13;:30;;;;;;;;:39;;;:99;;-1:-1:-1;90913:30:0;;;;:13;:30;;;;;;;;:39;90853:99;:159;;;;-1:-1:-1;90973:30:0;;;;:13;:30;;;;;;;;:39;90853:159;90845:234;;;;-1:-1:-1;;;90845:234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91090:20;91113:25;91122:15;91113:8;:25::i;:::-;91090:48;;91149:15;91167:24;91175:15;91167:7;:24::i;:::-;91149:42;;91238:5;91210:33;;;;;;;;:24;91218:15;91210:7;:24::i;:::-;:33;;;;;;;;;:79;;;;;91276:13;91247:42;;;;;;;;:25;91256:15;91247:8;:25::i;:::-;:42;;;;;;;;;91210:79;:133;;;;;91338:5;91310:33;;;;;;;;:24;91318:15;91310:7;:24::i;:::-;:33;;;;;;;;;91210:133;:179;;;;;91376:13;91347:42;;;;;;;;:25;91356:15;91347:8;:25::i;:::-;:42;;;;;;;;;91210:179;91202:262;;;;-1:-1:-1;;;91202:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91475:30;;;;:13;:30;;;;;;:37;;91508:4;-1:-1:-1;;91475:37:0;;;;;;;;91523:30;;;;;;:37;;;;;;;;91671:52;91685:15;91702:5;91709:13;91671;:52::i;:::-;91653:70;;91753:15;91739:96;91770:13;91785:8;91795:5;91802:15;91819;91739:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;91739:96:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;91739:96:0;-1:-1:-1;91739:96:0;90075:1768;;;;;;:::o;41892:154::-;-1:-1:-1;;;;;42008:20:0;;41981:7;42008:20;;;:13;:20;;;;;:30;;42032:5;42008:30;:23;:30;:::i;:::-;42001:37;41892:154;-1:-1:-1;;;41892:154:0:o;91974:1899::-;92125:20;;-1:-1:-1;;;;;92125:20:0;92109:84;;;;;-1:-1:-1;;;92109:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;92227:14;;92212:12;;:29;92204:66;;;;;-1:-1:-1;;;92204:66:0;;;;;;;;;;;;-1:-1:-1;;;92204:66:0;;;;;;;;;;;;;;;92308:14;92289:15;:33;;92281:98;;;;-1:-1:-1;;;92281:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92412:10;;92468:16;;-1:-1:-1;;;;;92412:10:0;;;;92468:16;92518:24;92526:15;92518:7;:24::i;:::-;-1:-1:-1;;;;;92504:38:0;:10;-1:-1:-1;;;;;92504:38:0;;:96;;;;;92577:23;92585:14;92577:7;:23::i;:::-;-1:-1:-1;;;;;92563:37:0;:10;-1:-1:-1;;;;;92563:37:0;;92504:96;:161;;;;;92635:3;-1:-1:-1;;;;;92635:11:0;;92647:17;92635:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;92635:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92635:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;92635:30:0;-1:-1:-1;;;;;92621:44:0;:10;:44;92504:161;92496:228;;;;-1:-1:-1;;;92496:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92743:30;;;;:13;:30;;;;;;;;:39;;;:98;;-1:-1:-1;92803:29:0;;;;:13;:29;;;;;;;;:38;92743:98;:163;;;;-1:-1:-1;92862:35:0;;;;:16;:35;;;;;;;;:44;92743:163;92735:238;;;;-1:-1:-1;;;92735:238:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92984:20;93007:25;93016:15;93007:8;:25::i;:::-;92984:48;;93043:15;93061:24;93069:15;93061:7;:24::i;:::-;93043:42;;93239:5;93212:32;;;;;;;;:23;93220:14;93212:7;:23::i;:::-;:32;;;;;;;;;:77;;;;;93276:13;93248:41;;;;;;;;:24;93257:14;93248:8;:24::i;:::-;:41;;;;;;;;;93212:77;:178;;;;;93375:13;93369:20;;;;;;;;93351:39;;;;;;;;;;93310:80;;;;;;;;:9;-1:-1:-1;;;;;93310:18:0;;93329:17;93310:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;93310:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93310:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;93310:37:0;:80;;;;;;;;;93212:178;93204:286;;;;-1:-1:-1;;;93204:286:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93501:29;;;;:13;:29;;;;;;;;:36;;93533:4;-1:-1:-1;;93501:36:0;;;;;;;;93548:35;;;:16;:35;;;;;;:42;;;;;;;;93701:52;93715:15;93732:5;93739:13;93701;:52::i;:::-;93683:70;;93783:15;93769:96;93800:13;93815:8;93825:4;93831:14;93847:17;93769:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93769:96:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93769:96:0;-1:-1:-1;93769:96:0;91974:1899;;;;;;;;:::o;79918:334::-;80025:7;80046:15;80063:13;80119:46;80142:9;80153:11;80119:22;:46::i;:::-;80045:120;;;;;;80180:16;80188:7;80180;:16::i;:::-;80176:45;;;80205:16;80213:7;80205;:16::i;:::-;80198:23;;;;;;80176:45;80239:5;79918:334;-1:-1:-1;;;;79918:334:0:o;88905:274::-;89063:15;89081:39;89097:9;89108:11;;89081:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;89081:15:0;;-1:-1:-1;;;89081:39:0:i;:::-;89063:57;;89131:40;89146:7;89155:3;89160:10;;89131:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;89131:14:0;;-1:-1:-1;;;89131:40:0:i;:::-;88905:274;;;;;;;:::o;84904:218::-;84978:9;85008:16;85016:7;85008;:16::i;:::-;85000:53;;;;;-1:-1:-1;;;85000:53:0;;;;;;;;;;;;-1:-1:-1;;;85000:53:0;;;;;;;;;;;;;;;70788:1;85081:10;85092:7;85081:19;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;85071:43;;;;;;;;78263:566;78383:7;74294:17;:15;:17::i;:::-;:26;74286:89;;;;-1:-1:-1;;;74286:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78416:22:::1;:20;:22::i;:::-;78408:70;;;;-1:-1:-1::0;;;78408:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78490:15;78507:13:::0;78522:15:::1;78539:12:::0;78555:46:::1;78578:9;78589:11;78555:22;:46::i;:::-;78489:112;;;;;;;;78621:16;78629:7;78621;:16::i;:::-;78620:17;78612:51;;;::::0;;-1:-1:-1;;;78612:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;78612:51:0;;;;;;;;;;;;;::::1;;78716:5;-1:-1:-1::0;;;;;78679:57:0::1;78707:7;78679:57;78695:10;78723:5;78730;78679:57;;;;-1:-1:-1::0;;;;;78679:57:0::1;-1:-1:-1::0;;;;;78679:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78747:49;78767:7;78776:5;78783;78790;78747:19;:49::i;:::-;-1:-1:-1::0;78814:7:0;;78263:566;-1:-1:-1;;;;;78263:566:0:o;46755:151::-;46859:39;46876:4;46882:2;46886:7;46859:39;;;;;;;;;;;;:16;:39::i;95998:193::-;74140:22;;-1:-1:-1;;;;;74140:22:0;74126:10;:36;74118:103;;;;-1:-1:-1;;;74118:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96144:38:::1;::::0;;-1:-1:-1;;;96144:38:0;;96176:4:::1;96144:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;96116:22:0;::::1;::::0;::::1;::::0;96139:3;;96116:22;;96144:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;96116:22;96144:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;96144:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;96144:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;96144:38:0;96116:67:::1;::::0;;-1:-1:-1;;;;;;96116:67:0::1;::::0;;;;;;-1:-1:-1;;;;;96116:67:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;96144:38:::1;::::0;96116:67;;;;;;;-1:-1:-1;96116:67:0;;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;96116:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;96116:67:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;;;95998:193:0:o;85438:112::-;85502:4;85526:16;85534:7;85526;:16::i;42762:164::-;42829:7;;42871:22;:12;42887:5;42871:22;:15;:22;:::i;:::-;-1:-1:-1;42849:44:0;42762:164;-1:-1:-1;;;42762:164:0:o;81252:334::-;81359:6;81379:15;81436:12;81452:46;81475:9;81486:11;81452:22;:46::i;:::-;81378:120;;;;;;81513:16;81521:7;81513;:16::i;:::-;81509:46;;;81538:17;81547:7;81538:8;:17::i;71587:54::-;;;;;;;;;;;;;:::o;71271:29::-;;;;:::o;84723:136::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84821:30:::1;84839:11;84821:17;:30::i;:::-;84723:136:::0;:::o;38968:169::-;39032:7;39059:70;39076:7;39059:70;;;;;;;;;;;;;;;;;:12;;:70;;:16;:70;:::i;74882:320::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74999:31:0;::::1;74991:85;;;;-1:-1:-1::0;;;74991:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75117:13;::::0;75092:58:::1;::::0;-1:-1:-1;;;;;75092:58:0;;::::1;::::0;75117:13:::1;::::0;75092:58:::1;::::0;75117:13:::1;::::0;75092:58:::1;75161:13;:33:::0;;-1:-1:-1;;;;;;75161:33:0::1;-1:-1:-1::0;;;;;75161:33:0;;;::::1;::::0;;;::::1;::::0;;74882:320::o;41421:89::-;41494:8;41487:15;;;;;;;;-1:-1:-1;;41487:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41461:13;;41487:15;;41494:8;;41487:15;;41494:8;41487:15;;;;;;;;;;;;;;;;;;;;;;;;71201:23;;;;:::o;38527:215::-;38591:7;-1:-1:-1;;;;;38619:19:0;;38611:74;;;;-1:-1:-1;;;38611:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38705:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;86568:483::-;86676:20;86699:17;86707:8;86699:7;:17::i;:::-;-1:-1:-1;;;;;86927:33:0;;86811:12;86927:33;;;:19;:33;;;;;;;;;;86836:125;;86861:4;86836:125;;;;;;;;-1:-1:-1;;;86836:125:0;;;;-1:-1:-1;;86836:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;86836:125:0;;;;;86826:136;;;;;86676:40;;-1:-1:-1;86973:70:0;86676:40;86826:136;86917:8;86912:3;87032:10;86973:23;:70::i;85168:211::-;85243:6;85270:16;85278:7;85270;:16::i;:::-;85262:53;;;;;-1:-1:-1;;;85262:53:0;;;;;;;;;;;;-1:-1:-1;;;85262:53:0;;;;;;;;;;;;;;;70830:21;85340:10;85351:7;85340:19;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;;;85333:38;;;;;;;;;95503:306;74140:22;;-1:-1:-1;;;;;74140:22:0;74126:10;:36;74118:103;;;;-1:-1:-1;;;74118:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;95657:38:0;::::1;95649:81;;;::::0;;-1:-1:-1;;;95649:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;95740:61;::::0;-1:-1:-1;;;95740:61:0;;::::1;;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;95740:54:0;::::1;::::0;::::1;::::0;95795:5;;;;95740:61;;;;;95795:5;;;;95740:61;1:33:-1::1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;95740:61:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;95740:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;95740:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;84310:156:0::0;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84393:18:::1;:26:::0;;-1:-1:-1;;;;84393:26:0::1;::::0;;84435:23:::1;::::0;::::1;::::0;84414:5:::1;::::0;84435:23:::1;84310:156::o:0;39455:96::-;39536:7;39529:14;;;;;;;;-1:-1:-1;;39529:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39503:13;;39529:14;;39536:7;;39529:14;;39536:7;39529:14;;;;;;;;;;;;;;;;;;;;;;;;44560:295;44675:12;:10;:12::i;:::-;-1:-1:-1;;;;;44663:24:0;:8;-1:-1:-1;;;;;44663:24:0;;;44655:62;;;;;-1:-1:-1;;;44655:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44775:8;44730:18;:32;44749:12;:10;:12::i;:::-;-1:-1:-1;;;;;44730:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;44730:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;44730:53:0;;;;;;;;;;;44814:12;:10;:12::i;:::-;44799:48;;;;;;;;;;-1:-1:-1;;;;;44799:48:0;;;;;;;;;;;;;;44560:295;;:::o;71478:45::-;;;;;;;;;;;;;;;:::o;85560:323::-;85628:7;;;85685:159;85709:15;85730:5;85725:11;;;;;;;;85709:28;;;;;;;;;:35;85705:1;:39;85685:159;;;85781:51;85800:15;85821:5;85816:11;;;;;;;;85800:28;;;;;;;;;;85829:1;85800:31;;;;;;;;;85781:14;;:51;:18;:51;:::i;:::-;85764:68;-1:-1:-1;85746:3:0;;85685:159;;;-1:-1:-1;85861:14:0;85560:323;-1:-1:-1;;85560:323:0:o;80572:335::-;80678:9;80701:15;80737;80774:46;80797:9;80808:11;80774:22;:46::i;:::-;80700:120;;;;;;80835:16;80843:7;80835;:16::i;:::-;80831:45;;;80860:16;80868:7;80860;:16::i;85893:314::-;85960:7;;;86018:149;86042:22;86038:1;:26;86018:149;;;86102:53;86122:15;86138:1;86122:18;;;;;;;;;;86146:6;86141:12;;;;;;;;86122:32;;;;;;86102:53;86084:71;-1:-1:-1;86066:3:0;;86018:149;;81959:817;82071:7;82080;82089:9;82100:6;82144:11;82132:23;;;:8;;:23;;82124:57;;;;;-1:-1:-1;;;82124:57:0;;;;;;;;;;;;-1:-1:-1;;;82124:57:0;;;;;;;;;;;;;;;82200:52;82219:11;82232:8;;82242:9;82200:18;:52::i;:::-;82192:85;;;;;-1:-1:-1;;;82192:85:0;;;;;;;;;;;;-1:-1:-1;;;82192:85:0;;;;;;;;;;;;;;;82327:3;82314:16;;;82288:15;70788:1;82314:9;82445:2;82435:13;82429:33;;:20;82419:44;;;;;;;;;82401:62;-1:-1:-1;82474:12:0;70830:21;82502:9;82512:2;82502:13;82496:31;;;;;;82489:39;;;;;;;;;;82474:54;-1:-1:-1;82571:9:0;-1:-1:-1;;;;;82660:19:0;;82652:68;;;;-1:-1:-1;;;82652:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82739:7;;;;-1:-1:-1;82755:5:0;;-1:-1:-1;82748:5:0;-1:-1:-1;81959:817:0;-1:-1:-1;;;81959:817:0:o;47643:285::-;47775:41;47794:12;:10;:12::i;:::-;47808:7;47775:18;:41::i;:::-;47767:103;;;;-1:-1:-1;;;47767:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47881:39;47895:4;47901:2;47905:7;47914:5;47881:13;:39::i;76908:109::-;76963:7;76990:19;:17;:19::i;71009:50::-;;;-1:-1:-1;;;;;71009:50:0;;:::o;71156:38::-;;;-1:-1:-1;;;71156:38:0;;;;;:::o;75248:501::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75362:20:::1;:67:::0;;-1:-1:-1;;;;;;75362:67:0::1;-1:-1:-1::0;;;;;75362:67:0;::::1;::::0;;::::1;::::0;;;75445:45:::1;::::0;::::1;::::0;-1:-1:-1;;75445:45:0::1;-1:-1:-1::0;;;;;75505:34:0;::::1;::::0;75501:241:::1;;75572:20;::::0;75564:85:::1;::::0;;-1:-1:-1;;;75564:85:0;;-1:-1:-1;;;75564:85:0::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;75572:20:0;;::::1;::::0;75564:47:::1;::::0;:85;;;;;::::1;::::0;;;;;;;;;75572:20;75564:85;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;75564:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;75564:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;75564:85:0;75556:174:::1;;;;-1:-1:-1::0;;;75556:174:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40427:755:::0;40492:13;40526:16;40534:7;40526;:16::i;:::-;40518:76;;;;-1:-1:-1;;;40518:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40633:19;;;;:10;:19;;;;;;;;;40607:45;;;;;;-1:-1:-1;;40607:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;40633:19;40607:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40734:8:0;40728:22;40607:45;;-1:-1:-1;;;;40728:22:0;-1:-1:-1;;40728:22:0;;;;;;;;;;;40724:76;;40779:9;-1:-1:-1;40772:16:0;;40724:76;40904:23;;:27;40900:112;;40979:8;40989:9;40962:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40962:37:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;40962:37:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;40962:37:0;;;40948:52;;;;;40900:112;41144:8;41154:18;:7;:16;:18::i;:::-;41127:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41127:46:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;41127:46:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41127:46:0;;;41113:61;;;40427:755;;;:::o;70895:37::-;;;-1:-1:-1;;;;;70895:37:0;;:::o;74464:410::-;74140:22;;-1:-1:-1;;;;;74140:22:0;74126:10;:36;74118:103;;;;-1:-1:-1;;;74118:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74608:40:0;::::1;74600:103;;;;-1:-1:-1::0;;;74600:103:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74753:22;::::0;74719:85:::1;::::0;-1:-1:-1;;;;;74719:85:0;;::::1;::::0;74753:22:::1;::::0;74719:85:::1;::::0;74753:22:::1;::::0;74719:85:::1;74815:22;:51:::0;;-1:-1:-1;;;;;;74815:51:0::1;-1:-1:-1::0;;;;;74815:51:0;;;::::1;::::0;;;::::1;::::0;;74464:410::o;89354:297::-;89523:15;89541:39;89557:9;89568:11;;89541:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;89541:15:0;;-1:-1:-1;;;89541:39:0:i;:::-;89523:57;;89591:52;89618:7;89627:3;89632:10;;89591:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;89591:26:0;;-1:-1:-1;;;89591:52:0:i;71360:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71360:36:0;;-1:-1:-1;71360:36:0:o;96307:170::-;74140:22;;-1:-1:-1;;;;;74140:22:0;74126:10;:36;74118:103;;;;-1:-1:-1;;;74118:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96429:40:::1;::::0;;-1:-1:-1;;;96429:40:0;;-1:-1:-1;;;;;96429:40:0;;::::1;;::::0;::::1;::::0;96464:4:::1;96429:40:::0;;;;;;:29;;::::1;::::0;::::1;::::0;:40;;;;;-1:-1:-1;;96429:40:0;;;;;;;;-1:-1:-1;96429:29:0;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;96429:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;96429:40:0;;;;96307:170:::0;;:::o;71530:48::-;;;;;;;;;;;;;;;:::o;70860:28::-;;;-1:-1:-1;;;;;70860:28:0;;:::o;77618:587::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74294:17:::1;:15;:17::i;:::-;:26;74286:89;;;;-1:-1:-1::0;;;74286:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77837:6:::2;:13;77819:7;:14;:31;:67;;;;;77872:7;:14;77854:7;:14;:32;77819:67;77811:124;;;;-1:-1:-1::0;;;77811:124:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77966:14:::0;;77946:17:::2;77991:207;78015:9;78011:1;:13;77991:207;;;78113:73;78149:1;78133:13;:17;78152:7;78160:1;78152:10;;;;;;;;;;;;;;78164:6;78171:1;78164:9;;;;;;;;;;;;;;78175:7;78183:1;78175:10;;;;;;;;;;;;;;78113:19;:73::i;:::-;78026:3;;77991:207;;45185:156:::0;-1:-1:-1;;;;;45298:25:0;;;45274:4;45298:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45185:156::o;76097:236::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76199:8:::1;::::0;:23;76191:59:::1;;;::::0;;-1:-1:-1;;;76191:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;76266:25;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;76302:8;:23:::0;76097:236::o;84533:142::-;84596:4;84627:17;:15;:17::i;:::-;84626:18;:40;;;;-1:-1:-1;;84648:18:0;;-1:-1:-1;;;84648:18:0;;;;;84533:142::o;70971:31::-;;;-1:-1:-1;;;;;70971:31:0;;:::o;77242:306::-;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74294:17:::1;:15;:17::i;:::-;:26;74286:89;;;;-1:-1:-1::0;;;74286:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77488:52:::2;77508:8;77518:6;77526:5;77533:6;77488:19;:52::i;84039:221::-:0;73978:13;;-1:-1:-1;;;;;73978:13:0;73964:10;:27;73956:85;;;;-1:-1:-1;;;73956:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84129:8:::1;::::0;84121:57:::1;;;::::0;;-1:-1:-1;;;84121:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;84121:57:0;;;;;;;;;;;;;::::1;;84189:18;:25:::0;;-1:-1:-1;;;;84189:25:0::1;-1:-1:-1::0;;;84189:25:0::1;::::0;;84230:22:::1;::::0;::::1;::::0;84189:25;;84230:22:::1;84039:221::o:0;54572:100::-;54645:19;;;;:8;;:19;;;;;:::i;:::-;;54572:100;:::o;42205:211::-;42266:7;42387:21;:12;:19;:21::i;49121:119::-;49178:4;49202:30;:12;49224:7;49202:30;:21;:30;:::i;994:106::-;1082:10;994:106;:::o;56323:158::-;56389:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;56389:29:0;-1:-1:-1;;;;;56389:29:0;;;;;;;;:24;;56443:16;56389:24;56443:7;:16::i;:::-;-1:-1:-1;;;;;56434:39:0;;;;;;;;;;;56323:158;;:::o;87961:748::-;88118:12;88133:35;88162:5;88133:28;:35::i;:::-;88118:50;;88179:14;88196:31;88210:4;88216:10;88196:13;:31::i;:::-;88179:48;;88256:13;-1:-1:-1;;;;;88246:23:0;:6;-1:-1:-1;;;;;88246:23:0;;88238:98;;;;-1:-1:-1;;;88238:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;88462:92:0;;;88519:34;;;;:19;:34;;;;;;;;;;88462:92;;88477:10;88462:92;;;;;;;;88509:8;;88462:92;;;;;;;;;;;;-1:-1:-1;;;;;88602:34:0;;;;;;:19;:34;;;;;;:41;;88641:1;88602:41;:38;:41;:::i;:::-;88565:19;:34;88585:13;-1:-1:-1;;;;;88565:34:0;-1:-1:-1;;;;;88565:34:0;;;;;;;;;;;;:78;;;;88654:47;88668:13;88683:3;88688:8;88654:47;;;;;;;;;;;;:13;:47::i;49610:333::-;49695:4;49720:16;49728:7;49720;:16::i;:::-;49712:73;;;;-1:-1:-1;;;49712:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49796:13;49812:16;49820:7;49812;:16::i;:::-;49796:32;;49858:5;-1:-1:-1;;;;;49847:16:0;:7;-1:-1:-1;;;;;49847:16:0;;:51;;;;49891:7;-1:-1:-1;;;;;49867:31:0;:20;49879:7;49867:11;:20::i;:::-;-1:-1:-1;;;;;49867:31:0;;49847:51;:87;;;;49902:32;49919:5;49926:7;49902:16;:32::i;53209:574::-;53327:4;-1:-1:-1;;;;;53307:24:0;:16;53315:7;53307;:16::i;:::-;-1:-1:-1;;;;;53307:24:0;;53299:78;;;;-1:-1:-1;;;53299:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53396:16:0;;53388:65;;;;-1:-1:-1;;;53388:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53466:39;53487:4;53493:2;53497:7;53466:20;:39::i;:::-;53570:29;53587:1;53591:7;53570:8;:29::i;:::-;-1:-1:-1;;;;;53612:19:0;;;;;;:13;:19;;;;;:35;;53639:7;53612:35;:26;:35;:::i;:::-;-1:-1:-1;;;;;;53658:17:0;;;;;;:13;:17;;;;;:30;;53680:7;53658:30;:21;:30;:::i;:::-;-1:-1:-1;53701:29:0;:12;53718:7;53727:2;53701:29;:16;:29;:::i;:::-;;53767:7;53763:2;-1:-1:-1;;;;;53748:27:0;53757:4;-1:-1:-1;;;;;53748:27:0;;;;;;;;;;;53209:574;;;:::o;93881:889::-;94000:6;94024:15;94049:30;94077:1;94057:14;94049:23;;;;;;;;:27;:30;:27;:30;:::i;:::-;94042:38;;;;;;;;94024:56;;94158:8;94152:15;;;;;;;;70830:21;94127:10;94121:17;;;;;;;;:28;:46;94091:10;94102:15;94091:27;;;;;;;;;;;;;;;;:76;;;;;;;;;;;;;;;;;;94236:62;94296:1;94236:15;94257:10;94252:16;;;;;;;;94236:33;;;;;;;;;;94275:14;94270:20;;;;;;;;94236:55;;;;;;;;;;:62;:59;:62;:::i;:::-;94178:15;94199:10;94194:16;;;;;;;;94178:33;;;;;;;;;;94217:14;94212:20;;;;;;;;94178:55;;;;;;;;:120;94361:56;94415:1;94361:15;94382:10;94377:16;;;;;;;;94361:33;;;;;;;;;;94400:8;94395:14;;;;;;;;94361:49;;;;;;;;;;:56;:53;:56;:::i;:::-;94309:15;94330:10;94325:16;;;;;;;;94309:33;;;;;;;;;;94348:8;94343:14;;;;;;;;94309:49;;;;;;;;:108;94443:12;;:19;;94460:1;94443:19;:16;:19;:::i;:::-;94428:12;:34;94495:20;;:81;;-1:-1:-1;;;94495:81:0;;;;;;;;;;94597:47;;-1:-1:-1;;;;;94495:20:0;;94597:47;;94534:15;;94551:14;;94567:8;;94495:81;;;;;;94551:14;;94495:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;94495:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;94495:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;94495:81:0;-1:-1:-1;;;;;;94495:149:0;;94473:263;;;;-1:-1:-1;;;94473:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27508:137;27579:7;27614:22;27618:3;27630:5;27614:3;:22::i;82894:863::-;83023:17;83031:8;83023:7;:17::i;:::-;83019:731;;;83086:5;83065:26;;;;;;;;:17;83073:8;83065:7;:17::i;:::-;:26;;;;;;;;;83057:73;;;;-1:-1:-1;;;83057:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83149:12;;83145:248;;83331:6;83309:28;;;;;;;;:18;83318:8;83309;:18::i;:::-;:28;;;;;;;;;83301:76;;;;-1:-1:-1;;;83301:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83019:731;;;83434:23;83440:6;83448:8;83434:5;:23::i;:::-;83622:6;83616:13;;;;;;;;70830:21;83596:5;83590:12;;;;;;;;:23;:39;83567:10;83578:8;83567:20;;;;;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;83689:49;83736:1;83689:15;83710:5;83705:11;;;;;;;83689:49;83644:15;83665:5;83660:11;;;;;;;;83644:28;;;;;;;;;;83678:6;83673:12;;;;;;;;83644:42;;;;;;;;:94;82894:863;;;;:::o;32682:227::-;32762:7;;;;32822:22;32826:3;32838:5;32822:3;:22::i;:::-;32791:53;;;;-1:-1:-1;32682:227:0;-1:-1:-1;;;;;32682:227:0:o;57825:151::-;57907:27;57925:8;57907:17;:27::i;:::-;57950:18;57958:9;:7;:9::i;:::-;57950:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;57950:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57825:151;:::o;33344:204::-;33451:7;33494:44;33499:3;33519;33525:12;33494:4;:44::i;27050:114::-;27110:7;27137:19;27145:3;27137:7;:19::i;12404:181::-;12462:7;12494:5;;;12518:6;;;;12510:46;;;;;-1:-1:-1;;;12510:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;69418:796;69509:4;69549;69509;69566:525;69590:5;:12;69586:1;:16;69566:525;;;69624:20;69647:5;69653:1;69647:8;;;;;;;;;;;;;;69624:31;;69692:12;69676;:28;69672:408;;69846:12;69860;69829:44;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;69829:44:0;;;69819:55;;;;;;69804:70;;69672:408;;;70036:12;70050;70019:44;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;70019:44:0;;;70009:55;;;;;;69994:70;;69672:408;-1:-1:-1;69604:3:0;;69566:525;;;-1:-1:-1;70186:20:0;;;;69418:796;-1:-1:-1;;;69418:796:0:o;48647:272::-;48761:28;48771:4;48777:2;48781:7;48761:9;:28::i;:::-;48808:48;48831:4;48837:2;48841:7;48850:5;48808:22;:48::i;:::-;48800:111;;;;-1:-1:-1;;;48800:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33787:744;33843:13;34064:10;34060:53;;-1:-1:-1;34091:10:0;;;;;;;;;;;;-1:-1:-1;;;34091:10:0;;;;;;34060:53;34138:5;34123:12;34179:78;34186:9;;34179:78;;34212:8;;34243:2;34235:10;;;;34179:78;;;34267:19;34299:6;34289:17;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34289:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;34289:17:0;87:42:-1;143:17;;-1:-1;34289:17:0;-1:-1:-1;34361:5:0;;-1:-1:-1;34267:39:0;-1:-1:-1;;;34333:10:0;;34377:115;34384:9;;34377:115;;34451:2;34444:4;:9;34439:2;:14;34428:27;;34410:6;34417:7;;;;;;;34410:15;;;;;;;;;;;:45;-1:-1:-1;;;;;34410:45:0;;;;;;;;-1:-1:-1;34478:2:0;34470:10;;;;34377:115;;;-1:-1:-1;34516:6:0;33787:744;-1:-1:-1;;;;33787:744:0:o;32220:123::-;32289:7;32316:19;32324:3;32316:7;:19::i;31981:151::-;32065:4;32089:35;32099:3;32119;32089:9;:35::i;68601:269::-;68803:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;68803:58:0;;;;;;;68793:69;;;;;;68601:269::o;66217:2110::-;66295:7;66358:9;:16;66378:2;66358:22;66354:96;;66397:41;;;-1:-1:-1;;;66397:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;66354:96;66811:4;66796:20;;66790:27;66857:4;66842:20;;66836:27;66911:4;66896:20;;66890:27;66519:9;66882:36;67841:66;67828:79;;67824:156;;;67924:44;;-1:-1:-1;;;67924:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67824:156;67996:1;:7;;68001:2;67996:7;;:18;;;;;68007:1;:7;;68012:2;68007:7;;67996:18;67992:95;;;68031:44;;-1:-1:-1;;;68031:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67992:95;68201:24;;;68184:14;68201:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68184:14;;68201:24;;;;;;;-1:-1:-1;;68201:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;68201:24:0;;-1:-1:-1;;68201:24:0;;;-1:-1:-1;;;;;;;68244:20:0;;68236:57;;;;;-1:-1:-1;;;68236:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68313:6;66217:2110;-1:-1:-1;;;;;;66217:2110:0:o;26595:137::-;26665:4;26689:35;26697:3;26717:5;26689:7;:35::i;26288:131::-;26355:4;26379:32;26384:3;26404:5;26379:4;:32::i;31408:176::-;31497:4;31521:55;31526:3;31546;-1:-1:-1;;;;;31560:14:0;;31521:4;:55::i;12860:136::-;12918:7;12945:43;12949:1;12952;12945:43;;;;;;;;;;;;;;;;;:3;:43::i;24172:204::-;24267:18;;24239:7;;24267:26;-1:-1:-1;24259:73:0;;;;-1:-1:-1;;;24259:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24350:3;:11;;24362:5;24350:18;;;;;;;;;;;;;;;;24343:25;;24172:204;;;;:::o;51711:404::-;-1:-1:-1;;;;;51791:16:0;;51783:61;;;;;-1:-1:-1;;;51783:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51864:16;51872:7;51864;:16::i;:::-;51863:17;51855:58;;;;;-1:-1:-1;;;51855:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51926:45;51955:1;51959:2;51963:7;51926:20;:45::i;:::-;-1:-1:-1;;;;;51984:17:0;;;;;;:13;:17;;;;;:30;;52006:7;51984:30;:21;:30;:::i;:::-;-1:-1:-1;52027:29:0;:12;52044:7;52053:2;52027:29;:16;:29;:::i;:::-;-1:-1:-1;52074:33:0;;52099:7;;-1:-1:-1;;;;;52074:33:0;;;52091:1;;52074:33;;52091:1;;52074:33;51711:404;;:::o;30175:251::-;30242:7;;30293:5;30318:19;30328:3;30293:5;30318:9;:19::i;:::-;30310:66;;;;-1:-1:-1;;;30310:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30400:12;:17;;;;;;;;;;;;;;;30175:251;-1:-1:-1;;;30175:251:0:o;30849:235::-;30943:7;30971:19;30981:3;30986;30971:9;:19::i;:::-;30992:12;30963:42;;;;;-1:-1:-1;;;30963:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30963:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31059:12:0;:17;;;;;;;;;;;;;30849:235::o;23719:109::-;23802:18;;23719:109::o;55237:1078::-;55358:4;55385:15;:2;-1:-1:-1;;;;;55385:13:0;;:15::i;:::-;55380:60;;-1:-1:-1;55424:4:0;55417:11;;55380:60;55511:12;55525:23;-1:-1:-1;;;;;55552:7:0;;-1:-1:-1;;;55657:12:0;:10;:12::i;:::-;55684:4;55703:7;55725:5;55560:181;;;;;;-1:-1:-1;;;;;55560:181:0;-1:-1:-1;;;;;55560:181:0;;;;;;-1:-1:-1;;;;;55560:181:0;-1:-1:-1;;;;;55560:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55560:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55560:181:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;55560:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;55560:181:0;;;179:29:-1;;;;160:49;;55552:190:0;;;55560:181;;55552:190;;-1:-1:-1;55552:190:0;;-1:-1:-1;25:18;-1:-1;55552:190:0;-1:-1:-1;55552:190:0;;-1:-1:-1;55552:190:0;;-1:-1:-1;25:18;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;55552:190:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;55510:232:0;;;;55758:7;55753:555;;55786:17;;:21;55782:384;;55954:10;55948:17;56015:15;56002:10;55998:2;55994:19;55987:44;55902:148;56090:60;;-1:-1:-1;;;56090:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55753:555;56198:13;56225:10;56214:32;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56214:32:0;-1:-1:-1;;;;;;56269:26:0;-1:-1:-1;;;56269:26:0;;-1:-1:-1;56261:35:0;;-1:-1:-1;;;56261:35:0;29718:102;29801:11;;;;29718:102::o;29488:135::-;29559:4;29583:17;;;;;;;;;;;;:32;;;29488:135::o;21874:1544::-;21940:4;22079:19;;;:12;;;:19;;;;;;22115:15;;22111:1300;;22550:18;;-1:-1:-1;;22501:14:0;;;;22550:22;;;;22477:21;;22550:3;;:22;;22837;;;;;;;;;;;;;;22817:42;;22983:9;22954:3;:11;;22966:13;22954:26;;;;;;;;;;;;;;;;;;;:38;;;;23060:23;;;23102:1;23060:12;;;:23;;;;;;23086:17;;;23060:43;;23212:17;;23060:3;;23212:17;;;;;;;;;;;;;;;;;;;;;;23307:3;:12;;:19;23320:5;23307:19;;;;;;;;;;;23300:26;;;23350:4;23343:11;;;;;;;;22111:1300;23394:5;23387:12;;;;;21284:414;21347:4;21369:21;21379:3;21384:5;21369:9;:21::i;:::-;21364:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;21407:11:0;:23;;;;;;;;;;;;;21590:18;;21568:19;;;:12;;;:19;;;;;;:40;;;;21623:11;;21364:327;-1:-1:-1;21674:5:0;21667:12;;28610:487;28686:4;28729:17;;;;;;;;;;;28686:4;;28725:305;;-1:-1:-1;28795:11:0;;;;:13;;;;;;28725:305;;;28867:20;28863:167;;-1:-1:-1;28920:11:0;;;:13;;-1:-1:-1;;28920:13:0;;;:11;28863:167;;;-1:-1:-1;29013:5:0;28863:167;29040:12;:17;;;;;;;;-1:-1:-1;29040:17:0;;;;:25;29083:6;28610:487::o;13291:192::-;13377:7;13413:12;13405:6;;;;13397:29;;;;-1:-1:-1;;;13397:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;13397:29:0;-1:-1:-1;;;13449:5:0;;;13291:192::o;17637:619::-;17697:4;18165:20;;18008:66;18205:23;;;;;;:42;;-1:-1:-1;;18232:15:0;;;18197:51;-1:-1:-1;;17637:619:0:o;23504:129::-;23577:4;23601:19;;;:12;;;;;:19;;;;;;:24;;;23504:129::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://621e5be191a6a40b4990ad61c0d1acb118c68d2078ddfbce92f383423741391d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.