ETH Price: $3,404.24 (+1.03%)

Token

The SolaVerse: Companions (Companion)
 

Overview

Max Total Supply

3,183 Companion

Holders

830

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Companion
0x67925a821a05d5c876efc0ec06c21734348a59a5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Companions are The SolaVerse PFP Collectibles collection. Each Companion NFT comes with multiple exclusive benefits.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Companions

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 8888 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

// SPDX-License-Identifier: MIT

// ................................................................................
//       ..........................................................................
//         ............8888........................................................
//           ..........8::8............888888888888................................
//               .......888.........88D~~~~~~~~~~~~88..............................
//                 ......88........8~~~~~~~~~~~~~~~~~DD............................
// ......................888...~8:~8~~~~~~~~~~~~~~~~~~~~8..........................
// ........................8...888D~~~~~~~~~~~~~~~~~~~~~8..........................
// ........................8.8D~~~~~~~~~~~~~~~~~~~~~~~~~~88........................
// ........................88~~~~~~~~~~~~~~~~~~~~~~~~~~~~88........................
// ........................:8~~~~~~~~~~~~~888888N~~~~~~~~88........................
// ........................8~~~~~~~~..:8888D..:8888D8~:~~8D........................
// ........................8~~~~~~~88................888~~~8.......................
// ........................8~~~~~888..................:8~~~8.......................
// ........................8~~~~~88....:88........88..:88~~8.......................
// ................    ...:8~~~~88D....8  8......8  8..:8~~8.......................
// ............:.         .8~~~~8......8  8......8  8..:8~~8.......................
// ............           .8~~~~888....8  8......8  8..:8~~8.......................
// ............           .8~~~~~88....:88~......:88..:88~~8.......................
// ............           .8~~~~~888................:888~~~8.......................
// ........               .8~~~~~~~88..............:88:~~~~8.......................
// ........               .8~~~~~~~~8888888......8888~~~~~~8.......................
// ........:...............8~~~~~~~~~~~8~DDDDDDDDD~~~~~~~~~8.......................
// ........................8~~~~~~~~~~~8~~~~~~~~~~~~~~~~~~~8.......................
// .........................8~~~~~~~~~~8~~~:D8DDDDDD~~~~~88........................
// .........................8888~~~~~~~~8~~~~D8..8D~~~~~888........................
// .........................8===D8D~~~~~8~~~~~~88~~~~~~88..........................
// .........................8==D===888D~8~~~~~~~~~~8888=8..........................
// .........................8==D=======++88++++++++=====8..........................
// ........................88==D=========88=============8..........................
// ......................88==88D=========88============8=88........................
// .....................8=====+8888=====8==========8888====8.......................
// ....................D====888====8888888888888888========88......................
// ..................88===+D8=========+88======++++++88O++==8......................
// .................8?===88==========88=888888888++++++=8====88D...................
// .................8===888=========8===8================88===+8...................
// .................8===8===========8===888========8..8==88===+8...................
// ................8==+88==========8=====88========8..88=88=====8..................
// ................8==+D===========D=====88========88..8=888====8..................
// ................8==+D=========88======88=========+8.8==+8====8..................
// ................8=88=========888======88===============+8====D88................
// ................8=88=========8===88888D8===============+8=====88................
// ................8=88=========8888D8D=D=8===============+8=====88................
// ................8=88=========8=+DDD====================+8=====88................
// ................8=88========8888=======================+8=====88................
// ................8=88========88=========================+8=====88................

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
	/**
	 * @dev Returns true if this contract implements the interface defined by
	 * `interfaceId`. See the corresponding
	 * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
	 * to learn more about how these ids are created.
	 *
	 * This function call must use less than 30 000 gas.
	 */
	function supportsInterface(bytes4 interfaceId) external view returns (bool);
}





/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
	/**
	 * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
	 */
	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

	/**
	 * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
	 */
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

	/**
	 * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
	 */
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	/**
	 * @dev Returns the number of tokens in ``owner``'s account.
	 */
	function balanceOf(address owner) external view returns (uint256 balance);

	/**
	 * @dev Returns the owner of the `tokenId` token.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function ownerOf(uint256 tokenId) external view returns (address owner);

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId
	) 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 Returns the account approved for `tokenId` token.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function getApproved(uint256 tokenId) external view returns (address operator);

	/**
	 * @dev Approve or remove `operator` as an operator for the caller.
	 * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
	 *
	 * Requirements:
	 *
	 * - The `operator` cannot be the caller.
	 *
	 * Emits an {ApprovalForAll} event.
	 */
	function setApprovalForAll(address operator, bool _approved) external;

	/**
	 * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
	 *
	 * See {setApprovalForAll}
	 */
	function isApprovedForAll(address owner, address operator) external view returns (bool);

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`.
	 *
	 * Requirements:
	 *
	 * - `from` 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;
}





/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
	/**
	 * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
	 * by `operator` from `from`, this function is called.
	 *
	 * It must return its Solidity selector to confirm the token transfer.
	 * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
	 *
	 * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
	 */
	function onERC721Received(
		address operator,
		address from,
		uint256 tokenId,
		bytes calldata data
	) external returns (bytes4);
}





/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
	/**
	 * @dev Returns the token collection name.
	 */
	function name() external view returns (string memory);

	/**
	 * @dev Returns the token collection symbol.
	 */
	function symbol() external view returns (string memory);

	/**
	 * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
	 */
	function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Address.sol




/**
 * @dev Collection of functions related to the address type
 */
library Address {
	/**
	 * @dev Returns true if `account` is a contract.
	 *
	 * [IMPORTANT]
	 * ====
	 * It is unsafe to assume that an address for which this function returns
	 * false is an externally-owned account (EOA) and not a contract.
	 *
	 * Among others, `isContract` will return false for the following
	 * types of addresses:
	 *
	 *  - an externally-owned account
	 *  - a contract in construction
	 *  - an address where a contract will be created
	 *  - an address where a contract lived, but was destroyed
	 * ====
	 *
	 * [IMPORTANT]
	 * ====
	 * You shouldn't rely on `isContract` to protect against flash loan attacks!
	 *
	 * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
	 * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
	 * constructor.
	 * ====
	 */
	function isContract(address account) internal view returns (bool) {
		// This method relies on extcodesize/address.code.length, which returns 0
		// for contracts in construction, since the code is only stored at the end
		// of the constructor execution.

		return account.code.length > 0;
	}

	/**
	 * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
	 * `recipient`, forwarding all available gas and reverting on errors.
	 *
	 * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
	 * of certain opcodes, possibly making contracts go over the 2300 gas limit
	 * imposed by `transfer`, making them unable to receive funds via
	 * `transfer`. {sendValue} removes this limitation.
	 *
	 * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
	 *
	 * IMPORTANT: because control is transferred to `recipient`, care must be
	 * taken to not create reentrancy vulnerabilities. Consider using
	 * {ReentrancyGuard} or the
	 * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
	 */
	function sendValue(address payable recipient, uint256 amount) internal {
		require(address(this).balance >= amount, "Address: insufficient balance");

		(bool success, ) = recipient.call{value: amount}("");
		require(success, "Address: unable to send value, recipient may have reverted");
	}

	/**
	 * @dev Performs a Solidity function call using a low level `call`. A
	 * plain `call` is an unsafe replacement for a function call: use this
	 * function instead.
	 *
	 * If `target` reverts with a revert reason, it is bubbled up by this
	 * function (like regular Solidity function calls).
	 *
	 * Returns the raw returned data. To convert to the expected return value,
	 * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
	 *
	 * Requirements:
	 *
	 * - `target` must be a contract.
	 * - calling `target` with `data` must not revert.
	 *
	 * _Available since v3.1._
	 */
	function functionCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionCall(target, data, "Address: low-level call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
	 * `errorMessage` as a fallback revert reason when `target` reverts.
	 *
	 * _Available since v3.1._
	 */
	function functionCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but also transferring `value` wei to `target`.
	 *
	 * Requirements:
	 *
	 * - the calling contract must have an ETH balance of at least `value`.
	 * - the called Solidity function must be `payable`.
	 *
	 * _Available since v3.1._
	 */
	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
	 * with `errorMessage` as a fallback revert reason when `target` reverts.
	 *
	 * _Available since v3.1._
	 */
	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(address(this).balance >= value, "Address: insufficient balance for call");
		require(isContract(target), "Address: call to non-contract");

		(bool success, bytes memory returndata) = target.call{value: value}(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but performing a static call.
	 *
	 * _Available since v3.3._
	 */
	function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
		return functionStaticCall(target, data, "Address: low-level static call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
	 * but performing a static call.
	 *
	 * _Available since v3.3._
	 */
	function functionStaticCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal view returns (bytes memory) {
		require(isContract(target), "Address: static call to non-contract");

		(bool success, bytes memory returndata) = target.staticcall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but performing a delegate call.
	 *
	 * _Available since v3.4._
	 */
	function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionDelegateCall(target, data, "Address: low-level delegate call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
	 * but performing a delegate call.
	 *
	 * _Available since v3.4._
	 */
	function functionDelegateCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(isContract(target), "Address: delegate call to non-contract");

		(bool success, bytes memory returndata) = target.delegatecall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
	 * revert reason using the provided one.
	 *
	 * _Available since v4.3._
	 */
	function verifyCallResult(
		bool success,
		bytes memory returndata,
		string memory errorMessage
	) internal pure returns (bytes memory) {
		if (success) {
			return returndata;
		} else {
			// Look for revert reason and bubble it up if present
			if (returndata.length > 0) {
				// The easiest way to bubble the revert reason is using memory via assembly

				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}





/**
 * @dev 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;
	}
}





/**
 * @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);
	}
}





/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
		return interfaceId == type(IERC165).interfaceId;
	}
}





/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721A] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
	using Address for address;
	using Strings for uint256;


	uint256 private currentIndex = 0;
	uint256 public maxBatchSize = 35;

	// Token name
	string private _name;

	// Token symbol
	string private _symbol;

	// Mapping from token ID to owner address
	mapping(uint256 => address) private _owners;

	// Mapping owner address to token count
	mapping(address => uint256) private _balances;

	// 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;

	/**
	 * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
	 */
	constructor(string memory name_, string memory symbol_) {
		_name = name_;
		_symbol = symbol_;
	}

	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
		return
			interfaceId == type(IERC721).interfaceId ||
			interfaceId == type(IERC721Metadata).interfaceId ||
			super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721-balanceOf}.
	 */
	function balanceOf(address owner) public view virtual override returns (uint256) {
		require(owner != address(0), "ERC721A: balance query for the zero address");
		return _balances[owner];
	}

	function ownerOf(uint256 tokenId) public view virtual override returns (address) {
		require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

		uint256 lowestTokenToCheck;
		if (tokenId >= maxBatchSize) {
			lowestTokenToCheck = tokenId - maxBatchSize + 1;
		}

		for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
			address owner = _owners[curr];
			if (owner != address(0)) {
				return owner;
			}
		}

		revert("ERC721A: unable to determine the owner of token");
	}

	/**
	 * @dev See {IERC721-ownerOf}.
	 */
	// function ownerOf(uint256 tokenId) public view virtual override returns (address) {
	//     return ownershipOf(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) {
		require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

		string memory baseURI = _baseURI();
		return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
	}

	/**
	 * @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, can be overriden in child contracts.
	 */
	function _baseURI() internal view virtual returns (string memory) {
		return "";
	}

	/**
	 * @dev See {IERC721-approve}.
	 */
	function approve(address to, uint256 tokenId) public virtual override {
		address owner = ERC721A.ownerOf(tokenId);
		require(to != owner, "ERC721A: approval to current owner");

		require(
			_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
			"ERC721A: approve caller is not owner nor approved for all"
		);

		_approve(to, tokenId);
	}

	/**
	 * @dev See {IERC721-getApproved}.
	 */
	function getApproved(uint256 tokenId) public view virtual override returns (address) {
		require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

		return _tokenApprovals[tokenId];
	}

	/**
	 * @dev See {IERC721-setApprovalForAll}.
	 */
	function setApprovalForAll(address operator, bool approved) public virtual override {
		_setApprovalForAll(_msgSender(), 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-transferFrom}.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		//solhint-disable-next-line max-line-length
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721A: transfer caller is not owner nor approved");

		_transfer(from, to, tokenId);
	}

	/**
	 * @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 {
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721A: transfer caller is not owner nor approved");
		_safeTransfer(from, to, tokenId, _data);
	}

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721A protocol to prevent tokens from being forever locked.
	 *
	 * `_data` is additional data, it has no specified format and it is sent in call to `to`.
	 *
	 * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
	 * implement alternative mechanisms to perform token transfer, such as signature-based.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeTransfer(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_transfer(from, to, tokenId);
		require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer");
	}

	/**
	 * @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`),
	 * and stop existing when they are burned (`_burn`).
	 */
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
		return tokenId < currentIndex;
	}

	/**
	 * @dev Returns whether `spender` is allowed to manage `tokenId`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
		require(_exists(tokenId), "ERC721A: operator query for nonexistent token");
		address owner = ERC721A.ownerOf(tokenId);
		return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
	}

	/**
	 * @dev Safely mints `tokenId` and transfers it to `to`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeMint(address to, uint256 quantity) internal virtual {
		_safeMint(to, quantity, "");
	}

	/**
	 * @dev Same as {xref-ERC721A-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
	 * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
	 */
	function _safeMint(
		address to,
		uint256 quantity,
		bytes memory _data
	) internal virtual {
		uint256 startTokenId = currentIndex;
		require(to != address(0), "ERC721A: mint to the zero address");
		require(!_exists(startTokenId), "ERC721A: token already minted");

		_beforeTokenTransfers(address(0), to, startTokenId, quantity);

		_balances[to] += quantity;
		_owners[startTokenId] =to;

		uint256 updatedIndex = startTokenId;

		for (uint256 i = 0; i < quantity; i++) {
			emit Transfer(address(0), to, updatedIndex);
			require(
				_checkOnERC721Received(address(0), to, updatedIndex, _data),
				"ERC721A: transfer to non ERC721Receiver implementer"
			);
			updatedIndex++;
		}

		currentIndex = updatedIndex;

		_afterTokenTransfers(address(0), to, startTokenId, quantity);
	}

	/**
	 * @dev Destroys `tokenId`.
	 * The approval is cleared when the token is burned.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 *
	 * Emits a {Transfer} event.
	 */
	function _burn(uint256 tokenId) internal virtual {
		address owner = ERC721A.ownerOf(tokenId);

		_beforeTokenTransfer(owner, address(0), tokenId);

		// Clear approvals
		_approve(address(0), tokenId);

		_balances[owner] -= 1;
		delete _owners[tokenId];

		emit Transfer(owner, address(0), tokenId);

		_afterTokenTransfer(owner, address(0), tokenId);
	}

	/**
	 * @dev Transfers `tokenId` from `from` to `to`.
	 *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
	 *
	 * Requirements:
	 *
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must be owned by `from`.
	 *
	 * Emits a {Transfer} event.
	 */
	function _transfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {
		require(ERC721A.ownerOf(tokenId) == from, "ERC721A: transfer from incorrect owner");
		require(to != address(0), "ERC721A: transfer to the zero address");

		_beforeTokenTransfer(from, to, tokenId);

		// Clear approvals from the previous owner
		_approve(address(0), tokenId);

		_balances[from] -= 1;
		_balances[to] += 1;
		_owners[tokenId] = to;
		if(_owners[tokenId+1] == address(0))
			_owners[tokenId+1] = from;

		emit Transfer(from, to, tokenId);

		_afterTokenTransfer(from, to, tokenId);
	}

	/**
	 * @dev Approve `to` to operate on `tokenId`
	 *
	 * Emits a {Approval} event.
	 */
	function _approve(address to, uint256 tokenId) internal virtual {
		_tokenApprovals[tokenId] = to;
		emit Approval(ERC721A.ownerOf(tokenId), to, tokenId);
	}

	/**
	 * @dev Approve `operator` to operate on all of `owner` tokens
	 *
	 * Emits a {ApprovalForAll} event.
	 */
	function _setApprovalForAll(
		address owner,
		address operator,
		bool approved
	) internal virtual {
		require(owner != operator, "ERC721A: approve to caller");
		_operatorApprovals[owner][operator] = approved;
		emit ApprovalForAll(owner, operator, approved);
	}

	/**
	 * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
	 * The call is not executed if the target address is not a contract.
	 *
	 * @param from address representing the previous owner of the given token ID
	 * @param to target address that will receive the tokens
	 * @param tokenId uint256 ID of the token to be transferred
	 * @param _data bytes optional data to send along with the call
	 * @return bool whether the call correctly returned the expected magic value
	 */
	function _checkOnERC721Received(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) private returns (bool) {
		if (to.isContract()) {
			try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
				return retval == IERC721Receiver.onERC721Received.selector;
			} catch (bytes memory reason) {
				if (reason.length == 0) {
					revert("ERC721A: transfer to non ERC721Receiver implementer");
				} else {
					assembly {
						revert(add(32, reason), mload(reason))
					}
				}
			}
		} else {
			return true;
		}
	}

	function getTotalSupply() public view returns(uint256) {
		return currentIndex;
	}
	/**
	 * @dev Hook that is called before any token transfer. This includes minting
	 * and burning.
	 *
	 * Calling conditions:
	 *
	 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
	 * transferred to `to`.
	 * - When `from` is zero, `tokenId` will be minted for `to`.
	 * - When `to` is zero, ``from``'s `tokenId` will be burned.
	 * - `from` and `to` are never both zero.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {}

	/**
	 * @dev Hook that is called after any transfer of tokens. This includes
	 * minting and burning.
	 *
	 * Calling conditions:
	 *
	 * - when `from` and `to` are both non-zero.
	 * - `from` and `to` are never both zero.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _afterTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {}

	function _beforeTokenTransfers(
		address from,
		address to,
		uint256 startTokenId,
		uint256 quantity
	) internal virtual {}

	function _afterTokenTransfers(
		address from,
		address to,
		uint256 startTokenId,
		uint256 quantity
	) internal virtual {}
}





/**
 * @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);
	}
}





/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
	/**
	 * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
	 * defined by `root`. For this, a `proof` must be provided, containing
	 * sibling hashes on the branch from the leaf to the root of the tree. Each
	 * pair of leaves and each pair of pre-images are assumed to be sorted.
	 */
	function verify(
		bytes32[] memory proof,
		bytes32 root,
		bytes32 leaf
	) internal pure returns (bool) {
		return processProof(proof, leaf) == root;
	}

	/**
	 * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
	 * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
	 * hash matches the root of the tree. When processing the proof, the pairs
	 * of leafs & pre-images are assumed to be sorted.
	 *
	 * _Available since v4.4._
	 */
	function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
		bytes32 computedHash = leaf;
		for (uint256 i = 0; i < proof.length; i++) {
			bytes32 proofElement = proof[i];
			if (computedHash <= proofElement) {
				// Hash(current computed hash + current element of the proof)
				computedHash = _efficientHash(computedHash, proofElement);
			} else {
				// Hash(current element of the proof + current computed hash)
				computedHash = _efficientHash(proofElement, computedHash);
			}
		}
		return computedHash;
	}

	function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
		assembly {
			mstore(0x00, a)
			mstore(0x20, b)
			value := keccak256(0x00, 0x40)
		}
	}
}





