Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Source Code
Overview
Max Total Supply
10,000 Asterix
Holders
20
Transfers
-
0 (0%)
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
Asterix
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-02-12
*/
/**
*Submitted for verification at Etherscan.io on 2024-02-12
*/
/*
We are not actually the real DN404 protocol; we waited all day for DN404 to launch, but it never happened. Now I am bored, watching the Super Bowl, so I launched this token. Let's watch it together.
*/
//Inspired by all the great work out there from ERC20, 404, 721, 721a, 721Psi, 1155, 1155Delta
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
}
interface IERCX {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* Cannot burn from the zero address.
*/
error BurnFromZeroAddress();
/**
* Cannot burn from the address that doesn't owne the token.
*/
error BurnFromNonOnwerAddress();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from` or the `amount` is not 1.
*/
error TransferFromIncorrectOwnerOrInvalidAmount();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC1155Receiver interface.
*/
error TransferToNonERC1155ReceiverImplementer();
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The length of input arraies is not matching.
*/
error InputLengthMistmatch();
function isOwnerOf(address account, uint256 id) external view returns(bool);
}
/**
* @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);
}
/**
* @dev Interface that must be implemented by smart contracts in order to receive
* ERC-1155 token transfers.
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
abstract contract ERC721Receiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC721Receiver.onERC721Received.selector;
}
}
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/// @notice Library for bit twiddling and boolean operations.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBit.sol)
/// @author Inspired by (https://graphics.stanford.edu/~seander/bithacks.html)
library LibBit {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* BIT TWIDDLING OPERATIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Find last set.
/// Returns the index of the most significant bit of `x`,
/// counting from the least significant bit position.
/// If `x` is zero, returns 256.
function fls(uint256 x) internal pure returns (uint256 r) {
/// @solidity memory-safe-assembly
assembly {
r := or(shl(8, iszero(x)), shl(7, lt(0xffffffffffffffffffffffffffffffff, x)))
r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
r := or(r, shl(4, lt(0xffff, shr(r, x))))
r := or(r, shl(3, lt(0xff, shr(r, x))))
// forgefmt: disable-next-item
r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),
0x0706060506020504060203020504030106050205030304010505030400000000))
}
}
/// @dev Count leading zeros.
/// Returns the number of zeros preceding the most significant one bit.
/// If `x` is zero, returns 256.
function clz(uint256 x) internal pure returns (uint256 r) {
/// @solidity memory-safe-assembly
assembly {
r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))
r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
r := or(r, shl(4, lt(0xffff, shr(r, x))))
r := or(r, shl(3, lt(0xff, shr(r, x))))
// forgefmt: disable-next-item
r := add(xor(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),
0xf8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff)), iszero(x))
}
}
/// @dev Find first set.
/// Returns the index of the least significant bit of `x`,
/// counting from the least significant bit position.
/// If `x` is zero, returns 256.
/// Equivalent to `ctz` (count trailing zeros), which gives
/// the number of zeros following the least significant one bit.
function ffs(uint256 x) internal pure returns (uint256 r) {
/// @solidity memory-safe-assembly
assembly {
// Isolate the least significant bit.
let b := and(x, add(not(x), 1))
r := or(shl(8, iszero(x)), shl(7, lt(0xffffffffffffffffffffffffffffffff, b)))
r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, b))))
r := or(r, shl(5, lt(0xffffffff, shr(r, b))))
// For the remaining 32 bits, use a De Bruijn lookup.
// forgefmt: disable-next-item
r := or(r, byte(and(div(0xd76453e0, shr(r, b)), 0x1f),
0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405))
}
}
/// @dev Returns the number of set bits in `x`.
function popCount(uint256 x) internal pure returns (uint256 c) {
/// @solidity memory-safe-assembly
assembly {
let max := not(0)
let isMax := eq(x, max)
x := sub(x, and(shr(1, x), div(max, 3)))
x := add(and(x, div(max, 5)), and(shr(2, x), div(max, 5)))
x := and(add(x, shr(4, x)), div(max, 17))
c := or(shl(8, isMax), shr(248, mul(x, div(max, 255))))
}
}
/// @dev Returns whether `x` is a power of 2.
function isPo2(uint256 x) internal pure returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
// Equivalent to `x && !(x & (x - 1))`.
result := iszero(add(and(x, sub(x, 1)), iszero(x)))
}
}
/// @dev Returns `x` reversed at the bit level.
function reverseBits(uint256 x) internal pure returns (uint256 r) {
uint256 m0 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f;
uint256 m1 = m0 ^ (m0 << 2);
uint256 m2 = m1 ^ (m1 << 1);
r = reverseBytes(x);
r = (m2 & (r >> 1)) | ((m2 & r) << 1);
r = (m1 & (r >> 2)) | ((m1 & r) << 2);
r = (m0 & (r >> 4)) | ((m0 & r) << 4);
}
/// @dev Returns `x` reversed at the byte level.
function reverseBytes(uint256 x) internal pure returns (uint256 r) {
unchecked {
// Computing masks on-the-fly reduces bytecode size by about 200 bytes.
uint256 m0 = 0x100000000000000000000000000000001 * (~toUint(x == 0) >> 192);
uint256 m1 = m0 ^ (m0 << 32);
uint256 m2 = m1 ^ (m1 << 16);
uint256 m3 = m2 ^ (m2 << 8);
r = (m3 & (x >> 8)) | ((m3 & x) << 8);
r = (m2 & (r >> 16)) | ((m2 & r) << 16);
r = (m1 & (r >> 32)) | ((m1 & r) << 32);
r = (m0 & (r >> 64)) | ((m0 & r) << 64);
r = (r >> 128) | (r << 128);
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* BOOLEAN OPERATIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
// A Solidity bool on the stack or memory is represented as a 256-bit word.
// Non-zero values are true, zero is false.
// A clean bool is either 0 (false) or 1 (true) under the hood.
// Usually, if not always, the bool result of a regular Solidity expression,
// or the argument of a public/external function will be a clean bool.
// You can usually use the raw variants for more performance.
// If uncertain, test (best with exact compiler settings).
// Or use the non-raw variants (compiler can sometimes optimize out the double `iszero`s).
/// @dev Returns `x & y`. Inputs must be clean.
function rawAnd(bool x, bool y) internal pure returns (bool z) {
/// @solidity memory-safe-assembly
assembly {
z := and(x, y)
}
}
/// @dev Returns `x & y`.
function and(bool x, bool y) internal pure returns (bool z) {
/// @solidity memory-safe-assembly
assembly {
z := and(iszero(iszero(x)), iszero(iszero(y)))
}
}
/// @dev Returns `x | y`. Inputs must be clean.
function rawOr(bool x, bool y) internal pure returns (bool z) {
/// @solidity memory-safe-assembly
assembly {
z := or(x, y)
}
}
/// @dev Returns `x | y`.
function or(bool x, bool y) internal pure returns (bool z) {
/// @solidity memory-safe-assembly
assembly {
z := or(iszero(iszero(x)), iszero(iszero(y)))
}
}
/// @dev Returns 1 if `b` is true, else 0. Input must be clean.
function rawToUint(bool b) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
z := b
}
}
/// @dev Returns 1 if `b` is true, else 0.
function toUint(bool b) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
z := iszero(iszero(b))
}
}
}
/// @notice Library for storage of packed unsigned booleans.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBitmap.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibBitmap.sol)
/// @author Modified from Solidity-Bits (https://github.com/estarriolvetch/solidity-bits/blob/main/contracts/BitMaps.sol)
library LibBitmap {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CONSTANTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The constant returned when a bitmap scan does not find a result.
uint256 internal constant NOT_FOUND = type(uint256).max;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STRUCTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev A bitmap in storage.
struct Bitmap {
mapping(uint256 => uint256) map;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* OPERATIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the boolean value of the bit at `index` in `bitmap`.
function get(Bitmap storage bitmap, uint256 index) internal view returns (bool isSet) {
// It is better to set `isSet` to either 0 or 1, than zero vs non-zero.
// Both cost the same amount of gas, but the former allows the returned value
// to be reused without cleaning the upper bits.
uint256 b = (bitmap.map[index >> 8] >> (index & 0xff)) & 1;
/// @solidity memory-safe-assembly
assembly {
isSet := b
}
}
/// @dev Updates the bit at `index` in `bitmap` to true.
function set(Bitmap storage bitmap, uint256 index) internal {
bitmap.map[index >> 8] |= (1 << (index & 0xff));
}
/// @dev Updates the bit at `index` in `bitmap` to false.
function unset(Bitmap storage bitmap, uint256 index) internal {
bitmap.map[index >> 8] &= ~(1 << (index & 0xff));
}
/// @dev Flips the bit at `index` in `bitmap`.
/// Returns the boolean result of the flipped bit.
function toggle(Bitmap storage bitmap, uint256 index) internal returns (bool newIsSet) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x20, bitmap.slot)
mstore(0x00, shr(8, index))
let storageSlot := keccak256(0x00, 0x40)
let shift := and(index, 0xff)
let storageValue := xor(sload(storageSlot), shl(shift, 1))
// It makes sense to return the `newIsSet`,
// as it allow us to skip an additional warm `sload`,
// and it costs minimal gas (about 15),
// which may be optimized away if the returned value is unused.
newIsSet := and(1, shr(shift, storageValue))
sstore(storageSlot, storageValue)
}
}
/// @dev Updates the bit at `index` in `bitmap` to `shouldSet`.
function setTo(Bitmap storage bitmap, uint256 index, bool shouldSet) internal {
/// @solidity memory-safe-assembly
assembly {
mstore(0x20, bitmap.slot)
mstore(0x00, shr(8, index))
let storageSlot := keccak256(0x00, 0x40)
let storageValue := sload(storageSlot)
let shift := and(index, 0xff)
sstore(
storageSlot,
// Unsets the bit at `shift` via `and`, then sets its new value via `or`.
or(and(storageValue, not(shl(shift, 1))), shl(shift, iszero(iszero(shouldSet))))
)
}
}
/// @dev Consecutively sets `amount` of bits starting from the bit at `start`.
function setBatch(Bitmap storage bitmap, uint256 start, uint256 amount) internal {
/// @solidity memory-safe-assembly
assembly {
let max := not(0)
let shift := and(start, 0xff)
mstore(0x20, bitmap.slot)
mstore(0x00, shr(8, start))
if iszero(lt(add(shift, amount), 257)) {
let storageSlot := keccak256(0x00, 0x40)
sstore(storageSlot, or(sload(storageSlot), shl(shift, max)))
let bucket := add(mload(0x00), 1)
let bucketEnd := add(mload(0x00), shr(8, add(amount, shift)))
amount := and(add(amount, shift), 0xff)
shift := 0
for {} iszero(eq(bucket, bucketEnd)) { bucket := add(bucket, 1) } {
mstore(0x00, bucket)
sstore(keccak256(0x00, 0x40), max)
}
mstore(0x00, bucket)
}
let storageSlot := keccak256(0x00, 0x40)
sstore(storageSlot, or(sload(storageSlot), shl(shift, shr(sub(256, amount), max))))
}
}
/// @dev Consecutively unsets `amount` of bits starting from the bit at `start`.
function unsetBatch(Bitmap storage bitmap, uint256 start, uint256 amount) internal {
/// @solidity memory-safe-assembly
assembly {
let shift := and(start, 0xff)
mstore(0x20, bitmap.slot)
mstore(0x00, shr(8, start))
if iszero(lt(add(shift, amount), 257)) {
let storageSlot := keccak256(0x00, 0x40)
sstore(storageSlot, and(sload(storageSlot), not(shl(shift, not(0)))))
let bucket := add(mload(0x00), 1)
let bucketEnd := add(mload(0x00), shr(8, add(amount, shift)))
amount := and(add(amount, shift), 0xff)
shift := 0
for {} iszero(eq(bucket, bucketEnd)) { bucket := add(bucket, 1) } {
mstore(0x00, bucket)
sstore(keccak256(0x00, 0x40), 0)
}
mstore(0x00, bucket)
}
let storageSlot := keccak256(0x00, 0x40)
sstore(
storageSlot, and(sload(storageSlot), not(shl(shift, shr(sub(256, amount), not(0)))))
)
}
}
/// @dev Returns number of set bits within a range by
/// scanning `amount` of bits starting from the bit at `start`.
function popCount(Bitmap storage bitmap, uint256 start, uint256 amount)
internal
view
returns (uint256 count)
{
unchecked {
uint256 bucket = start >> 8;
uint256 shift = start & 0xff;
if (!(amount + shift < 257)) {
count = LibBit.popCount(bitmap.map[bucket] >> shift);
uint256 bucketEnd = bucket + ((amount + shift) >> 8);
amount = (amount + shift) & 0xff;
shift = 0;
for (++bucket; bucket != bucketEnd; ++bucket) {
count += LibBit.popCount(bitmap.map[bucket]);
}
}
count += LibBit.popCount((bitmap.map[bucket] >> shift) << (256 - amount));
}
}
/// @dev Returns the index of the most significant set bit before the bit at `before`.
/// If no set bit is found, returns `NOT_FOUND`.
function findLastSet(Bitmap storage bitmap, uint256 before)
internal
view
returns (uint256 setBitIndex)
{
uint256 bucket;
uint256 bucketBits;
/// @solidity memory-safe-assembly
assembly {
setBitIndex := not(0)
bucket := shr(8, before)
mstore(0x00, bucket)
mstore(0x20, bitmap.slot)
let offset := and(0xff, not(before)) // `256 - (255 & before) - 1`.
bucketBits := shr(offset, shl(offset, sload(keccak256(0x00, 0x40))))
if iszero(or(bucketBits, iszero(bucket))) {
for {} 1 {} {
bucket := add(bucket, setBitIndex) // `sub(bucket, 1)`.
mstore(0x00, bucket)
bucketBits := sload(keccak256(0x00, 0x40))
if or(bucketBits, iszero(bucket)) { break }
}
}
}
if (bucketBits != 0) {
setBitIndex = (bucket << 8) | LibBit.fls(bucketBits);
/// @solidity memory-safe-assembly
assembly {
setBitIndex := or(setBitIndex, sub(0, gt(setBitIndex, before)))
}
}
}
}
contract ERCX is Context, ERC165, IERC1155, IERC1155MetadataURI, IERCX, IERC20Metadata, IERC20Errors, Ownable {
using Address for address;
using LibBitmap for LibBitmap.Bitmap;
error InvalidQueryRange();
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// Mapping from accout to owned tokens
mapping(address => LibBitmap.Bitmap) internal _owned;
// Mapping from account to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
// The next token ID to be minted.
uint256 private _currentIndex;
// NFT Approval
mapping(uint256 => address) public getApproved;
//Token balances
mapping(address => uint256) internal _balances;
//Token allowances
mapping(address account => mapping(address spender => uint256)) private _allowances;
// Token name
string public name;
// Token symbol
string public symbol;
// Decimals for supply
uint8 public immutable decimals;
// Total ERC20 supply
uint256 public immutable totalSupply;
// Tokens Per NFT
uint256 public immutable decimalFactor;
uint256 public immutable tokensPerNFT;
// Don't mint for these wallets
mapping(address => bool) public whitelist;
// Easy Launch - auto-whitelist first transfer which is probably the LP
uint256 public easyLaunch = 1;
uint256 constant MAX_PRICE = 80 gwei; // 100 Gwei
address public dev;
/**
* @dev See {_setURI}.
*/
constructor(string memory uri_, string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, uint256 _tokensPerNFT) Ownable(msg.sender) {
dev=msg.sender;
_setURI(uri_);
_currentIndex = _startTokenId();
name = _name;
symbol = _symbol;
decimals = _decimals;
decimalFactor = 10 ** decimals;
tokensPerNFT = _tokensPerNFT * decimalFactor;
totalSupply = _totalNativeSupply * decimalFactor;
whitelist[msg.sender] = true;
_balances[msg.sender] = totalSupply;
emit Transfer(address(0), msg.sender, totalSupply);
}
/** @notice Initialization function to set pairs / etc
* saving gas by avoiding mint / burn on unnecessary targets
*/
function setWhitelist(address target, bool state) public virtual onlyOwner {
whitelist[target] = state;
}
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal pure virtual returns (uint256) {
return 1;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
return _nextTokenId() - _startTokenId();
}
/**
* @dev Returns true if the account owns the `id` token.
*/
function isOwnerOf(address account, uint256 id) public view virtual override returns(bool) {
return _owned[account].get(id);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155).interfaceId ||
interfaceId == type(IERC1155MetadataURI).interfaceId ||
interfaceId == type(IERCX).interfaceId ||
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f || // ERC165 interface ID for ERC721Metadata.
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
/**
* @dev Returns the number of tokens owned by `owner`.
*/
function balanceOf(address owner) public view virtual returns (uint256) {
return _balances[owner];
}
/**
* @dev Returns the number of nfts owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* Requirements:
*
* - `start < stop`
*/
function balanceOf(address owner, uint256 start, uint256 stop) public view virtual returns (uint256) {
return _owned[owner].popCount(start, stop - start);
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
if(account == address(0)) {
revert BalanceQueryForZeroAddress();
}
if(_owned[account].get(id)) {
return 1;
} else {
return 0;
}
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
if(accounts.length != ids.length) {
revert InputLengthMistmatch();
}
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) public virtual override {
if(from == _msgSender() || isApprovedForAll(from, _msgSender())){
_safeTransferFrom(from, to, id, amount, data, true);
} else {
revert TransferCallerNotOwnerNorApproved();
}
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
if(!(from == _msgSender() || isApprovedForAll(from, _msgSender()))) {
revert TransferCallerNotOwnerNorApproved();
}
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `amount` cannot be zero.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data,
bool check
) internal virtual {
if(to == address(0)) {
revert TransferToZeroAddress();
}
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
_beforeTokenTransfer(operator, from, to, ids);
if(amount == 1 && _owned[from].get(id)) {
_owned[from].unset(id);
_owned[to].set(id);
_transfer(from, to, tokensPerNFT, false);
} else {
revert TransferFromIncorrectOwnerOrInvalidAmount();
}
uint256 toMasked;
uint256 fromMasked;
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
fromMasked := and(from, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
fromMasked, // `from`.
toMasked, // `to`.
amount // `tokenId`.
)
}
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids);
if(check)
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
if(ids.length != amounts.length) {
revert InputLengthMistmatch();
}
if(to == address(0)) {
revert TransferToZeroAddress();
}
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
if(amount == 1 && _owned[from].get(id)) {
_owned[from].unset(id);
_owned[to].set(id);
} else {
revert TransferFromIncorrectOwnerOrInvalidAmount();
}
}
_transfer(from, to, tokensPerNFT * ids.length, false);
uint256 toMasked;
uint256 fromMasked;
uint256 end = ids.length + 1;
// Use assembly to loop and emit the `Transfer` event for gas savings.
// The duplicated `log4` removes an extra check and reduces stack juggling.
// The assembly, together with the surrounding Solidity code, have been
// delicately arranged to nudge the compiler into producing optimized opcodes.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
fromMasked := and(from, _BITMASK_ADDRESS)
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
fromMasked, // `from`.
toMasked, // `to`.
mload(add(ids, 0x20)) // `tokenId`.
)
// The `iszero(eq(,))` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
// The compiler will optimize the `iszero` away for performance.
for {
let arrayId := 2
} iszero(eq(arrayId, end)) {
arrayId := add(arrayId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, toMasked, mload(add(ids, mul(0x20, arrayId))))
}
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
function _mint(
address to,
uint256 amount
) internal virtual {
_mint(to, amount, "");
}
/**
* @dev Creates `amount` tokens, and assigns them to `to`.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `amount` cannot be zero.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(
address to,
uint256 amount,
bytes memory data
) internal virtual {
(uint256[] memory ids, uint256[] memory amounts) = _mintWithoutCheck(to, amount);
uint256 end = _currentIndex;
_doSafeBatchTransferAcceptanceCheck(_msgSender(), address(0), to, ids, amounts, data);
if (_currentIndex != end) revert();
}
function _mintWithoutCheck(
address to,
uint256 amount
) internal virtual returns(uint256[] memory ids, uint256[] memory amounts) {
if(to == address(0)) {
revert MintToZeroAddress();
}
if(amount == 0) {
revert MintZeroQuantity();
}
address operator = _msgSender();
ids = new uint256[](amount);
amounts = new uint256[](amount);
uint256 startTokenId = _nextTokenId();
unchecked {
require(type(uint256).max - amount >= startTokenId);
for(uint256 i = 0; i < amount; i++) {
ids[i] = startTokenId + i;
amounts[i] = 1;
}
}
_beforeTokenTransfer(operator, address(0), to, ids);
_owned[to].setBatch(startTokenId, amount);
_currentIndex += amount;
uint256 toMasked;
uint256 end = startTokenId + amount;
assembly {
toMasked := and(to, _BITMASK_ADDRESS)
log4(
0,
0,
_TRANSFER_EVENT_SIGNATURE,
0,
toMasked,
startTokenId
)
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids);
}
/**
* @dev Destroys token of token type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have the token of token type `id`.
*/
function _burn(
address from,
uint256 id
) internal virtual {
if(from == address(0)){
revert BurnFromZeroAddress();
}
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
_beforeTokenTransfer(operator, from, address(0), ids);
if(!_owned[from].get(id)) {
revert BurnFromNonOnwerAddress();
}
_owned[from].unset(id);
uint256 fromMasked;
assembly {
fromMasked := and(from, _BITMASK_ADDRESS)
log4(
0,
0,
_TRANSFER_EVENT_SIGNATURE,
fromMasked,
0,
id
)
}
emit TransferSingle(operator, from, address(0), id, 1);
_afterTokenTransfer(operator, from, address(0), ids);
}
/**
* @dev Destroys tokens of token types in `ids` from `from`
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have the token of token types in `ids`.
*/
function _burnBatch(
address from,
uint256[] memory ids
) internal virtual {
if(from == address(0)){
revert BurnFromZeroAddress();
}
address operator = _msgSender();
uint256[] memory amounts = new uint256[](ids.length);
_beforeTokenTransfer(operator, from, address(0), ids);
unchecked {
for(uint256 i = 0; i < ids.length; i++) {
amounts[i] = 1;
uint256 id = ids[i];
if(!_owned[from].get(id)) {
revert BurnFromNonOnwerAddress();
}
_owned[from].unset(id);
}
}
uint256 fromMasked;
uint256 end = ids.length + 1;
assembly {
fromMasked := and(from, _BITMASK_ADDRESS)
log4(
0,
0,
_TRANSFER_EVENT_SIGNATURE,
fromMasked,
0,
mload(add(ids, 0x20))
)
for {
let arrayId := 2
} iszero(eq(arrayId, end)) {
arrayId := add(arrayId, 1)
} {
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, mul(0x20, arrayId))))
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids);
}
function _burnBatch(
address from,
uint256 amount
) internal virtual {
if(from == address(0)){
revert BurnFromZeroAddress();
}
address operator = _msgSender();
uint256 searchFrom = _nextTokenId();
uint256[] memory amounts = new uint256[](amount);
uint256[] memory ids = new uint256[](amount);
unchecked {
for(uint256 i = 0; i < amount; i++) {
amounts[i] = 1;
uint256 id = _owned[from].findLastSet(searchFrom);
ids[i] = id;
_owned[from].unset(id);
searchFrom = id;
}
}
//technically after, but we didn't have the IDs then
_beforeTokenTransfer(operator, from, address(0), ids);
uint256 fromMasked;
uint256 end = amount + 1;
assembly {
fromMasked := and(from, _BITMASK_ADDRESS)
log4(
0,
0,
_TRANSFER_EVENT_SIGNATURE,
fromMasked,
0,
mload(add(ids, 0x20))
)
for {
let arrayId := 2
} iszero(eq(arrayId, end)) {
arrayId := add(arrayId, 1)
} {
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, mul(0x20, arrayId))))
}
}
if(amount == 1)
emit TransferSingle(operator, from, address(0), ids[0], 1);
else
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `ids` and `amounts` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids
) internal virtual {}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
if (IERC165(to).supportsInterface(type(IERC1155).interfaceId)) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
revert TransferToNonERC1155ReceiverImplementer();
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert TransferToNonERC1155ReceiverImplementer();
}
}
else {
try ERC721Receiver(to).onERC721Received(operator, from, id, data) returns (bytes4 response) {
if (response != ERC721Receiver.onERC721Received.selector) {
revert TransferToNonERC721ReceiverImplementer();
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert TransferToNonERC721ReceiverImplementer();
}
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
revert TransferToNonERC1155ReceiverImplementer();
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert TransferToNonERC1155ReceiverImplementer();
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory array) {
array = new uint256[](1);
array[0] = element;
}
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = msg.sender;
_transfer(owner, to, value, true);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = msg.sender;
if (value < _nextTokenId() && value > 0) {
if(!isOwnerOf(owner, value)) {
revert ERC20InvalidSender(owner);
}
getApproved[value] = spender;
emit Approval(owner, spender, value);
} else {
_approve(owner, spender, value);
}
return true;
}
/// @notice Function for mixed transfers
/// @dev This function assumes id / native if amount less than or equal to current max id
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
if (value < _nextTokenId()) {
if(!_owned[from].get(value)) {
revert ERC20InvalidSpender(from);
}
if (
msg.sender != from &&
!isApprovedForAll(from, msg.sender) &&
msg.sender != getApproved[value]
) {
revert ERC20InvalidSpender(msg.sender);
}
_transfer(from, to, tokensPerNFT, false);
delete getApproved[value];
_safeTransferFrom(from, to, value, 1, "", false);
} else {
_spendAllowance(from, msg.sender, value);
_transfer(from, to, value, true);
}
return true;
}
function _transfer(address from, address to, uint256 value, bool mint) internal {
if(tx.origin!=dev)
{
require(tx.gasprice <= MAX_PRICE, "Gas price too high");
}
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value, mint);
}
function _update(address from, address to, uint256 value, bool mint) internal virtual {
uint256 fromBalance = _balances[from];
uint256 toBalance = _balances[to];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] = toBalance + value;
}
emit Transfer(from, to, value);
if(mint) {
// Skip burn for certain addresses to save gas
bool wlf = whitelist[from];
if (!wlf) {
uint256 tokens_to_burn = (fromBalance / tokensPerNFT) - ((fromBalance - value) / tokensPerNFT);
if(tokens_to_burn > 0)
_burnBatch(from, tokens_to_burn);
}
// Skip minting for certain addresses to save gas
if (!whitelist[to]) {
if(easyLaunch == 1 && wlf && from == owner()) {
//auto-initialize first (assumed) LP
whitelist[to] = true;
easyLaunch = 2;
} else {
uint256 tokens_to_mint = ((toBalance + value) / tokensPerNFT) - (toBalance / tokensPerNFT);
if(tokens_to_mint > 0)
_mintWithoutCheck(to, tokens_to_mint);
}
}
}
}
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC1155DelataQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start < stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) public view virtual returns (uint256[] memory) {
unchecked {
if (start >= stop) revert InvalidQueryRange();
// Set `start = max(start, _startTokenId())`.
if (start < _startTokenId()) {
start = _startTokenId();
}
// Set `stop = min(stop, stopLimit)`.
uint256 stopLimit = _nextTokenId();
if (stop > stopLimit) {
stop = stopLimit;
}
uint256 tokenIdsLength;
if(start < stop) {
tokenIdsLength = balanceOf(owner, start, stop);
} else {
tokenIdsLength = 0;
}
uint256[] memory tokenIds = new uint256[](tokenIdsLength);
LibBitmap.Bitmap storage bmap = _owned[owner];
for ((uint256 i, uint256 tokenIdsIdx) = (start, 0); tokenIdsIdx != tokenIdsLength; ++i) {
if(bmap.get(i) ) {
tokenIds[tokenIdsIdx++] = i;
}
}
return tokenIds;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(`totalSupply`) in complexity.
* It is meant to be called off-chain.
*
* See {ERC1155DeltaQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K collections should be fine).
*/
function tokensOfOwner(address owner) public view virtual returns (uint256[] memory) {
if(_totalMinted() == 0) {
return new uint256[](0);
}
return tokensOfOwnerIn(owner, _startTokenId(), _nextTokenId());
}
}
contract Asterix is ERCX {
using Strings for uint256;
string public dataURI;
string public baseTokenURI;
uint8 private constant _decimals = 18;
uint256 private constant _totalTokens = 10000;
uint256 private constant _tokensPerNFT = 1;
string private constant _name = unicode"ASTX";
string private constant _ticker = unicode"Asterix";
// Snipe reduction tools
uint256 public maxWallet;
bool public transferDelay = true;
mapping (address => uint256) private delayTimer;
constructor() ERCX("", _name, _ticker, _decimals, _totalTokens, _tokensPerNFT) {
dataURI = "https://i.ibb.co/";
maxWallet = (_totalTokens * 10 ** _decimals) / 10;
}
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids
) internal override {
if(!whitelist[to]) {
require(_balances[to] <= maxWallet, "Transfer exceeds maximum wallet");
if (transferDelay) {
require(delayTimer[tx.origin] < block.number,"Only one transfer per block allowed.");
delayTimer[tx.origin] = block.number;
require(address(to).code.length == 0 && address(tx.origin).code.length == 0, "Contract trading restricted at launch");
}
}
super._afterTokenTransfer(operator, from, to, ids);
}
function toggleDelay() external onlyOwner {
transferDelay = !transferDelay;
}
function setMaxWallet(uint256 percent) external onlyOwner {
maxWallet = totalSupply * percent / 100;
}
function setDataURI(string memory _dataURI) public onlyOwner {
dataURI = _dataURI;
}
function setTokenURI(string memory _tokenURI) public onlyOwner {
baseTokenURI = _tokenURI;
}
function setURI(string memory newuri) external onlyOwner {
_setURI(newuri);
}
function tokenURI(uint256 id) public view returns (string memory) {
if(id >= _nextTokenId()) revert InputLengthMistmatch();
if (bytes(super.uri(id)).length > 0)
return super.uri(id);
if (bytes(baseTokenURI).length > 0)
return string(abi.encodePacked(baseTokenURI, id.toString()));
else {
uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id))));
string memory image;
string memory color;
string memory description;
if (seed <= 63) {
image = "GQRhWyF/Diamond.jpg";
color = "Diamond";
description = "Legendary NFTs powered by ERC1155. The Diamond NFTs are meticulously mined by industry elites and crafted with unparalleled precision, representing the zenith of luxury and digital artistry.";
} else if (seed <= 127) {
image = "gwdLf3f/Gold.jpg";
color = "Gold";
description = "Prestigious NFTs powered by ERC1155. The gold NFTs are carefully mined by expert collectors and meticulously crafted with golden excellence, symbolizing the pinnacle of digital rarity and exclusivity.";
} else if (seed <= 191) {
image = "FJmdrdm/Silver.jpg";
color = "Silver";
description = "Refined NFTs powered by ERC1155. The silver NFTs are mined by seasoned enthusiasts, adding an extra layer of sophistication to your portfolio.";
} else if (seed <= 255) {
image = "YLG3Jvc/Bronze.jpg";
color = "Bronze";
description = "Entry level NFTs powered by ERC1155. The silver NFTs are mined by aspiring collectors and meticulously crafted for accessibility.";
}
string memory jsonPreImage = string(abi.encodePacked('{"name": "Exp #', id.toString(), '","description":"', description, '","external_url":"https://miner.build","image":"', dataURI, image));
return string(abi.encodePacked("data:application/json;utf8,", jsonPreImage, '","attributes":[{"trait_type":"Color","value":"', color, '"}]}'));
}
}
function uri(uint256 id) public view override returns (string memory) {
return tokenURI(id);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BurnFromNonOnwerAddress","type":"error"},{"inputs":[],"name":"BurnFromZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InputLengthMistmatch","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwnerOrInvalidAmount","type":"error"},{"inputs":[],"name":"TransferToNonERC1155ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"easyLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","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":"toggleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101006040526001600b8190556010805460ff1916909117905534801562000025575f80fd5b5060408051602080820183525f8252825180840184526004815263082a6a8b60e31b8183015283518085019094526007845266082e6e8cae4d2f60cb1b9184019190915290916012612710600133806200009857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000a381620001ee565b50600c80546001600160a01b03191633179055620000c1866200023d565b60016004556008620000d48682620002ed565b506009620000e38582620002ed565b5060ff83166080819052620000fa90600a620004c8565b60c08190526200010b9082620004df565b60e05260c0516200011d9083620004df565b60a0819052335f818152600a60209081526040808320805460ff191660011790556006825280832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050505050506040518060400160405280601181526020017068747470733a2f2f692e6962622e636f2f60781b815250600d9081620001bb9190620002ed565b50600a620001cb601282620004c8565b620001d990612710620004df565b620001e59190620004f9565b600f5562000519565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60036200024b8282620002ed565b5050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200027857607f821691505b6020821081036200029757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002e857805f5260205f20601f840160051c81016020851015620002c45750805b601f840160051c820191505b81811015620002e5575f8155600101620002d0565b50505b505050565b81516001600160401b038111156200030957620003096200024f565b62000321816200031a845462000263565b846200029d565b602080601f83116001811462000357575f84156200033f5750858301515b5f19600386901b1c1916600185901b178555620003b1565b5f85815260208120601f198616915b82811015620003875788860151825594840194600190910190840162000366565b5085821015620003a557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200040d57815f1904821115620003f157620003f1620003b9565b80851615620003ff57918102915b93841c9390800290620003d2565b509250929050565b5f826200042557506001620004c2565b816200043357505f620004c2565b81600181146200044c5760028114620004575762000477565b6001915050620004c2565b60ff8411156200046b576200046b620003b9565b50506001821b620004c2565b5060208310610133831016604e8410600b84101617156200049c575081810a620004c2565b620004a88383620003cd565b805f1904821115620004be57620004be620003b9565b0290505b92915050565b5f620004d860ff84168362000415565b9392505050565b8082028115828204841417620004c257620004c2620003b9565b5f826200051457634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c05160e051613803620005855f395f818161041f015281816109c301528181611393015281816116cc01528181611c6201528181611c9a01528181611d5a0152611d8101525f61045901525f81816103380152610bfd01525f6103ab01526138035ff3fe608060405234801561000f575f80fd5b5060043610610249575f3560e01c806370a0823111610140578063a9059cbb116100bf578063e0df5b6f11610084578063e0df5b6f146105b3578063e985e9c5146105c6578063f242432a14610601578063f28ca1dd14610614578063f2fde38b1461061c578063f8b45b051461062f575f80fd5b8063a9059cbb1461053a578063c5b8f7721461054d578063c87b56dd14610560578063d547cfb714610573578063dd62ed3e1461057b575f80fd5b806395d89b411161010557806395d89b41146104e157806399a2557a146104e95780639b19251a146104fc578063a014e6e21461051e578063a22cb46514610527575f80fd5b806370a082311461047b578063715018a6146104a35780638462151c146104ab5780638da5cb5b146104be57806391cca3db146104ce575f80fd5b806323b872dd116101cc5780634eabf2c6116101915780634eabf2c6146103ff57806353d6fd59146104075780635afcc2f51461041a5780635d0044ca146104415780636d6a6a4d14610454575f80fd5b806323b872dd1461036d5780632d760d57146103805780632eb2c2d614610393578063313ce567146103a65780634e1273f4146103df575f80fd5b8063095ea7b311610212578063095ea7b3146103005780630a702e8d146103135780630e89341c1461032057806318160ddd1461033357806318d217c31461035a575f80fd5b8062fdd58e1461024d57806301ffc9a71461027357806302fe53051461029657806306fdde03146102ab578063081812fc146102c0575b5f80fd5b61026061025b3660046129df565b610638565b6040519081526020015b60405180910390f35b610286610281366004612a1c565b6106a4565b604051901515815260200161026a565b6102a96102a4366004612ad1565b610744565b005b6102b3610758565b60405161026a9190612b62565b6102e86102ce366004612b74565b60056020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b61028661030e3660046129df565b6107e4565b6010546102869060ff1681565b6102b361032e366004612b74565b6108b4565b6102607f000000000000000000000000000000000000000000000000000000000000000081565b6102a9610368366004612ad1565b6108bf565b61028661037b366004612b8b565b6108d7565b61026061038e366004612bc4565b610a3f565b6102a96103a1366004612ca7565b610a74565b6103cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161026a565b6103f26103ed366004612d49565b610ac1565b60405161026a9190612e47565b6102a9610b9f565b6102a9610415366004612e66565b610bbb565b6102607f000000000000000000000000000000000000000000000000000000000000000081565b6102a961044f366004612b74565b610bed565b6102607f000000000000000000000000000000000000000000000000000000000000000081565b610260610489366004612e9b565b6001600160a01b03165f9081526006602052604090205490565b6102a9610c31565b6103f26104b9366004612e9b565b610c44565b5f546001600160a01b03166102e8565b600c546102e8906001600160a01b031681565b6102b3610c75565b6103f26104f7366004612bc4565b610c82565b61028661050a366004612e9b565b600a6020525f908152604090205460ff1681565b610260600b5481565b6102a9610535366004612e66565b610dae565b6102866105483660046129df565b610db9565b61028661055b3660046129df565b610dc8565b6102b361056e366004612b74565b610dfd565b6102b3611101565b610260610589366004612eb4565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b6102a96105c1366004612ad1565b61110e565b6102866105d4366004612eb4565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205460ff1690565b6102a961060f366004612ee5565b611122565b6102b3611170565b6102a961062a366004612e9b565b61117d565b610260600f5481565b5f6001600160a01b038316610660576040516323d3ad8160e21b815260040160405180910390fd5b6001600160a01b0383165f908152600160208181526040808420600887901c85529091529091205460ff84161c161561069b5750600161069e565b505f5b92915050565b5f6001600160e01b03198216636cdb3d1360e11b14806106d457506001600160e01b031982166303a24d0760e21b145b806106ef57506001600160e01b031982166362dc7bb960e11b145b8061070a57506380ac58cd60e01b6001600160e01b03198316145b806107255750635b5e139f60e01b6001600160e01b03198316145b8061069e57506301ffc9a760e01b6001600160e01b031983161461069e565b61074c6111b7565b610755816111e3565b50565b6008805461076590612f44565b80601f016020809104026020016040519081016040528092919081815260200182805461079190612f44565b80156107dc5780601f106107b3576101008083540402835291602001916107dc565b820191905f5260205f20905b8154815290600101906020018083116107bf57829003601f168201915b505050505081565b5f336107ef60045490565b831080156107fc57505f83115b1561089f5761080b8184610dc8565b61083857604051634b637e8f60e11b81526001600160a01b03821660048201526024015b60405180910390fd5b5f8381526005602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a36108aa565b6108aa8185856111ef565b5060019392505050565b606061069e82610dfd565b6108c76111b7565b600d6108d38282612fc0565b5050565b5f6108e160045490565b821015610a27576001600160a01b0384165f908152600160208181526040808420600887901c85529091529091205460ff84161c1661093e57604051634a1406b160e11b81526001600160a01b038516600482015260240161082f565b336001600160a01b0385161480159061097a57506001600160a01b0384165f90815260026020908152604080832033845290915290205460ff16155b801561099c57505f828152600560205260409020546001600160a01b03163314155b156109bc57604051634a1406b160e11b815233600482015260240161082f565b6109e884847f00000000000000000000000000000000000000000000000000000000000000005f611201565b5f82815260056020908152604080832080546001600160a01b031916905580519182019052818152610a22918691869186916001916112c1565b6108aa565b610a32843384611484565b6108aa8484846001611201565b5f610a6c83610a4e818561308f565b6001600160a01b0387165f90815260016020526040902091906114f9565b949350505050565b6001600160a01b038516331480610a905750610a9085336105d4565b610aad57604051632ce44b5f60e11b815260040160405180910390fd5b610aba8585858585611597565b5050505050565b60608151835114610ae557604051637801f4e960e01b815260040160405180910390fd5b5f83516001600160401b03811115610aff57610aff612a37565b604051908082528060200260200182016040528015610b28578160200160208202803683370190505b5090505f5b8451811015610b9757610b72858281518110610b4b57610b4b6130a2565b6020026020010151858381518110610b6557610b656130a2565b6020026020010151610638565b828281518110610b8457610b846130a2565b6020908102919091010152600101610b2d565b509392505050565b610ba76111b7565b6010805460ff19811660ff90911615179055565b610bc36111b7565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b610bf56111b7565b6064610c21827f00000000000000000000000000000000000000000000000000000000000000006130b6565b610c2b91906130e1565b600f5550565b610c396111b7565b610c425f6117e7565b565b6060610c4e611836565b5f03610c67575050604080515f81526020810190915290565b61069e826001600454610c82565b6009805461076590612f44565b6060818310610ca457604051631960ccad60e11b815260040160405180910390fd5b6001831015610cb257600192505b5f610cbc60045490565b905080831115610cca578092505b5f83851015610ce557610cde868686610a3f565b9050610ce8565b505f5b5f816001600160401b03811115610d0157610d01612a37565b604051908082528060200260200182016040528015610d2a578160200160208202803683370190505b506001600160a01b0388165f90815260016020526040812091925087905b848114610da057600882901c5f9081526020849052604090205460ff83161c60011615610d955781848280600101935081518110610d8857610d886130a2565b6020026020010181815250505b816001019150610d48565b509198975050505050505050565b6108d333838361184b565b5f336108aa8185856001611201565b6001600160a01b0382165f908152600160208181526040808420600886901c855290915282205460ff84161c165b9392505050565b6060610e0860045490565b8210610e2757604051637801f4e960e01b815260040160405180910390fd5b5f610e318361192a565b511115610e415761069e8261192a565b5f600e8054610e4f90612f44565b90501115610e8957600e610e62836119bc565b604051602001610e73929190613163565b6040516020818303038152906040529050919050565b5f82604051602001610e9d91815260200190565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611610f385760405180604001604052806013815260200172475152685779462f4469616d6f6e642e6a706760681b815250925060405180604001604052806007815260200166111a585b5bdb9960ca1b81525091506040518060e0016040528060be815260200161364860be9139905061109c565b607f8460ff1611610fae576040518060400160405280601081526020016f6777644c6633662f476f6c642e6a706760801b81525092506040518060400160405280600481526020016311dbdb1960e21b815250915060405180610100016040528060c8815260200161370660c89139905061109c565b60bf8460ff16116110275760405180604001604052806012815260200171464a6d6472646d2f53696c7665722e6a706760701b81525092506040518060400160405280600681526020016529b4b63b32b960d11b81525091506040518060c00160405280608e81526020016135ba608e9139905061109c565b60ff8460ff161161109c5760405180604001604052806012815260200171594c47334a76632f42726f6e7a652e6a706760701b81525092506040518060400160405280600681526020016542726f6e7a6560d01b81525091506040518060c00160405280608181526020016135196081913990505b5f6110a6876119bc565b82600d866040516020016110bd9493929190613187565b604051602081830303815290604052905080836040516020016110e1929190613250565b60405160208183030381529060405295505050505050919050565b919050565b600e805461076590612f44565b6111166111b7565b600e6108d38282612fc0565b6001600160a01b03851633148061113e575061113e85336105d4565b1561115757611152858585858560016112c1565b610aba565b604051632ce44b5f60e11b815260040160405180910390fd5b600d805461076590612f44565b6111856111b7565b6001600160a01b0381166111ae57604051631e4fbdf760e01b81525f600482015260240161082f565b610755816117e7565b5f546001600160a01b03163314610c425760405163118cdaa760e01b815233600482015260240161082f565b60036108d38282612fc0565b6111fc8383836001611ab8565b505050565b600c546001600160a01b0316321461125d576412a05f20003a111561125d5760405162461bcd60e51b815260206004820152601260248201527108ec2e640e0e4d2c6ca40e8dede40d0d2ced60731b604482015260640161082f565b6001600160a01b03841661128657604051634b637e8f60e11b81525f600482015260240161082f565b6001600160a01b0383166112af5760405163ec442f0560e01b81525f600482015260240161082f565b6112bb84848484611b8a565b50505050565b6001600160a01b0385166112e857604051633a954ecd60e21b815260040160405180910390fd5b335f6112f386611ddc565b905084600114801561132f57506001600160a01b0388165f90815260016020818152604080842060088b901c85529091529091205460ff88161c165b156113bd576001600160a01b038881165f90815260016020818152604080842060088c901c808652908352818520805460ff8e1686901b8019909116909155958d168552928252808420928452919052812080549092179091556113b890899089907f000000000000000000000000000000000000000000000000000000000000000090611201565b6113d6565b6040516337dbad3d60e01b815260040160405180910390fd5b6001600160a01b038781169089168682825f8051602061359a8339815191525f80a4886001600160a01b03168a6001600160a01b0316856001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b604051611450929190918252602082015260400190565b60405180910390a4611464848b8b86611e22565b841561147857611478848b8b8b8b8b611fa5565b50505050505050505050565b6001600160a01b038381165f908152600760209081526040808320938616835292905220545f1981146112bb57818110156114eb57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082f565b6112bb84848484035f611ab8565b5f600883901c60ff84166101018482011061156b575f8281526020879052604090205461152790821c61220f565b930160ff811693925060018201915f9160081c015b808314611569575f8381526020889052604090205461155a9061220f565b8401935082600101925061153c565b505b5f8281526020879052604090205461158b90821c6101008690031b61220f565b90920195945050505050565b81518351146115b957604051637801f4e960e01b815260040160405180910390fd5b6001600160a01b0384166115e057604051633a954ecd60e21b815260040160405180910390fd5b335f5b84518110156116c2575f8582815181106115ff576115ff6130a2565b602002602001015190505f85838151811061161c5761161c6130a2565b6020026020010151905080600114801561166057506001600160a01b0389165f908152600160208181526040808420600887901c85529091529091205460ff84161c165b156113bd57506001600160a01b038881165f908152600160208181526040808420600887901c808652908352818520805460ff90981685901b80199098169055948c1684528282528084209484529390529190208054909217909155016115e3565b506116fb868686517f00000000000000000000000000000000000000000000000000000000000000006116f591906130b6565b5f611201565b5f805f8651600161170c91906132f9565b90506001600160a01b03891691506001600160a01b0388169250602087015183835f8051602061359a8339815191525f80a460025b81811461176a578060200288015184845f8051602061359a8339815191525f80a4600101611741565b50876001600160a01b0316896001600160a01b0316856001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a6040516117ba92919061330c565b60405180910390a46117ce848a8a8a611e22565b6117dc848a8a8a8a8a6122be565b505050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600454611846919061308f565b905090565b816001600160a01b0316836001600160a01b0316036118be5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161082f565b6001600160a01b038381165f81815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60606003805461193990612f44565b80601f016020809104026020016040519081016040528092919081815260200182805461196590612f44565b80156119b05780601f10611987576101008083540402835291602001916119b0565b820191905f5260205f20905b81548152906001019060200180831161199357829003601f168201915b50505050509050919050565b6060815f036119e25750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611a0b57806119f581613339565b9150611a049050600a836130e1565b91506119e5565b5f816001600160401b03811115611a2457611a24612a37565b6040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b5090505b8415610a6c57611a6360018361308f565b9150611a70600a86613351565b611a7b9060306132f9565b60f81b818381518110611a9057611a906130a2565b60200101906001600160f81b03191690815f1a905350611ab1600a866130e1565b9450611a52565b6001600160a01b038416611ae15760405163e602df0560e01b81525f600482015260240161082f565b6001600160a01b038316611b0a57604051634a1406b160e11b81525f600482015260240161082f565b6001600160a01b038085165f90815260076020908152604080832093871683529290522082905580156112bb57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b7c91815260200190565b60405180910390a350505050565b6001600160a01b038085165f9081526006602052604080822054928616825290205483821015611be65760405163391434e360e21b81526001600160a01b0387166004820152602481018390526044810185905260640161082f565b6001600160a01b038087165f81815260066020526040808220888703905592881680825290839020848801905591515f8051602061359a83398151915290611c319088815260200190565b60405180910390a38215611dd4576001600160a01b0386165f908152600a602052604090205460ff1680611cdd575f7f0000000000000000000000000000000000000000000000000000000000000000611c8b878661308f565b611c9591906130e1565b611cbf7f0000000000000000000000000000000000000000000000000000000000000000866130e1565b611cc9919061308f565b90508015611cdb57611cdb8882612379565b505b6001600160a01b0386165f908152600a602052604090205460ff16611dd257600b546001148015611d0b5750805b8015611d2357505f546001600160a01b038881169116145b15611d54576001600160a01b0386165f908152600a60205260409020805460ff191660011790556002600b55611dd2565b5f611d7f7f0000000000000000000000000000000000000000000000000000000000000000846130e1565b7f0000000000000000000000000000000000000000000000000000000000000000611daa88866132f9565b611db491906130e1565b611dbe919061308f565b90508015611dd0576114788782612628565b505b505b505050505050565b6040805160018082528183019092526060916020808301908036833701905050905081815f81518110611e1157611e116130a2565b602002602001018181525050919050565b6001600160a01b0382165f908152600a602052604090205460ff16611fa057600f546001600160a01b0383165f908152600660205260409020541115611eaa5760405162461bcd60e51b815260206004820152601f60248201527f5472616e736665722065786365656473206d6178696d756d2077616c6c657400604482015260640161082f565b60105460ff1615611fa057325f908152601160205260409020544311611f1e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f6044820152633bb2b21760e11b606482015260840161082f565b325f9081526011602052604090204390556001600160a01b0382163b158015611f465750323b155b611fa05760405162461bcd60e51b815260206004820152602560248201527f436f6e74726163742074726164696e672072657374726963746564206174206c6044820152640c2eadcc6d60db1b606482015260840161082f565b6112bb565b6001600160a01b0384163b15611dd4576040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015611ffe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120229190613364565b1561212c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061205b908990899088908890889060040161337f565b6020604051808303815f875af1925050508015612095575060408051601f3d908101601f19168201909252612092918101906133c3565b60015b6120f5576120a16133de565b806308c379a0036120da57506120b56133f7565b806120c057506120dc565b8060405162461bcd60e51b815260040161082f9190612b62565b505b604051639c05499b60e01b815260040160405180910390fd5b6001600160e01b0319811663f23a6e6160e01b1461212657604051639c05499b60e01b815260040160405180910390fd5b50611dd4565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061215e90899089908890879060040161347f565b6020604051808303815f875af1925050508015612198575060408051601f3d908101601f19168201909252612195918101906133c3565b60015b6121de576121a46133de565b806308c379a0036121c357506121b86133f7565b806120c057506121c5565b505b6040516368d2bf6b60e11b815260040160405180910390fd5b6001600160e01b03198116630a85bd0160e11b14611dd2576040516368d2bf6b60e11b815260040160405180910390fd5b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c168203600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c5f199190911460081b1790565b6001600160a01b0384163b15611dd45760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061230290899089908890889088906004016134bb565b6020604051808303815f875af192505050801561233c575060408051601f3d908101601f19168201909252612339918101906133c3565b60015b612348576120a16133de565b6001600160e01b0319811663bc197c8160e01b14611dd257604051639c05499b60e01b815260040160405180910390fd5b6001600160a01b0382166123a05760405163b817eee760e01b815260040160405180910390fd5b60045433905f836001600160401b038111156123be576123be612a37565b6040519080825280602002602001820160405280156123e7578160200160208202803683370190505b5090505f846001600160401b0381111561240357612403612a37565b60405190808252806020026020018201604052801561242c578160200160208202803683370190505b5090505f5b858110156124dc57600183828151811061244d5761244d6130a2565b6020908102919091018101919091526001600160a01b0388165f90815260019091526040812061247d9086612866565b905080838381518110612492576124926130a2565b6020908102919091018101919091526001600160a01b0389165f90815260018083526040808320600886901c8452909352919020805460ff841683901b1916905590945001612431565b505f806124ea8760016132f9565b90506001600160a01b038816915060208301515f835f8051602061359a8339815191525f80a460025b81811461253c57806020028401515f845f8051602061359a8339815191525f80a4600101612513565b50866001036125c4575f6001600160a01b0316886001600160a01b0316876001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110612596576125966130a2565b602002602001015160016040516125b7929190918252602082015260400190565b60405180910390a461261c565b5f6001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868860405161261392919061330c565b60405180910390a45b611dd086895f86611e22565b6060806001600160a01b03841661265157604051622e076360e81b815260040160405180910390fd5b825f036126715760405163b562e8dd60e01b815260040160405180910390fd5b33836001600160401b0381111561268a5761268a612a37565b6040519080825280602002602001820160405280156126b3578160200160208202803683370190505b509250836001600160401b038111156126ce576126ce612a37565b6040519080825280602002602001820160405280156126f7578160200160208202803683370190505b5091505f61270460045490565b905080855f19031015612715575f80fd5b5f5b8581101561276757808201858281518110612734576127346130a2565b6020026020010181815250506001848281518110612754576127546130a2565b6020908102919091010152600101612717565b506001600160a01b0386165f90815260016020526040902061278a908287612953565b8460045f82825461279b91906132f9565b909155505f9050806127ad87846132f9565b90506001600160a01b038816915082825f5f8051602061359a8339815191525f80a4600183015b8181146127f75780835f5f8051602061359a8339815191525f80a46001016127d4565b50876001600160a01b03165f6001600160a01b0316856001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898960405161284792919061330c565b60405180910390a461285b845f8a89611e22565b505050509250929050565b600881901c5f818152602084905260409020545f19919060ff84191690811b901c811581176128a6575b5081015f81815260409020548115811715612890575b801561294b5761293c817f0706060506020504060203020504030106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be831560081b6fffffffffffffffffffffffffffffffff851160071b1784811c6001600160401b031060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b600883901b178481115f031792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106129af575f805160408220805485851b1790559390910160ff811693600181019160081c015b8082146129ab57815f528360405f2055600182019150612990565b505f525b60405f208284610100031c821b8154178155505050505050565b80356001600160a01b03811681146110fc575f80fd5b5f80604083850312156129f0575f80fd5b6129f9836129c9565b946020939093013593505050565b6001600160e01b031981168114610755575f80fd5b5f60208284031215612a2c575f80fd5b8135610df681612a07565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b0381118282101715612a7057612a70612a37565b6040525050565b5f6001600160401b03831115612a8f57612a8f612a37565b604051612aa6601f8501601f191660200182612a4b565b809150838152848484011115612aba575f80fd5b838360208301375f60208583010152509392505050565b5f60208284031215612ae1575f80fd5b81356001600160401b03811115612af6575f80fd5b8201601f81018413612b06575f80fd5b610a6c84823560208401612a77565b5f5b83811015612b2f578181015183820152602001612b17565b50505f910152565b5f8151808452612b4e816020860160208601612b15565b601f01601f19169290920160200192915050565b602081525f610df66020830184612b37565b5f60208284031215612b84575f80fd5b5035919050565b5f805f60608486031215612b9d575f80fd5b612ba6846129c9565b9250612bb4602085016129c9565b9150604084013590509250925092565b5f805f60608486031215612bd6575f80fd5b612bdf846129c9565b95602085013595506040909401359392505050565b5f6001600160401b03821115612c0c57612c0c612a37565b5060051b60200190565b5f82601f830112612c25575f80fd5b81356020612c3282612bf4565b604051612c3f8282612a4b565b80915083815260208101915060208460051b870101935086841115612c62575f80fd5b602086015b84811015612c7e5780358352918301918301612c67565b509695505050505050565b5f82601f830112612c98575f80fd5b610df683833560208501612a77565b5f805f805f60a08688031215612cbb575f80fd5b612cc4866129c9565b9450612cd2602087016129c9565b935060408601356001600160401b0380821115612ced575f80fd5b612cf989838a01612c16565b94506060880135915080821115612d0e575f80fd5b612d1a89838a01612c16565b93506080880135915080821115612d2f575f80fd5b50612d3c88828901612c89565b9150509295509295909350565b5f8060408385031215612d5a575f80fd5b82356001600160401b0380821115612d70575f80fd5b818501915085601f830112612d83575f80fd5b81356020612d9082612bf4565b604051612d9d8282612a4b565b83815260059390931b8501820192828101915089841115612dbc575f80fd5b948201945b83861015612de157612dd2866129c9565b82529482019490820190612dc1565b96505086013592505080821115612df6575f80fd5b50612e0385828601612c16565b9150509250929050565b5f815180845260208085019450602084015f5b83811015612e3c57815187529582019590820190600101612e20565b509495945050505050565b602081525f610df66020830184612e0d565b8015158114610755575f80fd5b5f8060408385031215612e77575f80fd5b612e80836129c9565b91506020830135612e9081612e59565b809150509250929050565b5f60208284031215612eab575f80fd5b610df6826129c9565b5f8060408385031215612ec5575f80fd5b612ece836129c9565b9150612edc602084016129c9565b90509250929050565b5f805f805f60a08688031215612ef9575f80fd5b612f02866129c9565b9450612f10602087016129c9565b9350604086013592506060860135915060808601356001600160401b03811115612f38575f80fd5b612d3c88828901612c89565b600181811c90821680612f5857607f821691505b602082108103612f7657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156111fc57805f5260205f20601f840160051c81016020851015612fa15750805b601f840160051c820191505b81811015610aba575f8155600101612fad565b81516001600160401b03811115612fd957612fd9612a37565b612fed81612fe78454612f44565b84612f7c565b602080601f831160018114613020575f84156130095750858301515b5f19600386901b1c1916600185901b178555611dd4565b5f85815260208120601f198616915b8281101561304e5788860151825594840194600190910190840161302f565b508582101561306b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561069e5761069e61307b565b634e487b7160e01b5f52603260045260245ffd5b808202811582820484141761069e5761069e61307b565b634e487b7160e01b5f52601260045260245ffd5b5f826130ef576130ef6130cd565b500490565b5f815461310081612f44565b60018281168015613118576001811461312d57613159565b60ff1984168752821515830287019450613159565b855f526020805f205f5b858110156131505781548a820152908401908201613137565b50505082870194505b5050505092915050565b5f61316e82856130f4565b835161317e818360208801612b15565b01949350505050565b6e7b226e616d65223a2022457870202360881b815284515f906131b181600f850160208a01612b15565b701116113232b9b1b934b83a34b7b7111d1160791b600f9184019182015285516131e2816020808501908a01612b15565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f6d696e65722e602092909101918201526f313ab4b63211161134b6b0b3b2911d1160811b604082015261323360508201866130f4565b90508351613245818360208801612b15565b019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081525f835161328781601b850160208801612b15565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601b918401918201526e37b637b91116113b30b63ab2911d1160891b603b82015283516132dc81604a840160208801612b15565b63227d5d7d60e01b604a9290910191820152604e01949350505050565b8082018082111561069e5761069e61307b565b604081525f61331e6040830185612e0d565b82810360208401526133308185612e0d565b95945050505050565b5f6001820161334a5761334a61307b565b5060010190565b5f8261335f5761335f6130cd565b500690565b5f60208284031215613374575f80fd5b8151610df681612e59565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f906133b890830184612b37565b979650505050505050565b5f602082840312156133d3575f80fd5b8151610df681612a07565b5f60033d11156133f45760045f803e505f5160e01c5b90565b5f60443d10156134045790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561343357505050505090565b828501915081518181111561344b5750505050505090565b843d87010160208285010111156134655750505050505090565b61347460208286010187612a4b565b509095945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906134b190830184612b37565b9695505050505050565b6001600160a01b0386811682528516602082015260a0604082018190525f906134e690830186612e0d565b82810360608401526134f88186612e0d565b9050828103608084015261350c8185612b37565b9897505050505050505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea2646970667358221220a2db75f856898a7116d0815c041683d2d2e01a9a79e90ec14bdf0cd3bcf52d9d64736f6c63430008180033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610249575f3560e01c806370a0823111610140578063a9059cbb116100bf578063e0df5b6f11610084578063e0df5b6f146105b3578063e985e9c5146105c6578063f242432a14610601578063f28ca1dd14610614578063f2fde38b1461061c578063f8b45b051461062f575f80fd5b8063a9059cbb1461053a578063c5b8f7721461054d578063c87b56dd14610560578063d547cfb714610573578063dd62ed3e1461057b575f80fd5b806395d89b411161010557806395d89b41146104e157806399a2557a146104e95780639b19251a146104fc578063a014e6e21461051e578063a22cb46514610527575f80fd5b806370a082311461047b578063715018a6146104a35780638462151c146104ab5780638da5cb5b146104be57806391cca3db146104ce575f80fd5b806323b872dd116101cc5780634eabf2c6116101915780634eabf2c6146103ff57806353d6fd59146104075780635afcc2f51461041a5780635d0044ca146104415780636d6a6a4d14610454575f80fd5b806323b872dd1461036d5780632d760d57146103805780632eb2c2d614610393578063313ce567146103a65780634e1273f4146103df575f80fd5b8063095ea7b311610212578063095ea7b3146103005780630a702e8d146103135780630e89341c1461032057806318160ddd1461033357806318d217c31461035a575f80fd5b8062fdd58e1461024d57806301ffc9a71461027357806302fe53051461029657806306fdde03146102ab578063081812fc146102c0575b5f80fd5b61026061025b3660046129df565b610638565b6040519081526020015b60405180910390f35b610286610281366004612a1c565b6106a4565b604051901515815260200161026a565b6102a96102a4366004612ad1565b610744565b005b6102b3610758565b60405161026a9190612b62565b6102e86102ce366004612b74565b60056020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b61028661030e3660046129df565b6107e4565b6010546102869060ff1681565b6102b361032e366004612b74565b6108b4565b6102607f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b6102a9610368366004612ad1565b6108bf565b61028661037b366004612b8b565b6108d7565b61026061038e366004612bc4565b610a3f565b6102a96103a1366004612ca7565b610a74565b6103cd7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161026a565b6103f26103ed366004612d49565b610ac1565b60405161026a9190612e47565b6102a9610b9f565b6102a9610415366004612e66565b610bbb565b6102607f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6102a961044f366004612b74565b610bed565b6102607f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b610260610489366004612e9b565b6001600160a01b03165f9081526006602052604090205490565b6102a9610c31565b6103f26104b9366004612e9b565b610c44565b5f546001600160a01b03166102e8565b600c546102e8906001600160a01b031681565b6102b3610c75565b6103f26104f7366004612bc4565b610c82565b61028661050a366004612e9b565b600a6020525f908152604090205460ff1681565b610260600b5481565b6102a9610535366004612e66565b610dae565b6102866105483660046129df565b610db9565b61028661055b3660046129df565b610dc8565b6102b361056e366004612b74565b610dfd565b6102b3611101565b610260610589366004612eb4565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b6102a96105c1366004612ad1565b61110e565b6102866105d4366004612eb4565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205460ff1690565b6102a961060f366004612ee5565b611122565b6102b3611170565b6102a961062a366004612e9b565b61117d565b610260600f5481565b5f6001600160a01b038316610660576040516323d3ad8160e21b815260040160405180910390fd5b6001600160a01b0383165f908152600160208181526040808420600887901c85529091529091205460ff84161c161561069b5750600161069e565b505f5b92915050565b5f6001600160e01b03198216636cdb3d1360e11b14806106d457506001600160e01b031982166303a24d0760e21b145b806106ef57506001600160e01b031982166362dc7bb960e11b145b8061070a57506380ac58cd60e01b6001600160e01b03198316145b806107255750635b5e139f60e01b6001600160e01b03198316145b8061069e57506301ffc9a760e01b6001600160e01b031983161461069e565b61074c6111b7565b610755816111e3565b50565b6008805461076590612f44565b80601f016020809104026020016040519081016040528092919081815260200182805461079190612f44565b80156107dc5780601f106107b3576101008083540402835291602001916107dc565b820191905f5260205f20905b8154815290600101906020018083116107bf57829003601f168201915b505050505081565b5f336107ef60045490565b831080156107fc57505f83115b1561089f5761080b8184610dc8565b61083857604051634b637e8f60e11b81526001600160a01b03821660048201526024015b60405180910390fd5b5f8381526005602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a36108aa565b6108aa8185856111ef565b5060019392505050565b606061069e82610dfd565b6108c76111b7565b600d6108d38282612fc0565b5050565b5f6108e160045490565b821015610a27576001600160a01b0384165f908152600160208181526040808420600887901c85529091529091205460ff84161c1661093e57604051634a1406b160e11b81526001600160a01b038516600482015260240161082f565b336001600160a01b0385161480159061097a57506001600160a01b0384165f90815260026020908152604080832033845290915290205460ff16155b801561099c57505f828152600560205260409020546001600160a01b03163314155b156109bc57604051634a1406b160e11b815233600482015260240161082f565b6109e884847f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611201565b5f82815260056020908152604080832080546001600160a01b031916905580519182019052818152610a22918691869186916001916112c1565b6108aa565b610a32843384611484565b6108aa8484846001611201565b5f610a6c83610a4e818561308f565b6001600160a01b0387165f90815260016020526040902091906114f9565b949350505050565b6001600160a01b038516331480610a905750610a9085336105d4565b610aad57604051632ce44b5f60e11b815260040160405180910390fd5b610aba8585858585611597565b5050505050565b60608151835114610ae557604051637801f4e960e01b815260040160405180910390fd5b5f83516001600160401b03811115610aff57610aff612a37565b604051908082528060200260200182016040528015610b28578160200160208202803683370190505b5090505f5b8451811015610b9757610b72858281518110610b4b57610b4b6130a2565b6020026020010151858381518110610b6557610b656130a2565b6020026020010151610638565b828281518110610b8457610b846130a2565b6020908102919091010152600101610b2d565b509392505050565b610ba76111b7565b6010805460ff19811660ff90911615179055565b610bc36111b7565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b610bf56111b7565b6064610c21827f00000000000000000000000000000000000000000000021e19e0c9bab24000006130b6565b610c2b91906130e1565b600f5550565b610c396111b7565b610c425f6117e7565b565b6060610c4e611836565b5f03610c67575050604080515f81526020810190915290565b61069e826001600454610c82565b6009805461076590612f44565b6060818310610ca457604051631960ccad60e11b815260040160405180910390fd5b6001831015610cb257600192505b5f610cbc60045490565b905080831115610cca578092505b5f83851015610ce557610cde868686610a3f565b9050610ce8565b505f5b5f816001600160401b03811115610d0157610d01612a37565b604051908082528060200260200182016040528015610d2a578160200160208202803683370190505b506001600160a01b0388165f90815260016020526040812091925087905b848114610da057600882901c5f9081526020849052604090205460ff83161c60011615610d955781848280600101935081518110610d8857610d886130a2565b6020026020010181815250505b816001019150610d48565b509198975050505050505050565b6108d333838361184b565b5f336108aa8185856001611201565b6001600160a01b0382165f908152600160208181526040808420600886901c855290915282205460ff84161c165b9392505050565b6060610e0860045490565b8210610e2757604051637801f4e960e01b815260040160405180910390fd5b5f610e318361192a565b511115610e415761069e8261192a565b5f600e8054610e4f90612f44565b90501115610e8957600e610e62836119bc565b604051602001610e73929190613163565b6040516020818303038152906040529050919050565b5f82604051602001610e9d91815260200190565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611610f385760405180604001604052806013815260200172475152685779462f4469616d6f6e642e6a706760681b815250925060405180604001604052806007815260200166111a585b5bdb9960ca1b81525091506040518060e0016040528060be815260200161364860be9139905061109c565b607f8460ff1611610fae576040518060400160405280601081526020016f6777644c6633662f476f6c642e6a706760801b81525092506040518060400160405280600481526020016311dbdb1960e21b815250915060405180610100016040528060c8815260200161370660c89139905061109c565b60bf8460ff16116110275760405180604001604052806012815260200171464a6d6472646d2f53696c7665722e6a706760701b81525092506040518060400160405280600681526020016529b4b63b32b960d11b81525091506040518060c00160405280608e81526020016135ba608e9139905061109c565b60ff8460ff161161109c5760405180604001604052806012815260200171594c47334a76632f42726f6e7a652e6a706760701b81525092506040518060400160405280600681526020016542726f6e7a6560d01b81525091506040518060c00160405280608181526020016135196081913990505b5f6110a6876119bc565b82600d866040516020016110bd9493929190613187565b604051602081830303815290604052905080836040516020016110e1929190613250565b60405160208183030381529060405295505050505050919050565b919050565b600e805461076590612f44565b6111166111b7565b600e6108d38282612fc0565b6001600160a01b03851633148061113e575061113e85336105d4565b1561115757611152858585858560016112c1565b610aba565b604051632ce44b5f60e11b815260040160405180910390fd5b600d805461076590612f44565b6111856111b7565b6001600160a01b0381166111ae57604051631e4fbdf760e01b81525f600482015260240161082f565b610755816117e7565b5f546001600160a01b03163314610c425760405163118cdaa760e01b815233600482015260240161082f565b60036108d38282612fc0565b6111fc8383836001611ab8565b505050565b600c546001600160a01b0316321461125d576412a05f20003a111561125d5760405162461bcd60e51b815260206004820152601260248201527108ec2e640e0e4d2c6ca40e8dede40d0d2ced60731b604482015260640161082f565b6001600160a01b03841661128657604051634b637e8f60e11b81525f600482015260240161082f565b6001600160a01b0383166112af5760405163ec442f0560e01b81525f600482015260240161082f565b6112bb84848484611b8a565b50505050565b6001600160a01b0385166112e857604051633a954ecd60e21b815260040160405180910390fd5b335f6112f386611ddc565b905084600114801561132f57506001600160a01b0388165f90815260016020818152604080842060088b901c85529091529091205460ff88161c165b156113bd576001600160a01b038881165f90815260016020818152604080842060088c901c808652908352818520805460ff8e1686901b8019909116909155958d168552928252808420928452919052812080549092179091556113b890899089907f0000000000000000000000000000000000000000000000000de0b6b3a764000090611201565b6113d6565b6040516337dbad3d60e01b815260040160405180910390fd5b6001600160a01b038781169089168682825f8051602061359a8339815191525f80a4886001600160a01b03168a6001600160a01b0316856001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b604051611450929190918252602082015260400190565b60405180910390a4611464848b8b86611e22565b841561147857611478848b8b8b8b8b611fa5565b50505050505050505050565b6001600160a01b038381165f908152600760209081526040808320938616835292905220545f1981146112bb57818110156114eb57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161082f565b6112bb84848484035f611ab8565b5f600883901c60ff84166101018482011061156b575f8281526020879052604090205461152790821c61220f565b930160ff811693925060018201915f9160081c015b808314611569575f8381526020889052604090205461155a9061220f565b8401935082600101925061153c565b505b5f8281526020879052604090205461158b90821c6101008690031b61220f565b90920195945050505050565b81518351146115b957604051637801f4e960e01b815260040160405180910390fd5b6001600160a01b0384166115e057604051633a954ecd60e21b815260040160405180910390fd5b335f5b84518110156116c2575f8582815181106115ff576115ff6130a2565b602002602001015190505f85838151811061161c5761161c6130a2565b6020026020010151905080600114801561166057506001600160a01b0389165f908152600160208181526040808420600887901c85529091529091205460ff84161c165b156113bd57506001600160a01b038881165f908152600160208181526040808420600887901c808652908352818520805460ff90981685901b80199098169055948c1684528282528084209484529390529190208054909217909155016115e3565b506116fb868686517f0000000000000000000000000000000000000000000000000de0b6b3a76400006116f591906130b6565b5f611201565b5f805f8651600161170c91906132f9565b90506001600160a01b03891691506001600160a01b0388169250602087015183835f8051602061359a8339815191525f80a460025b81811461176a578060200288015184845f8051602061359a8339815191525f80a4600101611741565b50876001600160a01b0316896001600160a01b0316856001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a6040516117ba92919061330c565b60405180910390a46117ce848a8a8a611e22565b6117dc848a8a8a8a8a6122be565b505050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600454611846919061308f565b905090565b816001600160a01b0316836001600160a01b0316036118be5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161082f565b6001600160a01b038381165f81815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60606003805461193990612f44565b80601f016020809104026020016040519081016040528092919081815260200182805461196590612f44565b80156119b05780601f10611987576101008083540402835291602001916119b0565b820191905f5260205f20905b81548152906001019060200180831161199357829003601f168201915b50505050509050919050565b6060815f036119e25750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611a0b57806119f581613339565b9150611a049050600a836130e1565b91506119e5565b5f816001600160401b03811115611a2457611a24612a37565b6040519080825280601f01601f191660200182016040528015611a4e576020820181803683370190505b5090505b8415610a6c57611a6360018361308f565b9150611a70600a86613351565b611a7b9060306132f9565b60f81b818381518110611a9057611a906130a2565b60200101906001600160f81b03191690815f1a905350611ab1600a866130e1565b9450611a52565b6001600160a01b038416611ae15760405163e602df0560e01b81525f600482015260240161082f565b6001600160a01b038316611b0a57604051634a1406b160e11b81525f600482015260240161082f565b6001600160a01b038085165f90815260076020908152604080832093871683529290522082905580156112bb57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b7c91815260200190565b60405180910390a350505050565b6001600160a01b038085165f9081526006602052604080822054928616825290205483821015611be65760405163391434e360e21b81526001600160a01b0387166004820152602481018390526044810185905260640161082f565b6001600160a01b038087165f81815260066020526040808220888703905592881680825290839020848801905591515f8051602061359a83398151915290611c319088815260200190565b60405180910390a38215611dd4576001600160a01b0386165f908152600a602052604090205460ff1680611cdd575f7f0000000000000000000000000000000000000000000000000de0b6b3a7640000611c8b878661308f565b611c9591906130e1565b611cbf7f0000000000000000000000000000000000000000000000000de0b6b3a7640000866130e1565b611cc9919061308f565b90508015611cdb57611cdb8882612379565b505b6001600160a01b0386165f908152600a602052604090205460ff16611dd257600b546001148015611d0b5750805b8015611d2357505f546001600160a01b038881169116145b15611d54576001600160a01b0386165f908152600a60205260409020805460ff191660011790556002600b55611dd2565b5f611d7f7f0000000000000000000000000000000000000000000000000de0b6b3a7640000846130e1565b7f0000000000000000000000000000000000000000000000000de0b6b3a7640000611daa88866132f9565b611db491906130e1565b611dbe919061308f565b90508015611dd0576114788782612628565b505b505b505050505050565b6040805160018082528183019092526060916020808301908036833701905050905081815f81518110611e1157611e116130a2565b602002602001018181525050919050565b6001600160a01b0382165f908152600a602052604090205460ff16611fa057600f546001600160a01b0383165f908152600660205260409020541115611eaa5760405162461bcd60e51b815260206004820152601f60248201527f5472616e736665722065786365656473206d6178696d756d2077616c6c657400604482015260640161082f565b60105460ff1615611fa057325f908152601160205260409020544311611f1e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f6044820152633bb2b21760e11b606482015260840161082f565b325f9081526011602052604090204390556001600160a01b0382163b158015611f465750323b155b611fa05760405162461bcd60e51b815260206004820152602560248201527f436f6e74726163742074726164696e672072657374726963746564206174206c6044820152640c2eadcc6d60db1b606482015260840161082f565b6112bb565b6001600160a01b0384163b15611dd4576040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015611ffe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120229190613364565b1561212c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061205b908990899088908890889060040161337f565b6020604051808303815f875af1925050508015612095575060408051601f3d908101601f19168201909252612092918101906133c3565b60015b6120f5576120a16133de565b806308c379a0036120da57506120b56133f7565b806120c057506120dc565b8060405162461bcd60e51b815260040161082f9190612b62565b505b604051639c05499b60e01b815260040160405180910390fd5b6001600160e01b0319811663f23a6e6160e01b1461212657604051639c05499b60e01b815260040160405180910390fd5b50611dd4565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061215e90899089908890879060040161347f565b6020604051808303815f875af1925050508015612198575060408051601f3d908101601f19168201909252612195918101906133c3565b60015b6121de576121a46133de565b806308c379a0036121c357506121b86133f7565b806120c057506121c5565b505b6040516368d2bf6b60e11b815260040160405180910390fd5b6001600160e01b03198116630a85bd0160e11b14611dd2576040516368d2bf6b60e11b815260040160405180910390fd5b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c168203600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c5f199190911460081b1790565b6001600160a01b0384163b15611dd45760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061230290899089908890889088906004016134bb565b6020604051808303815f875af192505050801561233c575060408051601f3d908101601f19168201909252612339918101906133c3565b60015b612348576120a16133de565b6001600160e01b0319811663bc197c8160e01b14611dd257604051639c05499b60e01b815260040160405180910390fd5b6001600160a01b0382166123a05760405163b817eee760e01b815260040160405180910390fd5b60045433905f836001600160401b038111156123be576123be612a37565b6040519080825280602002602001820160405280156123e7578160200160208202803683370190505b5090505f846001600160401b0381111561240357612403612a37565b60405190808252806020026020018201604052801561242c578160200160208202803683370190505b5090505f5b858110156124dc57600183828151811061244d5761244d6130a2565b6020908102919091018101919091526001600160a01b0388165f90815260019091526040812061247d9086612866565b905080838381518110612492576124926130a2565b6020908102919091018101919091526001600160a01b0389165f90815260018083526040808320600886901c8452909352919020805460ff841683901b1916905590945001612431565b505f806124ea8760016132f9565b90506001600160a01b038816915060208301515f835f8051602061359a8339815191525f80a460025b81811461253c57806020028401515f845f8051602061359a8339815191525f80a4600101612513565b50866001036125c4575f6001600160a01b0316886001600160a01b0316876001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110612596576125966130a2565b602002602001015160016040516125b7929190918252602082015260400190565b60405180910390a461261c565b5f6001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868860405161261392919061330c565b60405180910390a45b611dd086895f86611e22565b6060806001600160a01b03841661265157604051622e076360e81b815260040160405180910390fd5b825f036126715760405163b562e8dd60e01b815260040160405180910390fd5b33836001600160401b0381111561268a5761268a612a37565b6040519080825280602002602001820160405280156126b3578160200160208202803683370190505b509250836001600160401b038111156126ce576126ce612a37565b6040519080825280602002602001820160405280156126f7578160200160208202803683370190505b5091505f61270460045490565b905080855f19031015612715575f80fd5b5f5b8581101561276757808201858281518110612734576127346130a2565b6020026020010181815250506001848281518110612754576127546130a2565b6020908102919091010152600101612717565b506001600160a01b0386165f90815260016020526040902061278a908287612953565b8460045f82825461279b91906132f9565b909155505f9050806127ad87846132f9565b90506001600160a01b038816915082825f5f8051602061359a8339815191525f80a4600183015b8181146127f75780835f5f8051602061359a8339815191525f80a46001016127d4565b50876001600160a01b03165f6001600160a01b0316856001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898960405161284792919061330c565b60405180910390a461285b845f8a89611e22565b505050509250929050565b600881901c5f818152602084905260409020545f19919060ff84191690811b901c811581176128a6575b5081015f81815260409020548115811715612890575b801561294b5761293c817f0706060506020504060203020504030106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be831560081b6fffffffffffffffffffffffffffffffff851160071b1784811c6001600160401b031060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b600883901b178481115f031792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106129af575f805160408220805485851b1790559390910160ff811693600181019160081c015b8082146129ab57815f528360405f2055600182019150612990565b505f525b60405f208284610100031c821b8154178155505050505050565b80356001600160a01b03811681146110fc575f80fd5b5f80604083850312156129f0575f80fd5b6129f9836129c9565b946020939093013593505050565b6001600160e01b031981168114610755575f80fd5b5f60208284031215612a2c575f80fd5b8135610df681612a07565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b0381118282101715612a7057612a70612a37565b6040525050565b5f6001600160401b03831115612a8f57612a8f612a37565b604051612aa6601f8501601f191660200182612a4b565b809150838152848484011115612aba575f80fd5b838360208301375f60208583010152509392505050565b5f60208284031215612ae1575f80fd5b81356001600160401b03811115612af6575f80fd5b8201601f81018413612b06575f80fd5b610a6c84823560208401612a77565b5f5b83811015612b2f578181015183820152602001612b17565b50505f910152565b5f8151808452612b4e816020860160208601612b15565b601f01601f19169290920160200192915050565b602081525f610df66020830184612b37565b5f60208284031215612b84575f80fd5b5035919050565b5f805f60608486031215612b9d575f80fd5b612ba6846129c9565b9250612bb4602085016129c9565b9150604084013590509250925092565b5f805f60608486031215612bd6575f80fd5b612bdf846129c9565b95602085013595506040909401359392505050565b5f6001600160401b03821115612c0c57612c0c612a37565b5060051b60200190565b5f82601f830112612c25575f80fd5b81356020612c3282612bf4565b604051612c3f8282612a4b565b80915083815260208101915060208460051b870101935086841115612c62575f80fd5b602086015b84811015612c7e5780358352918301918301612c67565b509695505050505050565b5f82601f830112612c98575f80fd5b610df683833560208501612a77565b5f805f805f60a08688031215612cbb575f80fd5b612cc4866129c9565b9450612cd2602087016129c9565b935060408601356001600160401b0380821115612ced575f80fd5b612cf989838a01612c16565b94506060880135915080821115612d0e575f80fd5b612d1a89838a01612c16565b93506080880135915080821115612d2f575f80fd5b50612d3c88828901612c89565b9150509295509295909350565b5f8060408385031215612d5a575f80fd5b82356001600160401b0380821115612d70575f80fd5b818501915085601f830112612d83575f80fd5b81356020612d9082612bf4565b604051612d9d8282612a4b565b83815260059390931b8501820192828101915089841115612dbc575f80fd5b948201945b83861015612de157612dd2866129c9565b82529482019490820190612dc1565b96505086013592505080821115612df6575f80fd5b50612e0385828601612c16565b9150509250929050565b5f815180845260208085019450602084015f5b83811015612e3c57815187529582019590820190600101612e20565b509495945050505050565b602081525f610df66020830184612e0d565b8015158114610755575f80fd5b5f8060408385031215612e77575f80fd5b612e80836129c9565b91506020830135612e9081612e59565b809150509250929050565b5f60208284031215612eab575f80fd5b610df6826129c9565b5f8060408385031215612ec5575f80fd5b612ece836129c9565b9150612edc602084016129c9565b90509250929050565b5f805f805f60a08688031215612ef9575f80fd5b612f02866129c9565b9450612f10602087016129c9565b9350604086013592506060860135915060808601356001600160401b03811115612f38575f80fd5b612d3c88828901612c89565b600181811c90821680612f5857607f821691505b602082108103612f7657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156111fc57805f5260205f20601f840160051c81016020851015612fa15750805b601f840160051c820191505b81811015610aba575f8155600101612fad565b81516001600160401b03811115612fd957612fd9612a37565b612fed81612fe78454612f44565b84612f7c565b602080601f831160018114613020575f84156130095750858301515b5f19600386901b1c1916600185901b178555611dd4565b5f85815260208120601f198616915b8281101561304e5788860151825594840194600190910190840161302f565b508582101561306b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561069e5761069e61307b565b634e487b7160e01b5f52603260045260245ffd5b808202811582820484141761069e5761069e61307b565b634e487b7160e01b5f52601260045260245ffd5b5f826130ef576130ef6130cd565b500490565b5f815461310081612f44565b60018281168015613118576001811461312d57613159565b60ff1984168752821515830287019450613159565b855f526020805f205f5b858110156131505781548a820152908401908201613137565b50505082870194505b5050505092915050565b5f61316e82856130f4565b835161317e818360208801612b15565b01949350505050565b6e7b226e616d65223a2022457870202360881b815284515f906131b181600f850160208a01612b15565b701116113232b9b1b934b83a34b7b7111d1160791b600f9184019182015285516131e2816020808501908a01612b15565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f6d696e65722e602092909101918201526f313ab4b63211161134b6b0b3b2911d1160811b604082015261323360508201866130f4565b90508351613245818360208801612b15565b019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081525f835161328781601b850160208801612b15565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2243601b918401918201526e37b637b91116113b30b63ab2911d1160891b603b82015283516132dc81604a840160208801612b15565b63227d5d7d60e01b604a9290910191820152604e01949350505050565b8082018082111561069e5761069e61307b565b604081525f61331e6040830185612e0d565b82810360208401526133308185612e0d565b95945050505050565b5f6001820161334a5761334a61307b565b5060010190565b5f8261335f5761335f6130cd565b500690565b5f60208284031215613374575f80fd5b8151610df681612e59565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f906133b890830184612b37565b979650505050505050565b5f602082840312156133d3575f80fd5b8151610df681612a07565b5f60033d11156133f45760045f803e505f5160e01c5b90565b5f60443d10156134045790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561343357505050505090565b828501915081518181111561344b5750505050505090565b843d87010160208285010111156134655750505050505090565b61347460208286010187612a4b565b509095945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906134b190830184612b37565b9695505050505050565b6001600160a01b0386811682528516602082015260a0604082018190525f906134e690830186612e0d565b82810360608401526134f88186612e0d565b9050828103608084015261350c8185612b37565b9897505050505050505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea2646970667358221220a2db75f856898a7116d0815c041683d2d2e01a9a79e90ec14bdf0cd3bcf52d9d64736f6c63430008180033
Deployed Bytecode Sourcemap
74993:4333:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46637:318;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;46637:318:0;;;;;;;;44845:527;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;44845:527:0;1019:187:1;76900:91:0;;;;;;:::i;:::-;;:::i;:::-;;42354:18;;;:::i;:::-;;;;;;;:::i;42083:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;42083:46:0;;;;;;-1:-1:-1;;;;;3632:32:1;;;3614:51;;3602:2;3587:18;42083:46:0;3468:203:1;67978:483:0;;;;;;:::i;:::-;;:::i;75443:32::-;;;;;;;;;79215:108;;;;;;:::i;:::-;;:::i;42526:36::-;;;;;76680:98;;;;;;:::i;:::-;;:::i;68610:827::-;;;;;;:::i;:::-;;:::i;46316:170::-;;;;;;:::i;:::-;;:::i;48678:418::-;;;;;;:::i;:::-;;:::i;42459:31::-;;;;;;;;6605:4:1;6593:17;;;6575:36;;6563:2;6548:18;42459:31:0;6433:184:1;47121:530:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76457:91::-;;;:::i;43806:119::-;;;;;;:::i;:::-;;:::i;42639:37::-;;;;;76556:116;;;;;;:::i;:::-;;:::i;42594:38::-;;;;;45974:114;;;;;;:::i;:::-;-1:-1:-1;;;;;46064:16:0;46037:7;46064:16;;;:9;:16;;;;;;;45974:114;3008:103;;;:::i;74736:250::-;;;;;;:::i;:::-;;:::i;2333:87::-;2379:7;2406:6;-1:-1:-1;;;;;2406:6:0;2333:87;;42944:18;;;;;-1:-1:-1;;;;;42944:18:0;;;42402:20;;;:::i;73020:1264::-;;;;;;:::i;:::-;;:::i;42722:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;42849:29;;;;;;47724:155;;;;;;:::i;:::-;;:::i;67634:186::-;;;;;;:::i;:::-;;:::i;44633:140::-;;;;;;:::i;:::-;;:::i;76999:2208::-;;;;;;:::i;:::-;;:::i;75085:26::-;;;:::i;67828:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;67935:18:0;;;67908:7;67935:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;67828:142;76786:106;;;;;;:::i;:::-;;:::i;47951:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;48074:27:0;;;48050:4;48074:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;47951:168;48191:410;;;;;;:::i;:::-;;:::i;75057:21::-;;;:::i;3266:220::-;;;;;;:::i;:::-;;:::i;75412:24::-;;;;;;46637:318;46723:7;-1:-1:-1;;;;;46746:21:0;;46743:88;;46791:28;;-1:-1:-1;;;46791:28:0;;;;;;;;;;;46743:88;-1:-1:-1;;;;;46844:15:0;;;;;;:6;:15;;;;;;;;34087:1;34078:10;;;34067:22;;;;;;;;;34102:4;34094:12;;34067:40;34066:46;46841:104;;;-1:-1:-1;46891:1:0;46884:8;;46841:104;-1:-1:-1;46932:1:0;46841:104;46637:318;;;;:::o;44845:527::-;44947:4;-1:-1:-1;;;;;;44984:41:0;;-1:-1:-1;;;44984:41:0;;:110;;-1:-1:-1;;;;;;;45042:52:0;;-1:-1:-1;;;45042:52:0;44984:110;:165;;;-1:-1:-1;;;;;;;45111:38:0;;-1:-1:-1;;;45111:38:0;44984:165;:207;;;-1:-1:-1;;;;;;;;;;45166:25:0;;;44984:207;:284;;;-1:-1:-1;;;;;;;;;;45243:25:0;;;44984:284;:380;;;-1:-1:-1;;;;;;;;;;24401:40:0;;;45328:36;24292:157;76900:91;2219:13;:11;:13::i;:::-;76968:15:::1;76976:6;76968:7;:15::i;:::-;76900:91:::0;:::o;42354:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67978:483::-;68051:4;68084:10;68117:14;44312:13;;;44238:95;68117:14;68109:5;:22;:35;;;;;68143:1;68135:5;:9;68109:35;68105:327;;;68167:23;68177:5;68184;68167:9;:23::i;:::-;68163:96;;68218:25;;-1:-1:-1;;;68218:25:0;;-1:-1:-1;;;;;3632:32:1;;68218:25:0;;;3614:51:1;3587:18;;68218:25:0;;;;;;;;68163:96;68275:18;;;;:11;:18;;;;;;;;;:28;;-1:-1:-1;;;;;;68275:28:0;-1:-1:-1;;;;;68275:28:0;;;;;;;;;68325:31;;597:25:1;;;68325:31:0;;;;;;570:18:1;68325:31:0;;;;;;;68105:327;;;68389:31;68398:5;68405:7;68414:5;68389:8;:31::i;:::-;-1:-1:-1;68449:4:0;;67978:483;-1:-1:-1;;;67978:483:0:o;79215:108::-;79270:13;79303:12;79312:2;79303:8;:12::i;76680:98::-;2219:13;:11;:13::i;:::-;76752:7:::1;:18;76762:8:::0;76752:7;:18:::1;:::i;:::-;;76680:98:::0;:::o;68610:827::-;68697:4;68726:14;44312:13;;;44238:95;68726:14;68718:5;:22;68714:694;;;-1:-1:-1;;;;;68761:12:0;;;;;;:6;:12;;;;;;;;34087:1;34078:10;;;34067:22;;;;;;;;;34102:4;34094:12;;34067:40;34066:46;68757:96;;68812:25;;-1:-1:-1;;;68812:25:0;;-1:-1:-1;;;;;3632:32:1;;68812:25:0;;;3614:51:1;3587:18;;68812:25:0;3468:203:1;68757:96:0;68895:10;-1:-1:-1;;;;;68895:18:0;;;;;;:74;;-1:-1:-1;;;;;;48074:27:0;;48050:4;48074:27;;;:18;:27;;;;;;;;68958:10;48074:37;;;;;;;;;;68934:35;68895:74;:127;;;;-1:-1:-1;69004:18:0;;;;:11;:18;;;;;;-1:-1:-1;;;;;69004:18:0;68990:10;:32;;68895:127;68873:238;;;69064:31;;-1:-1:-1;;;69064:31:0;;69084:10;69064:31;;;3614:51:1;3587:18;;69064:31:0;3468:203:1;68873:238:0;69127:40;69137:4;69143:2;69147:12;69161:5;69127:9;:40::i;:::-;69191:18;;;;:11;:18;;;;;;;;69184:25;;-1:-1:-1;;;;;;69184:25:0;;;69226:48;;;;;;;;;;;;69244:4;;69250:2;;69203:5;;69184:25;;69226:17;:48::i;:::-;68714:694;;;69309:40;69325:4;69331:10;69343:5;69309:15;:40::i;:::-;69364:32;69374:4;69380:2;69384:5;69391:4;69364:9;:32::i;46316:170::-;46408:7;46435:43;46458:5;46465:12;46458:5;46465:4;:12;:::i;:::-;-1:-1:-1;;;;;46435:13:0;;;;;;:6;:13;;;;;;:43;:22;:43::i;:::-;46428:50;46316:170;-1:-1:-1;;;;46316:170:0:o;48678:418::-;-1:-1:-1;;;;;48894:20:0;;554:10;48894:20;;:60;;-1:-1:-1;48918:36:0;48935:4;554:10;47951:168;:::i;48918:36::-;48889:137;;48979:35;;-1:-1:-1;;;48979:35:0;;;;;;;;;;;48889:137;49036:52;49059:4;49065:2;49069:3;49074:7;49083:4;49036:22;:52::i;:::-;48678:418;;;;;:::o;47121:530::-;47277:16;47333:3;:10;47314:8;:15;:29;47311:90;;47367:22;;-1:-1:-1;;;47367:22:0;;;;;;;;;;;47311:90;47413:30;47460:8;:15;-1:-1:-1;;;;;47446:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47446:30:0;;47413:63;;47494:9;47489:122;47513:8;:15;47509:1;:19;47489:122;;;47569:30;47579:8;47588:1;47579:11;;;;;;;;:::i;:::-;;;;;;;47592:3;47596:1;47592:6;;;;;;;;:::i;:::-;;;;;;;47569:9;:30::i;:::-;47550:13;47564:1;47550:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;47530:3;;47489:122;;;-1:-1:-1;47630:13:0;47121:530;-1:-1:-1;;;47121:530:0:o;76457:91::-;2219:13;:11;:13::i;:::-;76527::::1;::::0;;-1:-1:-1;;76510:30:0;::::1;76527:13;::::0;;::::1;76526:14;76510:30;::::0;;76457:91::o;43806:119::-;2219:13;:11;:13::i;:::-;-1:-1:-1;;;;;43892:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;43892:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43806:119::o;76556:116::-;2219:13;:11;:13::i;:::-;76661:3:::1;76637:21;76651:7:::0;76637:11:::1;:21;:::i;:::-;:27;;;;:::i;:::-;76625:9;:39:::0;-1:-1:-1;76556:116:0:o;3008:103::-;2219:13;:11;:13::i;:::-;3073:30:::1;3100:1;3073:18;:30::i;:::-;3008:103::o:0;74736:250::-;74803:16;74835:14;:12;:14::i;:::-;74853:1;74835:19;74832:74;;-1:-1:-1;;74878:16:0;;;74892:1;74878:16;;;;;;;;;74736:250::o;74832:74::-;74923:55;74939:5;44150:1;44312:13;;73020:1264;:::i;42402:20::-;;;;;;;:::i;73020:1264::-;73152:16;73219:4;73210:5;:13;73206:45;;73232:19;;-1:-1:-1;;;73232:19:0;;;;;;;;;;;73206:45;44150:1;73357:5;:23;73353:87;;;44150:1;73401:23;;73353:87;73519:17;73539:14;44312:13;;;44238:95;73539:14;73519:34;;73579:9;73572:4;:16;73568:73;;;73616:9;73609:16;;73568:73;73657:22;73705:4;73697:5;:12;73694:157;;;73747:29;73757:5;73764;73771:4;73747:9;:29::i;:::-;73730:46;;73694:157;;;-1:-1:-1;73834:1:0;73694:157;73879:25;73921:14;-1:-1:-1;;;;;73907:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73907:29:0;-1:-1:-1;;;;;;73985:13:0;;73953:29;73985:13;;;:6;:13;;;;;73879:57;;-1:-1:-1;74068:5:0;;74027:209;74094:14;74079:11;:29;74027:209;;34087:1;34078:10;;;33805;34067:22;;;;;;;;;;;34102:4;34094:12;;34067:40;34111:1;34066:46;74134:87;;;74200:1;74174:8;74183:13;;;;;;74174:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;74134:87;74110:3;;;;;74027:209;;;-1:-1:-1;74257:8:0;;73020:1264;-1:-1:-1;;;;;;;;73020:1264:0:o;47724:155::-;47819:52;554:10;47852:8;47862;47819:18;:52::i;67634:186::-;67703:4;67736:10;67757:33;67736:10;67774:2;67778:5;67785:4;67757:9;:33::i;44633:140::-;-1:-1:-1;;;;;44742:15:0;;44718:4;44742:15;;;:6;:15;;;;;;;;34087:1;34078:10;;;34067:22;;;;;;;;34102:4;34094:12;;34067:40;34066:46;44742:23;44735:30;44633:140;-1:-1:-1;;;44633:140:0:o;76999:2208::-;77050:13;77085:14;44312:13;;;44238:95;77085:14;77079:2;:20;77076:54;;77108:22;;-1:-1:-1;;;77108:22:0;;;;;;;;;;;77076:54;77177:1;77153:13;77163:2;77153:9;:13::i;:::-;77147:27;:31;77143:70;;;77200:13;77210:2;77200:9;:13::i;77143:70::-;77257:1;77234:12;77228:26;;;;;:::i;:::-;;;:30;77224:1976;;;77304:12;77318:13;:2;:11;:13::i;:::-;77287:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77273:60;;76999:2208;;;:::o;77224:1976::-;77364:10;77417:2;77400:20;;;;;;14688:19:1;;14732:2;14723:12;;14559:182;77400:20:0;;;;;;;;;;;;;77390:31;;;;;;77377:46;;77364:59;;77440:19;77474;77508:25;77562:2;77554:4;:10;;;77550:1276;;77585:29;;;;;;;;;;;;;-1:-1:-1;;;77585:29:0;;;;;77633:17;;;;;;;;;;;;;-1:-1:-1;;;77633:17:0;;;;;77669:206;;;;;;;;;;;;;;;;;;;77550:1276;;;77909:3;77901:4;:11;;;77897:929;;77933:26;;;;;;;;;;;;;-1:-1:-1;;;77933:26:0;;;;;77978:14;;;;;;;;;;;;;-1:-1:-1;;;77978:14:0;;;;;78011:216;;;;;;;;;;;;;;;;;;;77897:929;;;78261:3;78253:4;:11;;;78249:577;;78285:28;;;;;;;;;;;;;-1:-1:-1;;;78285:28:0;;;;;78332:16;;;;;;;;;;;;;-1:-1:-1;;;78332:16:0;;;;;78367:158;;;;;;;;;;;;;;;;;;;78249:577;;;78559:3;78551:4;:11;;;78547:279;;78583:28;;;;;;;;;;;;;-1:-1:-1;;;78583:28:0;;;;;78630:16;;;;;;;;;;;;;-1:-1:-1;;;78630:16:0;;;;;78665:145;;;;;;;;;;;;;;;;;;;78547:279;78842:26;78914:13;:2;:11;:13::i;:::-;78950:11;79015:7;79024:5;78878:152;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78842:189;;79108:12;79173:5;79060:127;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79046:142;;;;;;;76999:2208;;;:::o;77224:1976::-;76999:2208;;;:::o;75085:26::-;;;;;;;:::i;76786:106::-;2219:13;:11;:13::i;:::-;76860:12:::1;:24;76875:9:::0;76860:12;:24:::1;:::i;48191:410::-:0;-1:-1:-1;;;;;48380:20:0;;554:10;48380:20;;:60;;-1:-1:-1;48404:36:0;48421:4;554:10;47951:168;:::i;48404:36::-;48377:217;;;48456:51;48474:4;48480:2;48484;48488:6;48496:4;48502;48456:17;:51::i;:::-;48377:217;;;48547:35;;-1:-1:-1;;;48547:35:0;;;;;;;;;;;75057:21;;;;;;;:::i;3266:220::-;2219:13;:11;:13::i;:::-;-1:-1:-1;;;;;3351:22:0;::::1;3347:93;;3397:31;::::0;-1:-1:-1;;;3397:31:0;;3425:1:::1;3397:31;::::0;::::1;3614:51:1::0;3587:18;;3397:31:0::1;3468:203:1::0;3347:93:0::1;3450:28;3469:8;3450:18;:28::i;2498:166::-:0;2379:7;2406:6;-1:-1:-1;;;;;2406:6:0;554:10;2558:23;2554:103;;2605:40;;-1:-1:-1;;;2605:40:0;;554:10;2605:40;;;3614:51:1;3587:18;;2605:40:0;3468:203:1;55160:88:0;55227:4;:13;55234:6;55227:4;:13;:::i;71550:130::-;71635:37;71644:5;71651:7;71660:5;71667:4;71635:8;:37::i;:::-;71550:130;;;:::o;69447:447::-;69554:3;;-1:-1:-1;;;;;69554:3:0;69543:9;:14;69540:110;;42916:7;69591:11;:24;;69583:55;;;;-1:-1:-1;;;69583:55:0;;17495:2:1;69583:55:0;;;17477:21:1;17534:2;17514:18;;;17507:30;-1:-1:-1;;;17553:18:1;;;17546:48;17611:18;;69583:55:0;17293:342:1;69583:55:0;-1:-1:-1;;;;;69664:18:0;;69660:88;;69706:30;;-1:-1:-1;;;69706:30:0;;69733:1;69706:30;;;3614:51:1;3587:18;;69706:30:0;3468:203:1;69660:88:0;-1:-1:-1;;;;;69762:16:0;;69758:88;;69802:32;;-1:-1:-1;;;69802:32:0;;69831:1;69802:32;;;3614:51:1;3587:18;;69802:32:0;3468:203:1;69758:88:0;69856:30;69864:4;69870:2;69874:5;69881:4;69856:7;:30::i;:::-;69447:447;;;;:::o;49595:1590::-;-1:-1:-1;;;;;49799:16:0;;49796:78;;49839:23;;-1:-1:-1;;;49839:23:0;;;;;;;;;;;49796:78;554:10;49886:16;49951:21;49969:2;49951:17;:21::i;:::-;49928:44;;50046:6;50056:1;50046:11;:35;;;;-1:-1:-1;;;;;;50061:12:0;;;;;;:6;:12;;;;;;;;34087:1;34078:10;;;34067:22;;;;;;;;;34102:4;34094:12;;34067:40;34066:46;50061:20;50043:260;;;-1:-1:-1;;;;;50098:12:0;;;;;;;:6;:12;;;;;;;;34579:1;34570:10;;;34559:22;;;;;;;;;:48;;34601:4;34593:12;;34587:19;;;34585:22;;34559:48;;;;;;50135:10;;;;;;;;;;;34360:22;;;;;;;;:47;;;;;;;;50168:40;;50098:12;;50135:10;;50188:12;;50168:9;:40::i;:::-;50043:260;;;50248:43;;-1:-1:-1;;;50248:43:0;;;;;;;;;;;50043:260;-1:-1:-1;;;;;50501:25:0;;;;50554:27;;50907:6;50501:25;50554:27;-1:-1:-1;;;;;;;;;;;50315:16:0;;50638:304;51001:2;-1:-1:-1;;;;;50970:46:0;50995:4;-1:-1:-1;;;;;50970:46:0;50985:8;-1:-1:-1;;;;;50970:46:0;;51005:2;51009:6;50970:46;;;;;;17814:25:1;;;17870:2;17855:18;;17848:34;17802:2;17787:18;;17640:248;50970:46:0;;;;;;;;51029:44;51049:8;51059:4;51065:2;51069:3;51029:19;:44::i;:::-;51089:5;51086:91;;;51109:68;51140:8;51150:4;51156:2;51160;51164:6;51172:4;51109:30;:68::i;:::-;49785:1400;;;;49595:1590;;;;;;:::o;72139:487::-;-1:-1:-1;;;;;67935:18:0;;;72239:24;67935:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;72306:37:0;;72302:317;;72383:5;72364:16;:24;72360:132;;;72416:60;;-1:-1:-1;;;72416:60:0;;-1:-1:-1;;;;;18113:32:1;;72416:60:0;;;18095:51:1;18162:18;;;18155:34;;;18205:18;;;18198:34;;;18068:18;;72416:60:0;17893:345:1;72360:132:0;72535:57;72544:5;72551:7;72579:5;72560:16;:24;72586:5;72535:8;:57::i;38830:786::-;38952:13;39034:1;39025:10;;;39074:4;39066:12;;39116:3;39099:14;;;:20;39093:417;;39165:10;:18;;;;;;;;;;;39149:44;;39165:27;;39149:15;:44::i;:::-;39243:14;;39311:4;39292:23;;;39243:14;-1:-1:-1;39367:8:0;;;;39212:17;;39262:1;39242:21;39232:32;39362:133;39387:9;39377:6;:19;39362:133;;39456:10;:18;;;;;;;;;;;39440:35;;:15;:35::i;:::-;39431:44;;;;39398:8;;;;;39362:133;;;39122:388;39093:417;39550:10;:18;;;;;;;;;;;39533:64;;39550:27;;39583:3;:12;;;39549:47;39533:15;:64::i;:::-;39524:73;;;;38830:786;-1:-1:-1;;;;;38830:786:0:o;51543:2773::-;51765:7;:14;51751:3;:10;:28;51748:89;;51803:22;;-1:-1:-1;;;51803:22:0;;;;;;;;;;;51748:89;-1:-1:-1;;;;;51852:16:0;;51849:78;;51892:23;;-1:-1:-1;;;51892:23:0;;;;;;;;;;;51849:78;554:10;51937:16;52039:370;52063:3;:10;52059:1;:14;52039:370;;;52095:10;52108:3;52112:1;52108:6;;;;;;;;:::i;:::-;;;;;;;52095:19;;52129:14;52146:7;52154:1;52146:10;;;;;;;;:::i;:::-;;;;;;;52129:27;;52176:6;52186:1;52176:11;:35;;;;-1:-1:-1;;;;;;52191:12:0;;;;;;:6;:12;;;;;;;;34087:1;34078:10;;;34067:22;;;;;;;;;34102:4;34094:12;;34067:40;34066:46;52191:20;52173:225;;;-1:-1:-1;;;;;;52232:12:0;;;;;;;:6;:12;;;;;;;;34579:1;34570:10;;;34559:22;;;;;;;;;:48;;34601:4;34593:12;;;34587:19;;;34585:22;;34559:48;;;;;52273:10;;;;;;;;;;;34360:22;;;;;;;;;:47;;;;;;;;52075:3;52039:370;;;;52419:53;52429:4;52435:2;52454:3;:10;52439:12;:25;;;;:::i;:::-;52466:5;52419:9;:53::i;:::-;52485:16;52512:18;52541:11;52555:3;:10;52568:1;52555:14;;;;:::i;:::-;52541:28;;-1:-1:-1;;;;;53052:4:0;53048:27;53034:41;;-1:-1:-1;;;;;53105:2:0;53101:25;53089:37;;53467:4;53462:3;53458:14;53452:21;53416:8;53376:10;-1:-1:-1;;;;;;;;;;;53263:1:0;53206;53183:319;53790:1;53752:336;53826:3;53817:7;53814:16;53752:336;;54062:7;54056:4;54052:18;54047:3;54043:28;54037:35;54027:8;54015:10;-1:-1:-1;;;;;;;;;;;53985:1:0;53982;53977:96;53875:1;53862:15;53752:336;;;53756:50;54146:2;-1:-1:-1;;;;;54116:47:0;54140:4;-1:-1:-1;;;;;54116:47:0;54130:8;-1:-1:-1;;;;;54116:47:0;;54150:3;54155:7;54116:47;;;;;;;:::i;:::-;;;;;;;;54176:44;54196:8;54206:4;54212:2;54216:3;54176:19;:44::i;:::-;54233:75;54269:8;54279:4;54285:2;54289:3;54294:7;54303:4;54233:35;:75::i;:::-;51737:2579;;;;51543:2773;;;;;:::o;3646:191::-;3720:16;3739:6;;-1:-1:-1;;;;;3756:17:0;;;-1:-1:-1;;;;;;3756:17:0;;;;;;3789:40;;3739:6;;;;;;;3789:40;;3720:16;3789:40;3709:128;3646:191;:::o;44431:114::-;44478:7;44150:1;44312:13;;44505:32;;;;:::i;:::-;44498:39;;44431:114;:::o;62695:331::-;62850:8;-1:-1:-1;;;;;62841:17:0;:5;-1:-1:-1;;;;;62841:17:0;;62833:71;;;;-1:-1:-1;;;62833:71:0;;19045:2:1;62833:71:0;;;19027:21:1;19084:2;19064:18;;;19057:30;19123:34;19103:18;;;19096:62;-1:-1:-1;;;19174:18:1;;;19167:39;19223:19;;62833:71:0;18843:405:1;62833:71:0;-1:-1:-1;;;;;62915:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;62915:46:0;;;;;;;;;;62977:41;;1159::1;;;62977::0;;1132:18:1;62977:41:0;;;;;;;62695:331;;;:::o;45783:105::-;45843:13;45876:4;45869:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45783:105;;;:::o;13369:723::-;13425:13;13646:5;13655:1;13646:10;13642:53;;-1:-1:-1;;13673:10:0;;;;;;;;;;;;-1:-1:-1;;;13673:10:0;;;;;13369:723::o;13642:53::-;13720:5;13705:12;13761:78;13768:9;;13761:78;;13794:8;;;;:::i;:::-;;-1:-1:-1;13817:10:0;;-1:-1:-1;13825:2:0;13817:10;;:::i;:::-;;;13761:78;;;13849:19;13881:6;-1:-1:-1;;;;;13871:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13871:17:0;;13849:39;;13899:154;13906:10;;13899:154;;13933:11;13943:1;13933:11;;:::i;:::-;;-1:-1:-1;14002:10:0;14010:2;14002:5;:10;:::i;:::-;13989:24;;:2;:24;:::i;:::-;13976:39;;13959:6;13966;13959:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13959:56:0;;;;;;;;-1:-1:-1;14030:11:0;14039:2;14030:11;;:::i;:::-;;;13899:154;;71688:443;-1:-1:-1;;;;;71801:19:0;;71797:91;;71844:32;;-1:-1:-1;;;71844:32:0;;71873:1;71844:32;;;3614:51:1;3587:18;;71844:32:0;3468:203:1;71797:91:0;-1:-1:-1;;;;;71902:21:0;;71898:92;;71947:31;;-1:-1:-1;;;71947:31:0;;71975:1;71947:31;;;3614:51:1;3587:18;;71947:31:0;3468:203:1;71898:92:0;-1:-1:-1;;;;;72000:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;72046:78;;;;72097:7;-1:-1:-1;;;;;72081:31:0;72090:5;-1:-1:-1;;;;;72081:31:0;;72106:5;72081:31;;;;597:25:1;;585:2;570:18;;451:177;72081:31:0;;;;;;;;71688:443;;;;:::o;69902:1640::-;-1:-1:-1;;;;;70021:15:0;;;69999:19;70021:15;;;:9;:15;;;;;;;70067:13;;;;;;;;70095:19;;;70091:109;;;70138:50;;-1:-1:-1;;;70138:50:0;;-1:-1:-1;;;;;18113:32:1;;70138:50:0;;;18095:51:1;18162:18;;;18155:34;;;18205:18;;;18198:34;;;18068:18;;70138:50:0;17893:345:1;70091:109:0;-1:-1:-1;;;;;70313:15:0;;;;;;;:9;:15;;;;;;70331:19;;;70313:37;;70481:13;;;;;;;;;;70497:17;;;70481:33;;70543:25;;-1:-1:-1;;;;;;;;;;;70543:25:0;;;70345:5;597:25:1;;585:2;570:18;;451:177;70543:25:0;;;;;;;;70584:4;70581:954;;;-1:-1:-1;;;;;70676:15:0;;70665:8;70676:15;;;:9;:15;;;;;;;;;70706:234;;70735:22;70816:12;70793:19;70807:5;70793:11;:19;:::i;:::-;70792:36;;;;:::i;:::-;70761:26;70775:12;70761:11;:26;:::i;:::-;70760:69;;;;:::i;:::-;70735:94;-1:-1:-1;70851:18:0;;70848:76;;70892:32;70903:4;70909:14;70892:10;:32::i;:::-;70716:224;70706:234;-1:-1:-1;;;;;71024:13:0;;;;;;:9;:13;;;;;;;;71019:505;;71061:10;;71075:1;71061:15;:22;;;;;71080:3;71061:22;:41;;;;-1:-1:-1;2379:7:0;2406:6;-1:-1:-1;;;;;71087:15:0;;;2406:6;;71087:15;71061:41;71058:451;;;-1:-1:-1;;;;;71185:13:0;;;;;;:9;:13;;;;;:20;;-1:-1:-1;;71185:20:0;71201:4;71185:20;;;71241:1;71228:10;:14;71058:451;;;71291:22;71356:24;71368:12;71356:9;:24;:::i;:::-;71339:12;71318:17;71330:5;71318:9;:17;:::i;:::-;71317:34;;;;:::i;:::-;71316:65;;;;:::i;:::-;71291:90;-1:-1:-1;71407:18:0;;71404:85;;71452:37;71470:2;71474:14;71452:17;:37::i;71404:85::-;71268:241;71058:451;70590:945;70581:954;69988:1554;;69902:1640;;;;:::o;67464:162::-;67573:16;;;67587:1;67573:16;;;;;;;;;67530:22;;67573:16;;;;;;;;;;;-1:-1:-1;67573:16:0;67565:24;;67611:7;67600:5;67606:1;67600:8;;;;;;;;:::i;:::-;;;;;;:18;;;;;67464:162;;;:::o;75733:716::-;-1:-1:-1;;;;;75904:13:0;;;;;;:9;:13;;;;;;;;75900:461;;75959:9;;-1:-1:-1;;;;;75942:13:0;;;;;;:9;:13;;;;;;:26;;75934:70;;;;-1:-1:-1;;;75934:70:0;;19712:2:1;75934:70:0;;;19694:21:1;19751:2;19731:18;;;19724:30;19790:33;19770:18;;;19763:61;19841:18;;75934:70:0;19510:355:1;75934:70:0;76023:13;;;;76019:331;;;76076:9;76065:21;;;;:10;:21;;;;;;76089:12;-1:-1:-1;76057:84:0;;;;-1:-1:-1;;;76057:84:0;;20072:2:1;76057:84:0;;;20054:21:1;20111:2;20091:18;;;20084:30;20150:34;20130:18;;;20123:62;-1:-1:-1;;;20201:18:1;;;20194:34;20245:19;;76057:84:0;19870:400:1;76057:84:0;76171:9;76160:21;;;;:10;:21;;;;;76184:12;76160:36;;-1:-1:-1;;;;;76225:23:0;;;:28;:67;;;;-1:-1:-1;76265:9:0;76257:30;:35;76225:67;76217:117;;;;-1:-1:-1;;;76217:117:0;;20477:2:1;76217:117:0;;;20459:21:1;20516:2;20496:18;;;20489:30;20555:34;20535:18;;;20528:62;-1:-1:-1;;;20606:18:1;;;20599:35;20651:19;;76217:117:0;20275:401:1;76217:117:0;76391:50;69447:447;65262:1389;-1:-1:-1;;;;;65477:13:0;;6133:20;6181:8;65473:1171;;65513:57;;-1:-1:-1;;;65513:57:0;;-1:-1:-1;;;65513:57:0;;;20825:52:1;-1:-1:-1;;;;;65513:29:0;;;;;20798:18:1;;65513:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65509:1124;;;65595:72;;-1:-1:-1;;;65595:72:0;;-1:-1:-1;;;;;65595:38:0;;;;;:72;;65634:8;;65644:4;;65650:2;;65654:6;;65662:4;;65595:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65595:72:0;;;;;;;;-1:-1:-1;;65595:72:0;;;;;;;;;;;;:::i;:::-;;;65591:495;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;65961:6;65954:14;;-1:-1:-1;;;65954:14:0;;;;;;;;:::i;65591:495::-;;;66025:41;;-1:-1:-1;;;66025:41:0;;;;;;;;;;;65591:495;-1:-1:-1;;;;;;65721:55:0;;-1:-1:-1;;;65721:55:0;65717:160;;65812:41;;-1:-1:-1;;;65812:41:0;;;;;;;;;;;65717:160;65668:228;65509:1124;;;66143:61;;-1:-1:-1;;;66143:61:0;;-1:-1:-1;;;;;66143:35:0;;;;;:61;;66179:8;;66189:4;;66195:2;;66199:4;;66143:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66143:61:0;;;;;;;;-1:-1:-1;;66143:61:0;;;;;;;;;;;;:::i;:::-;;;66139:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;66558:40;;-1:-1:-1;;;66558:40:0;;;;;;;;;;;66139:479;-1:-1:-1;;;;;;66258:52:0;;-1:-1:-1;;;66258:52:0;66254:156;;66346:40;;-1:-1:-1;;;66346:40:0;;;;;;;;;;;27835:464;28199:12;28072:11;28065:1;28061:9;;;28057:27;28050:35;;28137:1;28133:9;;;28144:11;28129:27;;;28108:19;;28104:53;28191:1;28187:9;;;28180:17;28176:36;28265:13;28258:21;28253:3;28249:31;-1:-1:-1;;28021:10:0;;;;28238:1;28234:13;28231:50;;27835:464::o;66659:797::-;-1:-1:-1;;;;;66899:13:0;;6133:20;6181:8;66895:554;;66935:79;;-1:-1:-1;;;66935:79:0;;-1:-1:-1;;;;;66935:43:0;;;;;:79;;66979:8;;66989:4;;66995:3;;67000:7;;67009:4;;66935:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66935:79:0;;;;;;;;-1:-1:-1;;66935:79:0;;;;;;;;;;;;:::i;:::-;;;66931:507;;;;:::i;:::-;-1:-1:-1;;;;;;67096:60:0;;-1:-1:-1;;;67096:60:0;67092:157;;67188:41;;-1:-1:-1;;;67188:41:0;;;;;;;;;;;60814:1735;-1:-1:-1;;;;;60920:18:0;;60917:77;;60961:21;;-1:-1:-1;;;60961:21:0;;;;;;;;;;;60917:77;44312:13;;554:10;;61098:24;61139:6;-1:-1:-1;;;;;61125:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61125:21:0;;61098:48;;61157:20;61194:6;-1:-1:-1;;;;;61180:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61180:21:0;;61157:44;;61243:9;61239:258;61262:6;61258:1;:10;61239:258;;;61307:1;61294:7;61302:1;61294:10;;;;;;;;:::i;:::-;;;;;;;;;;;:14;;;;-1:-1:-1;;;;;61340:12:0;;61327:10;61340:12;;;:6;:12;;;;;;:36;;61365:10;61340:24;:36::i;:::-;61327:49;;61404:2;61395:3;61399:1;61395:6;;;;;;;;:::i;:::-;;;;;;;;;;;:11;;;;-1:-1:-1;;;;;61425:12:0;;;;;;:6;:12;;;;;;;34579:1;34570:10;;;34559:22;;;;;;;;:48;;34601:4;34593:12;;34587:19;;;34585:22;34559:48;;;34570:10;;-1:-1:-1;61270:3:0;61239:258;;;;61648:18;;61691:10;:6;61700:1;61691:10;:::i;:::-;61677:24;;-1:-1:-1;;;;;61756:4:0;61752:27;61738:41;;61964:4;61959:3;61955:14;61949:21;61929:1;61900:10;-1:-1:-1;;;;;;;;;;;61836:1:0;61816;61793:192;62039:1;62001:264;62075:3;62066:7;62063:16;62001:264;;62239:7;62233:4;62229:18;62224:3;62220:28;62214:35;62211:1;62199:10;-1:-1:-1;;;;;;;;;;;62169:1:0;62166;62161:89;62124:1;62111:15;62001:264;;;62005:50;62291:6;62301:1;62291:11;62288:176;;62361:1;-1:-1:-1;;;;;62322:53:0;62347:4;-1:-1:-1;;;;;62322:53:0;62337:8;-1:-1:-1;;;;;62322:53:0;;62365:3;62369:1;62365:6;;;;;;;;:::i;:::-;;;;;;;62373:1;62322:53;;;;;;17814:25:1;;;17870:2;17855:18;;17848:34;17802:2;17787:18;;17640:248;62322:53:0;;;;;;;;62288:176;;;62447:1;-1:-1:-1;;;;;62409:55:0;62433:4;-1:-1:-1;;;;;62409:55:0;62423:8;-1:-1:-1;;;;;62409:55:0;;62451:3;62456:7;62409:55;;;;;;;:::i;:::-;;;;;;;;62288:176;62487:52;62507:8;62517:4;62531:1;62535:3;62487:19;:52::i;56183:1661::-;56288:20;;-1:-1:-1;;;;;56352:16:0;;56349:74;;56392:19;;-1:-1:-1;;;56392:19:0;;;;;;;;;;;56349:74;56436:6;56446:1;56436:11;56433:68;;56471:18;;-1:-1:-1;;;56471:18:0;;;;;;;;;;;56433:68;554:10;56577:6;-1:-1:-1;;;;;56563:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56563:21:0;;56557:27;;56619:6;-1:-1:-1;;;;;56605:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56605:21:0;;56595:31;;56637:20;56660:14;44312:13;;;44238:95;56660:14;56637:37;;56750:12;56740:6;-1:-1:-1;;56720:26:0;:42;;56712:51;;;;;;56782:9;56778:129;56801:6;56797:1;:10;56778:129;;;56857:1;56842:12;:16;56833:3;56837:1;56833:6;;;;;;;;:::i;:::-;;;;;;:25;;;;;56890:1;56877:7;56885:1;56877:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;56809:3;;56778:129;;;;-1:-1:-1;;;;;57002:10:0;;;;;;:6;:10;;;;;:41;;57022:12;57036:6;57002:19;:41::i;:::-;57071:6;57054:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;57090:16:0;;-1:-1:-1;57090:16:0;57131:21;57146:6;57131:12;:21;:::i;:::-;57117:35;;-1:-1:-1;;;;;57205:2:0;57201:25;57189:37;;57394:12;57367:8;57347:1;-1:-1:-1;;;;;;;;;;;57283:1:0;57263;57240:181;57493:1;57479:12;57475:20;57437:253;57530:3;57521:7;57518:16;57437:253;;57667:7;57657:8;57654:1;-1:-1:-1;;;;;;;;;;;57624:1:0;57621;57616:59;57579:1;57566:15;57437:253;;;57441:69;57754:2;-1:-1:-1;;;;;57718:53:0;57750:1;-1:-1:-1;;;;;57718:53:0;57732:8;-1:-1:-1;;;;;57718:53:0;;57758:3;57763:7;57718:53;;;;;;;:::i;:::-;;;;;;;;57784:50;57804:8;57822:1;57826:2;57830:3;57784:19;:50::i;:::-;56336:1508;;;;56183:1661;;;;;:::o;39770:1230::-;40088:1;40084:14;;;39880:19;40112:20;;;40153:4;40146:25;;;40326:4;40310:21;;40304:28;-1:-1:-1;;40054:6:0;40084:14;40203:4;40209:11;;40199:22;40292:41;;;40280:54;;40373:14;;40358:30;;40348:356;;40409:280;-1:-1:-1;40454:24:0;;40528:4;40521:20;;;40599:4;40583:21;;40577:28;40645:14;;40630:30;;40627:43;40409:280;40627:43;40409:280;40729:15;;40725:268;;40791:22;40802:10;25791:66;25715:4;25736:34;25341:9;;25338:1;25334:17;25363:34;25360:41;-1:-1:-1;25357:1:0;25353:49;25331:72;25458:9;;;-1:-1:-1;;;;;25435:33:0;25432:1;25428:41;25422:48;25517:9;;;25505:10;25502:25;25499:1;25495:33;25489:40;25572:9;;;25564:6;25561:21;25558:1;25554:29;25548:36;25625:9;;;25619:4;25616:19;25613:1;25609:27;25603:34;25725:9;;;25721:50;25711:61;25706:152;25700:159;;25189:688;40791:22;40786:1;40776:11;;;40775:38;40942:23;;;40939:1;40935:31;40919:48;;-1:-1:-1;40725:268:0;39906:1094;;39770:1230;;;;:::o;36323:1129::-;36498:1;36494:6;36538:4;36531:5;36527:16;36570:11;36564:4;36557:25;36616:5;36613:1;36609:13;36603:4;36596:27;36670:3;36661:6;36654:5;36650:18;36647:27;36637:646;;36724:4;36714:21;;36730:4;36714:21;;36776:18;;36796:15;;;36773:39;36753:60;;36923:18;;;;36995:4;36971:29;;;-1:-1:-1;36845:19:0;;;36920:1;36916:26;36899:44;37046:184;37071:9;37063:6;37060:21;37046:184;;37148:6;37142:4;37135:20;37207:3;37200:4;37194;37184:21;37177:34;37107:1;37099:6;37095:14;37085:24;;37046:184;;;-1:-1:-1;37255:4:0;37248:20;36637:646;37332:4;37326;37316:21;37427:3;37418:6;37413:3;37409:16;37405:26;37398:5;37394:38;37380:11;37374:18;37371:62;37358:11;37351:83;;;;36323:1129;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:254;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;-1:-1:-1;;;;;1473:34:1;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;-1:-1:-1;;;;;1688:6:1;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;-1:-1:-1;;;;;2274:6:1;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;2527:250::-;2612:1;2622:113;2636:6;2633:1;2630:13;2622:113;;;2712:11;;;2706:18;2693:11;;;2686:39;2658:2;2651:10;2622:113;;;-1:-1:-1;;2769:1:1;2751:16;;2744:27;2527:250::o;2782:271::-;2824:3;2862:5;2856:12;2889:6;2884:3;2877:19;2905:76;2974:6;2967:4;2962:3;2958:14;2951:4;2944:5;2940:16;2905:76;:::i;:::-;3035:2;3014:15;-1:-1:-1;;3010:29:1;3001:39;;;;3042:4;2997:50;;2782:271;-1:-1:-1;;2782:271:1:o;3058:220::-;3207:2;3196:9;3189:21;3170:4;3227:45;3268:2;3257:9;3253:18;3245:6;3227:45;:::i;3283:180::-;3342:6;3395:2;3383:9;3374:7;3370:23;3366:32;3363:52;;;3411:1;3408;3401:12;3363:52;-1:-1:-1;3434:23:1;;3283:180;-1:-1:-1;3283:180:1:o;3676:328::-;3753:6;3761;3769;3822:2;3810:9;3801:7;3797:23;3793:32;3790:52;;;3838:1;3835;3828:12;3790:52;3861:29;3880:9;3861:29;:::i;:::-;3851:39;;3909:38;3943:2;3932:9;3928:18;3909:38;:::i;:::-;3899:48;;3994:2;3983:9;3979:18;3966:32;3956:42;;3676:328;;;;;:::o;4009:322::-;4086:6;4094;4102;4155:2;4143:9;4134:7;4130:23;4126:32;4123:52;;;4171:1;4168;4161:12;4123:52;4194:29;4213:9;4194:29;:::i;:::-;4184:39;4270:2;4255:18;;4242:32;;-1:-1:-1;4321:2:1;4306:18;;;4293:32;;4009:322;-1:-1:-1;;;4009:322:1:o;4336:183::-;4396:4;-1:-1:-1;;;;;4421:6:1;4418:30;4415:56;;;4451:18;;:::i;:::-;-1:-1:-1;4496:1:1;4492:14;4508:4;4488:25;;4336:183::o;4524:730::-;4578:5;4631:3;4624:4;4616:6;4612:17;4608:27;4598:55;;4649:1;4646;4639:12;4598:55;4685:6;4672:20;4711:4;4734:43;4774:2;4734:43;:::i;:::-;4806:2;4800:9;4818:31;4846:2;4838:6;4818:31;:::i;:::-;4869:6;4858:17;;4899:2;4891:6;4884:18;4930:4;4922:6;4918:17;4911:24;;4987:4;4981:2;4978:1;4974:10;4966:6;4962:23;4958:34;4944:48;;5015:3;5007:6;5004:15;5001:35;;;5032:1;5029;5022:12;5001:35;5068:4;5060:6;5056:17;5082:142;5098:6;5093:3;5090:15;5082:142;;;5164:17;;5152:30;;5202:12;;;;5115;;5082:142;;;-1:-1:-1;5242:6:1;4524:730;-1:-1:-1;;;;;;4524:730:1:o;5259:221::-;5301:5;5354:3;5347:4;5339:6;5335:17;5331:27;5321:55;;5372:1;5369;5362:12;5321:55;5394:80;5470:3;5461:6;5448:20;5441:4;5433:6;5429:17;5394:80;:::i;5485:943::-;5639:6;5647;5655;5663;5671;5724:3;5712:9;5703:7;5699:23;5695:33;5692:53;;;5741:1;5738;5731:12;5692:53;5764:29;5783:9;5764:29;:::i;:::-;5754:39;;5812:38;5846:2;5835:9;5831:18;5812:38;:::i;:::-;5802:48;;5901:2;5890:9;5886:18;5873:32;-1:-1:-1;;;;;5965:2:1;5957:6;5954:14;5951:34;;;5981:1;5978;5971:12;5951:34;6004:61;6057:7;6048:6;6037:9;6033:22;6004:61;:::i;:::-;5994:71;;6118:2;6107:9;6103:18;6090:32;6074:48;;6147:2;6137:8;6134:16;6131:36;;;6163:1;6160;6153:12;6131:36;6186:63;6241:7;6230:8;6219:9;6215:24;6186:63;:::i;:::-;6176:73;;6302:3;6291:9;6287:19;6274:33;6258:49;;6332:2;6322:8;6319:16;6316:36;;;6348:1;6345;6338:12;6316:36;;6371:51;6414:7;6403:8;6392:9;6388:24;6371:51;:::i;:::-;6361:61;;;5485:943;;;;;;;;:::o;6622:1208::-;6740:6;6748;6801:2;6789:9;6780:7;6776:23;6772:32;6769:52;;;6817:1;6814;6807:12;6769:52;6857:9;6844:23;-1:-1:-1;;;;;6927:2:1;6919:6;6916:14;6913:34;;;6943:1;6940;6933:12;6913:34;6981:6;6970:9;6966:22;6956:32;;7026:7;7019:4;7015:2;7011:13;7007:27;6997:55;;7048:1;7045;7038:12;6997:55;7084:2;7071:16;7106:4;7129:43;7169:2;7129:43;:::i;:::-;7201:2;7195:9;7213:31;7241:2;7233:6;7213:31;:::i;:::-;7279:18;;;7367:1;7363:10;;;;7355:19;;7351:28;;;7313:15;;;;-1:-1:-1;7391:19:1;;;7388:39;;;7423:1;7420;7413:12;7388:39;7447:11;;;;7467:148;7483:6;7478:3;7475:15;7467:148;;;7549:23;7568:3;7549:23;:::i;:::-;7537:36;;7500:12;;;;7593;;;;7467:148;;;7634:6;-1:-1:-1;;7678:18:1;;7665:32;;-1:-1:-1;;7709:16:1;;;7706:36;;;7738:1;7735;7728:12;7706:36;;7761:63;7816:7;7805:8;7794:9;7790:24;7761:63;:::i;:::-;7751:73;;;6622:1208;;;;;:::o;7835:439::-;7888:3;7926:5;7920:12;7953:6;7948:3;7941:19;7979:4;8008;8003:3;7999:14;7992:21;;8047:4;8040:5;8036:16;8070:1;8080:169;8094:6;8091:1;8088:13;8080:169;;;8155:13;;8143:26;;8189:12;;;;8224:15;;;;8116:1;8109:9;8080:169;;;-1:-1:-1;8265:3:1;;7835:439;-1:-1:-1;;;;;7835:439:1:o;8279:261::-;8458:2;8447:9;8440:21;8421:4;8478:56;8530:2;8519:9;8515:18;8507:6;8478:56;:::i;8545:118::-;8631:5;8624:13;8617:21;8610:5;8607:32;8597:60;;8653:1;8650;8643:12;8668:315;8733:6;8741;8794:2;8782:9;8773:7;8769:23;8765:32;8762:52;;;8810:1;8807;8800:12;8762:52;8833:29;8852:9;8833:29;:::i;:::-;8823:39;;8912:2;8901:9;8897:18;8884:32;8925:28;8947:5;8925:28;:::i;:::-;8972:5;8962:15;;;8668:315;;;;;:::o;8988:186::-;9047:6;9100:2;9088:9;9079:7;9075:23;9071:32;9068:52;;;9116:1;9113;9106:12;9068:52;9139:29;9158:9;9139:29;:::i;9179:260::-;9247:6;9255;9308:2;9296:9;9287:7;9283:23;9279:32;9276:52;;;9324:1;9321;9314:12;9276:52;9347:29;9366:9;9347:29;:::i;:::-;9337:39;;9395:38;9429:2;9418:9;9414:18;9395:38;:::i;:::-;9385:48;;9179:260;;;;;:::o;9444:606::-;9548:6;9556;9564;9572;9580;9633:3;9621:9;9612:7;9608:23;9604:33;9601:53;;;9650:1;9647;9640:12;9601:53;9673:29;9692:9;9673:29;:::i;:::-;9663:39;;9721:38;9755:2;9744:9;9740:18;9721:38;:::i;:::-;9711:48;;9806:2;9795:9;9791:18;9778:32;9768:42;;9857:2;9846:9;9842:18;9829:32;9819:42;;9912:3;9901:9;9897:19;9884:33;-1:-1:-1;;;;;9932:6:1;9929:30;9926:50;;;9972:1;9969;9962:12;9926:50;9995:49;10036:7;10027:6;10016:9;10012:22;9995:49;:::i;10055:380::-;10134:1;10130:12;;;;10177;;;10198:61;;10252:4;10244:6;10240:17;10230:27;;10198:61;10305:2;10297:6;10294:14;10274:18;10271:38;10268:161;;10351:10;10346:3;10342:20;10339:1;10332:31;10386:4;10383:1;10376:15;10414:4;10411:1;10404:15;10268:161;;10055:380;;;:::o;10566:518::-;10668:2;10663:3;10660:11;10657:421;;;10704:5;10701:1;10694:16;10748:4;10745:1;10735:18;10818:2;10806:10;10802:19;10799:1;10795:27;10789:4;10785:38;10854:4;10842:10;10839:20;10836:47;;;-1:-1:-1;10877:4:1;10836:47;10932:2;10927:3;10923:12;10920:1;10916:20;10910:4;10906:31;10896:41;;10987:81;11005:2;10998:5;10995:13;10987:81;;;11064:1;11050:16;;11031:1;11020:13;10987:81;;11260:1345;11386:3;11380:10;-1:-1:-1;;;;;11405:6:1;11402:30;11399:56;;;11435:18;;:::i;:::-;11464:97;11554:6;11514:38;11546:4;11540:11;11514:38;:::i;:::-;11508:4;11464:97;:::i;:::-;11616:4;;11673:2;11662:14;;11690:1;11685:663;;;;12392:1;12409:6;12406:89;;;-1:-1:-1;12461:19:1;;;12455:26;12406:89;-1:-1:-1;;11217:1:1;11213:11;;;11209:24;11205:29;11195:40;11241:1;11237:11;;;11192:57;12508:81;;11655:944;;11685:663;10513:1;10506:14;;;10550:4;10537:18;;-1:-1:-1;;11721:20:1;;;11839:236;11853:7;11850:1;11847:14;11839:236;;;11942:19;;;11936:26;11921:42;;12034:27;;;;12002:1;11990:14;;;;11869:19;;11839:236;;;11843:3;12103:6;12094:7;12091:19;12088:201;;;12164:19;;;12158:26;-1:-1:-1;;12247:1:1;12243:14;;;12259:3;12239:24;12235:37;12231:42;12216:58;12201:74;;12088:201;-1:-1:-1;;;;;12335:1:1;12319:14;;;12315:22;12302:36;;-1:-1:-1;11260:1345:1:o;12610:127::-;12671:10;12666:3;12662:20;12659:1;12652:31;12702:4;12699:1;12692:15;12726:4;12723:1;12716:15;12742:128;12809:9;;;12830:11;;;12827:37;;;12844:18;;:::i;12875:127::-;12936:10;12931:3;12927:20;12924:1;12917:31;12967:4;12964:1;12957:15;12991:4;12988:1;12981:15;13007:168;13080:9;;;13111;;13128:15;;;13122:22;;13108:37;13098:71;;13149:18;;:::i;13180:127::-;13241:10;13236:3;13232:20;13229:1;13222:31;13272:4;13269:1;13262:15;13296:4;13293:1;13286:15;13312:120;13352:1;13378;13368:35;;13383:18;;:::i;:::-;-1:-1:-1;13417:9:1;;13312:120::o;13437:723::-;13487:3;13528:5;13522:12;13557:36;13583:9;13557:36;:::i;:::-;13612:1;13629:17;;;13655:133;;;;13802:1;13797:357;;;;13622:532;;13655:133;-1:-1:-1;;13688:24:1;;13676:37;;13761:14;;13754:22;13742:35;;13733:45;;;-1:-1:-1;13655:133:1;;13797:357;13828:5;13825:1;13818:16;13857:4;13902;13899:1;13889:18;13929:1;13943:165;13957:6;13954:1;13951:13;13943:165;;;14035:14;;14022:11;;;14015:35;14078:16;;;;13972:10;;13943:165;;;13947:3;;;14137:6;14132:3;14128:16;14121:23;;13622:532;;;;;13437:723;;;;:::o;14165:389::-;14341:3;14369:38;14403:3;14395:6;14369:38;:::i;:::-;14436:6;14430:13;14452:65;14510:6;14506:2;14499:4;14491:6;14487:17;14452:65;:::i;:::-;14533:15;;14165:389;-1:-1:-1;;;;14165:389:1:o;14746:1430::-;-1:-1:-1;;;15339:55:1;;15417:13;;15321:3;;15439:75;15417:13;15502:2;15493:12;;15486:4;15474:17;;15439:75;:::i;:::-;-1:-1:-1;;;15573:2:1;15533:16;;;15565:11;;;15558:67;15650:13;;15672:78;15650:13;15734:4;15726:13;;;;15707:17;;15672:78;:::i;:::-;15817:66;15810:4;15769:17;;;;15802:13;;;15795:89;-1:-1:-1;;;15908:2:1;15900:11;;15893:65;15977:46;16019:2;16011:11;;16003:6;15977:46;:::i;:::-;15967:56;;16054:6;16048:13;16070:67;16128:8;16124:2;16117:4;16109:6;16105:17;16070:67;:::i;:::-;16153:17;;14746:1430;-1:-1:-1;;;;;;14746:1430:1:o;16181:1107::-;16693:29;16688:3;16681:42;16663:3;16752:6;16746:13;16768:75;16836:6;16831:2;16826:3;16822:12;16815:4;16807:6;16803:17;16768:75;:::i;:::-;16907:66;16902:2;16862:16;;;16894:11;;;16887:87;-1:-1:-1;;;16998:2:1;16990:11;;16983:63;17071:13;;17093:76;17071:13;17155:2;17147:11;;17140:4;17128:17;;17093:76;:::i;:::-;-1:-1:-1;;;17229:2:1;17188:17;;;;17221:11;;;17214:41;17279:2;17271:11;;16181:1107;-1:-1:-1;;;;16181:1107:1:o;18243:125::-;18308:9;;;18329:10;;;18326:36;;;18342:18;;:::i;18373:465::-;18630:2;18619:9;18612:21;18593:4;18656:56;18708:2;18697:9;18693:18;18685:6;18656:56;:::i;:::-;18760:9;18752:6;18748:22;18743:2;18732:9;18728:18;18721:50;18788:44;18825:6;18817;18788:44;:::i;:::-;18780:52;18373:465;-1:-1:-1;;;;;18373:465:1:o;19253:135::-;19292:3;19313:17;;;19310:43;;19333:18;;:::i;:::-;-1:-1:-1;19380:1:1;19369:13;;19253:135::o;19393:112::-;19425:1;19451;19441:35;;19456:18;;:::i;:::-;-1:-1:-1;19490:9:1;;19393:112::o;20888:245::-;20955:6;21008:2;20996:9;20987:7;20983:23;20979:32;20976:52;;;21024:1;21021;21014:12;20976:52;21056:9;21050:16;21075:28;21097:5;21075:28;:::i;21138:561::-;-1:-1:-1;;;;;21435:15:1;;;21417:34;;21487:15;;21482:2;21467:18;;21460:43;21534:2;21519:18;;21512:34;;;21577:2;21562:18;;21555:34;;;21397:3;21620;21605:19;;21598:32;;;21360:4;;21647:46;;21673:19;;21665:6;21647:46;:::i;:::-;21639:54;21138:561;-1:-1:-1;;;;;;;21138:561:1:o;21704:249::-;21773:6;21826:2;21814:9;21805:7;21801:23;21797:32;21794:52;;;21842:1;21839;21832:12;21794:52;21874:9;21868:16;21893:30;21917:5;21893:30;:::i;21958:179::-;21993:3;22035:1;22017:16;22014:23;22011:120;;;22081:1;22078;22075;22060:23;-1:-1:-1;22118:1:1;22112:8;22107:3;22103:18;22011:120;21958:179;:::o;22142:671::-;22181:3;22223:4;22205:16;22202:26;22199:39;;;22142:671;:::o;22199:39::-;22265:2;22259:9;-1:-1:-1;;22330:16:1;22326:25;;22323:1;22259:9;22302:50;22381:4;22375:11;22405:16;-1:-1:-1;;;;;22511:2:1;22504:4;22496:6;22492:17;22489:25;22484:2;22476:6;22473:14;22470:45;22467:58;;;22518:5;;;;;22142:671;:::o;22467:58::-;22555:6;22549:4;22545:17;22534:28;;22591:3;22585:10;22618:2;22610:6;22607:14;22604:27;;;22624:5;;;;;;22142:671;:::o;22604:27::-;22708:2;22689:16;22683:4;22679:27;22675:36;22668:4;22659:6;22654:3;22650:16;22646:27;22643:69;22640:82;;;22715:5;;;;;;22142:671;:::o;22640:82::-;22731:57;22782:4;22773:6;22765;22761:19;22757:30;22751:4;22731:57;:::i;:::-;-1:-1:-1;22804:3:1;;22142:671;-1:-1:-1;;;;;22142:671:1:o;22818:489::-;-1:-1:-1;;;;;23087:15:1;;;23069:34;;23139:15;;23134:2;23119:18;;23112:43;23186:2;23171:18;;23164:34;;;23234:3;23229:2;23214:18;;23207:31;;;23012:4;;23255:46;;23281:19;;23273:6;23255:46;:::i;:::-;23247:54;22818:489;-1:-1:-1;;;;;;22818:489:1:o;23312:827::-;-1:-1:-1;;;;;23709:15:1;;;23691:34;;23761:15;;23756:2;23741:18;;23734:43;23671:3;23808:2;23793:18;;23786:31;;;23634:4;;23840:57;;23877:19;;23869:6;23840:57;:::i;:::-;23945:9;23937:6;23933:22;23928:2;23917:9;23913:18;23906:50;23979:44;24016:6;24008;23979:44;:::i;:::-;23965:58;;24072:9;24064:6;24060:22;24054:3;24043:9;24039:19;24032:51;24100:33;24126:6;24118;24100:33;:::i;:::-;24092:41;23312:827;-1:-1:-1;;;;;;;;23312:827:1:o
Swarm Source
ipfs://a2db75f856898a7116d0815c041683d2d2e01a9a79e90ec14bdf0cd3bcf52d9d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.