Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 22 from a total of 22 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Free Mint | 14973118 | 1363 days ago | IN | 0 ETH | 0.00169207 | ||||
| Free Mint | 14972680 | 1363 days ago | IN | 0 ETH | 0.00229058 | ||||
| Set Approval For... | 14972461 | 1363 days ago | IN | 0 ETH | 0.00121996 | ||||
| Free Mint | 14972437 | 1363 days ago | IN | 0 ETH | 0.00370561 | ||||
| Free Mint | 14972390 | 1363 days ago | IN | 0 ETH | 0.00295275 | ||||
| Free Mint | 14972339 | 1363 days ago | IN | 0 ETH | 0.00295275 | ||||
| Free Mint | 14972325 | 1363 days ago | IN | 0 ETH | 0.0026186 | ||||
| Free Mint | 14972325 | 1363 days ago | IN | 0 ETH | 0.0026186 | ||||
| Free Mint | 14972282 | 1363 days ago | IN | 0 ETH | 0.00463875 | ||||
| Free Mint | 14972272 | 1363 days ago | IN | 0 ETH | 0.00247146 | ||||
| Free Mint | 14972269 | 1363 days ago | IN | 0 ETH | 0.00302725 | ||||
| Free Mint | 14972240 | 1363 days ago | IN | 0 ETH | 0.00277794 | ||||
| Free Mint | 14972226 | 1363 days ago | IN | 0 ETH | 0.00369661 | ||||
| Free Mint | 14972131 | 1363 days ago | IN | 0 ETH | 0.00250924 | ||||
| Free Mint | 14972131 | 1363 days ago | IN | 0 ETH | 0.00250924 | ||||
| Free Mint | 14972094 | 1363 days ago | IN | 0 ETH | 0.00287522 | ||||
| Free Mint | 14972053 | 1363 days ago | IN | 0 ETH | 0.00194682 | ||||
| Free Mint | 14972004 | 1363 days ago | IN | 0 ETH | 0.00220646 | ||||
| Set Approval For... | 14971474 | 1363 days ago | IN | 0 ETH | 0.00169179 | ||||
| Free Mint | 14971445 | 1363 days ago | IN | 0 ETH | 0.00266963 | ||||
| Free Mint | 14971383 | 1363 days ago | IN | 0 ETH | 0.00319146 | ||||
| Set Paused | 14971377 | 1363 days ago | IN | 0 ETH | 0.00072075 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
orcbaby
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-06-16
*/
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @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);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: erc721a/contracts/IERC721A.sol
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of an ERC721A compliant contract.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* The caller cannot approve to their own address.
*/
error ApproveToCaller();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
uint24 extraData;
}
/**
* @dev Returns the total amount of tokens stored by the contract.
*
* Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
*/
function totalSupply() external view returns (uint256);
// ==============================
// 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);
// ==============================
// IERC721
// ==============================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// ==============================
// IERC721Metadata
// ==============================
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
// ==============================
// IERC2309
// ==============================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
* as defined in the ERC2309 standard. See `_mintERC2309` for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// File: erc721a/contracts/ERC721A.sol
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev ERC721 token receiver interface.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
* including the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at `_startTokenId()`
* (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Mask of an entry in packed address data.
uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with `_mintERC2309`.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
// is required to cause an overflow, which is unrealistic.
uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The tokenId of the next token to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See `_packedOwnershipOf` implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see `_totalMinted`.
*/
function totalSupply() public view override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to `_startTokenId()`
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view returns (uint256) {
return _burnCounter;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes of the XOR of
// all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
// e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> BITPOS_AUX);
}
/**
* Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
_packedAddressData[owner] = packed;
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & BITMASK_BURNED == 0) {
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed is zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
ownership.burned = packed & BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
}
/**
* Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, BITMASK_ADDRESS)
// `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSenderERC721A()) revert ApproveToCaller();
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event for each mint.
*/
function _mint(address to, uint256 quantity) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 tokenId = startTokenId;
uint256 end = startTokenId + quantity;
do {
emit Transfer(address(0), to, tokenId++);
} while (tokenId < end);
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
assembly {
// Compute the slot.
mstore(0x00, tokenId)
mstore(0x20, tokenApprovalsPtr.slot)
approvedAddressSlot := keccak256(0x00, 0x40)
// Load the slot's value from storage.
approvedAddress := sload(approvedAddressSlot)
}
}
/**
* @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
*/
function _isOwnerOrApproved(
address approvedAddress,
address from,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
from := and(from, BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, BITMASK_ADDRESS)
// `msgSender == from || msgSender == approvedAddress`.
result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `_burn(tokenId, false)`.
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
* This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred.
* This includes minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function _toString(uint256 value) internal pure returns (string memory ptr) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit),
// but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
// We will need 1 32-byte word to store the length,
// and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
ptr := add(mload(0x40), 128)
// Update the free memory pointer to allocate.
mstore(0x40, ptr)
// Cache the end of the memory to calculate the length later.
let end := ptr
// We write the string from the rightmost digit to the leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// Costs a bit more than early returning for the zero case,
// but cheaper in terms of deployment and overall runtime costs.
for {
// Initialize and perform the first pass without check.
let temp := value
// Move the pointer 1 byte leftwards to point to an empty character slot.
ptr := sub(ptr, 1)
// Write the character to the pointer. 48 is the ASCII index of '0'.
mstore8(ptr, add(48, mod(temp, 10)))
temp := div(temp, 10)
} temp {
// Keep dividing `temp` until zero.
temp := div(temp, 10)
} {
// Body of the for loop.
ptr := sub(ptr, 1)
mstore8(ptr, add(48, mod(temp, 10)))
}
let length := sub(end, ptr)
// Move the pointer 32 bytes leftwards to make room for the length.
ptr := sub(ptr, 32)
// Store the length.
mstore(ptr, length)
}
}
}
// File: contracts/orcbaby.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/*
orcbaby.sol
Contract by @markosystem
*/
/*
$$$$$$\ $$$$$$$\ $$$$$$\ $$$$$$$\ $$$$$$\ $$$$$$$\ $$\ $$\
$$ __$$\ $$ __$$\ $$ __$$\ $$ __$$\ $$ __$$\ $$ __$$\\$$\ $$ |
$$ / $$ |$$ | $$ |$$ / \__|$$\ $$ | $$ |$$ / $$ |$$ | $$ |\$$\ $$ /
$$ | $$ |$$$$$$$ |$$ | \__|$$$$$$$\ |$$$$$$$$ |$$$$$$$\ | \$$$$ /
$$ | $$ |$$ __$$< $$ | $$ __$$\ $$ __$$ |$$ __$$\ \$$ /
$$ | $$ |$$ | $$ |$$ | $$\ $$\ $$ | $$ |$$ | $$ |$$ | $$ | $$ |
$$$$$$ |$$ | $$ |\$$$$$$ |\__|$$$$$$$ |$$ | $$ |$$$$$$$ | $$ |
\______/ \__| \__| \______/ \_______/ \__| \__|\_______/ \__|
*/
contract orcbaby is Ownable, ERC721A {
uint256 constant public MAX_SUPPLY = 10000;
uint256 constant public FREE_MINT_MAX = 4000;
uint256 public TEAM_MINT_MAX = 100;
uint256 public publicPrice = 0.0077 ether;
uint256 constant public PUBLIC_MINT_LIMIT_TXN = 10;
uint256 constant public PUBLIC_MINT_LIMIT = 20;
uint256 public TOTAL_SUPPLY_TEAM;
string public revealedURI;
string public hiddenURI = "ipfs://QmQ9f7qg6vywn6Uj4SjAWGsKHzGZBjjg2Qhw3kEEGmpmvu";
// OpenSea CONTRACT_URI - https://docs.opensea.io/docs/contract-level-metadata
string public CONTRACT_URI = "ipfs://QmQ9f7qg6vywn6Uj4SjAWGsKHzGZBjjg2Qhw3kEEGmpmvu";
bool public paused = true;
bool public revealed = true;
bool public freeSale = true;
bool public publicSale = false;
address constant internal DEV_ADDRESS = 0x5444284bFbC8c63A780C06D26A5042346618B422;
address public teamWallet = 0x40306f6F717cD2DCc0dE5FFa7726aB708a1E8725;
mapping(address => bool) public userMintedFree;
mapping(address => uint256) public numUserMints;
constructor(
string memory initRevealedURI
) ERC721A("ORCBABY", "ORCBABY") {
setBaseURI(initRevealedURI);
_safeMint(msg.sender, TEAM_MINT_MAX);
}
/*
*
$$$$$$$\ $$\ $$\ $$$$$$$$\ $$\ $$\
$$ __$$\ \__| $$ | $$ _____| $$ | \__|
$$ | $$ | $$$$$$\ $$\ $$\ $$\ $$$$$$\ $$$$$$\ $$$$$$\ $$ | $$\ $$\ $$$$$$$\ $$$$$$$\ $$$$$$\ $$\ $$$$$$\ $$$$$$$\ $$$$$$$\
$$$$$$$ |$$ __$$\ $$ |\$$\ $$ |\____$$\\_$$ _| $$ __$$\ $$$$$\ $$ | $$ |$$ __$$\ $$ _____|\_$$ _| $$ |$$ __$$\ $$ __$$\ $$ _____|
$$ ____/ $$ | \__|$$ | \$$\$$ / $$$$$$$ | $$ | $$$$$$$$ | $$ __|$$ | $$ |$$ | $$ |$$ / $$ | $$ |$$ / $$ |$$ | $$ |\$$$$$$\
$$ | $$ | $$ | \$$$ / $$ __$$ | $$ |$$\ $$ ____| $$ | $$ | $$ |$$ | $$ |$$ | $$ |$$\ $$ |$$ | $$ |$$ | $$ | \____$$\
$$ | $$ | $$ | \$ / \$$$$$$$ | \$$$$ |\$$$$$$$\ $$ | \$$$$$$ |$$ | $$ |\$$$$$$$\ \$$$$ |$$ |\$$$$$$ |$$ | $$ |$$$$$$$ |
\__| \__| \__| \_/ \_______| \____/ \_______| \__| \______/ \__| \__| \_______| \____/ \__| \______/ \__| \__|\_______/
*
*/
// This function is if you want to override the first Token ID# for ERC721A
// Note: Fun fact - by overloading this method you save a small amount of gas for minting (technically just the first mint)
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
function refundOverpay(uint256 price) private {
if (msg.value > price) {
(bool succ, ) = payable(msg.sender).call{
value: (msg.value - price)
}("");
require(succ, "Transfer failed");
}
else if (msg.value < price) {
revert("Not enough ETH sent");
}
}
/*
*
$$$$$$$\ $$\ $$\ $$\ $$$$$$$$\ $$\ $$\
$$ __$$\ $$ | $$ |\__| $$ _____| $$ | \__|
$$ | $$ |$$\ $$\ $$$$$$$\ $$ |$$\ $$$$$$$\ $$ | $$\ $$\ $$$$$$$\ $$$$$$$\ $$$$$$\ $$\ $$$$$$\ $$$$$$$\ $$$$$$$\
$$$$$$$ |$$ | $$ |$$ __$$\ $$ |$$ |$$ _____| $$$$$\ $$ | $$ |$$ __$$\ $$ _____|\_$$ _| $$ |$$ __$$\ $$ __$$\ $$ _____|
$$ ____/ $$ | $$ |$$ | $$ |$$ |$$ |$$ / $$ __|$$ | $$ |$$ | $$ |$$ / $$ | $$ |$$ / $$ |$$ | $$ |\$$$$$$\
$$ | $$ | $$ |$$ | $$ |$$ |$$ |$$ | $$ | $$ | $$ |$$ | $$ |$$ | $$ |$$\ $$ |$$ | $$ |$$ | $$ | \____$$\
$$ | \$$$$$$ |$$$$$$$ |$$ |$$ |\$$$$$$$\ $$ | \$$$$$$ |$$ | $$ |\$$$$$$$\ \$$$$ |$$ |\$$$$$$ |$$ | $$ |$$$$$$$ |
\__| \______/ \_______/ \__|\__| \_______| \__| \______/ \__| \__| \_______| \____/ \__| \______/ \__| \__|\_______/
*
*/
function freeMint(uint256 quantity) external payable mintCompliance(quantity) {
require(freeSale, "Free sale inactive");
require(msg.value == 0, "This phase is free");
require(quantity == 1, "Only 1 free");
uint256 newSupply = (totalSupply()) + quantity;
require(newSupply <= FREE_MINT_MAX, "Not enough free supply");
require(!userMintedFree[msg.sender], "User max free limit");
userMintedFree[msg.sender] = true;
if(newSupply == FREE_MINT_MAX) {
freeSale = false;
publicSale = true;
}
_safeMint(msg.sender, quantity);
}
function publicMint(uint256 quantity) external payable mintCompliance(quantity) {
require(publicSale, "Public sale inactive");
require(quantity <= PUBLIC_MINT_LIMIT_TXN, "Quantity too high");
uint256 price = publicPrice;
uint256 currMints = numUserMints[msg.sender];
require(currMints + quantity <= PUBLIC_MINT_LIMIT, "User max mint limit");
refundOverpay(price * quantity);
numUserMints[msg.sender] = (currMints + quantity);
_safeMint(msg.sender, quantity);
}
/*
*
$$\ $$\ $$\ $$$$$$$$\ $$\ $$\
$$ | $$ |\__| $$ _____| $$ | \__|
$$ | $$ |$$\ $$$$$$\ $$\ $$\ $$\ $$ | $$\ $$\ $$$$$$$\ $$$$$$$\ $$$$$$\ $$\ $$$$$$\ $$$$$$$\ $$$$$$$\
\$$\ $$ |$$ |$$ __$$\ $$ | $$ | $$ | $$$$$\ $$ | $$ |$$ __$$\ $$ _____|\_$$ _| $$ |$$ __$$\ $$ __$$\ $$ _____|
\$$\$$ / $$ |$$$$$$$$ |$$ | $$ | $$ | $$ __|$$ | $$ |$$ | $$ |$$ / $$ | $$ |$$ / $$ |$$ | $$ |\$$$$$$\
\$$$ / $$ |$$ ____|$$ | $$ | $$ | $$ | $$ | $$ |$$ | $$ |$$ | $$ |$$\ $$ |$$ | $$ |$$ | $$ | \____$$\
\$ / $$ |\$$$$$$$\ \$$$$$\$$$$ | $$ | \$$$$$$ |$$ | $$ |\$$$$$$$\ \$$$$ |$$ |\$$$$$$ |$$ | $$ |$$$$$$$ |
\_/ \__| \_______| \_____\____/ \__| \______/ \__| \__| \_______| \____/ \__| \______/ \__| \__|\_______/
*
*/
// Note: walletOfOwner is only really necessary for enumerability when staking/using on websites etc.
// That said, it's a public view so we can keep it in.
// This could also be optimized if someone REALLY wanted, but it's just a public view.
// Check the pinned tweets of 0xInuarashi for more ideas on this method!
// For now, this is just the version that existed in v1.
function walletOfOwner(address _owner) public view returns (uint256[] memory)
{
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
uint256 currentTokenId = 1;
uint256 ownedTokenIndex = 0;
while (ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY) {
address currentTokenOwner = ownerOf(currentTokenId);
if (currentTokenOwner == _owner) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
currentTokenId++;
}
return ownedTokenIds;
}
function tokenURI(uint256 _tokenId) public view override returns (string memory) {
// Note: You don't REALLY need this require statement since nothing should be querying for non-existing tokens after reveal.
// That said, it's a public view method so gas efficiency shouldn't come into play.
require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
if (revealed) {
return string(abi.encodePacked(revealedURI, Strings.toString(_tokenId), ".json"));
}
else {
return hiddenURI;
}
}
// https://docs.opensea.io/docs/contract-level-metadata
// https://ethereum.stackexchange.com/questions/110924/how-to-properly-implement-a-contracturi-for-on-chain-nfts
function contractURI() public view returns (string memory) {
return CONTRACT_URI;
}
/*
*
$$$$$$\ $$$$$$$$\ $$\ $$\
$$ __$$\ $$ _____| $$ | \__|
$$ / $$ |$$\ $$\ $$\ $$$$$$$\ $$$$$$\ $$$$$$\ $$ | $$\ $$\ $$$$$$$\ $$$$$$$\ $$$$$$\ $$\ $$$$$$\ $$$$$$$\ $$$$$$$\
$$ | $$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\ $$ __$$\ $$$$$\ $$ | $$ |$$ __$$\ $$ _____|\_$$ _| $$ |$$ __$$\ $$ __$$\ $$ _____|
$$ | $$ |$$ | $$ | $$ |$$ | $$ |$$$$$$$$ |$$ | \__| $$ __|$$ | $$ |$$ | $$ |$$ / $$ | $$ |$$ / $$ |$$ | $$ |\$$$$$$\
$$ | $$ |$$ | $$ | $$ |$$ | $$ |$$ ____|$$ | $$ | $$ | $$ |$$ | $$ |$$ | $$ |$$\ $$ |$$ | $$ |$$ | $$ | \____$$\
$$$$$$ |\$$$$$\$$$$ |$$ | $$ |\$$$$$$$\ $$ | $$ | \$$$$$$ |$$ | $$ |\$$$$$$$\ \$$$$ |$$ |\$$$$$$ |$$ | $$ |$$$$$$$ |
\______/ \_____\____/ \__| \__| \_______|\__| \__| \______/ \__| \__| \_______| \____/ \__| \______/ \__| \__|\_______/
*
*/
function setTeamMintMax(uint256 _teamMintMax) public onlyOwner {
TEAM_MINT_MAX = _teamMintMax;
}
function setPublicPrice(uint256 _publicPrice) public onlyOwner {
publicPrice = _publicPrice;
}
function setBaseURI(string memory _baseUri) public onlyOwner {
revealed = true;
revealedURI = _baseUri;
}
// Note: This method can be hidden/removed if this is a constant.
function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
hiddenURI = _hiddenMetadataUri;
}
function revealCollection(bool _revealed, string memory _baseUri) public onlyOwner {
revealed = _revealed;
revealedURI = _baseUri;
}
// https://docs.opensea.io/docs/contract-level-metadata
function setContractURI(string memory _contractURI) public onlyOwner {
CONTRACT_URI = _contractURI;
}
// Note: Another option is to inherit Pausable without implementing the logic yourself.
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/Pausable.sol
function setPaused(bool _state) public onlyOwner {
paused = _state;
}
function setRevealed(bool _state) public onlyOwner {
revealed = _state;
}
function setPublicEnabled(bool _state) public onlyOwner {
publicSale = _state;
freeSale = !_state;
}
function setFreeEnabled(bool _state) public onlyOwner {
freeSale = _state;
publicSale = !_state;
}
function setTeamWalletAddress(address _teamWallet) public onlyOwner {
teamWallet = _teamWallet;
}
function withdraw() external payable onlyOwner {
// Get the current funds to calculate initial percentages
uint256 currBalance = address(this).balance;
(bool succ, ) = payable(DEV_ADDRESS).call{
value: (currBalance * 4000) / 10000
}("");
require(succ, "Dev transfer failed");
// Withdraw the ENTIRE remaining balance to the team wallet
(succ, ) = payable(teamWallet).call{
value: address(this).balance
}("");
require(succ, "Team (remaining) transfer failed");
}
// Owner-only mint functionality to "Airdrop" mints to specific users
// Note: These will likely end up hidden on OpenSea
function mintToUser(uint256 quantity, address receiver) public onlyOwner mintCompliance(quantity) {
_safeMint(receiver, quantity);
}
/*
*
$$\ $$\ $$\ $$\ $$$$$$\ $$\
$$$\ $$$ | $$ |\__|$$ __$$\ \__|
$$$$\ $$$$ | $$$$$$\ $$$$$$$ |$$\ $$ / \__|$$\ $$$$$$\ $$$$$$\ $$$$$$$\
$$\$$\$$ $$ |$$ __$$\ $$ __$$ |$$ |$$$$\ $$ |$$ __$$\ $$ __$$\ $$ _____|
$$ \$$$ $$ |$$ / $$ |$$ / $$ |$$ |$$ _| $$ |$$$$$$$$ |$$ | \__|\$$$$$$\
$$ |\$ /$$ |$$ | $$ |$$ | $$ |$$ |$$ | $$ |$$ ____|$$ | \____$$\
$$ | \_/ $$ |\$$$$$$ |\$$$$$$$ |$$ |$$ | $$ |\$$$$$$$\ $$ | $$$$$$$ |
\__| \__| \______/ \_______|\__|\__| \__| \_______|\__| \_______/
*
*/
modifier mintCompliance(uint256 quantity) {
require(!paused, "Contract is paused");
require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough mints left");
require(tx.origin == msg.sender, "No contract minting");
_;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"initRevealedURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_LIMIT_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_MINT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY_TEAM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numUserMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseUri","type":"string"}],"name":"revealCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setFreeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_teamMintMax","type":"uint256"}],"name":"setTeamMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamWallet","type":"address"}],"name":"setTeamWalletAddress","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":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userMintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60806040526064600955661b5b1bf4c54000600a5560405180606001604052806035815260200162005b1c60359139600d90805190602001906200004592919062000904565b5060405180606001604052806035815260200162005b1c60359139600e90805190602001906200007792919062000904565b506001600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055506001600f60026101000a81548160ff0219169083151502179055506000600f60036101000a81548160ff0219169083151502179055507340306f6f717cd2dcc0de5ffa7726ab708a1e8725600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200014657600080fd5b5060405162005b5138038062005b5183398181016040528101906200016c919062000a7b565b6040518060400160405280600781526020017f4f524342414259000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4f52434241425900000000000000000000000000000000000000000000000000815250620001f8620001ec6200026e60201b60201c565b6200027660201b60201c565b81600390805190602001906200021092919062000904565b5080600490805190602001906200022992919062000904565b506200023a6200033a60201b60201c565b600181905550505062000253816200034360201b60201c565b62000267336009546200040960201b60201c565b5062000e2a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b620003536200026e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003796200042f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c99062000baa565b60405180910390fd5b6001600f60016101000a81548160ff02191690831515021790555080600c90805190602001906200040592919062000904565b5050565b6200042b8282604051806020016040528060008152506200045860201b60201c565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200046a83836200050a60201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14620005055760006001549050600083820390505b620004b460008683806001019450866200070a60201b60201c565b620004eb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620004995781600154146200050257600080fd5b50505b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000579576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415620005b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620005ca60008483856200087c60201b60201c565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555062000659836200063b60008660006200088260201b60201c565b6200064c85620008b260201b60201c565b17620008c260201b60201c565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200067d57806001819055505050620007056000848385620008ed60201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000738620008f360201b60201c565b8786866040518563ffffffff1660e01b81526004016200075c949392919062000b56565b602060405180830381600087803b1580156200077757600080fd5b505af1925050508015620007ab57506040513d601f19601f82011682018060405250810190620007a8919062000a49565b60015b62000829573d8060008114620007de576040519150601f19603f3d011682016040523d82523d6000602084013e620007e3565b606091505b5060008151141562000821576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8620008a1868684620008fb60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620009129062000cf8565b90600052602060002090601f01602090048101928262000936576000855562000982565b82601f106200095157805160ff191683800117855562000982565b8280016001018555821562000982579182015b828111156200098157825182559160200191906001019062000964565b5b50905062000991919062000995565b5090565b5b80821115620009b057600081600090555060010162000996565b5090565b6000620009cb620009c58462000bf5565b62000bcc565b905082815260208101848484011115620009ea57620009e962000dc7565b5b620009f784828562000cc2565b509392505050565b60008151905062000a108162000e10565b92915050565b600082601f83011262000a2e5762000a2d62000dc2565b5b815162000a40848260208601620009b4565b91505092915050565b60006020828403121562000a625762000a6162000dd1565b5b600062000a7284828501620009ff565b91505092915050565b60006020828403121562000a945762000a9362000dd1565b5b600082015167ffffffffffffffff81111562000ab55762000ab462000dcc565b5b62000ac38482850162000a16565b91505092915050565b62000ad78162000c58565b82525050565b600062000aea8262000c2b565b62000af6818562000c36565b935062000b0881856020860162000cc2565b62000b138162000dd6565b840191505092915050565b600062000b2d60208362000c47565b915062000b3a8262000de7565b602082019050919050565b62000b508162000cb8565b82525050565b600060808201905062000b6d600083018762000acc565b62000b7c602083018662000acc565b62000b8b604083018562000b45565b818103606083015262000b9f818462000add565b905095945050505050565b6000602082019050818103600083015262000bc58162000b1e565b9050919050565b600062000bd862000beb565b905062000be6828262000d2e565b919050565b6000604051905090565b600067ffffffffffffffff82111562000c135762000c1262000d93565b5b62000c1e8262000dd6565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000c658262000c98565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000ce257808201518184015260208101905062000cc5565b8381111562000cf2576000848401525b50505050565b6000600282049050600182168062000d1157607f821691505b6020821081141562000d285762000d2762000d64565b5b50919050565b62000d398262000dd6565b810181811067ffffffffffffffff8211171562000d5b5762000d5a62000d93565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000e1b8162000c6c565b811462000e2757600080fd5b50565b614ce28062000e3a6000396000f3fe6080604052600436106102e45760003560e01c806364f640761161019057806395d89b41116100dc578063c627525511610095578063e8a3d4851161006f578063e8a3d48514610ae9578063e985e9c514610b14578063f2fde38b14610b51578063f7e8d6ea14610b7a576102e4565b8063c627525514610a5a578063c87b56dd14610a83578063e0a8085314610ac0576102e4565b806395d89b411461095c578063a22cb46514610987578063a4b41a15146109b0578063a945bf80146109db578063b88d4fde14610a06578063bceae77b14610a2f576102e4565b80637af3a1af116101495780638cc54e7f116101235780638cc54e7f146108b45780638da5cb5b146108df5780639007bd721461090a578063938e3d7b14610933576102e4565b80637af3a1af146108465780637c928fe91461086f57806388dedc141461088b576102e4565b806364f64076146107225780636b39fca41461075f57806370a082311461078a578063715018a6146107c7578063763ea95f146107de5780637aeb724214610809576102e4565b806333bc1c5c1161024f578063518302271161020857806359927044116101e257806359927044146106665780635c975abb146106915780635ed3e25e146106bc5780636352211e146106e5576102e4565b806351830227146105e757806355f804b31461061257806356b4f6731461063b576102e4565b806333bc1c5c146104f85780633bc4b025146105235780633ccfd60b1461054e57806342842e0e14610558578063438b6300146105815780634fdd43cb146105be576102e4565b806318160ddd116102a157806318160ddd1461040957806323b872dd146104345780632c4b23341461045d5780632db11544146104865780632fecf20b146104a257806332cb6b0c146104cd576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e5780630f15ad8d146103b757806316c38b3c146103e0575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613b16565b610ba5565b60405161031d9190614183565b60405180910390f35b34801561033257600080fd5b5061033b610c37565b604051610348919061419e565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613bb9565b610cc9565b60405161038591906140fa565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613a4d565b610d45565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613bb9565b610e86565b005b3480156103ec57600080fd5b5061040760048036038101906104029190613a8d565b610f0c565b005b34801561041557600080fd5b5061041e610fa5565b60405161042b9190614400565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613937565b610fbc565b005b34801561046957600080fd5b50610484600480360381019061047f91906138ca565b6112e1565b005b6104a0600480360381019061049b9190613bb9565b6113a1565b005b3480156104ae57600080fd5b506104b7611657565b6040516104c49190614400565b60405180910390f35b3480156104d957600080fd5b506104e261165c565b6040516104ef9190614400565b60405180910390f35b34801561050457600080fd5b5061050d611662565b60405161051a9190614183565b60405180910390f35b34801561052f57600080fd5b50610538611675565b6040516105459190614400565b60405180910390f35b61055661167b565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613937565b6118a8565b005b34801561058d57600080fd5b506105a860048036038101906105a391906138ca565b6118c8565b6040516105b59190614161565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e09190613b70565b6119d3565b005b3480156105f357600080fd5b506105fc611a69565b6040516106099190614183565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190613b70565b611a7c565b005b34801561064757600080fd5b50610650611b2d565b60405161065d919061419e565b60405180910390f35b34801561067257600080fd5b5061067b611bbb565b60405161068891906140fa565b60405180910390f35b34801561069d57600080fd5b506106a6611be1565b6040516106b39190614183565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613aba565b611bf4565b005b3480156106f157600080fd5b5061070c60048036038101906107079190613bb9565b611ca5565b60405161071991906140fa565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906138ca565b611cb7565b6040516107569190614183565b60405180910390f35b34801561076b57600080fd5b50610774611cd7565b6040516107819190614400565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac91906138ca565b611cdd565b6040516107be9190614400565b60405180910390f35b3480156107d357600080fd5b506107dc611d96565b005b3480156107ea57600080fd5b506107f3611e1e565b6040516108009190614400565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b91906138ca565b611e24565b60405161083d9190614400565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613a8d565b611e3c565b005b61088960048036038101906108849190613bb9565b611ef0565b005b34801561089757600080fd5b506108b260048036038101906108ad9190613a8d565b61226c565b005b3480156108c057600080fd5b506108c9612320565b6040516108d6919061419e565b60405180910390f35b3480156108eb57600080fd5b506108f46123ae565b60405161090191906140fa565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190613be6565b6123d7565b005b34801561093f57600080fd5b5061095a60048036038101906109559190613b70565b612578565b005b34801561096857600080fd5b5061097161260e565b60405161097e919061419e565b60405180910390f35b34801561099357600080fd5b506109ae60048036038101906109a99190613a0d565b6126a0565b005b3480156109bc57600080fd5b506109c5612818565b6040516109d29190614183565b60405180910390f35b3480156109e757600080fd5b506109f061282b565b6040516109fd9190614400565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a28919061398a565b612831565b005b348015610a3b57600080fd5b50610a446128a4565b604051610a519190614400565b60405180910390f35b348015610a6657600080fd5b50610a816004803603810190610a7c9190613bb9565b6128a9565b005b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613bb9565b61292f565b604051610ab7919061419e565b60405180910390f35b348015610acc57600080fd5b50610ae76004803603810190610ae29190613a8d565b612a53565b005b348015610af557600080fd5b50610afe612aec565b604051610b0b919061419e565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b3691906138f7565b612b7e565b604051610b489190614183565b60405180910390f35b348015610b5d57600080fd5b50610b786004803603810190610b7391906138ca565b612c12565b005b348015610b8657600080fd5b50610b8f612d0a565b604051610b9c919061419e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c305750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610c4690614709565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7290614709565b8015610cbf5780601f10610c9457610100808354040283529160200191610cbf565b820191906000526020600020905b815481529060010190602001808311610ca257829003601f168201915b5050505050905090565b6000610cd482612d98565b610d0a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5082611ca5565b90508073ffffffffffffffffffffffffffffffffffffffff16610d71612df7565b73ffffffffffffffffffffffffffffffffffffffff1614610dd457610d9d81610d98612df7565b612b7e565b610dd3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e8e612dff565b73ffffffffffffffffffffffffffffffffffffffff16610eac6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef9906142a0565b60405180910390fd5b8060098190555050565b610f14612dff565b73ffffffffffffffffffffffffffffffffffffffff16610f326123ae565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f906142a0565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610faf612e07565b6002546001540303905090565b6000610fc782612e10565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461102e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061103a84612ede565b91509150611050818761104b612df7565b612f00565b61109c5761106586611060612df7565b612b7e565b61109b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611103576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111108686866001612f44565b801561111b57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111e9856111c5888887612f4a565b7c020000000000000000000000000000000000000000000000000000000017612f72565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561127157600060018501905060006005600083815260200190815260200160002054141561126f57600154811461126e578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112d98686866001612f9d565b505050505050565b6112e9612dff565b73ffffffffffffffffffffffffffffffffffffffff166113076123ae565b73ffffffffffffffffffffffffffffffffffffffff161461135d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611354906142a0565b60405180910390fd5b80600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600f60009054906101000a900460ff16156113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e9906143a0565b60405180910390fd5b612710816113fe610fa5565b611408919061453e565b1115611449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611440906143e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614220565b60405180910390fd5b600f60039054906101000a900460ff16611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614340565b60405180910390fd5b600a82111561154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190614360565b60405180910390fd5b6000600a5490506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601484826115a3919061453e565b11156115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90614240565b60405180910390fd5b6115f884836115f391906145c5565b612fa3565b8381611604919061453e565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061165133856130af565b50505050565b600a81565b61271081565b600f60039054906101000a900460ff1681565b610fa081565b611683612dff565b73ffffffffffffffffffffffffffffffffffffffff166116a16123ae565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee906142a0565b60405180910390fd5b60004790506000735444284bfbc8c63a780c06d26a5042346618b42273ffffffffffffffffffffffffffffffffffffffff16612710610fa08461173a91906145c5565b6117449190614594565b604051611750906140e5565b60006040518083038185875af1925050503d806000811461178d576040519150601f19603f3d011682016040523d82523d6000602084013e611792565b606091505b50509050806117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90614380565b60405180910390fd5b600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161181c906140e5565b60006040518083038185875af1925050503d8060008114611859576040519150601f19603f3d011682016040523d82523d6000602084013e61185e565b606091505b505080915050806118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90614260565b60405180910390fd5b5050565b6118c383838360405180602001604052806000815250612831565b505050565b606060006118d583611cdd565b905060008167ffffffffffffffff8111156118f3576118f26148a2565b5b6040519080825280602002602001820160405280156119215781602001602082028036833780820191505090505b50905060006001905060005b838110801561193e57506127108211155b156119c757600061194e83611ca5565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119b3578284838151811061199857611997614873565b5b60200260200101818152505081806119af9061476c565b9250505b82806119be9061476c565b9350505061192d565b82945050505050919050565b6119db612dff565b73ffffffffffffffffffffffffffffffffffffffff166119f96123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906142a0565b60405180910390fd5b80600d9080519060200190611a659291906136de565b5050565b600f60019054906101000a900460ff1681565b611a84612dff565b73ffffffffffffffffffffffffffffffffffffffff16611aa26123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef906142a0565b60405180910390fd5b6001600f60016101000a81548160ff02191690831515021790555080600c9080519060200190611b299291906136de565b5050565b600e8054611b3a90614709565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6690614709565b8015611bb35780601f10611b8857610100808354040283529160200191611bb3565b820191906000526020600020905b815481529060010190602001808311611b9657829003601f168201915b505050505081565b600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900460ff1681565b611bfc612dff565b73ffffffffffffffffffffffffffffffffffffffff16611c1a6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906142a0565b60405180910390fd5b81600f60016101000a81548160ff02191690831515021790555080600c9080519060200190611ca09291906136de565b505050565b6000611cb082612e10565b9050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d45576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d9e612dff565b73ffffffffffffffffffffffffffffffffffffffff16611dbc6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e09906142a0565b60405180910390fd5b611e1c60006130cd565b565b600b5481565b60116020528060005260406000206000915090505481565b611e44612dff565b73ffffffffffffffffffffffffffffffffffffffff16611e626123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf906142a0565b60405180910390fd5b80600f60036101000a81548160ff0219169083151502179055508015600f60026101000a81548160ff02191690831515021790555050565b80600f60009054906101000a900460ff1615611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f38906143a0565b60405180910390fd5b61271081611f4d610fa5565b611f57919061453e565b1115611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f906143e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd90614220565b60405180910390fd5b600f60029054906101000a900460ff16612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90614280565b60405180910390fd5b60003414612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f90614300565b60405180910390fd5b600182146120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d2906141c0565b60405180910390fd5b6000826120e6610fa5565b6120f0919061453e565b9050610fa0811115612137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212e906143c0565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156121c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bb906142c0565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fa081141561225d576000600f60026101000a81548160ff0219169083151502179055506001600f60036101000a81548160ff0219169083151502179055505b61226733846130af565b505050565b612274612dff565b73ffffffffffffffffffffffffffffffffffffffff166122926123ae565b73ffffffffffffffffffffffffffffffffffffffff16146122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df906142a0565b60405180910390fd5b80600f60026101000a81548160ff0219169083151502179055508015600f60036101000a81548160ff02191690831515021790555050565b600d805461232d90614709565b80601f016020809104026020016040519081016040528092919081815260200182805461235990614709565b80156123a65780601f1061237b576101008083540402835291602001916123a6565b820191906000526020600020905b81548152906001019060200180831161238957829003601f168201915b505050505081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6123df612dff565b73ffffffffffffffffffffffffffffffffffffffff166123fd6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244a906142a0565b60405180910390fd5b81600f60009054906101000a900460ff16156124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249b906143a0565b60405180910390fd5b612710816124b0610fa5565b6124ba919061453e565b11156124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f2906143e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090614220565b60405180910390fd5b61257382846130af565b505050565b612580612dff565b73ffffffffffffffffffffffffffffffffffffffff1661259e6123ae565b73ffffffffffffffffffffffffffffffffffffffff16146125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb906142a0565b60405180910390fd5b80600e908051906020019061260a9291906136de565b5050565b60606004805461261d90614709565b80601f016020809104026020016040519081016040528092919081815260200182805461264990614709565b80156126965780601f1061266b57610100808354040283529160200191612696565b820191906000526020600020905b81548152906001019060200180831161267957829003601f168201915b5050505050905090565b6126a8612df7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061271a612df7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166127c7612df7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161280c9190614183565b60405180910390a35050565b600f60029054906101000a900460ff1681565b600a5481565b61283c848484610fbc565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461289e5761286784848484613191565b61289d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601481565b6128b1612dff565b73ffffffffffffffffffffffffffffffffffffffff166128cf6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c906142a0565b60405180910390fd5b80600a8190555050565b606061293a82612d98565b612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906142e0565b60405180910390fd5b600f60019054906101000a900460ff16156129c057600c612999836132f1565b6040516020016129aa9291906140b6565b6040516020818303038152906040529050612a4e565b600d80546129cd90614709565b80601f01602080910402602001604051908101604052809291908181526020018280546129f990614709565b8015612a465780601f10612a1b57610100808354040283529160200191612a46565b820191906000526020600020905b815481529060010190602001808311612a2957829003601f168201915b505050505090505b919050565b612a5b612dff565b73ffffffffffffffffffffffffffffffffffffffff16612a796123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac6906142a0565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6060600e8054612afb90614709565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2790614709565b8015612b745780601f10612b4957610100808354040283529160200191612b74565b820191906000526020600020905b815481529060010190602001808311612b5757829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612c1a612dff565b73ffffffffffffffffffffffffffffffffffffffff16612c386123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c85906142a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf5906141e0565b60405180910390fd5b612d07816130cd565b50565b600c8054612d1790614709565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4390614709565b8015612d905780601f10612d6557610100808354040283529160200191612d90565b820191906000526020600020905b815481529060010190602001808311612d7357829003601f168201915b505050505081565b600081612da3612e07565b11158015612db2575060015482105b8015612df0575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080612e1f612e07565b11612ea757600154811015612ea65760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612ea4575b6000811415612e9a576005600083600190039350838152602001908152602001600020549050612e6f565b8092505050612ed9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612f61868684613452565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b803411156130685760003373ffffffffffffffffffffffffffffffffffffffff168234612fd0919061461f565b604051612fdc906140e5565b60006040518083038185875af1925050503d8060008114613019576040519150601f19603f3d011682016040523d82523d6000602084013e61301e565b606091505b5050905080613062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305990614200565b60405180910390fd5b506130ac565b803410156130ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a290614320565b60405180910390fd5b5b50565b6130c982826040518060200160405280600081525061345b565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131b7612df7565b8786866040518563ffffffff1660e01b81526004016131d99493929190614115565b602060405180830381600087803b1580156131f357600080fd5b505af192505050801561322457506040513d601f19601f820116820180604052508101906132219190613b43565b60015b61329e573d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b50600081511415613296576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613339576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061344d565b600082905060005b6000821461336b5780806133549061476c565b915050600a826133649190614594565b9150613341565b60008167ffffffffffffffff811115613387576133866148a2565b5b6040519080825280601f01601f1916602001820160405280156133b95781602001600182028036833780820191505090505b5090505b60008514613446576001826133d2919061461f565b9150600a856133e191906147b5565b60306133ed919061453e565b60f81b81838151811061340357613402614873565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561343f9190614594565b94506133bd565b8093505050505b919050565b60009392505050565b61346583836134f9565b60008373ffffffffffffffffffffffffffffffffffffffff163b146134f45760006001549050600083820390505b6134a66000868380600101945086613191565b6134dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106134935781600154146134f157600080fd5b50505b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613567576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156135a2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135af6000848385612f44565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613626836136176000866000612f4a565b613620856136ce565b17612f72565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061364a578060018190555050506136c96000848385612f9d565b505050565b60006001821460e11b9050919050565b8280546136ea90614709565b90600052602060002090601f01602090048101928261370c5760008555613753565b82601f1061372557805160ff1916838001178555613753565b82800160010185558215613753579182015b82811115613752578251825591602001919060010190613737565b5b5090506137609190613764565b5090565b5b8082111561377d576000816000905550600101613765565b5090565b600061379461378f84614440565b61441b565b9050828152602081018484840111156137b0576137af6148d6565b5b6137bb8482856146c7565b509392505050565b60006137d66137d184614471565b61441b565b9050828152602081018484840111156137f2576137f16148d6565b5b6137fd8482856146c7565b509392505050565b60008135905061381481614c50565b92915050565b60008135905061382981614c67565b92915050565b60008135905061383e81614c7e565b92915050565b60008151905061385381614c7e565b92915050565b600082601f83011261386e5761386d6148d1565b5b813561387e848260208601613781565b91505092915050565b600082601f83011261389c5761389b6148d1565b5b81356138ac8482602086016137c3565b91505092915050565b6000813590506138c481614c95565b92915050565b6000602082840312156138e0576138df6148e0565b5b60006138ee84828501613805565b91505092915050565b6000806040838503121561390e5761390d6148e0565b5b600061391c85828601613805565b925050602061392d85828601613805565b9150509250929050565b6000806000606084860312156139505761394f6148e0565b5b600061395e86828701613805565b935050602061396f86828701613805565b9250506040613980868287016138b5565b9150509250925092565b600080600080608085870312156139a4576139a36148e0565b5b60006139b287828801613805565b94505060206139c387828801613805565b93505060406139d4878288016138b5565b925050606085013567ffffffffffffffff8111156139f5576139f46148db565b5b613a0187828801613859565b91505092959194509250565b60008060408385031215613a2457613a236148e0565b5b6000613a3285828601613805565b9250506020613a438582860161381a565b9150509250929050565b60008060408385031215613a6457613a636148e0565b5b6000613a7285828601613805565b9250506020613a83858286016138b5565b9150509250929050565b600060208284031215613aa357613aa26148e0565b5b6000613ab18482850161381a565b91505092915050565b60008060408385031215613ad157613ad06148e0565b5b6000613adf8582860161381a565b925050602083013567ffffffffffffffff811115613b0057613aff6148db565b5b613b0c85828601613887565b9150509250929050565b600060208284031215613b2c57613b2b6148e0565b5b6000613b3a8482850161382f565b91505092915050565b600060208284031215613b5957613b586148e0565b5b6000613b6784828501613844565b91505092915050565b600060208284031215613b8657613b856148e0565b5b600082013567ffffffffffffffff811115613ba457613ba36148db565b5b613bb084828501613887565b91505092915050565b600060208284031215613bcf57613bce6148e0565b5b6000613bdd848285016138b5565b91505092915050565b60008060408385031215613bfd57613bfc6148e0565b5b6000613c0b858286016138b5565b9250506020613c1c85828601613805565b9150509250929050565b6000613c328383614098565b60208301905092915050565b613c4781614653565b82525050565b6000613c58826144c7565b613c6281856144f5565b9350613c6d836144a2565b8060005b83811015613c9e578151613c858882613c26565b9750613c90836144e8565b925050600181019050613c71565b5085935050505092915050565b613cb481614665565b82525050565b6000613cc5826144d2565b613ccf8185614506565b9350613cdf8185602086016146d6565b613ce8816148e5565b840191505092915050565b6000613cfe826144dd565b613d088185614522565b9350613d188185602086016146d6565b613d21816148e5565b840191505092915050565b6000613d37826144dd565b613d418185614533565b9350613d518185602086016146d6565b80840191505092915050565b60008154613d6a81614709565b613d748186614533565b94506001821660008114613d8f5760018114613da057613dd3565b60ff19831686528186019350613dd3565b613da9856144b2565b60005b83811015613dcb57815481890152600182019150602081019050613dac565b838801955050505b50505092915050565b6000613de9600b83614522565b9150613df4826148f6565b602082019050919050565b6000613e0c602683614522565b9150613e178261491f565b604082019050919050565b6000613e2f600f83614522565b9150613e3a8261496e565b602082019050919050565b6000613e52601383614522565b9150613e5d82614997565b602082019050919050565b6000613e75601383614522565b9150613e80826149c0565b602082019050919050565b6000613e98602083614522565b9150613ea3826149e9565b602082019050919050565b6000613ebb601283614522565b9150613ec682614a12565b602082019050919050565b6000613ede600583614533565b9150613ee982614a3b565b600582019050919050565b6000613f01602083614522565b9150613f0c82614a64565b602082019050919050565b6000613f24601383614522565b9150613f2f82614a8d565b602082019050919050565b6000613f47602f83614522565b9150613f5282614ab6565b604082019050919050565b6000613f6a601283614522565b9150613f7582614b05565b602082019050919050565b6000613f8d601383614522565b9150613f9882614b2e565b602082019050919050565b6000613fb0601483614522565b9150613fbb82614b57565b602082019050919050565b6000613fd3601183614522565b9150613fde82614b80565b602082019050919050565b6000613ff6600083614517565b915061400182614ba9565b600082019050919050565b6000614019601383614522565b915061402482614bac565b602082019050919050565b600061403c601283614522565b915061404782614bd5565b602082019050919050565b600061405f601683614522565b915061406a82614bfe565b602082019050919050565b6000614082601583614522565b915061408d82614c27565b602082019050919050565b6140a1816146bd565b82525050565b6140b0816146bd565b82525050565b60006140c28285613d5d565b91506140ce8284613d2c565b91506140d982613ed1565b91508190509392505050565b60006140f082613fe9565b9150819050919050565b600060208201905061410f6000830184613c3e565b92915050565b600060808201905061412a6000830187613c3e565b6141376020830186613c3e565b61414460408301856140a7565b81810360608301526141568184613cba565b905095945050505050565b6000602082019050818103600083015261417b8184613c4d565b905092915050565b60006020820190506141986000830184613cab565b92915050565b600060208201905081810360008301526141b88184613cf3565b905092915050565b600060208201905081810360008301526141d981613ddc565b9050919050565b600060208201905081810360008301526141f981613dff565b9050919050565b6000602082019050818103600083015261421981613e22565b9050919050565b6000602082019050818103600083015261423981613e45565b9050919050565b6000602082019050818103600083015261425981613e68565b9050919050565b6000602082019050818103600083015261427981613e8b565b9050919050565b6000602082019050818103600083015261429981613eae565b9050919050565b600060208201905081810360008301526142b981613ef4565b9050919050565b600060208201905081810360008301526142d981613f17565b9050919050565b600060208201905081810360008301526142f981613f3a565b9050919050565b6000602082019050818103600083015261431981613f5d565b9050919050565b6000602082019050818103600083015261433981613f80565b9050919050565b6000602082019050818103600083015261435981613fa3565b9050919050565b6000602082019050818103600083015261437981613fc6565b9050919050565b600060208201905081810360008301526143998161400c565b9050919050565b600060208201905081810360008301526143b98161402f565b9050919050565b600060208201905081810360008301526143d981614052565b9050919050565b600060208201905081810360008301526143f981614075565b9050919050565b600060208201905061441560008301846140a7565b92915050565b6000614425614436565b9050614431828261473b565b919050565b6000604051905090565b600067ffffffffffffffff82111561445b5761445a6148a2565b5b614464826148e5565b9050602081019050919050565b600067ffffffffffffffff82111561448c5761448b6148a2565b5b614495826148e5565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614549826146bd565b9150614554836146bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614589576145886147e6565b5b828201905092915050565b600061459f826146bd565b91506145aa836146bd565b9250826145ba576145b9614815565b5b828204905092915050565b60006145d0826146bd565b91506145db836146bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614614576146136147e6565b5b828202905092915050565b600061462a826146bd565b9150614635836146bd565b925082821015614648576146476147e6565b5b828203905092915050565b600061465e8261469d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146f45780820151818401526020810190506146d9565b83811115614703576000848401525b50505050565b6000600282049050600182168061472157607f821691505b6020821081141561473557614734614844565b5b50919050565b614744826148e5565b810181811067ffffffffffffffff82111715614763576147626148a2565b5b80604052505050565b6000614777826146bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147aa576147a96147e6565b5b600182019050919050565b60006147c0826146bd565b91506147cb836146bd565b9250826147db576147da614815565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f6e6c7920312066726565000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4e6f20636f6e7472616374206d696e74696e6700000000000000000000000000600082015250565b7f55736572206d6178206d696e74206c696d697400000000000000000000000000600082015250565b7f5465616d202872656d61696e696e6729207472616e73666572206661696c6564600082015250565b7f467265652073616c6520696e6163746976650000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f55736572206d61782066726565206c696d697400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5468697320706861736520697320667265650000000000000000000000000000600082015250565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b7f5075626c69632073616c6520696e616374697665000000000000000000000000600082015250565b7f5175616e7469747920746f6f2068696768000000000000000000000000000000600082015250565b50565b7f446576207472616e73666572206661696c656400000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f4e6f7420656e6f756768206672656520737570706c7900000000000000000000600082015250565b7f4e6f7420656e6f756768206d696e7473206c6566740000000000000000000000600082015250565b614c5981614653565b8114614c6457600080fd5b50565b614c7081614665565b8114614c7b57600080fd5b50565b614c8781614671565b8114614c9257600080fd5b50565b614c9e816146bd565b8114614ca957600080fd5b5056fea2646970667358221220aa3d752f3cecd80e663e278bc9a6ca80a3ce0f4234b7f01fabab57150b2cc56c64736f6c63430008070033697066733a2f2f516d513966377167367679776e36556a34536a415747734b487a475a426a6a6732516877336b4545476d706d767500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5735644c696153556177524e755635477a7772675a59376e39673344465933635669485031714739363358702f00000000000000000000
Deployed Bytecode
0x6080604052600436106102e45760003560e01c806364f640761161019057806395d89b41116100dc578063c627525511610095578063e8a3d4851161006f578063e8a3d48514610ae9578063e985e9c514610b14578063f2fde38b14610b51578063f7e8d6ea14610b7a576102e4565b8063c627525514610a5a578063c87b56dd14610a83578063e0a8085314610ac0576102e4565b806395d89b411461095c578063a22cb46514610987578063a4b41a15146109b0578063a945bf80146109db578063b88d4fde14610a06578063bceae77b14610a2f576102e4565b80637af3a1af116101495780638cc54e7f116101235780638cc54e7f146108b45780638da5cb5b146108df5780639007bd721461090a578063938e3d7b14610933576102e4565b80637af3a1af146108465780637c928fe91461086f57806388dedc141461088b576102e4565b806364f64076146107225780636b39fca41461075f57806370a082311461078a578063715018a6146107c7578063763ea95f146107de5780637aeb724214610809576102e4565b806333bc1c5c1161024f578063518302271161020857806359927044116101e257806359927044146106665780635c975abb146106915780635ed3e25e146106bc5780636352211e146106e5576102e4565b806351830227146105e757806355f804b31461061257806356b4f6731461063b576102e4565b806333bc1c5c146104f85780633bc4b025146105235780633ccfd60b1461054e57806342842e0e14610558578063438b6300146105815780634fdd43cb146105be576102e4565b806318160ddd116102a157806318160ddd1461040957806323b872dd146104345780632c4b23341461045d5780632db11544146104865780632fecf20b146104a257806332cb6b0c146104cd576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e5780630f15ad8d146103b757806316c38b3c146103e0575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613b16565b610ba5565b60405161031d9190614183565b60405180910390f35b34801561033257600080fd5b5061033b610c37565b604051610348919061419e565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613bb9565b610cc9565b60405161038591906140fa565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613a4d565b610d45565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613bb9565b610e86565b005b3480156103ec57600080fd5b5061040760048036038101906104029190613a8d565b610f0c565b005b34801561041557600080fd5b5061041e610fa5565b60405161042b9190614400565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613937565b610fbc565b005b34801561046957600080fd5b50610484600480360381019061047f91906138ca565b6112e1565b005b6104a0600480360381019061049b9190613bb9565b6113a1565b005b3480156104ae57600080fd5b506104b7611657565b6040516104c49190614400565b60405180910390f35b3480156104d957600080fd5b506104e261165c565b6040516104ef9190614400565b60405180910390f35b34801561050457600080fd5b5061050d611662565b60405161051a9190614183565b60405180910390f35b34801561052f57600080fd5b50610538611675565b6040516105459190614400565b60405180910390f35b61055661167b565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613937565b6118a8565b005b34801561058d57600080fd5b506105a860048036038101906105a391906138ca565b6118c8565b6040516105b59190614161565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e09190613b70565b6119d3565b005b3480156105f357600080fd5b506105fc611a69565b6040516106099190614183565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190613b70565b611a7c565b005b34801561064757600080fd5b50610650611b2d565b60405161065d919061419e565b60405180910390f35b34801561067257600080fd5b5061067b611bbb565b60405161068891906140fa565b60405180910390f35b34801561069d57600080fd5b506106a6611be1565b6040516106b39190614183565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613aba565b611bf4565b005b3480156106f157600080fd5b5061070c60048036038101906107079190613bb9565b611ca5565b60405161071991906140fa565b60405180910390f35b34801561072e57600080fd5b50610749600480360381019061074491906138ca565b611cb7565b6040516107569190614183565b60405180910390f35b34801561076b57600080fd5b50610774611cd7565b6040516107819190614400565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac91906138ca565b611cdd565b6040516107be9190614400565b60405180910390f35b3480156107d357600080fd5b506107dc611d96565b005b3480156107ea57600080fd5b506107f3611e1e565b6040516108009190614400565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b91906138ca565b611e24565b60405161083d9190614400565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613a8d565b611e3c565b005b61088960048036038101906108849190613bb9565b611ef0565b005b34801561089757600080fd5b506108b260048036038101906108ad9190613a8d565b61226c565b005b3480156108c057600080fd5b506108c9612320565b6040516108d6919061419e565b60405180910390f35b3480156108eb57600080fd5b506108f46123ae565b60405161090191906140fa565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190613be6565b6123d7565b005b34801561093f57600080fd5b5061095a60048036038101906109559190613b70565b612578565b005b34801561096857600080fd5b5061097161260e565b60405161097e919061419e565b60405180910390f35b34801561099357600080fd5b506109ae60048036038101906109a99190613a0d565b6126a0565b005b3480156109bc57600080fd5b506109c5612818565b6040516109d29190614183565b60405180910390f35b3480156109e757600080fd5b506109f061282b565b6040516109fd9190614400565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a28919061398a565b612831565b005b348015610a3b57600080fd5b50610a446128a4565b604051610a519190614400565b60405180910390f35b348015610a6657600080fd5b50610a816004803603810190610a7c9190613bb9565b6128a9565b005b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613bb9565b61292f565b604051610ab7919061419e565b60405180910390f35b348015610acc57600080fd5b50610ae76004803603810190610ae29190613a8d565b612a53565b005b348015610af557600080fd5b50610afe612aec565b604051610b0b919061419e565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b3691906138f7565b612b7e565b604051610b489190614183565b60405180910390f35b348015610b5d57600080fd5b50610b786004803603810190610b7391906138ca565b612c12565b005b348015610b8657600080fd5b50610b8f612d0a565b604051610b9c919061419e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c305750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610c4690614709565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7290614709565b8015610cbf5780601f10610c9457610100808354040283529160200191610cbf565b820191906000526020600020905b815481529060010190602001808311610ca257829003601f168201915b5050505050905090565b6000610cd482612d98565b610d0a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5082611ca5565b90508073ffffffffffffffffffffffffffffffffffffffff16610d71612df7565b73ffffffffffffffffffffffffffffffffffffffff1614610dd457610d9d81610d98612df7565b612b7e565b610dd3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610e8e612dff565b73ffffffffffffffffffffffffffffffffffffffff16610eac6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef9906142a0565b60405180910390fd5b8060098190555050565b610f14612dff565b73ffffffffffffffffffffffffffffffffffffffff16610f326123ae565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f906142a0565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610faf612e07565b6002546001540303905090565b6000610fc782612e10565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461102e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061103a84612ede565b91509150611050818761104b612df7565b612f00565b61109c5761106586611060612df7565b612b7e565b61109b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611103576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111108686866001612f44565b801561111b57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111e9856111c5888887612f4a565b7c020000000000000000000000000000000000000000000000000000000017612f72565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561127157600060018501905060006005600083815260200190815260200160002054141561126f57600154811461126e578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112d98686866001612f9d565b505050505050565b6112e9612dff565b73ffffffffffffffffffffffffffffffffffffffff166113076123ae565b73ffffffffffffffffffffffffffffffffffffffff161461135d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611354906142a0565b60405180910390fd5b80600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600f60009054906101000a900460ff16156113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e9906143a0565b60405180910390fd5b612710816113fe610fa5565b611408919061453e565b1115611449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611440906143e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614220565b60405180910390fd5b600f60039054906101000a900460ff16611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614340565b60405180910390fd5b600a82111561154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190614360565b60405180910390fd5b6000600a5490506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601484826115a3919061453e565b11156115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90614240565b60405180910390fd5b6115f884836115f391906145c5565b612fa3565b8381611604919061453e565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061165133856130af565b50505050565b600a81565b61271081565b600f60039054906101000a900460ff1681565b610fa081565b611683612dff565b73ffffffffffffffffffffffffffffffffffffffff166116a16123ae565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee906142a0565b60405180910390fd5b60004790506000735444284bfbc8c63a780c06d26a5042346618b42273ffffffffffffffffffffffffffffffffffffffff16612710610fa08461173a91906145c5565b6117449190614594565b604051611750906140e5565b60006040518083038185875af1925050503d806000811461178d576040519150601f19603f3d011682016040523d82523d6000602084013e611792565b606091505b50509050806117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90614380565b60405180910390fd5b600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161181c906140e5565b60006040518083038185875af1925050503d8060008114611859576040519150601f19603f3d011682016040523d82523d6000602084013e61185e565b606091505b505080915050806118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90614260565b60405180910390fd5b5050565b6118c383838360405180602001604052806000815250612831565b505050565b606060006118d583611cdd565b905060008167ffffffffffffffff8111156118f3576118f26148a2565b5b6040519080825280602002602001820160405280156119215781602001602082028036833780820191505090505b50905060006001905060005b838110801561193e57506127108211155b156119c757600061194e83611ca5565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119b3578284838151811061199857611997614873565b5b60200260200101818152505081806119af9061476c565b9250505b82806119be9061476c565b9350505061192d565b82945050505050919050565b6119db612dff565b73ffffffffffffffffffffffffffffffffffffffff166119f96123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906142a0565b60405180910390fd5b80600d9080519060200190611a659291906136de565b5050565b600f60019054906101000a900460ff1681565b611a84612dff565b73ffffffffffffffffffffffffffffffffffffffff16611aa26123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef906142a0565b60405180910390fd5b6001600f60016101000a81548160ff02191690831515021790555080600c9080519060200190611b299291906136de565b5050565b600e8054611b3a90614709565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6690614709565b8015611bb35780601f10611b8857610100808354040283529160200191611bb3565b820191906000526020600020905b815481529060010190602001808311611b9657829003601f168201915b505050505081565b600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900460ff1681565b611bfc612dff565b73ffffffffffffffffffffffffffffffffffffffff16611c1a6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906142a0565b60405180910390fd5b81600f60016101000a81548160ff02191690831515021790555080600c9080519060200190611ca09291906136de565b505050565b6000611cb082612e10565b9050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d45576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d9e612dff565b73ffffffffffffffffffffffffffffffffffffffff16611dbc6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e09906142a0565b60405180910390fd5b611e1c60006130cd565b565b600b5481565b60116020528060005260406000206000915090505481565b611e44612dff565b73ffffffffffffffffffffffffffffffffffffffff16611e626123ae565b73ffffffffffffffffffffffffffffffffffffffff1614611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf906142a0565b60405180910390fd5b80600f60036101000a81548160ff0219169083151502179055508015600f60026101000a81548160ff02191690831515021790555050565b80600f60009054906101000a900460ff1615611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f38906143a0565b60405180910390fd5b61271081611f4d610fa5565b611f57919061453e565b1115611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f906143e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd90614220565b60405180910390fd5b600f60029054906101000a900460ff16612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90614280565b60405180910390fd5b60003414612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f90614300565b60405180910390fd5b600182146120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d2906141c0565b60405180910390fd5b6000826120e6610fa5565b6120f0919061453e565b9050610fa0811115612137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212e906143c0565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156121c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bb906142c0565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fa081141561225d576000600f60026101000a81548160ff0219169083151502179055506001600f60036101000a81548160ff0219169083151502179055505b61226733846130af565b505050565b612274612dff565b73ffffffffffffffffffffffffffffffffffffffff166122926123ae565b73ffffffffffffffffffffffffffffffffffffffff16146122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df906142a0565b60405180910390fd5b80600f60026101000a81548160ff0219169083151502179055508015600f60036101000a81548160ff02191690831515021790555050565b600d805461232d90614709565b80601f016020809104026020016040519081016040528092919081815260200182805461235990614709565b80156123a65780601f1061237b576101008083540402835291602001916123a6565b820191906000526020600020905b81548152906001019060200180831161238957829003601f168201915b505050505081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6123df612dff565b73ffffffffffffffffffffffffffffffffffffffff166123fd6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244a906142a0565b60405180910390fd5b81600f60009054906101000a900460ff16156124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249b906143a0565b60405180910390fd5b612710816124b0610fa5565b6124ba919061453e565b11156124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f2906143e0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090614220565b60405180910390fd5b61257382846130af565b505050565b612580612dff565b73ffffffffffffffffffffffffffffffffffffffff1661259e6123ae565b73ffffffffffffffffffffffffffffffffffffffff16146125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb906142a0565b60405180910390fd5b80600e908051906020019061260a9291906136de565b5050565b60606004805461261d90614709565b80601f016020809104026020016040519081016040528092919081815260200182805461264990614709565b80156126965780601f1061266b57610100808354040283529160200191612696565b820191906000526020600020905b81548152906001019060200180831161267957829003601f168201915b5050505050905090565b6126a8612df7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061271a612df7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166127c7612df7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161280c9190614183565b60405180910390a35050565b600f60029054906101000a900460ff1681565b600a5481565b61283c848484610fbc565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461289e5761286784848484613191565b61289d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601481565b6128b1612dff565b73ffffffffffffffffffffffffffffffffffffffff166128cf6123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c906142a0565b60405180910390fd5b80600a8190555050565b606061293a82612d98565b612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906142e0565b60405180910390fd5b600f60019054906101000a900460ff16156129c057600c612999836132f1565b6040516020016129aa9291906140b6565b6040516020818303038152906040529050612a4e565b600d80546129cd90614709565b80601f01602080910402602001604051908101604052809291908181526020018280546129f990614709565b8015612a465780601f10612a1b57610100808354040283529160200191612a46565b820191906000526020600020905b815481529060010190602001808311612a2957829003601f168201915b505050505090505b919050565b612a5b612dff565b73ffffffffffffffffffffffffffffffffffffffff16612a796123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac6906142a0565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6060600e8054612afb90614709565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2790614709565b8015612b745780601f10612b4957610100808354040283529160200191612b74565b820191906000526020600020905b815481529060010190602001808311612b5757829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612c1a612dff565b73ffffffffffffffffffffffffffffffffffffffff16612c386123ae565b73ffffffffffffffffffffffffffffffffffffffff1614612c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c85906142a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf5906141e0565b60405180910390fd5b612d07816130cd565b50565b600c8054612d1790614709565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4390614709565b8015612d905780601f10612d6557610100808354040283529160200191612d90565b820191906000526020600020905b815481529060010190602001808311612d7357829003601f168201915b505050505081565b600081612da3612e07565b11158015612db2575060015482105b8015612df0575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080612e1f612e07565b11612ea757600154811015612ea65760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612ea4575b6000811415612e9a576005600083600190039350838152602001908152602001600020549050612e6f565b8092505050612ed9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612f61868684613452565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b803411156130685760003373ffffffffffffffffffffffffffffffffffffffff168234612fd0919061461f565b604051612fdc906140e5565b60006040518083038185875af1925050503d8060008114613019576040519150601f19603f3d011682016040523d82523d6000602084013e61301e565b606091505b5050905080613062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305990614200565b60405180910390fd5b506130ac565b803410156130ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a290614320565b60405180910390fd5b5b50565b6130c982826040518060200160405280600081525061345b565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131b7612df7565b8786866040518563ffffffff1660e01b81526004016131d99493929190614115565b602060405180830381600087803b1580156131f357600080fd5b505af192505050801561322457506040513d601f19601f820116820180604052508101906132219190613b43565b60015b61329e573d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b50600081511415613296576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613339576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061344d565b600082905060005b6000821461336b5780806133549061476c565b915050600a826133649190614594565b9150613341565b60008167ffffffffffffffff811115613387576133866148a2565b5b6040519080825280601f01601f1916602001820160405280156133b95781602001600182028036833780820191505090505b5090505b60008514613446576001826133d2919061461f565b9150600a856133e191906147b5565b60306133ed919061453e565b60f81b81838151811061340357613402614873565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561343f9190614594565b94506133bd565b8093505050505b919050565b60009392505050565b61346583836134f9565b60008373ffffffffffffffffffffffffffffffffffffffff163b146134f45760006001549050600083820390505b6134a66000868380600101945086613191565b6134dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106134935781600154146134f157600080fd5b50505b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613567576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156135a2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135af6000848385612f44565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613626836136176000866000612f4a565b613620856136ce565b17612f72565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061364a578060018190555050506136c96000848385612f9d565b505050565b60006001821460e11b9050919050565b8280546136ea90614709565b90600052602060002090601f01602090048101928261370c5760008555613753565b82601f1061372557805160ff1916838001178555613753565b82800160010185558215613753579182015b82811115613752578251825591602001919060010190613737565b5b5090506137609190613764565b5090565b5b8082111561377d576000816000905550600101613765565b5090565b600061379461378f84614440565b61441b565b9050828152602081018484840111156137b0576137af6148d6565b5b6137bb8482856146c7565b509392505050565b60006137d66137d184614471565b61441b565b9050828152602081018484840111156137f2576137f16148d6565b5b6137fd8482856146c7565b509392505050565b60008135905061381481614c50565b92915050565b60008135905061382981614c67565b92915050565b60008135905061383e81614c7e565b92915050565b60008151905061385381614c7e565b92915050565b600082601f83011261386e5761386d6148d1565b5b813561387e848260208601613781565b91505092915050565b600082601f83011261389c5761389b6148d1565b5b81356138ac8482602086016137c3565b91505092915050565b6000813590506138c481614c95565b92915050565b6000602082840312156138e0576138df6148e0565b5b60006138ee84828501613805565b91505092915050565b6000806040838503121561390e5761390d6148e0565b5b600061391c85828601613805565b925050602061392d85828601613805565b9150509250929050565b6000806000606084860312156139505761394f6148e0565b5b600061395e86828701613805565b935050602061396f86828701613805565b9250506040613980868287016138b5565b9150509250925092565b600080600080608085870312156139a4576139a36148e0565b5b60006139b287828801613805565b94505060206139c387828801613805565b93505060406139d4878288016138b5565b925050606085013567ffffffffffffffff8111156139f5576139f46148db565b5b613a0187828801613859565b91505092959194509250565b60008060408385031215613a2457613a236148e0565b5b6000613a3285828601613805565b9250506020613a438582860161381a565b9150509250929050565b60008060408385031215613a6457613a636148e0565b5b6000613a7285828601613805565b9250506020613a83858286016138b5565b9150509250929050565b600060208284031215613aa357613aa26148e0565b5b6000613ab18482850161381a565b91505092915050565b60008060408385031215613ad157613ad06148e0565b5b6000613adf8582860161381a565b925050602083013567ffffffffffffffff811115613b0057613aff6148db565b5b613b0c85828601613887565b9150509250929050565b600060208284031215613b2c57613b2b6148e0565b5b6000613b3a8482850161382f565b91505092915050565b600060208284031215613b5957613b586148e0565b5b6000613b6784828501613844565b91505092915050565b600060208284031215613b8657613b856148e0565b5b600082013567ffffffffffffffff811115613ba457613ba36148db565b5b613bb084828501613887565b91505092915050565b600060208284031215613bcf57613bce6148e0565b5b6000613bdd848285016138b5565b91505092915050565b60008060408385031215613bfd57613bfc6148e0565b5b6000613c0b858286016138b5565b9250506020613c1c85828601613805565b9150509250929050565b6000613c328383614098565b60208301905092915050565b613c4781614653565b82525050565b6000613c58826144c7565b613c6281856144f5565b9350613c6d836144a2565b8060005b83811015613c9e578151613c858882613c26565b9750613c90836144e8565b925050600181019050613c71565b5085935050505092915050565b613cb481614665565b82525050565b6000613cc5826144d2565b613ccf8185614506565b9350613cdf8185602086016146d6565b613ce8816148e5565b840191505092915050565b6000613cfe826144dd565b613d088185614522565b9350613d188185602086016146d6565b613d21816148e5565b840191505092915050565b6000613d37826144dd565b613d418185614533565b9350613d518185602086016146d6565b80840191505092915050565b60008154613d6a81614709565b613d748186614533565b94506001821660008114613d8f5760018114613da057613dd3565b60ff19831686528186019350613dd3565b613da9856144b2565b60005b83811015613dcb57815481890152600182019150602081019050613dac565b838801955050505b50505092915050565b6000613de9600b83614522565b9150613df4826148f6565b602082019050919050565b6000613e0c602683614522565b9150613e178261491f565b604082019050919050565b6000613e2f600f83614522565b9150613e3a8261496e565b602082019050919050565b6000613e52601383614522565b9150613e5d82614997565b602082019050919050565b6000613e75601383614522565b9150613e80826149c0565b602082019050919050565b6000613e98602083614522565b9150613ea3826149e9565b602082019050919050565b6000613ebb601283614522565b9150613ec682614a12565b602082019050919050565b6000613ede600583614533565b9150613ee982614a3b565b600582019050919050565b6000613f01602083614522565b9150613f0c82614a64565b602082019050919050565b6000613f24601383614522565b9150613f2f82614a8d565b602082019050919050565b6000613f47602f83614522565b9150613f5282614ab6565b604082019050919050565b6000613f6a601283614522565b9150613f7582614b05565b602082019050919050565b6000613f8d601383614522565b9150613f9882614b2e565b602082019050919050565b6000613fb0601483614522565b9150613fbb82614b57565b602082019050919050565b6000613fd3601183614522565b9150613fde82614b80565b602082019050919050565b6000613ff6600083614517565b915061400182614ba9565b600082019050919050565b6000614019601383614522565b915061402482614bac565b602082019050919050565b600061403c601283614522565b915061404782614bd5565b602082019050919050565b600061405f601683614522565b915061406a82614bfe565b602082019050919050565b6000614082601583614522565b915061408d82614c27565b602082019050919050565b6140a1816146bd565b82525050565b6140b0816146bd565b82525050565b60006140c28285613d5d565b91506140ce8284613d2c565b91506140d982613ed1565b91508190509392505050565b60006140f082613fe9565b9150819050919050565b600060208201905061410f6000830184613c3e565b92915050565b600060808201905061412a6000830187613c3e565b6141376020830186613c3e565b61414460408301856140a7565b81810360608301526141568184613cba565b905095945050505050565b6000602082019050818103600083015261417b8184613c4d565b905092915050565b60006020820190506141986000830184613cab565b92915050565b600060208201905081810360008301526141b88184613cf3565b905092915050565b600060208201905081810360008301526141d981613ddc565b9050919050565b600060208201905081810360008301526141f981613dff565b9050919050565b6000602082019050818103600083015261421981613e22565b9050919050565b6000602082019050818103600083015261423981613e45565b9050919050565b6000602082019050818103600083015261425981613e68565b9050919050565b6000602082019050818103600083015261427981613e8b565b9050919050565b6000602082019050818103600083015261429981613eae565b9050919050565b600060208201905081810360008301526142b981613ef4565b9050919050565b600060208201905081810360008301526142d981613f17565b9050919050565b600060208201905081810360008301526142f981613f3a565b9050919050565b6000602082019050818103600083015261431981613f5d565b9050919050565b6000602082019050818103600083015261433981613f80565b9050919050565b6000602082019050818103600083015261435981613fa3565b9050919050565b6000602082019050818103600083015261437981613fc6565b9050919050565b600060208201905081810360008301526143998161400c565b9050919050565b600060208201905081810360008301526143b98161402f565b9050919050565b600060208201905081810360008301526143d981614052565b9050919050565b600060208201905081810360008301526143f981614075565b9050919050565b600060208201905061441560008301846140a7565b92915050565b6000614425614436565b9050614431828261473b565b919050565b6000604051905090565b600067ffffffffffffffff82111561445b5761445a6148a2565b5b614464826148e5565b9050602081019050919050565b600067ffffffffffffffff82111561448c5761448b6148a2565b5b614495826148e5565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614549826146bd565b9150614554836146bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614589576145886147e6565b5b828201905092915050565b600061459f826146bd565b91506145aa836146bd565b9250826145ba576145b9614815565b5b828204905092915050565b60006145d0826146bd565b91506145db836146bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614614576146136147e6565b5b828202905092915050565b600061462a826146bd565b9150614635836146bd565b925082821015614648576146476147e6565b5b828203905092915050565b600061465e8261469d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146f45780820151818401526020810190506146d9565b83811115614703576000848401525b50505050565b6000600282049050600182168061472157607f821691505b6020821081141561473557614734614844565b5b50919050565b614744826148e5565b810181811067ffffffffffffffff82111715614763576147626148a2565b5b80604052505050565b6000614777826146bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147aa576147a96147e6565b5b600182019050919050565b60006147c0826146bd565b91506147cb836146bd565b9250826147db576147da614815565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f6e6c7920312066726565000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f4e6f20636f6e7472616374206d696e74696e6700000000000000000000000000600082015250565b7f55736572206d6178206d696e74206c696d697400000000000000000000000000600082015250565b7f5465616d202872656d61696e696e6729207472616e73666572206661696c6564600082015250565b7f467265652073616c6520696e6163746976650000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f55736572206d61782066726565206c696d697400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5468697320706861736520697320667265650000000000000000000000000000600082015250565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b7f5075626c69632073616c6520696e616374697665000000000000000000000000600082015250565b7f5175616e7469747920746f6f2068696768000000000000000000000000000000600082015250565b50565b7f446576207472616e73666572206661696c656400000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f4e6f7420656e6f756768206672656520737570706c7900000000000000000000600082015250565b7f4e6f7420656e6f756768206d696e7473206c6566740000000000000000000000600082015250565b614c5981614653565b8114614c6457600080fd5b50565b614c7081614665565b8114614c7b57600080fd5b50565b614c8781614671565b8114614c9257600080fd5b50565b614c9e816146bd565b8114614ca957600080fd5b5056fea2646970667358221220aa3d752f3cecd80e663e278bc9a6ca80a3ce0f4234b7f01fabab57150b2cc56c64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5735644c696153556177524e755635477a7772675a59376e39673344465933635669485031714739363358702f00000000000000000000
-----Decoded View---------------
Arg [0] : initRevealedURI (string): ipfs://QmW5dLiaSUawRNuV5GzwrgZY7n9g3DFY3cViHP1qG963Xp/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d5735644c696153556177524e755635477a7772675a5937
Arg [3] : 6e39673344465933635669485031714739363358702f00000000000000000000
Deployed Bytecode Sourcemap
51045:13737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20139:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25786:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27732:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27280:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61216:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62346:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19193:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36997:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62790:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56317:571;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51286:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51091:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51846:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51141:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62909:579;;;:::i;:::-;;28622:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58404:689;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61657:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51776:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61450:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51651:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51976:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51744:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61795:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25575:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52055:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51192:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20818:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;51398:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52108:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62532:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55640:669;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62661:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51477:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63632:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62019:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25955:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28008:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51812:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51235:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28878:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51343:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61334:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59101:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62437:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59896:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28387:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51439:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20139:615;20224:4;20539:10;20524:25;;:11;:25;;;;:102;;;;20616:10;20601:25;;:11;:25;;;;20524:102;:179;;;;20693:10;20678:25;;:11;:25;;;;20524:179;20504:199;;20139:615;;;:::o;25786:100::-;25840:13;25873:5;25866:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25786:100;:::o;27732:204::-;27800:7;27825:16;27833:7;27825;:16::i;:::-;27820:64;;27850:34;;;;;;;;;;;;;;27820:64;27904:15;:24;27920:7;27904:24;;;;;;;;;;;;;;;;;;;;;27897:31;;27732:204;;;:::o;27280:386::-;27353:13;27369:16;27377:7;27369;:16::i;:::-;27353:32;;27425:5;27402:28;;:19;:17;:19::i;:::-;:28;;;27398:175;;27450:44;27467:5;27474:19;:17;:19::i;:::-;27450:16;:44::i;:::-;27445:128;;27522:35;;;;;;;;;;;;;;27445:128;27398:175;27612:2;27585:15;:24;27601:7;27585:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27650:7;27646:2;27630:28;;27639:5;27630:28;;;;;;;;;;;;27342:324;27280:386;;:::o;61216:110::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61306:12:::1;61290:13;:28;;;;61216:110:::0;:::o;62346:83::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62415:6:::1;62406;;:15;;;;;;;;;;;;;;;;;;62346:83:::0;:::o;19193:315::-;19246:7;19474:15;:13;:15::i;:::-;19459:12;;19443:13;;:28;:46;19436:53;;19193:315;:::o;36997:2800::-;37131:27;37161;37180:7;37161:18;:27::i;:::-;37131:57;;37246:4;37205:45;;37221:19;37205:45;;;37201:86;;37259:28;;;;;;;;;;;;;;37201:86;37301:27;37330:23;37357:28;37377:7;37357:19;:28::i;:::-;37300:85;;;;37485:62;37504:15;37521:4;37527:19;:17;:19::i;:::-;37485:18;:62::i;:::-;37480:174;;37567:43;37584:4;37590:19;:17;:19::i;:::-;37567:16;:43::i;:::-;37562:92;;37619:35;;;;;;;;;;;;;;37562:92;37480:174;37685:1;37671:16;;:2;:16;;;37667:52;;;37696:23;;;;;;;;;;;;;;37667:52;37732:43;37754:4;37760:2;37764:7;37773:1;37732:21;:43::i;:::-;37868:15;37865:160;;;38008:1;37987:19;37980:30;37865:160;38403:18;:24;38422:4;38403:24;;;;;;;;;;;;;;;;38401:26;;;;;;;;;;;;38472:18;:22;38491:2;38472:22;;;;;;;;;;;;;;;;38470:24;;;;;;;;;;;38794:145;38831:2;38879:45;38894:4;38900:2;38904:19;38879:14;:45::i;:::-;16421:8;38852:72;38794:18;:145::i;:::-;38765:17;:26;38783:7;38765:26;;;;;;;;;;;:174;;;;39109:1;16421:8;39059:19;:46;:51;39055:626;;;39131:19;39163:1;39153:7;:11;39131:33;;39320:1;39286:17;:30;39304:11;39286:30;;;;;;;;;;;;:35;39282:384;;;39424:13;;39409:11;:28;39405:242;;39604:19;39571:17;:30;39589:11;39571:30;;;;;;;;;;;:52;;;;39405:242;39282:384;39112:569;39055:626;39728:7;39724:2;39709:27;;39718:4;39709:27;;;;;;;;;;;;39747:42;39768:4;39774:2;39778:7;39787:1;39747:20;:42::i;:::-;37120:2677;;;36997:2800;;;:::o;62790:111::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62882:11:::1;62869:10;;:24;;;;;;;;;;;;;;;;;;62790:111:::0;:::o;56317:571::-;56387:8;64581:6;;;;;;;;;;;64580:7;64572:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51128:5;64645:8;64629:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;64621:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64725:10;64712:23;;:9;:23;;;64704:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56416:10:::1;;;;;;;;;;;56408:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51334:2;56470:8;:33;;56462:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56538:13;56554:11;;56538:27;;56576:17;56596:12;:24;56609:10;56596:24;;;;;;;;;;;;;;;;56576:44;;51387:2;56669:8;56657:9;:20;;;;:::i;:::-;:41;;56649:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56743:31;56765:8;56757:5;:16;;;;:::i;:::-;56743:13;:31::i;:::-;56827:8;56815:9;:20;;;;:::i;:::-;56787:12;:24;56800:10;56787:24;;;;;;;;;;;;;;;:49;;;;56849:31;56859:10;56871:8;56849:9;:31::i;:::-;56397:491;;56317:571:::0;;:::o;51286:50::-;51334:2;51286:50;:::o;51091:42::-;51128:5;51091:42;:::o;51846:30::-;;;;;;;;;;;;;:::o;51141:44::-;51181:4;51141:44;:::o;62909:579::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63034:19:::1;63056:21;63034:43;;63091:9;51926:42;63106:25;;63176:5;63168:4;63154:11;:18;;;;:::i;:::-;63153:28;;;;:::i;:::-;63106:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63090:106;;;63215:4;63207:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;63346:10;;;;;;;;;;;63338:24;;63384:21;63338:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63327:93;;;;;63439:4;63431:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;62956:532;;62909:579::o:0;28622:185::-;28760:39;28777:4;28783:2;28787:7;28760:39;;;;;;;;;;;;:16;:39::i;:::-;28622:185;;;:::o;58404:689::-;58464:16;58498:23;58524:17;58534:6;58524:9;:17::i;:::-;58498:43;;58552:30;58599:15;58585:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58552:63;;58626:22;58651:1;58626:26;;58663:23;58703:350;58728:15;58710;:33;:65;;;;;51128:5;58747:14;:28;;58710:65;58703:350;;;58792:25;58820:23;58828:14;58820:7;:23::i;:::-;58792:51;;58885:6;58864:27;;:17;:27;;;58860:153;;;58945:14;58912:13;58926:15;58912:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;58980:17;;;;;:::i;:::-;;;;58860:153;59025:16;;;;;:::i;:::-;;;;58777:276;58703:350;;;59072:13;59065:20;;;;;;58404:689;;;:::o;61657:130::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61761:18:::1;61749:9;:30;;;;;;;;;;;;:::i;:::-;;61657:130:::0;:::o;51776:27::-;;;;;;;;;;;;;:::o;61450:128::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61533:4:::1;61522:8;;:15;;;;;;;;;;;;;;;;;;61562:8;61548:11;:22;;;;;;;;;;;;:::i;:::-;;61450:128:::0;:::o;51651:84::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51976:70::-;;;;;;;;;;;;;:::o;51744:25::-;;;;;;;;;;;;;:::o;61795:155::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61900:9:::1;61889:8;;:20;;;;;;;;;;;;;;;;;;61934:8;61920:11;:22;;;;;;;;;;;;:::i;:::-;;61795:155:::0;;:::o;25575:144::-;25639:7;25682:27;25701:7;25682:18;:27::i;:::-;25659:52;;25575:144;;;:::o;52055:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;51192:34::-;;;;:::o;20818:224::-;20882:7;20923:1;20906:19;;:5;:19;;;20902:60;;;20934:28;;;;;;;;;;;;;;20902:60;15373:13;20980:18;:25;20999:5;20980:25;;;;;;;;;;;;;;;;:54;20973:61;;20818:224;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;51398:32::-;;;;:::o;52108:47::-;;;;;;;;;;;;;;;;;:::o;62532:123::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62612:6:::1;62599:10;;:19;;;;;;;;;;;;;;;;;;62641:6;62640:7;62629:8;;:18;;;;;;;;;;;;;;;;;;62532:123:::0;:::o;55640:669::-;55708:8;64581:6;;;;;;;;;;;64580:7;64572:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51128:5;64645:8;64629:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;64621:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64725:10;64712:23;;:9;:23;;;64704:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55737:8:::1;;;;;;;;;;;55729:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;55800:1;55787:9;:14;55779:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;55855:1;55843:8;:13;55835:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55885:17;55923:8;55906:13;:11;:13::i;:::-;55905:26;;;;:::i;:::-;55885:46;;51181:4;55960:9;:26;;55952:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56035:14;:26;56050:10;56035:26;;;;;;;;;;;;;;;;;;;;;;;;;56034:27;56026:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;56135:4;56106:14;:26;56121:10;56106:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;51181:4;56155:9;:26;56152:106;;;56209:5;56198:8;;:16;;;;;;;;;;;;;;;;;;56242:4;56229:10;;:17;;;;;;;;;;;;;;;;;;56152:106;56270:31;56280:10;56292:8;56270:9;:31::i;:::-;55718:591;55640:669:::0;;:::o;62661:121::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62737:6:::1;62726:8;;:17;;;;;;;;;;;;;;;;;;62768:6;62767:7;62754:10;;:20;;;;;;;;;;;;;;;;;;62661:121:::0;:::o;51477:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;63632:146::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63720:8:::1;64581:6;;;;;;;;;;;64580:7;64572:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51128:5;64645:8;64629:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;64621:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64725:10;64712:23;;:9;:23;;;64704:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63741:29:::2;63751:8;63761;63741:9;:29::i;:::-;4370:1:::1;63632:146:::0;;:::o;62019:115::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62114:12:::1;62099;:27;;;;;;;;;;;;:::i;:::-;;62019:115:::0;:::o;25955:104::-;26011:13;26044:7;26037:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25955:104;:::o;28008:308::-;28119:19;:17;:19::i;:::-;28107:31;;:8;:31;;;28103:61;;;28147:17;;;;;;;;;;;;;;28103:61;28229:8;28177:18;:39;28196:19;:17;:19::i;:::-;28177:39;;;;;;;;;;;;;;;:49;28217:8;28177:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28289:8;28253:55;;28268:19;:17;:19::i;:::-;28253:55;;;28299:8;28253:55;;;;;;:::i;:::-;;;;;;;;28008:308;;:::o;51812:27::-;;;;;;;;;;;;;:::o;51235:41::-;;;;:::o;28878:399::-;29045:31;29058:4;29064:2;29068:7;29045:12;:31::i;:::-;29109:1;29091:2;:14;;;:19;29087:183;;29130:56;29161:4;29167:2;29171:7;29180:5;29130:30;:56::i;:::-;29125:145;;29214:40;;;;;;;;;;;;;;29125:145;29087:183;28878:399;;;;:::o;51343:46::-;51387:2;51343:46;:::o;61334:108::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61422:12:::1;61408:11;:26;;;;61334:108:::0;:::o;59101:608::-;59167:13;59432:17;59440:8;59432:7;:17::i;:::-;59424:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;59526:8;;;;;;;;;;;59522:180;;;59582:11;59595:26;59612:8;59595:16;:26::i;:::-;59565:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59551:81;;;;59522:180;59681:9;59674:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59101:608;;;;:::o;62437:87::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62510:6:::1;62499:8;;:17;;;;;;;;;;;;;;;;;;62437:87:::0;:::o;59896:97::-;59940:13;59973:12;59966:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59896:97;:::o;28387:164::-;28484:4;28508:18;:25;28527:5;28508:25;;;;;;;;;;;;;;;:35;28534:8;28508:35;;;;;;;;;;;;;;;;;;;;;;;;;28501:42;;28387:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;51439:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29532:273::-;29589:4;29645:7;29626:15;:13;:15::i;:::-;:26;;:66;;;;;29679:13;;29669:7;:23;29626:66;:152;;;;;29777:1;16143:8;29730:17;:26;29748:7;29730:26;;;;;;;;;;;;:43;:48;29626:152;29606:172;;29532:273;;;:::o;48093:105::-;48153:7;48180:10;48173:17;;48093:105;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;53999:101::-;54064:7;54091:1;54084:8;;53999:101;:::o;22492:1129::-;22559:7;22579:12;22594:7;22579:22;;22662:4;22643:15;:13;:15::i;:::-;:23;22639:915;;22696:13;;22689:4;:20;22685:869;;;22734:14;22751:17;:23;22769:4;22751:23;;;;;;;;;;;;22734:40;;22867:1;16143:8;22840:6;:23;:28;22836:699;;;23359:113;23376:1;23366:6;:11;23359:113;;;23419:17;:25;23437:6;;;;;;;23419:25;;;;;;;;;;;;23410:34;;23359:113;;;23505:6;23498:13;;;;;;22836:699;22711:843;22685:869;22639:915;23582:31;;;;;;;;;;;;;;22492:1129;;;;:::o;35333:652::-;35428:27;35457:23;35498:53;35554:15;35498:71;;35740:7;35734:4;35727:21;35775:22;35769:4;35762:36;35851:4;35845;35835:21;35812:44;;35947:19;35941:26;35922:45;;35678:300;35333:652;;;:::o;36098:645::-;36240:11;36402:15;36396:4;36392:26;36384:34;;36561:15;36550:9;36546:31;36533:44;;36708:15;36697:9;36694:30;36687:4;36676:9;36673:19;36670:55;36660:65;;36098:645;;;;;:::o;46926:159::-;;;;;:::o;45238:309::-;45373:7;45393:16;16544:3;45419:19;:40;;45393:67;;16544:3;45486:31;45497:4;45503:2;45507:9;45486:10;:31::i;:::-;45478:40;;:61;;45471:68;;;45238:309;;;;;:::o;25066:447::-;25146:14;25314:15;25307:5;25303:27;25294:36;;25488:5;25474:11;25450:22;25446:40;25443:51;25436:5;25433:62;25423:72;;25066:447;;;;:::o;47744:158::-;;;;;:::o;54108:359::-;54181:5;54169:9;:17;54165:295;;;54204:9;54227:10;54219:24;;54282:5;54270:9;:17;;;;:::i;:::-;54219:88;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54203:104;;;54330:4;54322:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;54188:178;54165:295;;;54397:5;54385:9;:17;54381:79;;;54419:29;;;;;;;;;;:::i;:::-;;;;;;;;54381:79;54165:295;54108:359;:::o;29889:104::-;29958:27;29968:2;29972:8;29958:27;;;;;;;;;;;;:9;:27::i;:::-;29889:104;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;43748:716::-;43911:4;43957:2;43932:45;;;43978:19;:17;:19::i;:::-;43999:4;44005:7;44014:5;43932:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43928:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44232:1;44215:6;:13;:18;44211:235;;;44261:40;;;;;;;;;;;;;;44211:235;44404:6;44398:13;44389:6;44385:2;44381:15;44374:38;43928:529;44101:54;;;44091:64;;;:6;:64;;;;44084:71;;;43748:716;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;46123:147::-;46260:6;46123:147;;;;;:::o;30409:681::-;30532:19;30538:2;30542:8;30532:5;:19::i;:::-;30611:1;30593:2;:14;;;:19;30589:483;;30633:11;30647:13;;30633:27;;30679:13;30701:8;30695:3;:14;30679:30;;30728:233;30759:62;30798:1;30802:2;30806:7;;;;;;30815:5;30759:30;:62::i;:::-;30754:167;;30857:40;;;;;;;;;;;;;;30754:167;30956:3;30948:5;:11;30728:233;;31043:3;31026:13;;:20;31022:34;;31048:8;;;31022:34;30614:458;;30589:483;30409:681;;;:::o;31363:1529::-;31428:20;31451:13;;31428:36;;31493:1;31479:16;;:2;:16;;;31475:48;;;31504:19;;;;;;;;;;;;;;31475:48;31550:1;31538:8;:13;31534:44;;;31560:18;;;;;;;;;;;;;;31534:44;31591:61;31621:1;31625:2;31629:12;31643:8;31591:21;:61::i;:::-;32134:1;15510:2;32105:1;:25;;32104:31;32092:8;:44;32066:18;:22;32085:2;32066:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;32413:139;32450:2;32504:33;32527:1;32531:2;32535:1;32504:14;:33::i;:::-;32471:30;32492:8;32471:20;:30::i;:::-;:66;32413:18;:139::i;:::-;32379:17;:31;32397:12;32379:31;;;;;;;;;;;:173;;;;32569:15;32587:12;32569:30;;32614:11;32643:8;32628:12;:23;32614:37;;32666:101;32718:9;;;;;;32714:2;32693:35;;32710:1;32693:35;;;;;;;;;;;;32762:3;32752:7;:13;32666:101;;32799:3;32783:13;:19;;;;31840:974;;32824:60;32853:1;32857:2;32861:12;32875:8;32824:20;:60::i;:::-;31417:1475;31363:1529;;:::o;26896:322::-;26966:14;27197:1;27187:8;27184:15;27159:23;27155:45;27145:55;;26896:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:648::-;6024:6;6032;6081:2;6069:9;6060:7;6056:23;6052:32;6049:119;;;6087:79;;:::i;:::-;6049:119;6207:1;6232:50;6274:7;6265:6;6254:9;6250:22;6232:50;:::i;:::-;6222:60;;6178:114;6359:2;6348:9;6344:18;6331:32;6390:18;6382:6;6379:30;6376:117;;;6412:79;;:::i;:::-;6376:117;6517:63;6572:7;6563:6;6552:9;6548:22;6517:63;:::i;:::-;6507:73;;6302:288;5949:648;;;;;:::o;6603:327::-;6661:6;6710:2;6698:9;6689:7;6685:23;6681:32;6678:119;;;6716:79;;:::i;:::-;6678:119;6836:1;6861:52;6905:7;6896:6;6885:9;6881:22;6861:52;:::i;:::-;6851:62;;6807:116;6603:327;;;;:::o;6936:349::-;7005:6;7054:2;7042:9;7033:7;7029:23;7025:32;7022:119;;;7060:79;;:::i;:::-;7022:119;7180:1;7205:63;7260:7;7251:6;7240:9;7236:22;7205:63;:::i;:::-;7195:73;;7151:127;6936:349;;;;:::o;7291:509::-;7360:6;7409:2;7397:9;7388:7;7384:23;7380:32;7377:119;;;7415:79;;:::i;:::-;7377:119;7563:1;7552:9;7548:17;7535:31;7593:18;7585:6;7582:30;7579:117;;;7615:79;;:::i;:::-;7579:117;7720:63;7775:7;7766:6;7755:9;7751:22;7720:63;:::i;:::-;7710:73;;7506:287;7291:509;;;;:::o;7806:329::-;7865:6;7914:2;7902:9;7893:7;7889:23;7885:32;7882:119;;;7920:79;;:::i;:::-;7882:119;8040:1;8065:53;8110:7;8101:6;8090:9;8086:22;8065:53;:::i;:::-;8055:63;;8011:117;7806:329;;;;:::o;8141:474::-;8209:6;8217;8266:2;8254:9;8245:7;8241:23;8237:32;8234:119;;;8272:79;;:::i;:::-;8234:119;8392:1;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8363:117;8519:2;8545:53;8590:7;8581:6;8570:9;8566:22;8545:53;:::i;:::-;8535:63;;8490:118;8141:474;;;;;:::o;8621:179::-;8690:10;8711:46;8753:3;8745:6;8711:46;:::i;:::-;8789:4;8784:3;8780:14;8766:28;;8621:179;;;;:::o;8806:118::-;8893:24;8911:5;8893:24;:::i;:::-;8888:3;8881:37;8806:118;;:::o;8960:732::-;9079:3;9108:54;9156:5;9108:54;:::i;:::-;9178:86;9257:6;9252:3;9178:86;:::i;:::-;9171:93;;9288:56;9338:5;9288:56;:::i;:::-;9367:7;9398:1;9383:284;9408:6;9405:1;9402:13;9383:284;;;9484:6;9478:13;9511:63;9570:3;9555:13;9511:63;:::i;:::-;9504:70;;9597:60;9650:6;9597:60;:::i;:::-;9587:70;;9443:224;9430:1;9427;9423:9;9418:14;;9383:284;;;9387:14;9683:3;9676:10;;9084:608;;;8960:732;;;;:::o;9698:109::-;9779:21;9794:5;9779:21;:::i;:::-;9774:3;9767:34;9698:109;;:::o;9813:360::-;9899:3;9927:38;9959:5;9927:38;:::i;:::-;9981:70;10044:6;10039:3;9981:70;:::i;:::-;9974:77;;10060:52;10105:6;10100:3;10093:4;10086:5;10082:16;10060:52;:::i;:::-;10137:29;10159:6;10137:29;:::i;:::-;10132:3;10128:39;10121:46;;9903:270;9813:360;;;;:::o;10179:364::-;10267:3;10295:39;10328:5;10295:39;:::i;:::-;10350:71;10414:6;10409:3;10350:71;:::i;:::-;10343:78;;10430:52;10475:6;10470:3;10463:4;10456:5;10452:16;10430:52;:::i;:::-;10507:29;10529:6;10507:29;:::i;:::-;10502:3;10498:39;10491:46;;10271:272;10179:364;;;;:::o;10549:377::-;10655:3;10683:39;10716:5;10683:39;:::i;:::-;10738:89;10820:6;10815:3;10738:89;:::i;:::-;10731:96;;10836:52;10881:6;10876:3;10869:4;10862:5;10858:16;10836:52;:::i;:::-;10913:6;10908:3;10904:16;10897:23;;10659:267;10549:377;;;;:::o;10956:845::-;11059:3;11096:5;11090:12;11125:36;11151:9;11125:36;:::i;:::-;11177:89;11259:6;11254:3;11177:89;:::i;:::-;11170:96;;11297:1;11286:9;11282:17;11313:1;11308:137;;;;11459:1;11454:341;;;;11275:520;;11308:137;11392:4;11388:9;11377;11373:25;11368:3;11361:38;11428:6;11423:3;11419:16;11412:23;;11308:137;;11454:341;11521:38;11553:5;11521:38;:::i;:::-;11581:1;11595:154;11609:6;11606:1;11603:13;11595:154;;;11683:7;11677:14;11673:1;11668:3;11664:11;11657:35;11733:1;11724:7;11720:15;11709:26;;11631:4;11628:1;11624:12;11619:17;;11595:154;;;11778:6;11773:3;11769:16;11762:23;;11461:334;;11275:520;;11063:738;;10956:845;;;;:::o;11807:366::-;11949:3;11970:67;12034:2;12029:3;11970:67;:::i;:::-;11963:74;;12046:93;12135:3;12046:93;:::i;:::-;12164:2;12159:3;12155:12;12148:19;;11807:366;;;:::o;12179:::-;12321:3;12342:67;12406:2;12401:3;12342:67;:::i;:::-;12335:74;;12418:93;12507:3;12418:93;:::i;:::-;12536:2;12531:3;12527:12;12520:19;;12179:366;;;:::o;12551:::-;12693:3;12714:67;12778:2;12773:3;12714:67;:::i;:::-;12707:74;;12790:93;12879:3;12790:93;:::i;:::-;12908:2;12903:3;12899:12;12892:19;;12551:366;;;:::o;12923:::-;13065:3;13086:67;13150:2;13145:3;13086:67;:::i;:::-;13079:74;;13162:93;13251:3;13162:93;:::i;:::-;13280:2;13275:3;13271:12;13264:19;;12923:366;;;:::o;13295:::-;13437:3;13458:67;13522:2;13517:3;13458:67;:::i;:::-;13451:74;;13534:93;13623:3;13534:93;:::i;:::-;13652:2;13647:3;13643:12;13636:19;;13295:366;;;:::o;13667:::-;13809:3;13830:67;13894:2;13889:3;13830:67;:::i;:::-;13823:74;;13906:93;13995:3;13906:93;:::i;:::-;14024:2;14019:3;14015:12;14008:19;;13667:366;;;:::o;14039:::-;14181:3;14202:67;14266:2;14261:3;14202:67;:::i;:::-;14195:74;;14278:93;14367:3;14278:93;:::i;:::-;14396:2;14391:3;14387:12;14380:19;;14039:366;;;:::o;14411:400::-;14571:3;14592:84;14674:1;14669:3;14592:84;:::i;:::-;14585:91;;14685:93;14774:3;14685:93;:::i;:::-;14803:1;14798:3;14794:11;14787:18;;14411:400;;;:::o;14817:366::-;14959:3;14980:67;15044:2;15039:3;14980:67;:::i;:::-;14973:74;;15056:93;15145:3;15056:93;:::i;:::-;15174:2;15169:3;15165:12;15158:19;;14817:366;;;:::o;15189:::-;15331:3;15352:67;15416:2;15411:3;15352:67;:::i;:::-;15345:74;;15428:93;15517:3;15428:93;:::i;:::-;15546:2;15541:3;15537:12;15530:19;;15189:366;;;:::o;15561:::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15561:366;;;:::o;15933:::-;16075:3;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16172:93;16261:3;16172:93;:::i;:::-;16290:2;16285:3;16281:12;16274:19;;15933:366;;;:::o;16305:::-;16447:3;16468:67;16532:2;16527:3;16468:67;:::i;:::-;16461:74;;16544:93;16633:3;16544:93;:::i;:::-;16662:2;16657:3;16653:12;16646:19;;16305:366;;;:::o;16677:::-;16819:3;16840:67;16904:2;16899:3;16840:67;:::i;:::-;16833:74;;16916:93;17005:3;16916:93;:::i;:::-;17034:2;17029:3;17025:12;17018:19;;16677:366;;;:::o;17049:::-;17191:3;17212:67;17276:2;17271:3;17212:67;:::i;:::-;17205:74;;17288:93;17377:3;17288:93;:::i;:::-;17406:2;17401:3;17397:12;17390:19;;17049:366;;;:::o;17421:398::-;17580:3;17601:83;17682:1;17677:3;17601:83;:::i;:::-;17594:90;;17693:93;17782:3;17693:93;:::i;:::-;17811:1;17806:3;17802:11;17795:18;;17421:398;;;:::o;17825:366::-;17967:3;17988:67;18052:2;18047:3;17988:67;:::i;:::-;17981:74;;18064:93;18153:3;18064:93;:::i;:::-;18182:2;18177:3;18173:12;18166:19;;17825:366;;;:::o;18197:::-;18339:3;18360:67;18424:2;18419:3;18360:67;:::i;:::-;18353:74;;18436:93;18525:3;18436:93;:::i;:::-;18554:2;18549:3;18545:12;18538:19;;18197:366;;;:::o;18569:::-;18711:3;18732:67;18796:2;18791:3;18732:67;:::i;:::-;18725:74;;18808:93;18897:3;18808:93;:::i;:::-;18926:2;18921:3;18917:12;18910:19;;18569:366;;;:::o;18941:::-;19083:3;19104:67;19168:2;19163:3;19104:67;:::i;:::-;19097:74;;19180:93;19269:3;19180:93;:::i;:::-;19298:2;19293:3;19289:12;19282:19;;18941:366;;;:::o;19313:108::-;19390:24;19408:5;19390:24;:::i;:::-;19385:3;19378:37;19313:108;;:::o;19427:118::-;19514:24;19532:5;19514:24;:::i;:::-;19509:3;19502:37;19427:118;;:::o;19551:695::-;19829:3;19851:92;19939:3;19930:6;19851:92;:::i;:::-;19844:99;;19960:95;20051:3;20042:6;19960:95;:::i;:::-;19953:102;;20072:148;20216:3;20072:148;:::i;:::-;20065:155;;20237:3;20230:10;;19551:695;;;;;:::o;20252:379::-;20436:3;20458:147;20601:3;20458:147;:::i;:::-;20451:154;;20622:3;20615:10;;20252:379;;;:::o;20637:222::-;20730:4;20768:2;20757:9;20753:18;20745:26;;20781:71;20849:1;20838:9;20834:17;20825:6;20781:71;:::i;:::-;20637:222;;;;:::o;20865:640::-;21060:4;21098:3;21087:9;21083:19;21075:27;;21112:71;21180:1;21169:9;21165:17;21156:6;21112:71;:::i;:::-;21193:72;21261:2;21250:9;21246:18;21237:6;21193:72;:::i;:::-;21275;21343:2;21332:9;21328:18;21319:6;21275:72;:::i;:::-;21394:9;21388:4;21384:20;21379:2;21368:9;21364:18;21357:48;21422:76;21493:4;21484:6;21422:76;:::i;:::-;21414:84;;20865:640;;;;;;;:::o;21511:373::-;21654:4;21692:2;21681:9;21677:18;21669:26;;21741:9;21735:4;21731:20;21727:1;21716:9;21712:17;21705:47;21769:108;21872:4;21863:6;21769:108;:::i;:::-;21761:116;;21511:373;;;;:::o;21890:210::-;21977:4;22015:2;22004:9;22000:18;21992:26;;22028:65;22090:1;22079:9;22075:17;22066:6;22028:65;:::i;:::-;21890:210;;;;:::o;22106:313::-;22219:4;22257:2;22246:9;22242:18;22234:26;;22306:9;22300:4;22296:20;22292:1;22281:9;22277:17;22270:47;22334:78;22407:4;22398:6;22334:78;:::i;:::-;22326:86;;22106:313;;;;:::o;22425:419::-;22591:4;22629:2;22618:9;22614:18;22606:26;;22678:9;22672:4;22668:20;22664:1;22653:9;22649:17;22642:47;22706:131;22832:4;22706:131;:::i;:::-;22698:139;;22425:419;;;:::o;22850:::-;23016:4;23054:2;23043:9;23039:18;23031:26;;23103:9;23097:4;23093:20;23089:1;23078:9;23074:17;23067:47;23131:131;23257:4;23131:131;:::i;:::-;23123:139;;22850:419;;;:::o;23275:::-;23441:4;23479:2;23468:9;23464:18;23456:26;;23528:9;23522:4;23518:20;23514:1;23503:9;23499:17;23492:47;23556:131;23682:4;23556:131;:::i;:::-;23548:139;;23275:419;;;:::o;23700:::-;23866:4;23904:2;23893:9;23889:18;23881:26;;23953:9;23947:4;23943:20;23939:1;23928:9;23924:17;23917:47;23981:131;24107:4;23981:131;:::i;:::-;23973:139;;23700:419;;;:::o;24125:::-;24291:4;24329:2;24318:9;24314:18;24306:26;;24378:9;24372:4;24368:20;24364:1;24353:9;24349:17;24342:47;24406:131;24532:4;24406:131;:::i;:::-;24398:139;;24125:419;;;:::o;24550:::-;24716:4;24754:2;24743:9;24739:18;24731:26;;24803:9;24797:4;24793:20;24789:1;24778:9;24774:17;24767:47;24831:131;24957:4;24831:131;:::i;:::-;24823:139;;24550:419;;;:::o;24975:::-;25141:4;25179:2;25168:9;25164:18;25156:26;;25228:9;25222:4;25218:20;25214:1;25203:9;25199:17;25192:47;25256:131;25382:4;25256:131;:::i;:::-;25248:139;;24975:419;;;:::o;25400:::-;25566:4;25604:2;25593:9;25589:18;25581:26;;25653:9;25647:4;25643:20;25639:1;25628:9;25624:17;25617:47;25681:131;25807:4;25681:131;:::i;:::-;25673:139;;25400:419;;;:::o;25825:::-;25991:4;26029:2;26018:9;26014:18;26006:26;;26078:9;26072:4;26068:20;26064:1;26053:9;26049:17;26042:47;26106:131;26232:4;26106:131;:::i;:::-;26098:139;;25825:419;;;:::o;26250:::-;26416:4;26454:2;26443:9;26439:18;26431:26;;26503:9;26497:4;26493:20;26489:1;26478:9;26474:17;26467:47;26531:131;26657:4;26531:131;:::i;:::-;26523:139;;26250:419;;;:::o;26675:::-;26841:4;26879:2;26868:9;26864:18;26856:26;;26928:9;26922:4;26918:20;26914:1;26903:9;26899:17;26892:47;26956:131;27082:4;26956:131;:::i;:::-;26948:139;;26675:419;;;:::o;27100:::-;27266:4;27304:2;27293:9;27289:18;27281:26;;27353:9;27347:4;27343:20;27339:1;27328:9;27324:17;27317:47;27381:131;27507:4;27381:131;:::i;:::-;27373:139;;27100:419;;;:::o;27525:::-;27691:4;27729:2;27718:9;27714:18;27706:26;;27778:9;27772:4;27768:20;27764:1;27753:9;27749:17;27742:47;27806:131;27932:4;27806:131;:::i;:::-;27798:139;;27525:419;;;:::o;27950:::-;28116:4;28154:2;28143:9;28139:18;28131:26;;28203:9;28197:4;28193:20;28189:1;28178:9;28174:17;28167:47;28231:131;28357:4;28231:131;:::i;:::-;28223:139;;27950:419;;;:::o;28375:::-;28541:4;28579:2;28568:9;28564:18;28556:26;;28628:9;28622:4;28618:20;28614:1;28603:9;28599:17;28592:47;28656:131;28782:4;28656:131;:::i;:::-;28648:139;;28375:419;;;:::o;28800:::-;28966:4;29004:2;28993:9;28989:18;28981:26;;29053:9;29047:4;29043:20;29039:1;29028:9;29024:17;29017:47;29081:131;29207:4;29081:131;:::i;:::-;29073:139;;28800:419;;;:::o;29225:::-;29391:4;29429:2;29418:9;29414:18;29406:26;;29478:9;29472:4;29468:20;29464:1;29453:9;29449:17;29442:47;29506:131;29632:4;29506:131;:::i;:::-;29498:139;;29225:419;;;:::o;29650:::-;29816:4;29854:2;29843:9;29839:18;29831:26;;29903:9;29897:4;29893:20;29889:1;29878:9;29874:17;29867:47;29931:131;30057:4;29931:131;:::i;:::-;29923:139;;29650:419;;;:::o;30075:222::-;30168:4;30206:2;30195:9;30191:18;30183:26;;30219:71;30287:1;30276:9;30272:17;30263:6;30219:71;:::i;:::-;30075:222;;;;:::o;30303:129::-;30337:6;30364:20;;:::i;:::-;30354:30;;30393:33;30421:4;30413:6;30393:33;:::i;:::-;30303:129;;;:::o;30438:75::-;30471:6;30504:2;30498:9;30488:19;;30438:75;:::o;30519:307::-;30580:4;30670:18;30662:6;30659:30;30656:56;;;30692:18;;:::i;:::-;30656:56;30730:29;30752:6;30730:29;:::i;:::-;30722:37;;30814:4;30808;30804:15;30796:23;;30519:307;;;:::o;30832:308::-;30894:4;30984:18;30976:6;30973:30;30970:56;;;31006:18;;:::i;:::-;30970:56;31044:29;31066:6;31044:29;:::i;:::-;31036:37;;31128:4;31122;31118:15;31110:23;;30832:308;;;:::o;31146:132::-;31213:4;31236:3;31228:11;;31266:4;31261:3;31257:14;31249:22;;31146:132;;;:::o;31284:141::-;31333:4;31356:3;31348:11;;31379:3;31376:1;31369:14;31413:4;31410:1;31400:18;31392:26;;31284:141;;;:::o;31431:114::-;31498:6;31532:5;31526:12;31516:22;;31431:114;;;:::o;31551:98::-;31602:6;31636:5;31630:12;31620:22;;31551:98;;;:::o;31655:99::-;31707:6;31741:5;31735:12;31725:22;;31655:99;;;:::o;31760:113::-;31830:4;31862;31857:3;31853:14;31845:22;;31760:113;;;:::o;31879:184::-;31978:11;32012:6;32007:3;32000:19;32052:4;32047:3;32043:14;32028:29;;31879:184;;;;:::o;32069:168::-;32152:11;32186:6;32181:3;32174:19;32226:4;32221:3;32217:14;32202:29;;32069:168;;;;:::o;32243:147::-;32344:11;32381:3;32366:18;;32243:147;;;;:::o;32396:169::-;32480:11;32514:6;32509:3;32502:19;32554:4;32549:3;32545:14;32530:29;;32396:169;;;;:::o;32571:148::-;32673:11;32710:3;32695:18;;32571:148;;;;:::o;32725:305::-;32765:3;32784:20;32802:1;32784:20;:::i;:::-;32779:25;;32818:20;32836:1;32818:20;:::i;:::-;32813:25;;32972:1;32904:66;32900:74;32897:1;32894:81;32891:107;;;32978:18;;:::i;:::-;32891:107;33022:1;33019;33015:9;33008:16;;32725:305;;;;:::o;33036:185::-;33076:1;33093:20;33111:1;33093:20;:::i;:::-;33088:25;;33127:20;33145:1;33127:20;:::i;:::-;33122:25;;33166:1;33156:35;;33171:18;;:::i;:::-;33156:35;33213:1;33210;33206:9;33201:14;;33036:185;;;;:::o;33227:348::-;33267:7;33290:20;33308:1;33290:20;:::i;:::-;33285:25;;33324:20;33342:1;33324:20;:::i;:::-;33319:25;;33512:1;33444:66;33440:74;33437:1;33434:81;33429:1;33422:9;33415:17;33411:105;33408:131;;;33519:18;;:::i;:::-;33408:131;33567:1;33564;33560:9;33549:20;;33227:348;;;;:::o;33581:191::-;33621:4;33641:20;33659:1;33641:20;:::i;:::-;33636:25;;33675:20;33693:1;33675:20;:::i;:::-;33670:25;;33714:1;33711;33708:8;33705:34;;;33719:18;;:::i;:::-;33705:34;33764:1;33761;33757:9;33749:17;;33581:191;;;;:::o;33778:96::-;33815:7;33844:24;33862:5;33844:24;:::i;:::-;33833:35;;33778:96;;;:::o;33880:90::-;33914:7;33957:5;33950:13;33943:21;33932:32;;33880:90;;;:::o;33976:149::-;34012:7;34052:66;34045:5;34041:78;34030:89;;33976:149;;;:::o;34131:126::-;34168:7;34208:42;34201:5;34197:54;34186:65;;34131:126;;;:::o;34263:77::-;34300:7;34329:5;34318:16;;34263:77;;;:::o;34346:154::-;34430:6;34425:3;34420;34407:30;34492:1;34483:6;34478:3;34474:16;34467:27;34346:154;;;:::o;34506:307::-;34574:1;34584:113;34598:6;34595:1;34592:13;34584:113;;;34683:1;34678:3;34674:11;34668:18;34664:1;34659:3;34655:11;34648:39;34620:2;34617:1;34613:10;34608:15;;34584:113;;;34715:6;34712:1;34709:13;34706:101;;;34795:1;34786:6;34781:3;34777:16;34770:27;34706:101;34555:258;34506:307;;;:::o;34819:320::-;34863:6;34900:1;34894:4;34890:12;34880:22;;34947:1;34941:4;34937:12;34968:18;34958:81;;35024:4;35016:6;35012:17;35002:27;;34958:81;35086:2;35078:6;35075:14;35055:18;35052:38;35049:84;;;35105:18;;:::i;:::-;35049:84;34870:269;34819:320;;;:::o;35145:281::-;35228:27;35250:4;35228:27;:::i;:::-;35220:6;35216:40;35358:6;35346:10;35343:22;35322:18;35310:10;35307:34;35304:62;35301:88;;;35369:18;;:::i;:::-;35301:88;35409:10;35405:2;35398:22;35188:238;35145:281;;:::o;35432:233::-;35471:3;35494:24;35512:5;35494:24;:::i;:::-;35485:33;;35540:66;35533:5;35530:77;35527:103;;;35610:18;;:::i;:::-;35527:103;35657:1;35650:5;35646:13;35639:20;;35432:233;;;:::o;35671:176::-;35703:1;35720:20;35738:1;35720:20;:::i;:::-;35715:25;;35754:20;35772:1;35754:20;:::i;:::-;35749:25;;35793:1;35783:35;;35798:18;;:::i;:::-;35783:35;35839:1;35836;35832:9;35827:14;;35671:176;;;;:::o;35853:180::-;35901:77;35898:1;35891:88;35998:4;35995:1;35988:15;36022:4;36019:1;36012:15;36039:180;36087:77;36084:1;36077:88;36184:4;36181:1;36174:15;36208:4;36205:1;36198:15;36225:180;36273:77;36270:1;36263:88;36370:4;36367:1;36360:15;36394:4;36391:1;36384:15;36411:180;36459:77;36456:1;36449:88;36556:4;36553:1;36546:15;36580:4;36577:1;36570:15;36597:180;36645:77;36642:1;36635:88;36742:4;36739:1;36732:15;36766:4;36763:1;36756:15;36783:117;36892:1;36889;36882:12;36906:117;37015:1;37012;37005:12;37029:117;37138:1;37135;37128:12;37152:117;37261:1;37258;37251:12;37275:102;37316:6;37367:2;37363:7;37358:2;37351:5;37347:14;37343:28;37333:38;;37275:102;;;:::o;37383:161::-;37523:13;37519:1;37511:6;37507:14;37500:37;37383:161;:::o;37550:225::-;37690:34;37686:1;37678:6;37674:14;37667:58;37759:8;37754:2;37746:6;37742:15;37735:33;37550:225;:::o;37781:165::-;37921:17;37917:1;37909:6;37905:14;37898:41;37781:165;:::o;37952:169::-;38092:21;38088:1;38080:6;38076:14;38069:45;37952:169;:::o;38127:::-;38267:21;38263:1;38255:6;38251:14;38244:45;38127:169;:::o;38302:182::-;38442:34;38438:1;38430:6;38426:14;38419:58;38302:182;:::o;38490:168::-;38630:20;38626:1;38618:6;38614:14;38607:44;38490:168;:::o;38664:155::-;38804:7;38800:1;38792:6;38788:14;38781:31;38664:155;:::o;38825:182::-;38965:34;38961:1;38953:6;38949:14;38942:58;38825:182;:::o;39013:169::-;39153:21;39149:1;39141:6;39137:14;39130:45;39013:169;:::o;39188:234::-;39328:34;39324:1;39316:6;39312:14;39305:58;39397:17;39392:2;39384:6;39380:15;39373:42;39188:234;:::o;39428:168::-;39568:20;39564:1;39556:6;39552:14;39545:44;39428:168;:::o;39602:169::-;39742:21;39738:1;39730:6;39726:14;39719:45;39602:169;:::o;39777:170::-;39917:22;39913:1;39905:6;39901:14;39894:46;39777:170;:::o;39953:167::-;40093:19;40089:1;40081:6;40077:14;40070:43;39953:167;:::o;40126:114::-;;:::o;40246:169::-;40386:21;40382:1;40374:6;40370:14;40363:45;40246:169;:::o;40421:168::-;40561:20;40557:1;40549:6;40545:14;40538:44;40421:168;:::o;40595:172::-;40735:24;40731:1;40723:6;40719:14;40712:48;40595:172;:::o;40773:171::-;40913:23;40909:1;40901:6;40897:14;40890:47;40773:171;:::o;40950:122::-;41023:24;41041:5;41023:24;:::i;:::-;41016:5;41013:35;41003:63;;41062:1;41059;41052:12;41003:63;40950:122;:::o;41078:116::-;41148:21;41163:5;41148:21;:::i;:::-;41141:5;41138:32;41128:60;;41184:1;41181;41174:12;41128:60;41078:116;:::o;41200:120::-;41272:23;41289:5;41272:23;:::i;:::-;41265:5;41262:34;41252:62;;41310:1;41307;41300:12;41252:62;41200:120;:::o;41326:122::-;41399:24;41417:5;41399:24;:::i;:::-;41392:5;41389:35;41379:63;;41438:1;41435;41428:12;41379:63;41326:122;:::o
Swarm Source
ipfs://aa3d752f3cecd80e663e278bc9a6ca80a3ce0f4234b7f01fabab57150b2cc56c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.