/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
	/**
	 * @dev Returns the addition of two unsigned integers, with an overflow flag.
	 *
	 * _Available since v3.4._
	 */
	function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		unchecked {
			uint256 c = a + b;
			if (c < a) return (false, 0);
			return (true, c);
		}
	}

	/**
	 * @dev Returns the substraction of two unsigned integers, with an overflow flag.
	 *
	 * _Available since v3.4._
	 */
	function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		unchecked {
			if (b > a) return (false, 0);
			return (true, a - b);
		}
	}

	/**
	 * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
	 *
	 * _Available since v3.4._
	 */
	function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		unchecked {
			// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
			// benefit is lost if 'b' is also tested.
			// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
			if (a == 0) return (true, 0);
			uint256 c = a * b;
			if (c / a != b) return (false, 0);
			return (true, c);
		}
	}

	/**
	 * @dev Returns the division of two unsigned integers, with a division by zero flag.
	 *
	 * _Available since v3.4._
	 */
	function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		unchecked {
			if (b == 0) return (false, 0);
			return (true, a / b);
		}
	}

	/**
	 * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
	 *
	 * _Available since v3.4._
	 */
	function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		unchecked {
			if (b == 0) return (false, 0);
			return (true, a % b);
		}
	}

	/**
	 * @dev Returns the addition of two unsigned integers, reverting on
	 * overflow.
	 *
	 * Counterpart to Solidity's `+` operator.
	 *
	 * Requirements:
	 *
	 * - Addition cannot overflow.
	 */
	function add(uint256 a, uint256 b) internal pure returns (uint256) {
		return a + b;
	}

	/**
	 * @dev Returns the subtraction of two unsigned integers, reverting on
	 * overflow (when the result is negative).
	 *
	 * Counterpart to Solidity's `-` operator.
	 *
	 * Requirements:
	 *
	 * - Subtraction cannot overflow.
	 */
	function sub(uint256 a, uint256 b) internal pure returns (uint256) {
		return a - b;
	}

	/**
	 * @dev Returns the multiplication of two unsigned integers, reverting on
	 * overflow.
	 *
	 * Counterpart to Solidity's `*` operator.
	 *
	 * Requirements:
	 *
	 * - Multiplication cannot overflow.
	 */
	function mul(uint256 a, uint256 b) internal pure returns (uint256) {
		return a * b;
	}

	/**
	 * @dev Returns the integer division of two unsigned integers, reverting on
	 * division by zero. The result is rounded towards zero.
	 *
	 * Counterpart to Solidity's `/` operator.
	 *
	 * Requirements:
	 *
	 * - The divisor cannot be zero.
	 */
	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		return a / b;
	}

	/**
	 * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
	 * reverting when dividing by zero.
	 *
	 * Counterpart to Solidity's `%` operator. This function uses a `revert`
	 * opcode (which leaves remaining gas untouched) while Solidity uses an
	 * invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 *
	 * - The divisor cannot be zero.
	 */
	function mod(uint256 a, uint256 b) internal pure returns (uint256) {
		return a % b;
	}

	/**
	 * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
	 * overflow (when the result is negative).
	 *
	 * CAUTION: This function is deprecated because it requires allocating memory for the error
	 * message unnecessarily. For custom revert reasons use {trySub}.
	 *
	 * Counterpart to Solidity's `-` operator.
	 *
	 * Requirements:
	 *
	 * - Subtraction cannot overflow.
	 */
	function sub(
		uint256 a,
		uint256 b,
		string memory errorMessage
	) internal pure returns (uint256) {
		unchecked {
			require(b <= a, errorMessage);
			return a - b;
		}
	}

	/**
	 * @dev Returns the integer division of two unsigned integers, reverting with custom message on
	 * division by zero. The result is rounded towards zero.
	 *
	 * Counterpart to Solidity's `/` operator. Note: this function uses a
	 * `revert` opcode (which leaves remaining gas untouched) while Solidity
	 * uses an invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 *
	 * - The divisor cannot be zero.
	 */
	function div(
		uint256 a,
		uint256 b,
		string memory errorMessage
	) internal pure returns (uint256) {
		unchecked {
			require(b > 0, errorMessage);
			return a / b;
		}
	}

	/**
	 * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
	 * reverting with custom message when dividing by zero.
	 *
	 * CAUTION: This function is deprecated because it requires allocating memory for the error
	 * message unnecessarily. For custom revert reasons use {tryMod}.
	 *
	 * Counterpart to Solidity's `%` operator. This function uses a `revert`
	 * opcode (which leaves remaining gas untouched) while Solidity uses an
	 * invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 *
	 * - The divisor cannot be zero.
	 */
	function mod(
		uint256 a,
		uint256 b,
		string memory errorMessage
	) internal pure returns (uint256) {
		unchecked {
			require(b > 0, errorMessage);
			return a % b;
		}
	}
}





contract Companions is ERC721A, Ownable
{
	using SafeMath for uint256;

	IERC721 starContract;

	string public baseURI;
	string public provenanceHash;

	uint256 public maxSupply = 10000;
	uint256 public maxBatchAmount = 400;

	uint256 public holderMintedAmount;
	uint256 public adminMintedAmount;
	uint256 public whitelistMintedAmount;
	uint256 public publicMintedAmount;

	uint256 public whitelistMintPrice = 0.042 ether;
	uint256 public publicMintPrice;
	uint256 public publicMaxPerTransaction = 10;
	uint256 public startingIndexBlock;
	uint256 public startingIndex;

	bool public holderMintActive = false;
	bool public whitelistMintActive = false;
	bool public publicMintActive = false;

	mapping(uint256 => bool) public usedStarIds;
	mapping(uint256 => uint256) public matchStarComp;
	mapping(address => bool) public mintedWhitelist;

	bytes32 private whitelistRoot;
	bytes32 private tieredWhitelistRoot;


	/**
	* @dev TheSolaVerse: Companions
	*/
	constructor() ERC721A("The SolaVerse: Companions", "Companion") {}


	/**
	* @dev Calculate the total amount minted so far.
	*/
	function totalSupply() public view returns (uint256)
	{
		return holderMintedAmount.add(adminMintedAmount).add(whitelistMintedAmount).add(publicMintedAmount);
	}


	/**
	* @dev SOLA-STAR holder wallets.
	*/
	function holderMint(uint256[] memory _ids) public
	{
		require(holderMintActive, "Holder mint is paused.");
		require(_ids.length <= maxBatchAmount, "Can't mint that many.");

		for (uint256 i=0; i<_ids.length; i++)
		{
			require(starContract.ownerOf(_ids[i]) == msg.sender, "You don't own this one.");
			require(!usedStarIds[_ids[i]], "This one was already used for minting.");
		}

		_safeMint(msg.sender, _ids.length);

		for (uint256 i=0; i<_ids.length; i++)
		{
			usedStarIds[_ids[i]] = true;
			matchStarComp[_ids[i]] = holderMintedAmount + i;
		}

		holderMintedAmount += _ids.length;
	}


	/**
	* @dev Whitelisted wallets.
	*/
	function whitelistMint(bytes32[] memory _proof, uint256 _num_tokens) public payable
	{
		require(whitelistMintActive, "Whitelist mint is paused.");
		require(mintedWhitelist[msg.sender] == false, "Already minted.");
		require(msg.value == _num_tokens.mul(whitelistMintPrice), "Insufficient funds.");

		bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
		require(MerkleProof.verify(_proof, whitelistRoot, leaf), "Invalid proof.");

		_safeMint(msg.sender, _num_tokens);

		whitelistMintedAmount += _num_tokens;
		mintedWhitelist[msg.sender] = true;
	}


	/**
	* @dev Whitelisted wallets with Tiers.
	*/
	function tieredWhitelistMint(bytes32[] memory _proof, uint256 _num_tokens) public payable
	{
		require(whitelistMintActive, "Whitelist mint is paused.");
		require(mintedWhitelist[msg.sender] == false, "Already minted.");
		require(msg.value == _num_tokens.mul(whitelistMintPrice), "Insufficient funds.");

		bytes32 leaf = keccak256(abi.encodePacked(msg.sender, _num_tokens));
		require(MerkleProof.verify(_proof, tieredWhitelistRoot, leaf), "Invalid proof.");

		_safeMint(msg.sender, _num_tokens);

		whitelistMintedAmount += _num_tokens;
		mintedWhitelist[msg.sender] = true;
	}


	/**
	* @dev Public mint.
	*/
	function publicMint(uint256 _num_tokens) public payable
	{
		require(publicMintActive, "Public mint is paused.");
		require(publicMintPrice > 0, "Public mint price not set.");
		require(msg.value == publicMintPrice.mul(_num_tokens), "Insufficient funds.");
		require(_num_tokens <= publicMaxPerTransaction, "Can't mint that many at once.");
		require(totalSupply().add(_num_tokens) <= maxSupply, "Can't mint that many.");

		_safeMint(msg.sender, _num_tokens);

		publicMintedAmount += _num_tokens;

		if (startingIndexBlock == 0 && (totalSupply() == maxSupply))
		{
			startingIndexBlock = block.number;
		}
	}


	/**
	* @dev Admin mint.
	*/
	function adminMint(address _to, uint256 _num_tokens) public onlyOwner
	{
		require(_num_tokens <= maxBatchAmount, "Can't mint that many.");

		_safeMint(_to, _num_tokens);

		adminMintedAmount += _num_tokens;
	}


	/**
	* @dev Link to the SOLA-STAR NFT contract to check ownership during holderMint.
	*/
	function setStarContract(address _addr) public onlyOwner
	{
		starContract = IERC721(_addr);
	}


	/**
	* @dev Set the Merkle Root for the Whitelist.
	*/
	function setWhitelistMerkleRoot(bytes32 _root) public onlyOwner
	{
		whitelistRoot = _root;
	}


	/**
	* @dev Set the Merkle Root for the Tiered Whitelist.
	*/
	function setTieredWhitelistMerkleRoot(bytes32 _root) public onlyOwner
	{
		tieredWhitelistRoot = _root;
	}


	/**
	* @dev Toggle the Holder Mint status.
	*/
	function toggleHolderMint() public onlyOwner
	{
		holderMintActive = !holderMintActive;
	}


	/**
	* @dev Toggle the Whitelist Mint status.
	*/
	function toggleWhitelistMint() public onlyOwner
	{
		whitelistMintActive = !whitelistMintActive;
	}


	/**
	* @dev Toggle the Public Mint status.
	*/
	function togglepublicMint() public onlyOwner
	{
		publicMintActive = !publicMintActive;
	}


	/**
	* @dev Set the cost of the tokens for the public mint.
	*/
	function setPublicMintPrice(uint256 _price) public onlyOwner
	{
		publicMintPrice = _price;
	}


	/**
	* @dev Update the BaseURI for the reveals.
	*/
	function setBaseURI(string memory _newBaseURI) public onlyOwner
	{
		baseURI = _newBaseURI;
	}


	/**
	* @dev Get the Base URI.
	*/
	function _baseURI() internal view virtual override returns (string memory)
	{
		return baseURI;
	}


	/**
	 * @dev Finalize starting index.
	 */
	function finalizeStartingIndex() public onlyOwner
	{
		require(startingIndex == 0, "Starting index already set.");
		require(startingIndexBlock != 0, "Starting index block not set.");

		startingIndex = uint256(blockhash(startingIndexBlock)) % maxSupply;

		if (block.number.sub(startingIndexBlock) > 255)
		{
			startingIndex = uint256(blockhash(block.number.sub(1))) % maxSupply;
		}

		if (startingIndex == 0)
		{
			startingIndex = startingIndex.add(1);
		}
	}


	/**
	 * @dev Set the starting index block for the collection, essentially unblocking setting starting index.
	 */
	function emergencySetStartingIndexBlock() public onlyOwner
	{
		require(startingIndex == 0, "Starting index already set.");

		startingIndexBlock = block.number;
	}


	/**
	 * @dev Set provenance once it's calculated.
	 *
	 * @param _provenance_hash string memory
	 */
	function setProvenanceHash(string memory _provenance_hash) public onlyOwner
	{
		provenanceHash = _provenance_hash;
	}


	/**
	* @dev Withdraw the balance from the contract.
	*/
	function withdraw() public onlyOwner
	{
		uint256 balance = address(this).balance;
		require(balance > 0, "Balance is 0");
		payable(msg.sender).transfer(balance);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_num_tokens","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminMintedAmount","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"holderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"holderMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"uint256"}],"name":"matchStarComp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num_tokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setStarContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setTieredWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_num_tokens","type":"uint256"}],"name":"tieredWhitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleHolderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglepublicMint","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"","type":"uint256"}],"name":"usedStarIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_num_tokens","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600080556023600155612710600c55610190600d55669536c708910000601255600a6014556017805462ffffff191690553480156200004257600080fd5b50604080518082018252601981527f54686520536f6c6156657273653a20436f6d70616e696f6e730000000000000060208083019182528351808501909452600984526821b7b6b830b734b7b760b91b908401528151919291620000a99160029162000138565b508051620000bf90600390602084019062000138565b505050620000dc620000d6620000e260201b60201c565b620000e6565b6200021b565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014690620001de565b90600052602060002090601f0160209004810192826200016a5760008555620001b5565b82601f106200018557805160ff1916838001178555620001b5565b82800160010185558215620001b5579182015b82811115620001b557825182559160200191906001019062000198565b50620001c3929150620001c7565b5090565b5b80821115620001c35760008155600101620001c8565b600281046001821680620001f357607f821691505b602082108114156200021557634e487b7160e01b600052602260045260246000fd5b50919050565b6135bd806200022b6000396000f3fe6080604052600436106103605760003560e01c80637a3cbc0f116101c6578063c4e41b22116100f7578063e36d649811610095578063e985e9c51161006f578063e985e9c5146108a9578063f186d77e146108c9578063f2fde38b146108e9578063fa0770df1461090957610360565b8063e36d649814610854578063e4da3f2814610869578063e58306f91461088957610360565b8063cb774d47116100d1578063cb774d4714610800578063d06a624214610815578063d5abeb011461082a578063dc53fd921461083f57610360565b8063c4e41b22146107b6578063c6ab67a3146107cb578063c87b56dd146107e057610360565b80639e46ab1611610164578063b88d4fde1161013e578063b88d4fde14610736578063bd32fb6614610756578063becacc5b14610776578063c024df441461079657610360565b80639e46ab16146106ec578063a22cb46514610701578063b67c25a31461072157610360565b80638da5cb5b116101a05780638da5cb5b1461068d5780638e9c5b38146106a257806395d89b41146106c2578063980dd703146106d757610360565b80637a3cbc0f1461064e5780637d17fcbe146106635780637d6f389e1461067857610360565b80632db11544116102a05780636352211e1161023e5780636f63b60a116102185780636f63b60a146105ef57806370a0823114610604578063715018a61461062457806374df39c91461063957610360565b80636352211e146105a557806364de1e85146105c55780636c0360eb146105da57610360565b806342842e0e1161027a57806342842e0e14610530578063489c077c1461055057806355f804b3146105655780635d82cf6e1461058557610360565b80632db11544146104f357806335c6aaf8146105065780633ccfd60b1461051b57610360565b806318160ddd1161030d5780632668a3c1116102e75780632668a3c1146104a35780632904e6d9146104b85780632913daa0146104cb5780632d61ad50146104e057610360565b806318160ddd1461044e57806318ff321b1461046357806323b872dd1461048357610360565b8063095ea7b31161033e578063095ea7b3146103ea5780630a76ff241461040c578063109695231461042e57610360565b806301ffc9a71461036557806306fdde031461039b578063081812fc146103bd575b600080fd5b34801561037157600080fd5b50610385610380366004612897565b61091e565b6040516103929190612a43565b60405180910390f35b3480156103a757600080fd5b506103b06109c8565b6040516103929190612a4e565b3480156103c957600080fd5b506103dd6103d836600461287f565b610a5a565b60405161039291906129f3565b3480156103f657600080fd5b5061040a610405366004612729565b610aa6565b005b34801561041857600080fd5b50610421610b3e565b6040516103929190613342565b34801561043a57600080fd5b5061040a6104493660046128cf565b610b44565b34801561045a57600080fd5b50610421610b9a565b34801561046f57600080fd5b5061040a61047e3660046127ef565b610bca565b34801561048f57600080fd5b5061040a61049e36600461263b565b610e43565b3480156104af57600080fd5b50610385610e7b565b61040a6104c6366004612754565b610e84565b3480156104d757600080fd5b50610421610fb9565b61040a6104ee366004612754565b610fbf565b61040a61050136600461287f565b61107c565b34801561051257600080fd5b50610421611186565b34801561052757600080fd5b5061040a61118c565b34801561053c57600080fd5b5061040a61054b36600461263b565b611216565b34801561055c57600080fd5b5061040a611231565b34801561057157600080fd5b5061040a6105803660046128cf565b6112ab565b34801561059157600080fd5b5061040a6105a036600461287f565b6112fd565b3480156105b157600080fd5b506103dd6105c036600461287f565b611341565b3480156105d157600080fd5b506103856113eb565b3480156105e657600080fd5b506103b06113f9565b3480156105fb57600080fd5b5061040a611487565b34801561061057600080fd5b5061042161061f3660046125cb565b611500565b34801561063057600080fd5b5061040a611544565b34801561064557600080fd5b5061040a61158f565b34801561065a57600080fd5b5061042161166f565b34801561066f57600080fd5b5061040a611675565b34801561068457600080fd5b5061040a6116da565b34801561069957600080fd5b506103dd61174b565b3480156106ae57600080fd5b5061040a6106bd36600461287f565b61175a565b3480156106ce57600080fd5b506103b061179e565b3480156106e357600080fd5b506104216117ad565b3480156106f857600080fd5b506104216117b3565b34801561070d57600080fd5b5061040a61071c3660046126f8565b6117b9565b34801561072d57600080fd5b506103856117cb565b34801561074257600080fd5b5061040a61075136600461267b565b6117da565b34801561076257600080fd5b5061040a61077136600461287f565b611819565b34801561078257600080fd5b506103856107913660046125cb565b61185d565b3480156107a257600080fd5b506103856107b136600461287f565b611872565b3480156107c257600080fd5b50610421611887565b3480156107d757600080fd5b506103b061188d565b3480156107ec57600080fd5b506103b06107fb36600461287f565b61189a565b34801561080c57600080fd5b5061042161191d565b34801561082157600080fd5b50610421611923565b34801561083657600080fd5b50610421611929565b34801561084b57600080fd5b5061042161192f565b34801561086057600080fd5b50610421611935565b34801561087557600080fd5b5061042161088436600461287f565b61193b565b34801561089557600080fd5b5061040a6108a4366004612729565b61194d565b3480156108b557600080fd5b506103856108c4366004612603565b6119d3565b3480156108d557600080fd5b5061040a6108e43660046125cb565b611a01565b3480156108f557600080fd5b5061040a6109043660046125cb565b611a7a565b34801561091557600080fd5b50610421611ae8565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109c057506109c082611aee565b90505b919050565b6060600280546109d79061347a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a039061347a565b8015610a505780601f10610a2557610100808354040283529160200191610a50565b820191906000526020600020905b815481529060010190602001808311610a3357829003601f168201915b5050505050905090565b6000610a6582611b38565b610a8a5760405162461bcd60e51b8152600401610a81906132ae565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ab182611341565b9050806001600160a01b0316836001600160a01b03161415610ae55760405162461bcd60e51b8152600401610a8190613001565b806001600160a01b0316610af7611b3f565b6001600160a01b03161480610b135750610b13816108c4611b3f565b610b2f5760405162461bcd60e51b8152600401610a8190612cc2565b610b398383611b43565b505050565b600d5481565b610b4c611b3f565b6001600160a01b0316610b5d61174b565b6001600160a01b031614610b835760405162461bcd60e51b8152600401610a8190612ea4565b8051610b9690600b9060208401906124bc565b5050565b6000610bc5601154610bbf601054610bbf600f54600e54611bc990919063ffffffff16565b90611bc9565b905090565b60175460ff16610bec5760405162461bcd60e51b8152600401610a8190612c54565b600d5481511115610c0f5760405162461bcd60e51b8152600401610a81906130f2565b60005b8151811015610d5d57600954825133916001600160a01b031690636352211e90859085908110610c5257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610c769190613342565b60206040518083038186803b158015610c8e57600080fd5b505afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906125e7565b6001600160a01b031614610cec5760405162461bcd60e51b8152600401610a8190612c8b565b60186000838381518110610d1057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1615610d4b5760405162461bcd60e51b8152600401610a8190612d7c565b80610d55816134b5565b915050610c12565b50610d69338251611bd5565b60005b8151811015610e2757600160186000848481518110610d9b57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080600e54610dd69190613399565b60196000848481518110610dfa57634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001908152602001600020819055508080610e1f906134b5565b915050610d6c565b508051600e6000828254610e3b9190613399565b909155505050565b610e54610e4e611b3f565b82611bef565b610e705760405162461bcd60e51b8152600401610a8190612f6d565b610b39838383611c74565b60175460ff1681565b601754610100900460ff16610eab5760405162461bcd60e51b8152600401610a8190612a61565b336000908152601a602052604090205460ff1615610edb5760405162461bcd60e51b8152600401610a8190612c1d565b601254610ee9908290611e41565b3414610f075760405162461bcd60e51b8152600401610a819061330b565b600033604051602001610f1a919061295f565b604051602081830303815290604052805190602001209050610f3f83601b5483611e4d565b610f5b5760405162461bcd60e51b8152600401610a81906131bd565b610f653383611bd5565b8160106000828254610f779190613399565b9091555050336000908152601a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050565b60015481565b601754610100900460ff16610fe65760405162461bcd60e51b8152600401610a8190612a61565b336000908152601a602052604090205460ff16156110165760405162461bcd60e51b8152600401610a8190612c1d565b601254611024908290611e41565b34146110425760405162461bcd60e51b8152600401610a819061330b565b6000338260405160200161105792919061298f565b604051602081830303815290604052805190602001209050610f3f83601c5483611e4d565b60175462010000900460ff166110a45760405162461bcd60e51b8152600401610a8190612fca565b6000601354116110c65760405162461bcd60e51b8152600401610a8190612e6d565b6013546110d39082611e41565b34146110f15760405162461bcd60e51b8152600401610a819061330b565b6014548111156111135760405162461bcd60e51b8152600401610a8190612a98565b600c5461112282610bbf610b9a565b11156111405760405162461bcd60e51b8152600401610a81906130f2565b61114a3382611bd5565b806011600082825461115c9190613399565b90915550506015541580156111795750600c54611177610b9a565b145b1561118357436015555b50565b60125481565b611194611b3f565b6001600160a01b03166111a561174b565b6001600160a01b0316146111cb5760405162461bcd60e51b8152600401610a8190612ea4565b47806111e95760405162461bcd60e51b8152600401610a8190612dd9565b604051339082156108fc029083906000818181858888f19350505050158015610b96573d6000803e3d6000fd5b610b39838383604051806020016040528060008152506117da565b611239611b3f565b6001600160a01b031661124a61174b565b6001600160a01b0316146112705760405162461bcd60e51b8152600401610a8190612ea4565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b6112b3611b3f565b6001600160a01b03166112c461174b565b6001600160a01b0316146112ea5760405162461bcd60e51b8152600401610a8190612ea4565b8051610b9690600a9060208401906124bc565b611305611b3f565b6001600160a01b031661131661174b565b6001600160a01b03161461133c5760405162461bcd60e51b8152600401610a8190612ea4565b601355565b600061134c82611b38565b6113685760405162461bcd60e51b8152600401610a8190612b2c565b6000600154831061138e576001546113809084613402565b61138b906001613399565b90505b825b8181106113d2576000818152600460205260409020546001600160a01b031680156113bf5792506109c3915050565b50806113ca81613445565b915050611390565b5060405162461bcd60e51b8152600401610a81906131f4565b601754610100900460ff1681565b600a80546114069061347a565b80601f01602080910402602001604051908101604052809291908181526020018280546114329061347a565b801561147f5780601f106114545761010080835404028352916020019161147f565b820191906000526020600020905b81548152906001019060200180831161146257829003601f168201915b505050505081565b61148f611b3f565b6001600160a01b03166114a061174b565b6001600160a01b0316146114c65760405162461bcd60e51b8152600401610a8190612ea4565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b60006001600160a01b0382166115285760405162461bcd60e51b8152600401610a8190612d1f565b506001600160a01b031660009081526005602052604090205490565b61154c611b3f565b6001600160a01b031661155d61174b565b6001600160a01b0316146115835760405162461bcd60e51b8152600401610a8190612ea4565b61158d6000611e63565b565b611597611b3f565b6001600160a01b03166115a861174b565b6001600160a01b0316146115ce5760405162461bcd60e51b8152600401610a8190612ea4565b601654156115ee5760405162461bcd60e51b8152600401610a8190613186565b60155461160d5760405162461bcd60e51b8152600401610a8190612be6565b600c5460155461161e9190406134ee565b60165560155460ff90611632904390611ecd565b111561165557600c54611646436001611ecd565b6116519190406134ee565b6016555b60165461158d5760165461166a906001611bc9565b601655565b60105481565b61167d611b3f565b6001600160a01b031661168e61174b565b6001600160a01b0316146116b45760405162461bcd60e51b8152600401610a8190612ea4565b601654156116d45760405162461bcd60e51b8152600401610a8190613186565b43601555565b6116e2611b3f565b6001600160a01b03166116f361174b565b6001600160a01b0316146117195760405162461bcd60e51b8152600401610a8190612ea4565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6008546001600160a01b031690565b611762611b3f565b6001600160a01b031661177361174b565b6001600160a01b0316146117995760405162461bcd60e51b8152600401610a8190612ea4565b601c55565b6060600380546109d79061347a565b60145481565b600e5481565b610b966117c4611b3f565b8383611ed9565b60175462010000900460ff1681565b6117eb6117e5611b3f565b83611bef565b6118075760405162461bcd60e51b8152600401610a8190612f6d565b61181384848484611f9a565b50505050565b611821611b3f565b6001600160a01b031661183261174b565b6001600160a01b0316146118585760405162461bcd60e51b8152600401610a8190612ea4565b601b55565b601a6020526000908152604090205460ff1681565b60186020526000908152604090205460ff1681565b60005490565b600b80546114069061347a565b60606118a582611b38565b6118c15760405162461bcd60e51b8152600401610a8190612ed9565b60006118cb611fcd565b905060008151116118eb5760405180602001604052806000815250611916565b806118f584611fdc565b6040516020016119069291906129c4565b6040516020818303038152906040525b9392505050565b60165481565b600f5481565b600c5481565b60135481565b60155481565b60196020526000908152604090205481565b611955611b3f565b6001600160a01b031661196661174b565b6001600160a01b03161461198c5760405162461bcd60e51b8152600401610a8190612ea4565b600d548111156119ae5760405162461bcd60e51b8152600401610a81906130f2565b6119b88282611bd5565b80600f60008282546119ca9190613399565b90915550505050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b611a09611b3f565b6001600160a01b0316611a1a61174b565b6001600160a01b031614611a405760405162461bcd60e51b8152600401610a8190612ea4565b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b611a82611b3f565b6001600160a01b0316611a9361174b565b6001600160a01b031614611ab95760405162461bcd60e51b8152600401610a8190612ea4565b6001600160a01b038116611adf5760405162461bcd60e51b8152600401610a8190612acf565b61118381611e63565b60115481565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b6000541190565b3390565b600081815260066020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611b9082611341565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119168284613399565b610b9682826040518060200160405280600081525061212b565b6000611bfa82611b38565b611c165760405162461bcd60e51b8152600401610a8190613251565b6000611c2183611341565b9050806001600160a01b0316846001600160a01b03161480611c5c5750836001600160a01b0316611c5184610a5a565b6001600160a01b0316145b80611c6c5750611c6c81856119d3565b949350505050565b826001600160a01b0316611c8782611341565b6001600160a01b031614611cad5760405162461bcd60e51b8152600401610a8190612e10565b6001600160a01b038216611cd35760405162461bcd60e51b8152600401610a8190612b89565b611cde838383610b39565b611ce9600082611b43565b6001600160a01b0383166000908152600560205260408120805460019290611d12908490613402565b90915550506001600160a01b0382166000908152600560205260408120805460019290611d40908490613399565b90915550506000818152600460208190526040822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861617905581611d92846001613399565b81526020810191909152604001600020546001600160a01b03161415611df5578260046000611dc2846001613399565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610b39838383610b39565b600061191682846133c5565b600082611e5a8584612298565b14949350505050565b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006119168284613402565b816001600160a01b0316836001600160a01b03161415611f0b5760405162461bcd60e51b8152600401610a8190612f36565b6001600160a01b038381166000818152600760209081526040808320948716808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611f8d908590612a43565b60405180910390a3505050565b611fa5848484611c74565b611fb184848484612312565b6118135760405162461bcd60e51b8152600401610a819061305e565b6060600a80546109d79061347a565b60608161201d575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526109c3565b8160005b81156120475780612031816134b5565b91506120409050600a836133b1565b9150612021565b60008167ffffffffffffffff81111561207057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561209a576020820181803683370190505b5090505b8415611c6c576120af600183613402565b91506120bc600a866134ee565b6120c7906030613399565b60f81b8183815181106120ea57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612124600a866133b1565b945061209e565b6000546001600160a01b0384166121545760405162461bcd60e51b8152600401610a8190613129565b61215d81611b38565b1561217a5760405162461bcd60e51b8152600401610a81906130bb565b6121876000858386611813565b6001600160a01b038416600090815260056020526040812080548592906121af908490613399565b9091555050600081815260046020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03871617905581905b8481101561227f5760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46122436000878487612312565b61225f5760405162461bcd60e51b8152600401610a819061305e565b81612269816134b5565b9250508080612277906134b5565b9150506121f6565b50600081815561229190868487611813565b5050505050565b600081815b845181101561230a5760008582815181106122c857634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116122ea576122e3838261247c565b92506122f7565b6122f4818461247c565b92505b5080612302816134b5565b91505061229d565b509392505050565b6000612326846001600160a01b031661248b565b1561247157836001600160a01b031663150b7a02612342611b3f565b8786866040518563ffffffff1660e01b81526004016123649493929190612a07565b602060405180830381600087803b15801561237e57600080fd5b505af19250505080156123cc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123c9918101906128b3565b60015b612426573d8080156123fa576040519150601f19603f3d011682016040523d82523d6000602084013e6123ff565b606091505b50805161241e5760405162461bcd60e51b8152600401610a819061305e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611c6c565b506001949350505050565b60009182526020526040902090565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b8280546124c89061347a565b90600052602060002090601f0160209004810192826124ea5760008555612530565b82601f1061250357805160ff1916838001178555612530565b82800160010185558215612530579182015b82811115612530578251825591602001919060010190612515565b5061253c929150612540565b5090565b5b8082111561253c5760008155600101612541565b600067ffffffffffffffff83111561256f5761256f61352e565b6125a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161334b565b90508281528383830111156125b457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156125dc578081fd5b813561191681613544565b6000602082840312156125f8578081fd5b815161191681613544565b60008060408385031215612615578081fd5b823561262081613544565b9150602083013561263081613544565b809150509250929050565b60008060006060848603121561264f578081fd5b833561265a81613544565b9250602084013561266a81613544565b929592945050506040919091013590565b60008060008060808587031215612690578081fd5b843561269b81613544565b935060208501356126ab81613544565b925060408501359150606085013567ffffffffffffffff8111156126cd578182fd5b8501601f810187136126dd578182fd5b6126ec87823560208401612555565b91505092959194509250565b6000806040838503121561270a578182fd5b823561271581613544565b915060208301358015158114612630578182fd5b6000806040838503121561273b578182fd5b823561274681613544565b946020939093013593505050565b60008060408385031215612766578182fd5b823567ffffffffffffffff81111561277c578283fd5b8301601f8101851361278c578283fd5b803560206127a161279c83613375565b61334b565b82815281810190848301838502860184018a10156127bd578788fd5b8795505b848610156127df5780358352600195909501949183019183016127c1565b5098969091013596505050505050565b60006020808385031215612801578182fd5b823567ffffffffffffffff811115612817578283fd5b8301601f81018513612827578283fd5b803561283561279c82613375565b8181528381019083850185840285018601891015612851578687fd5b8694505b83851015612873578035835260019490940193918501918501612855565b50979650505050505050565b600060208284031215612890578081fd5b5035919050565b6000602082840312156128a8578081fd5b813561191681613559565b6000602082840312156128c4578081fd5b815161191681613559565b6000602082840312156128e0578081fd5b813567ffffffffffffffff8111156128f6578182fd5b8201601f81018413612906578182fd5b611c6c84823560208401612555565b6000815180845261292d816020860160208601613419565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b600083516129d6818460208801613419565b8351908301906129ea818360208801613419565b01949350505050565b6001600160a01b0391909116815260200190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612a396080830184612915565b9695505050505050565b901515815260200190565b6000602082526119166020830184612915565b60208082526019908201527f57686974656c697374206d696e74206973207061757365642e00000000000000604082015260600190565b6020808252601d908201527f43616e2774206d696e742074686174206d616e79206174206f6e63652e000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360408201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f5374617274696e6720696e64657820626c6f636b206e6f74207365742e000000604082015260600190565b6020808252600f908201527f416c7265616479206d696e7465642e0000000000000000000000000000000000604082015260600190565b60208082526016908201527f486f6c646572206d696e74206973207061757365642e00000000000000000000604082015260600190565b60208082526017908201527f596f7520646f6e2774206f776e2074686973206f6e652e000000000000000000604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201527f65726f2061646472657373000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f54686973206f6e652077617320616c7265616479207573656420666f72206d6960408201527f6e74696e672e0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600c908201527f42616c616e636520697320300000000000000000000000000000000000000000604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460408201527f206f776e65720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5075626c6963206d696e74207072696365206e6f74207365742e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606082015260800190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060408201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606082015260800190565b60208082526016908201527f5075626c6963206d696e74206973207061757365642e00000000000000000000604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201527f6572000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527f6563656976657220696d706c656d656e74657200000000000000000000000000606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526015908201527f43616e2774206d696e742074686174206d616e792e0000000000000000000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f5374617274696e6720696e64657820616c7265616479207365742e0000000000604082015260600190565b6020808252600e908201527f496e76616c69642070726f6f662e000000000000000000000000000000000000604082015260600190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000606082015260800190565b6020808252602d908201527f455243373231413a206f70657261746f7220717565727920666f72206e6f6e6560408201527f78697374656e7420746f6b656e00000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201527f78697374656e7420746f6b656e00000000000000000000000000000000000000606082015260800190565b60208082526013908201527f496e73756666696369656e742066756e64732e00000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561336d5761336d61352e565b604052919050565b600067ffffffffffffffff82111561338f5761338f61352e565b5060209081020190565b600082198211156133ac576133ac613502565b500190565b6000826133c0576133c0613518565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133fd576133fd613502565b500290565b60008282101561341457613414613502565b500390565b60005b8381101561343457818101518382015260200161341c565b838111156118135750506000910152565b60008161345457613454613502565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60028104600182168061348e57607f821691505b602082108114156134af57634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134e7576134e7613502565b5060010190565b6000826134fd576134fd613518565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461118357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461118357600080fdfea26469706673582212207a22df7f68a496a33697571902d2346760033d22c8991c7b01d36f3e05a09d2864736f6c63430008000033

Deployed Bytecode

0x6080604052600436106103605760003560e01c80637a3cbc0f116101c6578063c4e41b22116100f7578063e36d649811610095578063e985e9c51161006f578063e985e9c5146108a9578063f186d77e146108c9578063f2fde38b146108e9578063fa0770df1461090957610360565b8063e36d649814610854578063e4da3f2814610869578063e58306f91461088957610360565b8063cb774d47116100d1578063cb774d4714610800578063d06a624214610815578063d5abeb011461082a578063dc53fd921461083f57610360565b8063c4e41b22146107b6578063c6ab67a3146107cb578063c87b56dd146107e057610360565b80639e46ab1611610164578063b88d4fde1161013e578063b88d4fde14610736578063bd32fb6614610756578063becacc5b14610776578063c024df441461079657610360565b80639e46ab16146106ec578063a22cb46514610701578063b67c25a31461072157610360565b80638da5cb5b116101a05780638da5cb5b1461068d5780638e9c5b38146106a257806395d89b41146106c2578063980dd703146106d757610360565b80637a3cbc0f1461064e5780637d17fcbe146106635780637d6f389e1461067857610360565b80632db11544116102a05780636352211e1161023e5780636f63b60a116102185780636f63b60a146105ef57806370a0823114610604578063715018a61461062457806374df39c91461063957610360565b80636352211e146105a557806364de1e85146105c55780636c0360eb146105da57610360565b806342842e0e1161027a57806342842e0e14610530578063489c077c1461055057806355f804b3146105655780635d82cf6e1461058557610360565b80632db11544146104f357806335c6aaf8146105065780633ccfd60b1461051b57610360565b806318160ddd1161030d5780632668a3c1116102e75780632668a3c1146104a35780632904e6d9146104b85780632913daa0146104cb5780632d61ad50146104e057610360565b806318160ddd1461044e57806318ff321b1461046357806323b872dd1461048357610360565b8063095ea7b31161033e578063095ea7b3146103ea5780630a76ff241461040c578063109695231461042e57610360565b806301ffc9a71461036557806306fdde031461039b578063081812fc146103bd575b600080fd5b34801561037157600080fd5b50610385610380366004612897565b61091e565b6040516103929190612a43565b60405180910390f35b3480156103a757600080fd5b506103b06109c8565b6040516103929190612a4e565b3480156103c957600080fd5b506103dd6103d836600461287f565b610a5a565b60405161039291906129f3565b3480156103f657600080fd5b5061040a610405366004612729565b610aa6565b005b34801561041857600080fd5b50610421610b3e565b6040516103929190613342565b34801561043a57600080fd5b5061040a6104493660046128cf565b610b44565b34801561045a57600080fd5b50610421610b9a565b34801561046f57600080fd5b5061040a61047e3660046127ef565b610bca565b34801561048f57600080fd5b5061040a61049e36600461263b565b610e43565b3480156104af57600080fd5b50610385610e7b565b61040a6104c6366004612754565b610e84565b3480156104d757600080fd5b50610421610fb9565b61040a6104ee366004612754565b610fbf565b61040a61050136600461287f565b61107c565b34801561051257600080fd5b50610421611186565b34801561052757600080fd5b5061040a61118c565b34801561053c57600080fd5b5061040a61054b36600461263b565b611216565b34801561055c57600080fd5b5061040a611231565b34801561057157600080fd5b5061040a6105803660046128cf565b6112ab565b34801561059157600080fd5b5061040a6105a036600461287f565b6112fd565b3480156105b157600080fd5b506103dd6105c036600461287f565b611341565b3480156105d157600080fd5b506103856113eb565b3480156105e657600080fd5b506103b06113f9565b3480156105fb57600080fd5b5061040a611487565b34801561061057600080fd5b5061042161061f3660046125cb565b611500565b34801561063057600080fd5b5061040a611544565b34801561064557600080fd5b5061040a61158f565b34801561065a57600080fd5b5061042161166f565b34801561066f57600080fd5b5061040a611675565b34801561068457600080fd5b5061040a6116da565b34801561069957600080fd5b506103dd61174b565b3480156106ae57600080fd5b5061040a6106bd36600461287f565b61175a565b3480156106ce57600080fd5b506103b061179e565b3480156106e357600080fd5b506104216117ad565b3480156106f857600080fd5b506104216117b3565b34801561070d57600080fd5b5061040a61071c3660046126f8565b6117b9565b34801561072d57600080fd5b506103856117cb565b34801561074257600080fd5b5061040a61075136600461267b565b6117da565b34801561076257600080fd5b5061040a61077136600461287f565b611819565b34801561078257600080fd5b506103856107913660046125cb565b61185d565b3480156107a257600080fd5b506103856107b136600461287f565b611872565b3480156107c257600080fd5b50610421611887565b3480156107d757600080fd5b506103b061188d565b3480156107ec57600080fd5b506103b06107fb36600461287f565b61189a565b34801561080c57600080fd5b5061042161191d565b34801561082157600080fd5b50610421611923565b34801561083657600080fd5b50610421611929565b34801561084b57600080fd5b5061042161192f565b34801561086057600080fd5b50610421611935565b34801561087557600080fd5b5061042161088436600461287f565b61193b565b34801561089557600080fd5b5061040a6108a4366004612729565b61194d565b3480156108b557600080fd5b506103856108c4366004612603565b6119d3565b3480156108d557600080fd5b5061040a6108e43660046125cb565b611a01565b3480156108f557600080fd5b5061040a6109043660046125cb565b611a7a565b34801561091557600080fd5b50610421611ae8565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806109c057506109c082611aee565b90505b919050565b6060600280546109d79061347a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a039061347a565b8015610a505780601f10610a2557610100808354040283529160200191610a50565b820191906000526020600020905b815481529060010190602001808311610a3357829003601f168201915b5050505050905090565b6000610a6582611b38565b610a8a5760405162461bcd60e51b8152600401610a81906132ae565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ab182611341565b9050806001600160a01b0316836001600160a01b03161415610ae55760405162461bcd60e51b8152600401610a8190613001565b806001600160a01b0316610af7611b3f565b6001600160a01b03161480610b135750610b13816108c4611b3f565b610b2f5760405162461bcd60e51b8152600401610a8190612cc2565b610b398383611b43565b505050565b600d5481565b610b4c611b3f565b6001600160a01b0316610b5d61174b565b6001600160a01b031614610b835760405162461bcd60e51b8152600401610a8190612ea4565b8051610b9690600b9060208401906124bc565b5050565b6000610bc5601154610bbf601054610bbf600f54600e54611bc990919063ffffffff16565b90611bc9565b905090565b60175460ff16610bec5760405162461bcd60e51b8152600401610a8190612c54565b600d5481511115610c0f5760405162461bcd60e51b8152600401610a81906130f2565b60005b8151811015610d5d57600954825133916001600160a01b031690636352211e90859085908110610c5257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610c769190613342565b60206040518083038186803b158015610c8e57600080fd5b505afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906125e7565b6001600160a01b031614610cec5760405162461bcd60e51b8152600401610a8190612c8b565b60186000838381518110610d1057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1615610d4b5760405162461bcd60e51b8152600401610a8190612d7c565b80610d55816134b5565b915050610c12565b50610d69338251611bd5565b60005b8151811015610e2757600160186000848481518110610d9b57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080600e54610dd69190613399565b60196000848481518110610dfa57634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001908152602001600020819055508080610e1f906134b5565b915050610d6c565b508051600e6000828254610e3b9190613399565b909155505050565b610e54610e4e611b3f565b82611bef565b610e705760405162461bcd60e51b8152600401610a8190612f6d565b610b39838383611c74565b60175460ff1681565b601754610100900460ff16610eab5760405162461bcd60e51b8152600401610a8190612a61565b336000908152601a602052604090205460ff1615610edb5760405162461bcd60e51b8152600401610a8190612c1d565b601254610ee9908290611e41565b3414610f075760405162461bcd60e51b8152600401610a819061330b565b600033604051602001610f1a919061295f565b604051602081830303815290604052805190602001209050610f3f83601b5483611e4d565b610f5b5760405162461bcd60e51b8152600401610a81906131bd565b610f653383611bd5565b8160106000828254610f779190613399565b9091555050336000908152601a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050565b60015481565b601754610100900460ff16610fe65760405162461bcd60e51b8152600401610a8190612a61565b336000908152601a602052604090205460ff16156110165760405162461bcd60e51b8152600401610a8190612c1d565b601254611024908290611e41565b34146110425760405162461bcd60e51b8152600401610a819061330b565b6000338260405160200161105792919061298f565b604051602081830303815290604052805190602001209050610f3f83601c5483611e4d565b60175462010000900460ff166110a45760405162461bcd60e51b8152600401610a8190612fca565b6000601354116110c65760405162461bcd60e51b8152600401610a8190612e6d565b6013546110d39082611e41565b34146110f15760405162461bcd60e51b8152600401610a819061330b565b6014548111156111135760405162461bcd60e51b8152600401610a8190612a98565b600c5461112282610bbf610b9a565b11156111405760405162461bcd60e51b8152600401610a81906130f2565b61114a3382611bd5565b806011600082825461115c9190613399565b90915550506015541580156111795750600c54611177610b9a565b145b1561118357436015555b50565b60125481565b611194611b3f565b6001600160a01b03166111a561174b565b6001600160a01b0316146111cb5760405162461bcd60e51b8152600401610a8190612ea4565b47806111e95760405162461bcd60e51b8152600401610a8190612dd9565b604051339082156108fc029083906000818181858888f19350505050158015610b96573d6000803e3d6000fd5b610b39838383604051806020016040528060008152506117da565b611239611b3f565b6001600160a01b031661124a61174b565b6001600160a01b0316146112705760405162461bcd60e51b8152600401610a8190612ea4565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b6112b3611b3f565b6001600160a01b03166112c461174b565b6001600160a01b0316146112ea5760405162461bcd60e51b8152600401610a8190612ea4565b8051610b9690600a9060208401906124bc565b611305611b3f565b6001600160a01b031661131661174b565b6001600160a01b03161461133c5760405162461bcd60e51b8152600401610a8190612ea4565b601355565b600061134c82611b38565b6113685760405162461bcd60e51b8152600401610a8190612b2c565b6000600154831061138e576001546113809084613402565b61138b906001613399565b90505b825b8181106113d2576000818152600460205260409020546001600160a01b031680156113bf5792506109c3915050565b50806113ca81613445565b915050611390565b5060405162461bcd60e51b8152600401610a81906131f4565b601754610100900460ff1681565b600a80546114069061347a565b80601f01602080910402602001604051908101604052809291908181526020018280546114329061347a565b801561147f5780601f106114545761010080835404028352916020019161147f565b820191906000526020600020905b81548152906001019060200180831161146257829003601f168201915b505050505081565b61148f611b3f565b6001600160a01b03166114a061174b565b6001600160a01b0316146114c65760405162461bcd60e51b8152600401610a8190612ea4565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b60006001600160a01b0382166115285760405162461bcd60e51b8152600401610a8190612d1f565b506001600160a01b031660009081526005602052604090205490565b61154c611b3f565b6001600160a01b031661155d61174b565b6001600160a01b0316146115835760405162461bcd60e51b8152600401610a8190612ea4565b61158d6000611e63565b565b611597611b3f565b6001600160a01b03166115a861174b565b6001600160a01b0316146115ce5760405162461bcd60e51b8152600401610a8190612ea4565b601654156115ee5760405162461bcd60e51b8152600401610a8190613186565b60155461160d5760405162461bcd60e51b8152600401610a8190612be6565b600c5460155461161e9190406134ee565b60165560155460ff90611632904390611ecd565b111561165557600c54611646436001611ecd565b6116519190406134ee565b6016555b60165461158d5760165461166a906001611bc9565b601655565b60105481565b61167d611b3f565b6001600160a01b031661168e61174b565b6001600160a01b0316146116b45760405162461bcd60e51b8152600401610a8190612ea4565b601654156116d45760405162461bcd60e51b8152600401610a8190613186565b43601555565b6116e2611b3f565b6001600160a01b03166116f361174b565b6001600160a01b0316146117195760405162461bcd60e51b8152600401610a8190612ea4565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6008546001600160a01b031690565b611762611b3f565b6001600160a01b031661177361174b565b6001600160a01b0316146117995760405162461bcd60e51b8152600401610a8190612ea4565b601c55565b6060600380546109d79061347a565b60145481565b600e5481565b610b966117c4611b3f565b8383611ed9565b60175462010000900460ff1681565b6117eb6117e5611b3f565b83611bef565b6118075760405162461bcd60e51b8152600401610a8190612f6d565b61181384848484611f9a565b50505050565b611821611b3f565b6001600160a01b031661183261174b565b6001600160a01b0316146118585760405162461bcd60e51b8152600401610a8190612ea4565b601b55565b601a6020526000908152604090205460ff1681565b60186020526000908152604090205460ff1681565b60005490565b600b80546114069061347a565b60606118a582611b38565b6118c15760405162461bcd60e51b8152600401610a8190612ed9565b60006118cb611fcd565b905060008151116118eb5760405180602001604052806000815250611916565b806118f584611fdc565b6040516020016119069291906129c4565b6040516020818303038152906040525b9392505050565b60165481565b600f5481565b600c5481565b60135481565b60155481565b60196020526000908152604090205481565b611955611b3f565b6001600160a01b031661196661174b565b6001600160a01b03161461198c5760405162461bcd60e51b8152600401610a8190612ea4565b600d548111156119ae5760405162461bcd60e51b8152600401610a81906130f2565b6119b88282611bd5565b80600f60008282546119ca9190613399565b90915550505050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b611a09611b3f565b6001600160a01b0316611a1a61174b565b6001600160a01b031614611a405760405162461bcd60e51b8152600401610a8190612ea4565b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b611a82611b3f565b6001600160a01b0316611a9361174b565b6001600160a01b031614611ab95760405162461bcd60e51b8152600401610a8190612ea4565b6001600160a01b038116611adf5760405162461bcd60e51b8152600401610a8190612acf565b61118381611e63565b60115481565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b6000541190565b3390565b600081815260066020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611b9082611341565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119168284613399565b610b9682826040518060200160405280600081525061212b565b6000611bfa82611b38565b611c165760405162461bcd60e51b8152600401610a8190613251565b6000611c2183611341565b9050806001600160a01b0316846001600160a01b03161480611c5c5750836001600160a01b0316611c5184610a5a565b6001600160a01b0316145b80611c6c5750611c6c81856119d3565b949350505050565b826001600160a01b0316611c8782611341565b6001600160a01b031614611cad5760405162461bcd60e51b8152600401610a8190612e10565b6001600160a01b038216611cd35760405162461bcd60e51b8152600401610a8190612b89565b611cde838383610b39565b611ce9600082611b43565b6001600160a01b0383166000908152600560205260408120805460019290611d12908490613402565b90915550506001600160a01b0382166000908152600560205260408120805460019290611d40908490613399565b90915550506000818152600460208190526040822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861617905581611d92846001613399565b81526020810191909152604001600020546001600160a01b03161415611df5578260046000611dc2846001613399565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610b39838383610b39565b600061191682846133c5565b600082611e5a8584612298565b14949350505050565b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006119168284613402565b816001600160a01b0316836001600160a01b03161415611f0b5760405162461bcd60e51b8152600401610a8190612f36565b6001600160a01b038381166000818152600760209081526040808320948716808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611f8d908590612a43565b60405180910390a3505050565b611fa5848484611c74565b611fb184848484612312565b6118135760405162461bcd60e51b8152600401610a819061305e565b6060600a80546109d79061347a565b60608161201d575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526109c3565b8160005b81156120475780612031816134b5565b91506120409050600a836133b1565b9150612021565b60008167ffffffffffffffff81111561207057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561209a576020820181803683370190505b5090505b8415611c6c576120af600183613402565b91506120bc600a866134ee565b6120c7906030613399565b60f81b8183815181106120ea57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612124600a866133b1565b945061209e565b6000546001600160a01b0384166121545760405162461bcd60e51b8152600401610a8190613129565b61215d81611b38565b1561217a5760405162461bcd60e51b8152600401610a81906130bb565b6121876000858386611813565b6001600160a01b038416600090815260056020526040812080548592906121af908490613399565b9091555050600081815260046020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03871617905581905b8481101561227f5760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46122436000878487612312565b61225f5760405162461bcd60e51b8152600401610a819061305e565b81612269816134b5565b9250508080612277906134b5565b9150506121f6565b50600081815561229190868487611813565b5050505050565b600081815b845181101561230a5760008582815181106122c857634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116122ea576122e3838261247c565b92506122f7565b6122f4818461247c565b92505b5080612302816134b5565b91505061229d565b509392505050565b6000612326846001600160a01b031661248b565b1561247157836001600160a01b031663150b7a02612342611b3f565b8786866040518563ffffffff1660e01b81526004016123649493929190612a07565b602060405180830381600087803b15801561237e57600080fd5b505af19250505080156123cc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123c9918101906128b3565b60015b612426573d8080156123fa576040519150601f19603f3d011682016040523d82523d6000602084013e6123ff565b606091505b50805161241e5760405162461bcd60e51b8152600401610a819061305e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611c6c565b506001949350505050565b60009182526020526040902090565b600080826001600160a01b0316803b806020016040519081016040528181526000908060200190933c511192915050565b8280546124c89061347a565b90600052602060002090601f0160209004810192826124ea5760008555612530565b82601f1061250357805160ff1916838001178555612530565b82800160010185558215612530579182015b82811115612530578251825591602001919060010190612515565b5061253c929150612540565b5090565b5b8082111561253c5760008155600101612541565b600067ffffffffffffffff83111561256f5761256f61352e565b6125a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161334b565b90508281528383830111156125b457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156125dc578081fd5b813561191681613544565b6000602082840312156125f8578081fd5b815161191681613544565b60008060408385031215612615578081fd5b823561262081613544565b9150602083013561263081613544565b809150509250929050565b60008060006060848603121561264f578081fd5b833561265a81613544565b9250602084013561266a81613544565b929592945050506040919091013590565b60008060008060808587031215612690578081fd5b843561269b81613544565b935060208501356126ab81613544565b925060408501359150606085013567ffffffffffffffff8111156126cd578182fd5b8501601f810187136126dd578182fd5b6126ec87823560208401612555565b91505092959194509250565b6000806040838503121561270a578182fd5b823561271581613544565b915060208301358015158114612630578182fd5b6000806040838503121561273b578182fd5b823561274681613544565b946020939093013593505050565b60008060408385031215612766578182fd5b823567ffffffffffffffff81111561277c578283fd5b8301601f8101851361278c578283fd5b803560206127a161279c83613375565b61334b565b82815281810190848301838502860184018a10156127bd578788fd5b8795505b848610156127df5780358352600195909501949183019183016127c1565b5098969091013596505050505050565b60006020808385031215612801578182fd5b823567ffffffffffffffff811115612817578283fd5b8301601f81018513612827578283fd5b803561283561279c82613375565b8181528381019083850185840285018601891015612851578687fd5b8694505b83851015612873578035835260019490940193918501918501612855565b50979650505050505050565b600060208284031215612890578081fd5b5035919050565b6000602082840312156128a8578081fd5b813561191681613559565b6000602082840312156128c4578081fd5b815161191681613559565b6000602082840312156128e0578081fd5b813567ffffffffffffffff8111156128f6578182fd5b8201601f81018413612906578182fd5b611c6c84823560208401612555565b6000815180845261292d816020860160208601613419565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b600083516129d6818460208801613419565b8351908301906129ea818360208801613419565b01949350505050565b6001600160a01b0391909116815260200190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612a396080830184612915565b9695505050505050565b901515815260200190565b6000602082526119166020830184612915565b60208082526019908201527f57686974656c697374206d696e74206973207061757365642e00000000000000604082015260600190565b6020808252601d908201527f43616e2774206d696e742074686174206d616e79206174206f6e63652e000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360408201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f5374617274696e6720696e64657820626c6f636b206e6f74207365742e000000604082015260600190565b6020808252600f908201527f416c7265616479206d696e7465642e0000000000000000000000000000000000604082015260600190565b60208082526016908201527f486f6c646572206d696e74206973207061757365642e00000000000000000000604082015260600190565b60208082526017908201527f596f7520646f6e2774206f776e2074686973206f6e652e000000000000000000604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201527f65726f2061646472657373000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f54686973206f6e652077617320616c7265616479207573656420666f72206d6960408201527f6e74696e672e0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600c908201527f42616c616e636520697320300000000000000000000000000000000000000000604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460408201527f206f776e65720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5075626c6963206d696e74207072696365206e6f74207365742e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606082015260800190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060408201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606082015260800190565b60208082526016908201527f5075626c6963206d696e74206973207061757365642e00000000000000000000604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201527f6572000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527f6563656976657220696d706c656d656e74657200000000000000000000000000606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526015908201527f43616e2774206d696e742074686174206d616e792e0000000000000000000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f5374617274696e6720696e64657820616c7265616479207365742e0000000000604082015260600190565b6020808252600e908201527f496e76616c69642070726f6f662e000000000000000000000000000000000000604082015260600190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000606082015260800190565b6020808252602d908201527f455243373231413a206f70657261746f7220717565727920666f72206e6f6e6560408201527f78697374656e7420746f6b656e00000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201527f78697374656e7420746f6b656e00000000000000000000000000000000000000606082015260800190565b60208082526013908201527f496e73756666696369656e742066756e64732e00000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561336d5761336d61352e565b604052919050565b600067ffffffffffffffff82111561338f5761338f61352e565b5060209081020190565b600082198211156133ac576133ac613502565b500190565b6000826133c0576133c0613518565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133fd576133fd613502565b500290565b60008282101561341457613414613502565b500390565b60005b8381101561343457818101518382015260200161341c565b838111156118135750506000910152565b60008161345457613454613502565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60028104600182168061348e57607f821691505b602082108114156134af57634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134e7576134e7613502565b5060010190565b6000826134fd576134fd613518565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461118357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461118357600080fdfea26469706673582212207a22df7f68a496a33697571902d2346760033d22c8991c7b01d36f3e05a09d2864736f6c63430008000033

Deployed Bytecode Sourcemap

45001:6947:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22535:269;;;;;;;;;;-1:-1:-1;22535:269:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23809:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25206:207::-;;;;;;;;;;-1:-1:-1;25206:207:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24789:363::-;;;;;;;;;;-1:-1:-1;24789:363:0;;;;;:::i;:::-;;:::i;:::-;;45199:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51586:121::-;;;;;;;;;;-1:-1:-1;51586:121:0;;;;;:::i;:::-;;:::i;46128:164::-;;;;;;;;;;;;;:::i;46345:617::-;;;;;;;;;;-1:-1:-1;46345:617:0;;;;;:::i;:::-;;:::i;25888:298::-;;;;;;;;;;-1:-1:-1;25888:298:0;;;;;:::i;:::-;;:::i;45595:36::-;;;;;;;;;;;;;:::i;47010:570::-;;;;;;:::i;:::-;;:::i;21728:32::-;;;;;;;;;;;;;:::i;47639:595::-;;;;;;:::i;:::-;;:::i;48274:627::-;;;;;;:::i;:::-;;:::i;45392:47::-;;;;;;;;;;;;;:::i;51774:171::-;;;;;;;;;;;;;:::i;26245:155::-;;;;;;;;;;-1:-1:-1;26245:155:0;;;;;:::i;:::-;;:::i;50073:93::-;;;;;;;;;;;;;:::i;50401:97::-;;;;;;;;;;-1:-1:-1;50401:97:0;;;;;:::i;:::-;;:::i;50241:::-;;;;;;;;;;-1:-1:-1;50241:97:0;;;;;:::i;:::-;;:::i;23055:519::-;;;;;;;;;;-1:-1:-1;23055:519:0;;;;;:::i;:::-;;:::i;45635:39::-;;;;;;;;;;;;;:::i;45104:21::-;;;;;;;;;;;;;:::i;49913:102::-;;;;;;;;;;;;;:::i;22856:194::-;;;;;;;;;;-1:-1:-1;22856:194:0;;;;;:::i;:::-;;:::i;36365:94::-;;;;;;;;;;;;;:::i;50698:480::-;;;;;;;;;;;;;:::i;45313:36::-;;;;;;;;;;;;;:::i;51303:169::-;;;;;;;;;;;;;:::i;49759:93::-;;;;;;;;;;;;;:::i;35774:78::-;;;;;;;;;;;;;:::i;49592:109::-;;;;;;;;;;-1:-1:-1;49592:109:0;;;;;:::i;:::-;;:::i;23957:95::-;;;;;;;;;;;;;:::i;45477:43::-;;;;;;;;;;;;;:::i;45240:33::-;;;;;;;;;;;;;:::i;25473:146::-;;;;;;;;;;-1:-1:-1;25473:146:0;;;;;:::i;:::-;;:::i;45678:36::-;;;;;;;;;;;;;:::i;26459:287::-;;;;;;;;;;-1:-1:-1;26459:287:0;;;;;:::i;:::-;;:::i;49422:97::-;;;;;;;;;;-1:-1:-1;49422:97:0;;;;;:::i;:::-;;:::i;45819:47::-;;;;;;;;;;-1:-1:-1;45819:47:0;;;;;:::i;:::-;;:::i;45720:43::-;;;;;;;;;;-1:-1:-1;45720:43:0;;;;;:::i;:::-;;:::i;33439:84::-;;;;;;;;;;;;;:::i;45129:28::-;;;;;;;;;;;;;:::i;24111:313::-;;;;;;;;;;-1:-1:-1;24111:313:0;;;;;:::i;:::-;;:::i;45561:28::-;;;;;;;;;;;;;:::i;45277:32::-;;;;;;;;;;;;;:::i;45163:::-;;;;;;;;;;;;;:::i;45443:30::-;;;;;;;;;;;;;:::i;45524:33::-;;;;;;;;;;;;;:::i;45767:48::-;;;;;;;;;;-1:-1:-1;45767:48:0;;;;;:::i;:::-;;:::i;48940:218::-;;;;;;;;;;-1:-1:-1;48940:218:0;;;;;:::i;:::-;;:::i;25678:155::-;;;;;;;;;;-1:-1:-1;25678:155:0;;;;;:::i;:::-;;:::i;49258:98::-;;;;;;;;;;-1:-1:-1;49258:98:0;;;;;:::i;:::-;;:::i;36599:186::-;;;;;;;;;;-1:-1:-1;36599:186:0;;;;;:::i;:::-;;:::i;45353:33::-;;;;;;;;;;;;;:::i;22535:269::-;22637:4;22659:40;;;22674:25;22659:40;;:96;;-1:-1:-1;22707:48:0;;;22722:33;22707:48;22659:96;:140;;;;22763:36;22787:11;22763:23;:36::i;:::-;22648:151;;22535:269;;;;:::o;23809:91::-;23863:13;23890:5;23883:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23809:91;:::o;25206:207::-;25282:7;25304:16;25312:7;25304;:16::i;:::-;25296:74;;;;-1:-1:-1;;;25296:74:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;25384:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25384:24:0;;25206:207::o;24789:363::-;24864:13;24880:24;24896:7;24880:15;:24::i;:::-;24864:40;;24923:5;-1:-1:-1;;;;;24917:11:0;:2;-1:-1:-1;;;;;24917:11:0;;;24909:58;;;;-1:-1:-1;;;24909:58:0;;;;;;;:::i;:::-;25003:5;-1:-1:-1;;;;;24987:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24987:21:0;;:62;;;;25012:37;25029:5;25036:12;:10;:12::i;25012:37::-;24974:145;;;;-1:-1:-1;;;24974:145:0;;;;;;;:::i;:::-;25126:21;25135:2;25139:7;25126:8;:21::i;:::-;24789:363;;;:::o;45199:35::-;;;;:::o;51586:121::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;51669:33;;::::1;::::0;:14:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51586:121:::0;:::o;46128:164::-;46172:7;46195:92;46268:18;;46195:68;46241:21;;46195:41;46218:17;;46195:18;;:22;;:41;;;;:::i;:::-;:45;;:68::i;:92::-;46188:99;;46128:164;:::o;46345:617::-;46410:16;;;;46402:51;;;;-1:-1:-1;;;46402:51:0;;;;;;;:::i;:::-;46481:14;;46466:4;:11;:29;;46458:63;;;;-1:-1:-1;;;46458:63:0;;;;;;;:::i;:::-;46533:9;46528:210;46548:4;:11;46546:1;:13;46528:210;;;46583:12;;46604:7;;46616:10;;-1:-1:-1;;;;;46583:12:0;;:20;;46604:4;;46609:1;;46604:7;;;;-1:-1:-1;;;46604:7:0;;;;;;;;;;;;;;;46583:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46583:43:0;;46575:79;;;;-1:-1:-1;;;46575:79:0;;;;;;;:::i;:::-;46669:11;:20;46681:4;46686:1;46681:7;;;;;;-1:-1:-1;;;46681:7:0;;;;;;;;;;;;;;;;;;;;46669:20;;;;;;;;;;-1:-1:-1;46669:20:0;;;;46668:21;46660:72;;;;-1:-1:-1;;;46660:72:0;;;;;;;:::i;:::-;46561:3;;;;:::i;:::-;;;;46528:210;;;;46744:34;46754:10;46766:4;:11;46744:9;:34::i;:::-;46790:9;46785:133;46805:4;:11;46803:1;:13;46785:133;;;46855:4;46832:11;:20;46844:4;46849:1;46844:7;;;;;;-1:-1:-1;;;46844:7:0;;;;;;;;;;;;;;;46832:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;46911:1;46890:18;;:22;;;;:::i;:::-;46865:13;:22;46879:4;46884:1;46879:7;;;;;;-1:-1:-1;;;46879:7:0;;;;;;;;;;;;;;;46865:22;;;;;;;;;;;:47;;;;46818:3;;;;;:::i;:::-;;;;46785:133;;;;46946:4;:11;46924:18;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;;46345:617:0:o;25888:298::-;26050:41;26069:12;:10;:12::i;:::-;26083:7;26050:18;:41::i;:::-;26042:104;;;;-1:-1:-1;;;26042:104:0;;;;;;;:::i;:::-;26153:28;26163:4;26169:2;26173:7;26153:9;:28::i;45595:36::-;;;;;;:::o;47010:570::-;47109:19;;;;;;;47101:57;;;;-1:-1:-1;;;47101:57:0;;;;;;;:::i;:::-;47187:10;47171:27;;;;:15;:27;;;;;;;;:36;47163:64;;;;-1:-1:-1;;;47163:64:0;;;;;;;:::i;:::-;47269:18;;47253:35;;:11;;:15;:35::i;:::-;47240:9;:48;47232:80;;;;-1:-1:-1;;;47232:80:0;;;;;;;:::i;:::-;47319:12;47361:10;47344:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;47334:39;;;;;;47319:54;;47386:47;47405:6;47413:13;;47428:4;47386:18;:47::i;:::-;47378:74;;;;-1:-1:-1;;;47378:74:0;;;;;;;:::i;:::-;47459:34;47469:10;47481:11;47459:9;:34::i;:::-;47525:11;47500:21;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;47557:10:0;47541:27;;;;:15;:27;;;;;:34;;;;47571:4;47541:34;;;-1:-1:-1;;;47010:570:0:o;21728:32::-;;;;:::o;47639:595::-;47744:19;;;;;;;47736:57;;;;-1:-1:-1;;;47736:57:0;;;;;;;:::i;:::-;47822:10;47806:27;;;;:15;:27;;;;;;;;:36;47798:64;;;;-1:-1:-1;;;47798:64:0;;;;;;;:::i;:::-;47904:18;;47888:35;;:11;;:15;:35::i;:::-;47875:9;:48;47867:80;;;;-1:-1:-1;;;47867:80:0;;;;;;;:::i;:::-;47954:12;47996:10;48008:11;47979:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47969:52;;;;;;47954:67;;48034:53;48053:6;48061:19;;48082:4;48034:18;:53::i;48274:627::-;48345:16;;;;;;;48337:51;;;;-1:-1:-1;;;48337:51:0;;;;;;;:::i;:::-;48419:1;48401:15;;:19;48393:58;;;;-1:-1:-1;;;48393:58:0;;;;;;;:::i;:::-;48477:15;;:32;;48497:11;48477:19;:32::i;:::-;48464:9;:45;48456:77;;;;-1:-1:-1;;;48456:77:0;;;;;;;:::i;:::-;48561:23;;48546:11;:38;;48538:80;;;;-1:-1:-1;;;48538:80:0;;;;;;;:::i;:::-;48665:9;;48631:30;48649:11;48631:13;:11;:13::i;:30::-;:43;;48623:77;;;;-1:-1:-1;;;48623:77:0;;;;;;;:::i;:::-;48707:34;48717:10;48729:11;48707:9;:34::i;:::-;48770:11;48748:18;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;48792:18:0;;:23;:55;;;;;48837:9;;48820:13;:11;:13::i;:::-;:26;48792:55;48788:109;;;48879:12;48858:18;:33;48788:109;48274:627;:::o;45392:47::-;;;;:::o;51774:171::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;51836:21:::1;51870:11:::0;51862:36:::1;;;;-1:-1:-1::0;;;51862:36:0::1;;;;;;;:::i;:::-;51903:37;::::0;51911:10:::1;::::0;51903:37;::::1;;;::::0;51932:7;;51903:37:::1;::::0;;;51932:7;51911:10;51903:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;26245:155:::0;26356:39;26373:4;26379:2;26383:7;26356:39;;;;;;;;;;;;:16;:39::i;50073:93::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;50145:16:::1;::::0;;50125:36;;::::1;50145:16:::0;;;;::::1;;;50144:17;50125:36:::0;;::::1;;::::0;;50073:93::o;50401:97::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;50472:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;50241:97::-:0;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;50309:15:::1;:24:::0;50241:97::o;23055:519::-;23127:7;23149:16;23157:7;23149;:16::i;:::-;23141:71;;;;-1:-1:-1;;;23141:71:0;;;;;;;:::i;:::-;23219:26;23265:12;;23254:7;:23;23250:88;;23316:12;;23306:22;;:7;:22;:::i;:::-;:26;;23331:1;23306:26;:::i;:::-;23285:47;;23250:88;23364:7;23344:162;23381:18;23373:4;:26;23344:162;;23415:13;23431;;;:7;:13;;;;;;-1:-1:-1;;;;;23431:13:0;23454:19;;23450:51;;23489:5;-1:-1:-1;23482:12:0;;-1:-1:-1;;23482:12:0;23450:51;-1:-1:-1;23401:6:0;;;;:::i;:::-;;;;23344:162;;;;23512:57;;-1:-1:-1;;;23512:57:0;;;;;;;:::i;45635:39::-;;;;;;;;;:::o;45104:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49913:102::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;49991:19:::1;::::0;;49968:42;;::::1;49991:19;::::0;;;::::1;;;49990:20;49968:42:::0;;::::1;;::::0;;49913:102::o;22856:194::-;22928:7;-1:-1:-1;;;;;22950:19:0;;22942:75;;;;-1:-1:-1;;;22942:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23029:16:0;;;;;:9;:16;;;;;;;22856:194::o;36365:94::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;36424:30:::1;36451:1;36424:18;:30::i;:::-;36365:94::o:0;50698:480::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;50763:13:::1;::::0;:18;50755:58:::1;;;;-1:-1:-1::0;;;50755:58:0::1;;;;;;;:::i;:::-;50826:18;::::0;50818:65:::1;;;;-1:-1:-1::0;;;50818:65:0::1;;;;;;;:::i;:::-;50947:9;::::0;50924:18:::1;::::0;50906:50:::1;::::0;50947:9;50914:29:::1;50906:50;:::i;:::-;50890:13;:66:::0;50984:18:::1;::::0;51006:3:::1;::::0;50967:36:::1;::::0;:12:::1;::::0;:16:::1;:36::i;:::-;:42;50963:130;;;51078:9;::::0;51054:19:::1;:12;51071:1;51054:16;:19::i;:::-;51036:51;::::0;;51044:30:::1;51036:51;:::i;:::-;51020:13;:67:::0;50963:130:::1;51103:13;::::0;51099:75:::1;;51148:13;::::0;:20:::1;::::0;51166:1:::1;51148:17;:20::i;:::-;51132:13;:36:::0;50698:480::o;45313:36::-;;;;:::o;51303:169::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;51377:13:::1;::::0;:18;51369:58:::1;;;;-1:-1:-1::0;;;51369:58:0::1;;;;;;;:::i;:::-;51455:12;51434:18;:33:::0;51303:169::o;49759:93::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;49831:16:::1;::::0;;49811:36;;::::1;49831:16;::::0;;::::1;49830:17;49811:36;::::0;;49759:93::o;35774:78::-;35841:6;;-1:-1:-1;;;;;35841:6:0;35774:78;:::o;49592:109::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;49669:19:::1;:27:::0;49592:109::o;23957:95::-;24013:13;24040:7;24033:14;;;;;:::i;45477:43::-;;;;:::o;45240:33::-;;;;:::o;25473:146::-;25562:52;25581:12;:10;:12::i;:::-;25595:8;25605;25562:18;:52::i;45678:36::-;;;;;;;;;:::o;26459:287::-;26601:41;26620:12;:10;:12::i;:::-;26634:7;26601:18;:41::i;:::-;26593:104;;;;-1:-1:-1;;;26593:104:0;;;;;;;:::i;:::-;26702:39;26716:4;26722:2;26726:7;26735:5;26702:13;:39::i;:::-;26459:287;;;;:::o;49422:97::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;49493:13:::1;:21:::0;49422:97::o;45819:47::-;;;;;;;;;;;;;;;:::o;45720:43::-;;;;;;;;;;;;;;;:::o;33439:84::-;33485:7;33506:12;33439:84;:::o;45129:28::-;;;;;;;:::i;24111:313::-;24184:13;24212:16;24220:7;24212;:16::i;:::-;24204:76;;;;-1:-1:-1;;;24204:76:0;;;;;;;:::i;:::-;24287:21;24311:10;:8;:10::i;:::-;24287:34;;24357:1;24339:7;24333:21;:25;:86;;;;;;;;;;;;;;;;;24385:7;24394:18;:7;:16;:18::i;:::-;24368:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24333:86;24326:93;24111:313;-1:-1:-1;;;24111:313:0:o;45561:28::-;;;;:::o;45277:32::-;;;;:::o;45163:::-;;;;:::o;45443:30::-;;;;:::o;45524:33::-;;;;:::o;45767:48::-;;;;;;;;;;;;;:::o;48940:218::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;49040:14:::1;;49025:11;:29;;49017:63;;;;-1:-1:-1::0;;;49017:63:0::1;;;;;;;:::i;:::-;49087:27;49097:3;49102:11;49087:9;:27::i;:::-;49142:11;49121:17;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;48940:218:0:o;25678:155::-;-1:-1:-1;;;;;25793:25:0;;;25775:4;25793:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25678:155::o;49258:98::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;49322:12:::1;:29:::0;;;::::1;-1:-1:-1::0;;;;;49322:29:0;;;::::1;::::0;;;::::1;::::0;;49258:98::o;36599:186::-;35978:12;:10;:12::i;:::-;-1:-1:-1;;;;;35967:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;35967:23:0;;35959:68;;;;-1:-1:-1;;;35959:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36682:22:0;::::1;36674:73;;;;-1:-1:-1::0;;;36674:73:0::1;;;;;;;:::i;:::-;36752:28;36771:8;36752:18;:28::i;45353:33::-:0;;;;:::o;21148:148::-;21251:40;;;21266:25;21251:40;21148:148;;;:::o;28132:110::-;28197:4;28225:12;-1:-1:-1;28215:22:0;28132:110::o;18571:89::-;18645:10;18571:89;:::o;31739:160::-;31808:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;31808:29:0;;;;;;;;:24;;31856;31808;31856:15;:24::i;:::-;-1:-1:-1;;;;;31847:47:0;;;;;;;;;;;31739:160;;:::o;41302:89::-;41360:7;41381:5;41385:1;41381;:5;:::i;29023:103::-;29094:27;29104:2;29108:8;29094:27;;;;;;;;;;;;:9;:27::i;28385:329::-;28478:4;28497:16;28505:7;28497;:16::i;:::-;28489:74;;;;-1:-1:-1;;;28489:74:0;;;;;;;:::i;:::-;28568:13;28584:24;28600:7;28584:15;:24::i;:::-;28568:40;;28632:5;-1:-1:-1;;;;;28621:16:0;:7;-1:-1:-1;;;;;28621:16:0;;:51;;;;28665:7;-1:-1:-1;;;;;28641:31:0;:20;28653:7;28641:11;:20::i;:::-;-1:-1:-1;;;;;28641:31:0;;28621:51;:87;;;;28676:32;28693:5;28700:7;28676:16;:32::i;:::-;28613:96;28385:329;-1:-1:-1;;;;28385:329:0:o;31024:615::-;31157:4;-1:-1:-1;;;;;31129:32:0;:24;31145:7;31129:15;:24::i;:::-;-1:-1:-1;;;;;31129:32:0;;31121:83;;;;-1:-1:-1;;;31121:83:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31217:16:0;;31209:66;;;;-1:-1:-1;;;31209:66:0;;;;;;;:::i;:::-;31282:39;31303:4;31309:2;31313:7;31282:20;:39::i;:::-;31374:29;31391:1;31395:7;31374:8;:29::i;:::-;-1:-1:-1;;;;;31410:15:0;;;;;;:9;:15;;;;;:20;;31429:1;;31410:15;:20;;31429:1;;31410:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31435:13:0;;;;;;:9;:13;;;;;:18;;31452:1;;31435:13;:18;;31452:1;;31435:18;:::i;:::-;;;;-1:-1:-1;;31458:16:0;;;;:7;:16;;;;;;;:21;;;;-1:-1:-1;;;;;31458:21:0;;;;;:16;31495:9;31458:16;-1:-1:-1;31495:9:0;:::i;:::-;31487:18;;;;;;;;;;;-1:-1:-1;31487:18:0;;-1:-1:-1;;;;;31487:18:0;:32;31484:66;;;31546:4;31525:7;:18;31533:9;:7;31541:1;31533:9;:::i;:::-;31525:18;;;;;;;;;;;;:25;;;;;-1:-1:-1;;;;;31525:25:0;;;;;-1:-1:-1;;;;;31525:25:0;;;;;;31484:66;31581:7;31577:2;-1:-1:-1;;;;;31562:27:0;31571:4;-1:-1:-1;;;;;31562:27:0;;;;;;;;;;;31596:38;31616:4;31622:2;31626:7;31596:19;:38::i;41956:89::-;42014:7;42035:5;42039:1;42035;:5;:::i;37829:160::-;37933:4;37980;37951:25;37964:5;37971:4;37951:12;:25::i;:::-;:33;;37829:160;-1:-1:-1;;;;37829:160:0:o;36930:170::-;37017:6;;;-1:-1:-1;;;;;37028:17:0;;;;;;;;;;;37055:40;;37017:6;;;37028:17;37017:6;;37055:40;;36998:16;;37055:40;36930:170;;:::o;41641:89::-;41699:7;41720:5;41724:1;41720;:5;:::i;32023:274::-;32151:8;-1:-1:-1;;;;;32142:17:0;:5;-1:-1:-1;;;;;32142:17:0;;;32134:56;;;;-1:-1:-1;;;32134:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32195:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;;;;;;;;;32251:41;;;;;32195:46;;32251:41;:::i;:::-;;;;;;;;32023:274;;;:::o;27572:::-;27696:28;27706:4;27712:2;27716:7;27696:9;:28::i;:::-;27737:48;27760:4;27766:2;27770:7;27779:5;27737:22;:48::i;:::-;27729:112;;;;-1:-1:-1;;;27729:112:0;;;;;;;:::i;50543:101::-;50603:13;50632:7;50625:14;;;;;:::i;18983:594::-;19039:13;19242:10;19238:38;;-1:-1:-1;19260:10:0;;;;;;;;;;;;;;;;;;;19238:38;19295:5;19280:12;19324:54;19331:9;;19324:54;;19348:8;;;;:::i;:::-;;-1:-1:-1;19362:10:0;;-1:-1:-1;19370:2:0;19362:10;;:::i;:::-;;;19324:54;;;19382:19;19414:6;19404:17;;;;;;-1:-1:-1;;;19404:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19404:17:0;;19382:39;;19426:121;19433:10;;19426:121;;19451:11;19461:1;19451:11;;:::i;:::-;;-1:-1:-1;19511:10:0;19519:2;19511:5;:10;:::i;:::-;19498:24;;:2;:24;:::i;:::-;19485:39;;19468:6;19475;19468:14;;;;;;-1:-1:-1;;;19468:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;19530:11:0;19539:2;19530:11;;:::i;:::-;;;19426:121;;29339:818;29443:20;29466:12;-1:-1:-1;;;;;29491:16:0;;29483:62;;;;-1:-1:-1;;;29483:62:0;;;;;;;:::i;:::-;29559:21;29567:12;29559:7;:21::i;:::-;29558:22;29550:64;;;;-1:-1:-1;;;29550:64:0;;;;;;;:::i;:::-;29621:61;29651:1;29655:2;29659:12;29673:8;29621:21;:61::i;:::-;-1:-1:-1;;;;;29689:13:0;;;;;;:9;:13;;;;;:25;;29706:8;;29689:13;:25;;29706:8;;29689:25;:::i;:::-;;;;-1:-1:-1;;29719:21:0;;;;:7;:21;;;;;:25;;;;-1:-1:-1;;;;;29719:25:0;;;;;:21;;29793:259;29817:8;29813:1;:12;29793:259;;;29843:38;;29868:12;;-1:-1:-1;;;;;29843:38:0;;;29860:1;;29843:38;;29860:1;;29843:38;29901:59;29932:1;29936:2;29940:12;29954:5;29901:22;:59::i;:::-;29887:139;;;;-1:-1:-1;;;29887:139:0;;;;;;;:::i;:::-;30032:14;;;;:::i;:::-;;;;29827:3;;;;;:::i;:::-;;;;29793:259;;;-1:-1:-1;30058:12:0;:27;;;30092:60;;30125:2;30129:12;30143:8;30092:20;:60::i;:::-;29339:818;;;;;:::o;38324:564::-;38407:7;38444:4;38407:7;38453:407;38477:5;:12;38473:1;:16;38453:407;;;38502:20;38525:5;38531:1;38525:8;;;;;;-1:-1:-1;;;38525:8:0;;;;;;;;;;;;;;;38502:31;;38559:12;38543;:28;38539:316;;38662:42;38677:12;38691;38662:14;:42::i;:::-;38647:57;;38539:316;;;38806:42;38821:12;38835;38806:14;:42::i;:::-;38791:57;;38539:316;-1:-1:-1;38491:3:0;;;;:::i;:::-;;;;38453:407;;;-1:-1:-1;38871:12:0;38324:564;-1:-1:-1;;;38324:564:0:o;32829:605::-;32957:4;32972:15;:2;-1:-1:-1;;;;;32972:13:0;;:15::i;:::-;32968:462;;;33015:2;-1:-1:-1;;;;;32999:36:0;;33036:12;:10;:12::i;:::-;33050:4;33056:7;33065:5;32999:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32999:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32995:401;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33208:13:0;;33204:186;;33236:61;;-1:-1:-1;;;33236:61:0;;;;;;;:::i;33204:186::-;33367:6;33361:13;33352:6;33348:2;33344:15;33337:38;32995:401;33110:51;;33120:41;33110:51;;-1:-1:-1;33103:58:0;;32968:462;-1:-1:-1;33420:4:0;32829:605;;;;;;:::o;38893:182::-;38961:13;38996:15;;;39023:4;39016:15;39061:4;39045:21;;;38990:81::o;11485:299::-;11545:4;11778:1;11756:7;-1:-1:-1;;;;;11756:12:0;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;;11485:299;-1:-1:-1;;11485:299:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:117;285:4;216:66;209:4;201:6;197:17;193:90;189:101;174:117;:::i;:::-;165:126;;314:6;307:5;300:21;354:3;345:6;340:3;336:16;333:25;330:2;;;371:1;368;361:12;330:2;420:6;415:3;408:4;401:5;397:16;384:43;474:1;467:4;458:6;451:5;447:18;443:29;436:40;90:392;;;;;:::o;487:259::-;;599:2;587:9;578:7;574:23;570:32;567:2;;;620:6;612;605:22;567:2;664:9;651:23;683:33;710:5;683:33;:::i;751:263::-;;874:2;862:9;853:7;849:23;845:32;842:2;;;895:6;887;880:22;842:2;932:9;926:16;951:33;978:5;951:33;:::i;1019:402::-;;;1148:2;1136:9;1127:7;1123:23;1119:32;1116:2;;;1169:6;1161;1154:22;1116:2;1213:9;1200:23;1232:33;1259:5;1232:33;:::i;:::-;1284:5;-1:-1:-1;1341:2:1;1326:18;;1313:32;1354:35;1313:32;1354:35;:::i;:::-;1408:7;1398:17;;;1106:315;;;;;:::o;1426:470::-;;;;1572:2;1560:9;1551:7;1547:23;1543:32;1540:2;;;1593:6;1585;1578:22;1540:2;1637:9;1624:23;1656:33;1683:5;1656:33;:::i;:::-;1708:5;-1:-1:-1;1765:2:1;1750:18;;1737:32;1778:35;1737:32;1778:35;:::i;:::-;1530:366;;1832:7;;-1:-1:-1;;;1886:2:1;1871:18;;;;1858:32;;1530:366::o;1901:830::-;;;;;2073:3;2061:9;2052:7;2048:23;2044:33;2041:2;;;2095:6;2087;2080:22;2041:2;2139:9;2126:23;2158:33;2185:5;2158:33;:::i;:::-;2210:5;-1:-1:-1;2267:2:1;2252:18;;2239:32;2280:35;2239:32;2280:35;:::i;:::-;2334:7;-1:-1:-1;2388:2:1;2373:18;;2360:32;;-1:-1:-1;2443:2:1;2428:18;;2415:32;2470:18;2459:30;;2456:2;;;2507:6;2499;2492:22;2456:2;2535:22;;2588:4;2580:13;;2576:27;-1:-1:-1;2566:2:1;;2622:6;2614;2607:22;2566:2;2650:75;2717:7;2712:2;2699:16;2694:2;2690;2686:11;2650:75;:::i;:::-;2640:85;;;2031:700;;;;;;;:::o;2736:438::-;;;2862:2;2850:9;2841:7;2837:23;2833:32;2830:2;;;2883:6;2875;2868:22;2830:2;2927:9;2914:23;2946:33;2973:5;2946:33;:::i;:::-;2998:5;-1:-1:-1;3055:2:1;3040:18;;3027:32;3097:15;;3090:23;3078:36;;3068:2;;3133:6;3125;3118:22;3179:327;;;3308:2;3296:9;3287:7;3283:23;3279:32;3276:2;;;3329:6;3321;3314:22;3276:2;3373:9;3360:23;3392:33;3419:5;3392:33;:::i;:::-;3444:5;3496:2;3481:18;;;;3468:32;;-1:-1:-1;;;3266:240:1:o;3511:1023::-;;;3665:2;3653:9;3644:7;3640:23;3636:32;3633:2;;;3686:6;3678;3671:22;3633:2;3731:9;3718:23;3764:18;3756:6;3753:30;3750:2;;;3801:6;3793;3786:22;3750:2;3829:22;;3882:4;3874:13;;3870:27;-1:-1:-1;3860:2:1;;3916:6;3908;3901:22;3860:2;3957;3944:16;3979:4;4003:65;4018:49;4064:2;4018:49;:::i;:::-;4003:65;:::i;:::-;4102:15;;;4133:12;;;;4165:11;;;4203;;;4195:20;;4191:29;;4188:42;-1:-1:-1;4185:2:1;;;4248:6;4240;4233:22;4185:2;4275:6;4266:15;;4290:163;4304:2;4301:1;4298:9;4290:163;;;4361:17;;4349:30;;4322:1;4315:9;;;;;4399:12;;;;4431;;4290:163;;;-1:-1:-1;4472:5:1;4509:18;;;;4496:32;;-1:-1:-1;;;;;;3623:911:1:o;4539:953::-;;4654:2;4697;4685:9;4676:7;4672:23;4668:32;4665:2;;;4718:6;4710;4703:22;4665:2;4763:9;4750:23;4796:18;4788:6;4785:30;4782:2;;;4833:6;4825;4818:22;4782:2;4861:22;;4914:4;4906:13;;4902:27;-1:-1:-1;4892:2:1;;4948:6;4940;4933:22;4892:2;4989;4976:16;5012:65;5027:49;5073:2;5027:49;:::i;5012:65::-;5111:15;;;5142:12;;;;5174:11;;;5212;;;5204:20;;5200:29;;5197:42;-1:-1:-1;5194:2:1;;;5257:6;5249;5242:22;5194:2;5284:6;5275:15;;5299:163;5313:2;5310:1;5307:9;5299:163;;;5370:17;;5358:30;;5331:1;5324:9;;;;;5408:12;;;;5440;;5299:163;;;-1:-1:-1;5481:5:1;4634:858;-1:-1:-1;;;;;;;4634:858:1:o;5497:190::-;;5609:2;5597:9;5588:7;5584:23;5580:32;5577:2;;;5630:6;5622;5615:22;5577:2;-1:-1:-1;5658:23:1;;5567:120;-1:-1:-1;5567:120:1:o;5692:257::-;;5803:2;5791:9;5782:7;5778:23;5774:32;5771:2;;;5824:6;5816;5809:22;5771:2;5868:9;5855:23;5887:32;5913:5;5887:32;:::i;5954:261::-;;6076:2;6064:9;6055:7;6051:23;6047:32;6044:2;;;6097:6;6089;6082:22;6044:2;6134:9;6128:16;6153:32;6179:5;6153:32;:::i;6220:482::-;;6342:2;6330:9;6321:7;6317:23;6313:32;6310:2;;;6363:6;6355;6348:22;6310:2;6408:9;6395:23;6441:18;6433:6;6430:30;6427:2;;;6478:6;6470;6463:22;6427:2;6506:22;;6559:4;6551:13;;6547:27;-1:-1:-1;6537:2:1;;6593:6;6585;6578:22;6537:2;6621:75;6688:7;6683:2;6670:16;6665:2;6661;6657:11;6621:75;:::i;6902:318::-;;6983:5;6977:12;7010:6;7005:3;6998:19;7026:63;7082:6;7075:4;7070:3;7066:14;7059:4;7052:5;7048:16;7026:63;:::i;:::-;7134:2;7122:15;7139:66;7118:88;7109:98;;;;7209:4;7105:109;;6953:267;-1:-1:-1;;6953:267:1:o;7225:264::-;7374:2;7370:15;;;;7387:66;7366:88;7354:101;;7480:2;7471:12;;7344:145::o;7494:329::-;7671:2;7667:15;;;;7684:66;7663:88;7651:101;;7777:2;7768:12;;7761:28;7814:2;7805:12;;7641:182::o;7828:470::-;;8045:6;8039:13;8061:53;8107:6;8102:3;8095:4;8087:6;8083:17;8061:53;:::i;:::-;8177:13;;8136:16;;;;8199:57;8177:13;8136:16;8233:4;8221:17;;8199:57;:::i;:::-;8272:20;;8015:283;-1:-1:-1;;;;8015:283:1:o;8303:226::-;-1:-1:-1;;;;;8467:55:1;;;;8449:74;;8437:2;8422:18;;8404:125::o;8534:513::-;;-1:-1:-1;;;;;8838:2:1;8830:6;8826:15;8815:9;8808:34;8890:2;8882:6;8878:15;8873:2;8862:9;8858:18;8851:43;;8930:6;8925:2;8914:9;8910:18;8903:34;8973:3;8968:2;8957:9;8953:18;8946:31;8994:47;9036:3;9025:9;9021:19;9013:6;8994:47;:::i;:::-;8986:55;8737:310;-1:-1:-1;;;;;;8737:310:1:o;9052:187::-;9217:14;;9210:22;9192:41;;9180:2;9165:18;;9147:92::o;9244:221::-;;9393:2;9382:9;9375:21;9413:46;9455:2;9444:9;9440:18;9432:6;9413:46;:::i;9470:349::-;9672:2;9654:21;;;9711:2;9691:18;;;9684:30;9750:27;9745:2;9730:18;;9723:55;9810:2;9795:18;;9644:175::o;9824:353::-;10026:2;10008:21;;;10065:2;10045:18;;;10038:30;10104:31;10099:2;10084:18;;10077:59;10168:2;10153:18;;9998:179::o;10182:402::-;10384:2;10366:21;;;10423:2;10403:18;;;10396:30;10462:34;10457:2;10442:18;;10435:62;10533:8;10528:2;10513:18;;10506:36;10574:3;10559:19;;10356:228::o;10589:406::-;10791:2;10773:21;;;10830:2;10810:18;;;10803:30;10869:34;10864:2;10849:18;;10842:62;10940:12;10935:2;10920:18;;10913:40;10985:3;10970:19;;10763:232::o;11000:401::-;11202:2;11184:21;;;11241:2;11221:18;;;11214:30;11280:34;11275:2;11260:18;;11253:62;11351:7;11346:2;11331:18;;11324:35;11391:3;11376:19;;11174:227::o;11406:353::-;11608:2;11590:21;;;11647:2;11627:18;;;11620:30;11686:31;11681:2;11666:18;;11659:59;11750:2;11735:18;;11580:179::o;11764:339::-;11966:2;11948:21;;;12005:2;11985:18;;;11978:30;12044:17;12039:2;12024:18;;12017:45;12094:2;12079:18;;11938:165::o;12108:346::-;12310:2;12292:21;;;12349:2;12329:18;;;12322:30;12388:24;12383:2;12368:18;;12361:52;12445:2;12430:18;;12282:172::o;12459:347::-;12661:2;12643:21;;;12700:2;12680:18;;;12673:30;12739:25;12734:2;12719:18;;12712:53;12797:2;12782:18;;12633:173::o;12811:421::-;13013:2;12995:21;;;13052:2;13032:18;;;13025:30;13091:34;13086:2;13071:18;;13064:62;13162:27;13157:2;13142:18;;13135:55;13222:3;13207:19;;12985:247::o;13237:407::-;13439:2;13421:21;;;13478:2;13458:18;;;13451:30;13517:34;13512:2;13497:18;;13490:62;13588:13;13583:2;13568:18;;13561:41;13634:3;13619:19;;13411:233::o;13649:402::-;13851:2;13833:21;;;13890:2;13870:18;;;13863:30;13929:34;13924:2;13909:18;;13902:62;14000:8;13995:2;13980:18;;13973:36;14041:3;14026:19;;13823:228::o;14056:336::-;14258:2;14240:21;;;14297:2;14277:18;;;14270:30;14336:14;14331:2;14316:18;;14309:42;14383:2;14368:18;;14230:162::o;14397:402::-;14599:2;14581:21;;;14638:2;14618:18;;;14611:30;14677:34;14672:2;14657:18;;14650:62;14748:8;14743:2;14728:18;;14721:36;14789:3;14774:19;;14571:228::o;14804:350::-;15006:2;14988:21;;;15045:2;15025:18;;;15018:30;15084:28;15079:2;15064:18;;15057:56;15145:2;15130:18;;14978:176::o;15159:356::-;15361:2;15343:21;;;15380:18;;;15373:30;15439:34;15434:2;15419:18;;15412:62;15506:2;15491:18;;15333:182::o;15520:411::-;15722:2;15704:21;;;15761:2;15741:18;;;15734:30;15800:34;15795:2;15780:18;;15773:62;15871:17;15866:2;15851:18;;15844:45;15921:3;15906:19;;15694:237::o;15936:350::-;16138:2;16120:21;;;16177:2;16157:18;;;16150:30;16216:28;16211:2;16196:18;;16189:56;16277:2;16262:18;;16110:176::o;16291:414::-;16493:2;16475:21;;;16532:2;16512:18;;;16505:30;16571:34;16566:2;16551:18;;16544:62;16642:20;16637:2;16622:18;;16615:48;16695:3;16680:19;;16465:240::o;16710:346::-;16912:2;16894:21;;;16951:2;16931:18;;;16924:30;16990:24;16985:2;16970:18;;16963:52;17047:2;17032:18;;16884:172::o;17061:398::-;17263:2;17245:21;;;17302:2;17282:18;;;17275:30;17341:34;17336:2;17321:18;;17314:62;17412:4;17407:2;17392:18;;17385:32;17449:3;17434:19;;17235:224::o;17464:415::-;17666:2;17648:21;;;17705:2;17685:18;;;17678:30;17744:34;17739:2;17724:18;;17717:62;17815:21;17810:2;17795:18;;17788:49;17869:3;17854:19;;17638:241::o;17884:353::-;18086:2;18068:21;;;18125:2;18105:18;;;18098:30;18164:31;18159:2;18144:18;;18137:59;18228:2;18213:18;;18058:179::o;18242:345::-;18444:2;18426:21;;;18483:2;18463:18;;;18456:30;18522:23;18517:2;18502:18;;18495:51;18578:2;18563:18;;18416:171::o;18592:397::-;18794:2;18776:21;;;18833:2;18813:18;;;18806:30;18872:34;18867:2;18852:18;;18845:62;18943:3;18938:2;18923:18;;18916:31;18979:3;18964:19;;18766:223::o;18994:351::-;19196:2;19178:21;;;19235:2;19215:18;;;19208:30;19274:29;19269:2;19254:18;;19247:57;19336:2;19321:18;;19168:177::o;19350:338::-;19552:2;19534:21;;;19591:2;19571:18;;;19564:30;19630:16;19625:2;19610:18;;19603:44;19679:2;19664:18;;19524:164::o;19693:411::-;19895:2;19877:21;;;19934:2;19914:18;;;19907:30;19973:34;19968:2;19953:18;;19946:62;20044:17;20039:2;20024:18;;20017:45;20094:3;20079:19;;19867:237::o;20109:409::-;20311:2;20293:21;;;20350:2;20330:18;;;20323:30;20389:34;20384:2;20369:18;;20362:62;20460:15;20455:2;20440:18;;20433:43;20508:3;20493:19;;20283:235::o;20523:409::-;20725:2;20707:21;;;20764:2;20744:18;;;20737:30;20803:34;20798:2;20783:18;;20776:62;20874:15;20869:2;20854:18;;20847:43;20922:3;20907:19;;20697:235::o;20937:343::-;21139:2;21121:21;;;21178:2;21158:18;;;21151:30;21217:21;21212:2;21197:18;;21190:49;21271:2;21256:18;;21111:169::o;21285:177::-;21431:25;;;21419:2;21404:18;;21386:76::o;21467:251::-;21537:2;21531:9;21567:17;;;21614:18;21599:34;;21635:22;;;21596:62;21593:2;;;21661:18;;:::i;:::-;21697:2;21690:22;21511:207;;-1:-1:-1;21511:207:1:o;21723:192::-;;21822:18;21814:6;21811:30;21808:2;;;21844:18;;:::i;:::-;-1:-1:-1;21904:4:1;21885:17;;;21881:28;;21798:117::o;21920:128::-;;21991:1;21987:6;21984:1;21981:13;21978:2;;;21997:18;;:::i;:::-;-1:-1:-1;22033:9:1;;21968:80::o;22053:120::-;;22119:1;22109:2;;22124:18;;:::i;:::-;-1:-1:-1;22158:9:1;;22099:74::o;22178:228::-;;22344:1;22276:66;22272:74;22269:1;22266:81;22261:1;22254:9;22247:17;22243:105;22240:2;;;22351:18;;:::i;:::-;-1:-1:-1;22391:9:1;;22230:176::o;22411:125::-;;22479:1;22476;22473:8;22470:2;;;22484:18;;:::i;:::-;-1:-1:-1;22521:9:1;;22460:76::o;22541:258::-;22613:1;22623:113;22637:6;22634:1;22631:13;22623:113;;;22713:11;;;22707:18;22694:11;;;22687:39;22659:2;22652:10;22623:113;;;22754:6;22751:1;22748:13;22745:2;;;-1:-1:-1;;22789:1:1;22771:16;;22764:27;22594:205::o;22804:196::-;;22871:5;22861:2;;22880:18;;:::i;:::-;-1:-1:-1;22927:66:1;22916:78;;22851:149::o;23005:437::-;23090:1;23080:12;;23137:1;23127:12;;;23148:2;;23202:4;23194:6;23190:17;23180:27;;23148:2;23255;23247:6;23244:14;23224:18;23221:38;23218:2;;;-1:-1:-1;;;23289:1:1;23282:88;23393:4;23390:1;23383:15;23421:4;23418:1;23411:15;23218:2;;23060:382;;;:::o;23447:195::-;;23517:66;23510:5;23507:77;23504:2;;;23587:18;;:::i;:::-;-1:-1:-1;23634:1:1;23623:13;;23494:148::o;23647:112::-;;23705:1;23695:2;;23710:18;;:::i;:::-;-1:-1:-1;23744:9:1;;23685:74::o;23764:184::-;-1:-1:-1;;;23813:1:1;23806:88;23913:4;23910:1;23903:15;23937:4;23934:1;23927:15;23953:184;-1:-1:-1;;;24002:1:1;23995:88;24102:4;24099:1;24092:15;24126:4;24123:1;24116:15;24142:184;-1:-1:-1;;;24191:1:1;24184:88;24291:4;24288:1;24281:15;24315:4;24312:1;24305:15;24331:156;-1:-1:-1;;;;;24412:5:1;24408:54;24401:5;24398:65;24388:2;;24477:1;24474;24467:12;24492:179;24579:66;24572:5;24568:78;24561:5;24558:89;24548:2;;24661:1;24658;24651:12

Swarm Source

ipfs://7a22df7f68a496a33697571902d2346760033d22c8991c7b01d36f3e05a09d28
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.