Token Mars Wasteland
Overview ERC-721
Total Supply:
132,402 MarsWasteland
Holders:
669 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MarsWasteland
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-05 */ // SPDX-License-Identifier: MIT LICENSE // Interface //////////// 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); } pragma solidity ^0.8.0; /** * @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; } pragma solidity ^0.8.0; /** * @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); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @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); } pragma solidity ^0.8.0; interface IMarsWasteland { // struct to store each token's traits struct RobotSlime { bool isRobot; uint8 head; uint8 eyes; uint8 mouth; uint8 body; uint8 equipment; uint8 alphaIndex; } function getPaidTokens() external view returns (uint256); function getTokenTraits(uint256 tokenId) external view returns (RobotSlime memory); } pragma solidity ^0.8.0; interface ITraits { function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; interface ISupplyStation { function addManyToStationAndPack(address account, uint32[] calldata tokenIds) external; function randomSlimeOwner(uint256 seed) external view returns (address); } pragma solidity ^0.8.0; interface ICore { function burn(address from, uint256 amount) external; } pragma solidity ^0.8.0; interface IERC20 { /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); } // Library ////////// pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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); } } } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _ALPHABET = "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] = _ALPHABET[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // Abstract contract //////////////////// pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // 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), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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 = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev 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), "ERC721: 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), "ERC721: 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 ERC721 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), "ERC721: 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 _owners[tokenId] != address(0); } /** * @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), "ERC721: operator query for nonexistent token"); address owner = ERC721.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 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @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 = ERC721.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); } /** * @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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(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(ERC721.ownerOf(tokenId), to, tokenId); } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @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 {} } pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // RobotSlime ///////////// pragma solidity ^0.8.0; contract MarsWasteland is IMarsWasteland, ERC721Enumerable, Ownable, Pausable { // mint price uint256 public MINT_PRICE = 30 ether; // max number of tokens that can be minted - 150,000 in production uint256 public immutable MAX_TOKENS; // number of tokens that can be minted using FTM - 20% of MAX_TOKENS uint256 public PAID_TOKENS; // number of tokens have been minted so far uint32 public minted; // mapping from tokenId to a struct containing the token's traits mapping(uint256 => RobotSlime) public tokenTraits; // mapping from hashed(tokenTrait) to the tokenId it's associated with // used to ensure there are no duplicates mapping(uint256 => uint256) public existingCombinations; // list of probabilities for each trait type // 0 - 5 are associated with Robots, 6 - 11 are associated with Slimes uint8[][12] public rarities; // list of aliases for Walker's Alias algorithm // 0 - 5 are associated with Robots, 6 - 11 are associated with Slimes uint8[][12] public aliases; // reference to Supply Station ISupplyStation public supplyStation; // reference to CORE; ICore public core; // reference to Traits ITraits public traits; event mintCardEvent(address to, uint256 tokenid); /** * instantiates contract and rarity tables */ constructor( uint256 maxTokens_ ) ERC721("Mars Wasteland", "MarsWasteland") { MAX_TOKENS = maxTokens_; PAID_TOKENS = maxTokens_ / 5; // I know this looks weird but it saves users gas by making lookup O(1) // A.J. Walker's Alias Algorithm // Robot // head rarities[0] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[0] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // eye rarities[1] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[1] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // mouth rarities[2] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[2] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; //body rarities[3] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[3] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // equipment rarities[4] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[4] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // alphaIndex rarities[5] = [255, 5, 154, 50]; aliases[5] = [0, 0, 1, 1]; // Slime // head rarities[6] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[6] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // eye rarities[7] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[7] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // mouth rarities[8] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[8] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // body rarities[9] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[9] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // equipement rarities[10] = [ 190, 215, 240, 100, 110, 135, 160, 185, 80 , 210, 235, 240, 80, 80, 100, 100, 100, 245, 250, 255 ]; aliases[10] = [ 1 , 2 , 4 , 0 , 5 , 6 , 7 , 9 , 0 , 10, 11, 17, 0 , 0 , 0 , 0 , 4 , 18, 19, 19 ]; // alphaIndex rarities[11] = [8, 160, 73, 255]; aliases[11] = [2, 3, 3, 3]; } /** EXTERNAL */ /** * mint a token - 90% Robots, 10% Slimes * The first 20% are minted using FTM, the remaining cost $CORE */ function mint(uint256 amount, bool stake) external payable whenNotPaused returns(uint32[] memory) { address sender = _msgSender(); require(tx.origin == sender, "Only EOA"); require(minted + amount <= MAX_TOKENS, "All tokens minted"); require(amount > 0 && amount <= 30, "Invalid mint amount"); if (minted < PAID_TOKENS) { require( minted + amount <= PAID_TOKENS, "All tokens on-sale already sold" ); require(amount * MINT_PRICE == msg.value, "Invalid payment amount"); } else { require(msg.value == 0); } uint256 totalCoreCost = 0; uint32[] memory tokenIds = new uint32[](amount); uint256 seed; for (uint256 i = 0; i < amount; i++) { minted++; seed = random(minted + block.timestamp); generate(minted, seed); address recipient = selectRecipient(seed); if (recipient != sender) { _safeMint(recipient, minted); emit mintCardEvent(sender, 0); } else { if(stake) { _safeMint(address(supplyStation), minted); } else { _safeMint(recipient, minted); } tokenIds[i] = minted; emit mintCardEvent(sender, minted); } totalCoreCost += mintCost(minted); } if (totalCoreCost > 0) core.burn(sender, totalCoreCost); if (stake) supplyStation.addManyToStationAndPack(sender, tokenIds); return tokenIds; } /** * the first 20% are paid in FTM * the next 20% are 20000 $CORE * the next 40% are 40000 $CORE * the final 20% are 80000 $CORE * @param tokenId the ID to check the cost of to mint * @return the cost of the given token ID */ function mintCost(uint256 tokenId) public view returns (uint256) { if (tokenId <= PAID_TOKENS) return 0; if (tokenId <= MAX_TOKENS * 2 / 5) return 20000 ether; if (tokenId <= MAX_TOKENS * 4 / 5) return 40000 ether; return 80000 ether; } function transferFrom( address from, address to, uint256 tokenId ) public virtual override { // Hardcode the SupplyStation's approval so that users don't have to waste gas approving if (_msgSender() != address(supplyStation)) require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** INTERNAL */ /** * generates traits for a specific token, checking to make sure it's unique * @param tokenId the id of the token to generate traits for * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of traits for the given token ID */ function generate(uint256 tokenId, uint256 seed) internal returns (RobotSlime memory t) { t = selectTraits(seed); if (existingCombinations[structToHash(t)] == 0) { tokenTraits[tokenId] = t; existingCombinations[structToHash(t)] = tokenId; return t; } return generate(tokenId, random(seed)); } /** * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup * ensuring O(1) instead of O(n) reduces mint cost by more than 50% * probability & alias tables are generated off-chain beforehand * @param seed portion of the 256 bit seed to remove trait correlation * @param traitType the trait type to select a trait for * @return the ID of the randomly selected trait */ function selectTrait(uint16 seed, uint8 traitType) internal view returns (uint8) { uint8 trait = uint8(seed) % uint8(rarities[traitType].length); if (seed >> 8 < rarities[traitType][trait]) return trait; return aliases[traitType][trait]; } /** * selects the species and all of its traits based on the seed value * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of randomly selected traits */ function selectTraits(uint256 seed) internal view returns (RobotSlime memory t) { t.isRobot = (seed & 0xFFFF) % 10 != 0; uint8 shift = t.isRobot ? 0 : 6; seed >>= 16; t.head = selectTrait(uint16(seed & 0xFFFF), 0 + shift); seed >>= 16; t.eyes = selectTrait(uint16(seed & 0xFFFF), 1 + shift); seed >>= 16; t.mouth = selectTrait(uint16(seed & 0xFFFF), 2 + shift); seed >>= 16; t.body = selectTrait(uint16(seed & 0xFFFF), 3 + shift); seed >>= 16; t.equipment = selectTrait(uint16(seed & 0xFFFF), 4 + shift); seed >>= 16; t.alphaIndex = selectTrait(uint16(seed & 0xFFFF), 5 + shift); } /** * the first 20% (FTM purchases) go to the minter * the remaining 80% have a 10% chance to be given to a random staked wolf * @param seed a random value to select a recipient from * @return the address of the recipient (either the minter or the Wolf thief's owner) */ function selectRecipient(uint256 seed) internal view returns (address) { if (minted <= PAID_TOKENS || ((seed >> 245) % 10) != 0) return _msgSender(); // top 10 bits haven't been used address thief = supplyStation.randomSlimeOwner(seed >> 144); // 144 bits reserved for trait selection if (thief == address(0x0)) return _msgSender(); return thief; } /** * converts a struct to a 256 bit hash to check for uniqueness * @param s the struct to pack into a hash * @return the 256 bit hash of the struct */ function structToHash(RobotSlime memory s) internal pure returns (uint256) { return uint256( keccak256( abi.encodePacked( s.isRobot, s.head, s.eyes, s.mouth, s.body, s.equipment, s.alphaIndex ) ) ); } /** * generates a pseudorandom number * @param seed a value ensure different outcomes for different sources in the same block * @return a pseudorandom value */ function random(uint256 seed) internal view returns (uint256) { return uint256( keccak256( abi.encodePacked( tx.origin, blockhash(block.number - 1), block.timestamp, seed ) ) ); } /** READ */ function getTokenTraits(uint256 tokenId) external view override returns (RobotSlime memory) { return tokenTraits[tokenId]; } function getPaidTokens() external view override returns (uint256) { return PAID_TOKENS; } function tokenUriOfOwnerByIndex(address owner, uint256 index) public view returns (string memory) { uint256 token_id = tokenOfOwnerByIndex(owner, index); string memory token_uri = _getTokenURI(token_id); return token_uri; } /** ADMIN */ function setMintPrice(uint256 price_) external onlyOwner { MINT_PRICE = price_; } function setPaidTokens(uint256 amount_) external onlyOwner { PAID_TOKENS = amount_; } function setSupplyStation(address supply_) external onlyOwner { supplyStation = ISupplyStation(supply_); } function setCore(address core_) external onlyOwner { core = ICore(core_); } function setTraits(address traits_) external onlyOwner { traits = ITraits(traits_); } /** * enables owner to pause / unpause minting */ function setPaused(bool _paused) external onlyOwner { if (_paused) _pause(); else _unpause(); } /** * allows owner to withdraw funds from minting */ function withdraw(address payable recipient_) external onlyOwner { recipient_.transfer(address(this).balance); } function withdrawToken(address token_, address recipient_) external onlyOwner { uint256 amount = IERC20(token_).balanceOf(address(this)); IERC20(token_).transfer(recipient_, amount); } /** RENDER */ function tokenURI(uint256 tokenId) public view override returns (string memory) { string memory token_uri = _getTokenURI(tokenId); return token_uri; } function _getTokenURI(uint256 tokenId) internal view returns(string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return traits.tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxTokens_","type":"uint256"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"mintCardEvent","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAID_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"core","outputs":[{"internalType":"contract ICore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaidTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraits","outputs":[{"components":[{"internalType":"bool","name":"isRobot","type":"bool"},{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"equipment","type":"uint8"},{"internalType":"uint8","name":"alphaIndex","type":"uint8"}],"internalType":"struct IMarsWasteland.RobotSlime","name":"","type":"tuple"}],"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":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mint","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"address","name":"core_","type":"address"}],"name":"setCore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setPaidTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"supply_","type":"address"}],"name":"setSupplyStation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"traits_","type":"address"}],"name":"setTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyStation","outputs":[{"internalType":"contract ISupplyStation","name":"","type":"address"}],"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":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraits","outputs":[{"internalType":"bool","name":"isRobot","type":"bool"},{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"equipment","type":"uint8"},{"internalType":"uint8","name":"alphaIndex","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenUriOfOwnerByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITraits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient_","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526801a055690d9db80000600b553480156200001e57600080fd5b506040516200782c3803806200782c833981810160405281019062000044919062001944565b6040518060400160405280600e81526020017f4d6172732057617374656c616e640000000000000000000000000000000000008152506040518060400160405280600d81526020017f4d61727357617374656c616e64000000000000000000000000000000000000008152508160009080519060200190620000c892919062001721565b508060019080519060200190620000e192919062001721565b50505062000104620000f86200165360201b60201c565b6200165b60201b60201c565b6000600a60146101000a81548160ff021916908315150217905550806080818152505060058162000136919062001976565b600c8190555060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106000600c811062000225576200022462001a4c565b5b0190601462000236929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6000600c811062000321576200032062001a4c565b5b0190601462000332929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106001600c81106200041c576200041b62001a4c565b5b019060146200042d929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6001600c811062000518576200051762001a4c565b5b0190601462000529929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106002600c811062000613576200061262001a4c565b5b0190601462000624929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6002600c81106200070f576200070e62001a4c565b5b0190601462000720929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106003600c81106200080a576200080962001a4c565b5b019060146200081b929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6003600c811062000906576200090562001a4c565b5b0190601462000917929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106004600c811062000a015762000a0062001a4c565b5b0190601462000a12929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6004600c811062000afd5762000afc62001a4c565b5b0190601462000b0e929190620017b2565b50604051806080016040528060ff80168152602001600560ff168152602001609a60ff168152602001603260ff1681525060106005600c811062000b575762000b5662001a4c565b5b0190600462000b6892919062001860565b506040518060800160405280600060ff168152602001600060ff168152602001600160ff168152602001600160ff16815250601c6005600c811062000bb25762000bb162001a4c565b5b0190600462000bc392919062001860565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106006600c811062000cad5762000cac62001a4c565b5b0190601462000cbe929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6006600c811062000da95762000da862001a4c565b5b0190601462000dba929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106007600c811062000ea45762000ea362001a4c565b5b0190601462000eb5929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6007600c811062000fa05762000f9f62001a4c565b5b0190601462000fb1929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106008600c81106200109b576200109a62001a4c565b5b01906014620010ac929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6008600c811062001197576200119662001a4c565b5b01906014620011a8929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff801681525060106009600c811062001292576200129162001a4c565b5b01906014620012a3929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c6009600c81106200138e576200138d62001a4c565b5b019060146200139f929190620017b2565b5060405180610280016040528060be60ff16815260200160d760ff16815260200160f060ff168152602001606460ff168152602001606e60ff168152602001608760ff16815260200160a060ff16815260200160b960ff168152602001605060ff16815260200160d260ff16815260200160eb60ff16815260200160f060ff168152602001605060ff168152602001605060ff168152602001606460ff168152602001606460ff168152602001606460ff16815260200160f560ff16815260200160fa60ff16815260200160ff80168152506010600a600c811062001489576200148862001a4c565b5b019060146200149a929190620017b2565b50604051806102800160405280600160ff168152602001600260ff168152602001600460ff168152602001600060ff168152602001600560ff168152602001600660ff168152602001600760ff168152602001600960ff168152602001600060ff168152602001600a60ff168152602001600b60ff168152602001601160ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600460ff168152602001601260ff168152602001601360ff168152602001601360ff16815250601c600a600c811062001585576200158462001a4c565b5b0190601462001596929190620017b2565b506040518060800160405280600860ff16815260200160a060ff168152602001604960ff16815260200160ff80168152506010600b600c8110620015df57620015de62001a4c565b5b01906004620015f092919062001860565b506040518060800160405280600260ff168152602001600360ff168152602001600360ff168152602001600360ff16815250601c600b600c81106200163a576200163962001a4c565b5b019060046200164b92919062001860565b505062001a9a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200172f90620019b8565b90600052602060002090601f0160209004810192826200175357600085556200179f565b82601f106200176e57805160ff19168380011785556200179f565b828001600101855582156200179f579182015b828111156200179e57825182559160200191906001019062001781565b5b509050620017ae91906200190e565b5090565b82805482825590600052602060002090601f016020900481019282156200184d5791602002820160005b838211156200181c57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620017dc565b80156200184b5782816101000a81549060ff02191690556001016020816000010492830192600103026200181c565b505b5090506200185c91906200190e565b5090565b82805482825590600052602060002090601f01602090048101928215620018fb5791602002820160005b83821115620018ca57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200188a565b8015620018f95782816101000a81549060ff0219169055600101602081600001049283019260010302620018ca565b505b5090506200190a91906200190e565b5090565b5b80821115620019295760008160009055506001016200190f565b5090565b6000815190506200193e8162001a80565b92915050565b6000602082840312156200195d576200195c62001a7b565b5b60006200196d848285016200192d565b91505092915050565b60006200198382620019ae565b91506200199083620019ae565b925082620019a357620019a2620019ee565b5b828204905092915050565b6000819050919050565b60006002820490506001821680620019d157607f821691505b60208210811415620019e857620019e762001a1d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b62001a8b81620019ae565b811462001a9757600080fd5b50565b608051615d6162001acb60003960008181610f0901528181610f5a0152818161161101526125cd0152615d616000f3fe6080604052600436106102675760003560e01c80636f4f736611610144578063c002d23d116100b6578063e1fc334f1161007a578063e1fc334f146109a9578063e985e9c5146109d4578063f2f4eb2614610a11578063f2fde38b14610a3c578063f47c84c514610a65578063f4a0a52814610a9057610267565b8063c002d23d146108aa578063c084f540146108d5578063c87b56dd14610900578063ceefe16b1461093d578063e05c57bf1461096657610267565b80638da5cb5b116101085780638da5cb5b1461078857806394e56847146107b357806395d89b41146107f0578063a1b8f3741461081b578063a22cb46514610858578063b88d4fde1461088157610267565b80636f4f7366146106b7578063705df875146106e057806370a082311461070b578063715018a614610748578063800096301461075f57610267565b80633431a753116101dd5780634f02c420116101a15780634f02c4201461058e5780634f6ccce7146105b957806351cff8d9146105f65780635c975abb1461061f5780636352211e1461064a57806367f68fac1461068757610267565b80633431a753146104ab57806336838391146104d45780633aeac4e1146105115780634018b1f81461053a57806342842e0e1461056557610267565b806318160ddd1161022f57806318160ddd146103635780631bc9fba31461038e57806323b872dd146103cb57806327de8f27146103f45780632f745c591461043157806333df4b2c1461046e57610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806316c38b3c1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906141d0565b610ab9565b6040516102a09190614b67565b60405180910390f35b3480156102b557600080fd5b506102be610b33565b6040516102cb9190614c42565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190614273565b610bc5565b6040516103089190614a33565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190614136565b610c4a565b005b34801561034657600080fd5b50610361600480360381019061035c9190614176565b610d62565b005b34801561036f57600080fd5b50610378610dfd565b6040516103859190614f9f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614136565b610e0a565b6040516103c29190614c42565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190614020565b610e32565b005b34801561040057600080fd5b5061041b60048036038101906104169190614273565b610eef565b6040516104289190614f9f565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190614136565b610fb8565b6040516104659190614f9f565b60405180910390f35b34801561047a57600080fd5b506104956004803603810190610490919061430d565b61105d565b6040516104a29190614fd5565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190614273565b6110a3565b005b3480156104e057600080fd5b506104fb60048036038101906104f6919061430d565b611129565b6040516105089190614fd5565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613fe0565b61116f565b005b34801561054657600080fd5b5061054f61130b565b60405161055c9190614f9f565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190614020565b611315565b005b34801561059a57600080fd5b506105a3611335565b6040516105b09190614fba565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190614273565b61134b565b6040516105ed9190614f9f565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613fb3565b6113bc565b005b34801561062b57600080fd5b50610634611482565b6040516106419190614b67565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190614273565b611499565b60405161067e9190614a33565b60405180910390f35b6106a1600480360381019061069c91906142cd565b61154b565b6040516106ae9190614b45565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190613f59565b611bdf565b005b3480156106ec57600080fd5b506106f5611c9f565b6040516107029190614c0c565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190613f59565b611cc5565b60405161073f9190614f9f565b60405180910390f35b34801561075457600080fd5b5061075d611d7d565b005b34801561076b57600080fd5b5061078660048036038101906107819190613f59565b611e05565b005b34801561079457600080fd5b5061079d611ec5565b6040516107aa9190614a33565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190614273565b611eef565b6040516107e79190614f84565b60405180910390f35b3480156107fc57600080fd5b50610805611fe5565b6040516108129190614c42565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190614273565b612077565b60405161084f9190614f9f565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a91906140f6565b61208f565b005b34801561088d57600080fd5b506108a860048036038101906108a39190614073565b612210565b005b3480156108b657600080fd5b506108bf612272565b6040516108cc9190614f9f565b60405180910390f35b3480156108e157600080fd5b506108ea612278565b6040516108f79190614f9f565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190614273565b61227e565b6040516109349190614c42565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f9190613f59565b612296565b005b34801561097257600080fd5b5061098d60048036038101906109889190614273565b612356565b6040516109a09796959493929190614b82565b60405180910390f35b3480156109b557600080fd5b506109be6123f3565b6040516109cb9190614c27565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f69190613fe0565b612419565b604051610a089190614b67565b60405180910390f35b348015610a1d57600080fd5b50610a266124ad565b604051610a339190614bf1565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e9190613f59565b6124d3565b005b348015610a7157600080fd5b50610a7a6125cb565b604051610a879190614f9f565b60405180910390f35b348015610a9c57600080fd5b50610ab76004803603810190610ab29190614273565b6125ef565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2c5750610b2b82612675565b5b9050919050565b606060008054610b42906153b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6e906153b3565b8015610bbb5780601f10610b9057610100808354040283529160200191610bbb565b820191906000526020600020905b815481529060010190602001808311610b9e57829003601f168201915b5050505050905090565b6000610bd082612757565b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690614e84565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5582611499565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90614f04565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce56127c3565b73ffffffffffffffffffffffffffffffffffffffff161480610d145750610d1381610d0e6127c3565b612419565b5b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614e04565b60405180910390fd5b610d5d83836127cb565b505050565b610d6a6127c3565b73ffffffffffffffffffffffffffffffffffffffff16610d88611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd590614ea4565b60405180910390fd5b8015610df157610dec612884565b610dfa565b610df9612927565b5b50565b6000600880549050905090565b60606000610e188484610fb8565b90506000610e25826129c9565b9050809250505092915050565b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e736127c3565b73ffffffffffffffffffffffffffffffffffffffff1614610edf57610e9f610e996127c3565b82612aca565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614f24565b60405180910390fd5b5b610eea838383612ba8565b505050565b6000600c548211610f035760009050610fb3565b600560027f0000000000000000000000000000000000000000000000000000000000000000610f3291906151a6565b610f3c9190615175565b8211610f545769043c33c19375648000009050610fb3565b600560047f0000000000000000000000000000000000000000000000000000000000000000610f8391906151a6565b610f8d9190615175565b8211610fa557690878678326eac90000009050610fb3565b6910f0cf064dd59200000090505b919050565b6000610fc383611cc5565b8210611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb90614c84565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601082600c811061106d57600080fd5b01818154811061107c57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6110ab6127c3565b73ffffffffffffffffffffffffffffffffffffffff166110c9611ec5565b73ffffffffffffffffffffffffffffffffffffffff161461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690614ea4565b60405180910390fd5b80600c8190555050565b601c82600c811061113957600080fd5b01818154811061114857600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6111776127c3565b73ffffffffffffffffffffffffffffffffffffffff16611195611ec5565b73ffffffffffffffffffffffffffffffffffffffff16146111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290614ea4565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112269190614a33565b60206040518083038186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127691906142a0565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016112b3929190614af3565b602060405180830381600087803b1580156112cd57600080fd5b505af11580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130591906141a3565b50505050565b6000600c54905090565b61133083838360405180602001604052806000815250612210565b505050565b600d60009054906101000a900463ffffffff1681565b6000611355610dfd565b8210611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90614f64565b60405180910390fd5b600882815481106113aa576113a9615606565b5b90600052602060002001549050919050565b6113c46127c3565b73ffffffffffffffffffffffffffffffffffffffff166113e2611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614ea4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561147e573d6000803e3d6000fd5b5050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990614e44565b60405180910390fd5b80915050919050565b6060611555611482565b15611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90614de4565b60405180910390fd5b600061159f6127c3565b90508073ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690614d44565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000084600d60009054906101000a900463ffffffff1663ffffffff1661165491906150e8565b1115611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90614ce4565b60405180910390fd5b6000841180156116a65750601e8411155b6116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90614f44565b60405180910390fd5b600c54600d60009054906101000a900463ffffffff1663ffffffff1610156117c357600c5484600d60009054906101000a900463ffffffff1663ffffffff1661172e91906150e8565b111561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614dc4565b60405180910390fd5b34600b548561177e91906151a6565b146117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590614d24565b60405180910390fd5b6117d1565b600034146117d057600080fd5b5b6000808567ffffffffffffffff8111156117ee576117ed615635565b5b60405190808252806020026020018201604052801561181c5781602001602082028036833780820191505090505b509050600080600090505b87811015611aa257600d600081819054906101000a900463ffffffff16809291906118519061545f565b91906101000a81548163ffffffff021916908363ffffffff1602179055505061189c42600d60009054906101000a900463ffffffff1663ffffffff1661189791906150e8565b612e04565b91506118c0600d60009054906101000a900463ffffffff1663ffffffff1683612e4a565b5060006118cc83612fbe565b90508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119625761192381600d60009054906101000a900463ffffffff1663ffffffff16613110565b7f7a0a508be70b7153767300bb87b46461afdddca3273e4817cc53827a170fb5b5866000604051611955929190614aca565b60405180910390a1611a60565b87156119b1576119ac602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900463ffffffff1663ffffffff16613110565b6119d4565b6119d381600d60009054906101000a900463ffffffff1663ffffffff16613110565b5b600d60009054906101000a900463ffffffff168483815181106119fa576119f9615606565b5b602002602001019063ffffffff16908163ffffffff16815250507f7a0a508be70b7153767300bb87b46461afdddca3273e4817cc53827a170fb5b586600d60009054906101000a900463ffffffff16604051611a57929190614b1c565b60405180910390a15b611a81600d60009054906101000a900463ffffffff1663ffffffff16610eef565b85611a8c91906150e8565b9450508080611a9a90615416565b915050611827565b506000831115611b3c57602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac85856040518363ffffffff1660e01b8152600401611b09929190614af3565b600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b505050505b8515611bd257602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f723ad685846040518363ffffffff1660e01b8152600401611b9f929190614a9a565b600060405180830381600087803b158015611bb957600080fd5b505af1158015611bcd573d6000803e3d6000fd5b505050505b8194505050505092915050565b611be76127c3565b73ffffffffffffffffffffffffffffffffffffffff16611c05611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614ea4565b60405180910390fd5b80602a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d90614e24565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d856127c3565b73ffffffffffffffffffffffffffffffffffffffff16611da3611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614611df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df090614ea4565b60405180910390fd5b611e03600061312e565b565b611e0d6127c3565b73ffffffffffffffffffffffffffffffffffffffff16611e2b611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7890614ea4565b60405180910390fd5b80602960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ef7613d6b565b600e60008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050919050565b606060018054611ff4906153b3565b80601f0160208091040260200160405190810160405280929190818152602001828054612020906153b3565b801561206d5780601f106120425761010080835404028352916020019161206d565b820191906000526020600020905b81548152906001019060200180831161205057829003601f168201915b5050505050905090565b600f6020528060005260406000206000915090505481565b6120976127c3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90614d84565b60405180910390fd5b80600560006121126127c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121bf6127c3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122049190614b67565b60405180910390a35050565b61222161221b6127c3565b83612aca565b612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614f24565b60405180910390fd5b61226c848484846131f4565b50505050565b600b5481565b600c5481565b6060600061228b836129c9565b905080915050919050565b61229e6127c3565b73ffffffffffffffffffffffffffffffffffffffff166122bc611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614612312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230990614ea4565b60405180910390fd5b80602860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900460ff16908060000160049054906101000a900460ff16908060000160059054906101000a900460ff16908060000160069054906101000a900460ff16905087565b602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124db6127c3565b73ffffffffffffffffffffffffffffffffffffffff166124f9611ec5565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690614ea4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b690614cc4565b60405180910390fd5b6125c88161312e565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6125f76127c3565b73ffffffffffffffffffffffffffffffffffffffff16612615611ec5565b73ffffffffffffffffffffffffffffffffffffffff161461266b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266290614ea4565b60405180910390fd5b80600b8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061274057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612750575061274f82613250565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661283e83611499565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61288c611482565b156128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c390614de4565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129106127c3565b60405161291d9190614a33565b60405180910390a1565b61292f611482565b61296e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296590614c64565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129b26127c3565b6040516129bf9190614a33565b60405180910390a1565b60606129d482612757565b612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a90614ee4565b60405180910390fd5b602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b8152600401612a6e9190614f9f565b60006040518083038186803b158015612a8657600080fd5b505afa158015612a9a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612ac3919061422a565b9050919050565b6000612ad582612757565b612b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0b90614da4565b60405180910390fd5b6000612b1f83611499565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b8e57508373ffffffffffffffffffffffffffffffffffffffff16612b7684610bc5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b9f5750612b9e8185612419565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bc882611499565b73ffffffffffffffffffffffffffffffffffffffff1614612c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1590614ec4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8590614d64565b60405180910390fd5b612c998383836132ba565b612ca46000826127cb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cf49190615200565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4b91906150e8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600032600143612e149190615200565b404284604051602001612e2a9493929190614964565b6040516020818303038152906040528051906020012060001c9050919050565b612e52613d6b565b612e5b826133ce565b90506000600f6000612e6c84613543565b8152602001908152602001600020541415612fa35780600e600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555090505082600f6000612f8c84613543565b815260200190815260200160002081905550612fb8565b612fb583612fb084612e04565b612e4a565b90505b92915050565b6000600c54600d60009054906101000a900463ffffffff1663ffffffff16111580612ffa57506000600a60f584901c612ff791906154e8565b14155b1561300e576130076127c3565b905061310b565b6000602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637907de93609085901c6040518263ffffffff1660e01b815260040161306f9190614f9f565b60206040518083038186803b15801561308757600080fd5b505afa15801561309b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130bf9190613f86565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613106576130fe6127c3565b91505061310b565b809150505b919050565b61312a82826040518060200160405280600081525061359e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131ff848484612ba8565b61320b848484846135f9565b61324a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324190614ca4565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132c5838383613790565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133085761330381613795565b613347565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133465761334583826137de565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338a576133858161394b565b6133c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133c8576133c78282613a1c565b5b5b505050565b6133d6613d6b565b6000600a61ffff84166133e991906154e8565b14158160000190151590811515815250506000816000015161340c57600661340f565b60005b9050601083901c925061343261ffff841682600061342d919061513e565b613a9b565b826020019060ff16908160ff1681525050601083901c925061346461ffff841682600161345f919061513e565b613a9b565b826040019060ff16908160ff1681525050601083901c925061349661ffff8416826002613491919061513e565b613a9b565b826060019060ff16908160ff1681525050601083901c92506134c861ffff84168260036134c3919061513e565b613a9b565b826080019060ff16908160ff1681525050601083901c92506134fa61ffff84168260046134f5919061513e565b613a9b565b8260a0019060ff16908160ff1681525050601083901c925061352c61ffff8416826005613527919061513e565b613a9b565b8260c0019060ff16908160ff168152505050919050565b6000816000015182602001518360400151846060015185608001518660a001518760c0015160405160200161357e97969594939291906149b2565b6040516020818303038152906040528051906020012060001c9050919050565b6135a88383613b8a565b6135b560008484846135f9565b6135f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135eb90614ca4565b60405180910390fd5b505050565b600061361a8473ffffffffffffffffffffffffffffffffffffffff16613d58565b15613783578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136436127c3565b8786866040518563ffffffff1660e01b81526004016136659493929190614a4e565b602060405180830381600087803b15801561367f57600080fd5b505af19250505080156136b057506040513d601f19601f820116820180604052508101906136ad91906141fd565b60015b613733573d80600081146136e0576040519150601f19603f3d011682016040523d82523d6000602084013e6136e5565b606091505b5060008151141561372b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372290614ca4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613788565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137eb84611cc5565b6137f59190615200565b90506000600760008481526020019081526020016000205490508181146138da576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061395f9190615200565b905060006009600084815260200190815260200160002054905060006008838154811061398f5761398e615606565b5b9060005260206000200154905080600883815481106139b1576139b0615606565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a00576139ff6155d7565b5b6001900381819060005260206000200160009055905550505050565b6000613a2783611cc5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008060108360ff16600c8110613ab557613ab4615606565b5b018054905084613ac59190615519565b905060108360ff16600c8110613ade57613add615606565b5b018160ff1681548110613af457613af3615606565b5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660088561ffff16901c61ffff161015613b335780915050613b84565b601c8360ff16600c8110613b4a57613b49615606565b5b018160ff1681548110613b6057613b5f615606565b5b90600052602060002090602091828204019190069054906101000a900460ff169150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf190614e64565b60405180910390fd5b613c0381612757565b15613c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3a90614d04565b60405180910390fd5b613c4f600083836132ba565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c9f91906150e8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e00160405280600015158152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000613dcf613dca84615015565b614ff0565b905082815260208101848484011115613deb57613dea615669565b5b613df6848285615371565b509392505050565b6000613e11613e0c84615046565b614ff0565b905082815260208101848484011115613e2d57613e2c615669565b5b613e38848285615380565b509392505050565b600081359050613e4f81615cb8565b92915050565b600081519050613e6481615cb8565b92915050565b600081359050613e7981615ccf565b92915050565b600081359050613e8e81615ce6565b92915050565b600081519050613ea381615ce6565b92915050565b600081359050613eb881615cfd565b92915050565b600081519050613ecd81615cfd565b92915050565b600082601f830112613ee857613ee7615664565b5b8135613ef8848260208601613dbc565b91505092915050565b600082601f830112613f1657613f15615664565b5b8151613f26848260208601613dfe565b91505092915050565b600081359050613f3e81615d14565b92915050565b600081519050613f5381615d14565b92915050565b600060208284031215613f6f57613f6e615673565b5b6000613f7d84828501613e40565b91505092915050565b600060208284031215613f9c57613f9b615673565b5b6000613faa84828501613e55565b91505092915050565b600060208284031215613fc957613fc8615673565b5b6000613fd784828501613e6a565b91505092915050565b60008060408385031215613ff757613ff6615673565b5b600061400585828601613e40565b925050602061401685828601613e40565b9150509250929050565b60008060006060848603121561403957614038615673565b5b600061404786828701613e40565b935050602061405886828701613e40565b925050604061406986828701613f2f565b9150509250925092565b6000806000806080858703121561408d5761408c615673565b5b600061409b87828801613e40565b94505060206140ac87828801613e40565b93505060406140bd87828801613f2f565b925050606085013567ffffffffffffffff8111156140de576140dd61566e565b5b6140ea87828801613ed3565b91505092959194509250565b6000806040838503121561410d5761410c615673565b5b600061411b85828601613e40565b925050602061412c85828601613e7f565b9150509250929050565b6000806040838503121561414d5761414c615673565b5b600061415b85828601613e40565b925050602061416c85828601613f2f565b9150509250929050565b60006020828403121561418c5761418b615673565b5b600061419a84828501613e7f565b91505092915050565b6000602082840312156141b9576141b8615673565b5b60006141c784828501613e94565b91505092915050565b6000602082840312156141e6576141e5615673565b5b60006141f484828501613ea9565b91505092915050565b60006020828403121561421357614212615673565b5b600061422184828501613ebe565b91505092915050565b6000602082840312156142405761423f615673565b5b600082015167ffffffffffffffff81111561425e5761425d61566e565b5b61426a84828501613f01565b91505092915050565b60006020828403121561428957614288615673565b5b600061429784828501613f2f565b91505092915050565b6000602082840312156142b6576142b5615673565b5b60006142c484828501613f44565b91505092915050565b600080604083850312156142e4576142e3615673565b5b60006142f285828601613f2f565b925050602061430385828601613e7f565b9150509250929050565b6000806040838503121561432457614323615673565b5b600061433285828601613f2f565b925050602061434385828601613f2f565b9150509250929050565b60006143598383614911565b60208301905092915050565b61436e81615234565b82525050565b61438561438082615234565b61548c565b82525050565b600061439682615087565b6143a081856150b5565b93506143ab83615077565b8060005b838110156143dc5781516143c3888261434d565b97506143ce836150a8565b9250506001810190506143af565b5085935050505092915050565b6143f281615258565b82525050565b61440181615258565b82525050565b61441861441382615258565b61549e565b82525050565b61442f61442a82615264565b6154b0565b82525050565b600061444082615092565b61444a81856150c6565b935061445a818560208601615380565b61446381615678565b840191505092915050565b614477816152e1565b82525050565b61448681615305565b82525050565b61449581615329565b82525050565b6144a48161534d565b82525050565b60006144b58261509d565b6144bf81856150d7565b93506144cf818560208601615380565b6144d881615678565b840191505092915050565b60006144f06014836150d7565b91506144fb826156a3565b602082019050919050565b6000614513602b836150d7565b915061451e826156cc565b604082019050919050565b60006145366032836150d7565b91506145418261571b565b604082019050919050565b60006145596026836150d7565b91506145648261576a565b604082019050919050565b600061457c6011836150d7565b9150614587826157b9565b602082019050919050565b600061459f601c836150d7565b91506145aa826157e2565b602082019050919050565b60006145c26016836150d7565b91506145cd8261580b565b602082019050919050565b60006145e56008836150d7565b91506145f082615834565b602082019050919050565b60006146086024836150d7565b91506146138261585d565b604082019050919050565b600061462b6019836150d7565b9150614636826158ac565b602082019050919050565b600061464e602c836150d7565b9150614659826158d5565b604082019050919050565b6000614671601f836150d7565b915061467c82615924565b602082019050919050565b60006146946010836150d7565b915061469f8261594d565b602082019050919050565b60006146b76038836150d7565b91506146c282615976565b604082019050919050565b60006146da602a836150d7565b91506146e5826159c5565b604082019050919050565b60006146fd6029836150d7565b915061470882615a14565b604082019050919050565b60006147206020836150d7565b915061472b82615a63565b602082019050919050565b6000614743602c836150d7565b915061474e82615a8c565b604082019050919050565b60006147666020836150d7565b915061477182615adb565b602082019050919050565b60006147896029836150d7565b915061479482615b04565b604082019050919050565b60006147ac602f836150d7565b91506147b782615b53565b604082019050919050565b60006147cf6021836150d7565b91506147da82615ba2565b604082019050919050565b60006147f26031836150d7565b91506147fd82615bf1565b604082019050919050565b60006148156013836150d7565b915061482082615c40565b602082019050919050565b6000614838602c836150d7565b915061484382615c69565b604082019050919050565b60e08201600082015161486460008501826143e9565b506020820151614877602085018261492f565b50604082015161488a604085018261492f565b50606082015161489d606085018261492f565b5060808201516148b0608085018261492f565b5060a08201516148c360a085018261492f565b5060c08201516148d660c085018261492f565b50505050565b6148e5816152ba565b82525050565b6148fc6148f7826152ba565b6154cc565b82525050565b61490b8161535f565b82525050565b61491a816152c4565b82525050565b614929816152c4565b82525050565b614938816152d4565b82525050565b614947816152d4565b82525050565b61495e614959826152d4565b6154d6565b82525050565b60006149708287614374565b601482019150614980828661441e565b60208201915061499082856148eb565b6020820191506149a082846148eb565b60208201915081905095945050505050565b60006149be828a614407565b6001820191506149ce828961494d565b6001820191506149de828861494d565b6001820191506149ee828761494d565b6001820191506149fe828661494d565b600182019150614a0e828561494d565b600182019150614a1e828461494d565b60018201915081905098975050505050505050565b6000602082019050614a486000830184614365565b92915050565b6000608082019050614a636000830187614365565b614a706020830186614365565b614a7d60408301856148dc565b8181036060830152614a8f8184614435565b905095945050505050565b6000604082019050614aaf6000830185614365565b8181036020830152614ac1818461438b565b90509392505050565b6000604082019050614adf6000830185614365565b614aec602083018461449b565b9392505050565b6000604082019050614b086000830185614365565b614b1560208301846148dc565b9392505050565b6000604082019050614b316000830185614365565b614b3e6020830184614902565b9392505050565b60006020820190508181036000830152614b5f818461438b565b905092915050565b6000602082019050614b7c60008301846143f8565b92915050565b600060e082019050614b97600083018a6143f8565b614ba4602083018961493e565b614bb1604083018861493e565b614bbe606083018761493e565b614bcb608083018661493e565b614bd860a083018561493e565b614be560c083018461493e565b98975050505050505050565b6000602082019050614c06600083018461446e565b92915050565b6000602082019050614c21600083018461447d565b92915050565b6000602082019050614c3c600083018461448c565b92915050565b60006020820190508181036000830152614c5c81846144aa565b905092915050565b60006020820190508181036000830152614c7d816144e3565b9050919050565b60006020820190508181036000830152614c9d81614506565b9050919050565b60006020820190508181036000830152614cbd81614529565b9050919050565b60006020820190508181036000830152614cdd8161454c565b9050919050565b60006020820190508181036000830152614cfd8161456f565b9050919050565b60006020820190508181036000830152614d1d81614592565b9050919050565b60006020820190508181036000830152614d3d816145b5565b9050919050565b60006020820190508181036000830152614d5d816145d8565b9050919050565b60006020820190508181036000830152614d7d816145fb565b9050919050565b60006020820190508181036000830152614d9d8161461e565b9050919050565b60006020820190508181036000830152614dbd81614641565b9050919050565b60006020820190508181036000830152614ddd81614664565b9050919050565b60006020820190508181036000830152614dfd81614687565b9050919050565b60006020820190508181036000830152614e1d816146aa565b9050919050565b60006020820190508181036000830152614e3d816146cd565b9050919050565b60006020820190508181036000830152614e5d816146f0565b9050919050565b60006020820190508181036000830152614e7d81614713565b9050919050565b60006020820190508181036000830152614e9d81614736565b9050919050565b60006020820190508181036000830152614ebd81614759565b9050919050565b60006020820190508181036000830152614edd8161477c565b9050919050565b60006020820190508181036000830152614efd8161479f565b9050919050565b60006020820190508181036000830152614f1d816147c2565b9050919050565b60006020820190508181036000830152614f3d816147e5565b9050919050565b60006020820190508181036000830152614f5d81614808565b9050919050565b60006020820190508181036000830152614f7d8161482b565b9050919050565b600060e082019050614f99600083018461484e565b92915050565b6000602082019050614fb460008301846148dc565b92915050565b6000602082019050614fcf6000830184614920565b92915050565b6000602082019050614fea600083018461493e565b92915050565b6000614ffa61500b565b905061500682826153e5565b919050565b6000604051905090565b600067ffffffffffffffff8211156150305761502f615635565b5b61503982615678565b9050602081019050919050565b600067ffffffffffffffff82111561506157615060615635565b5b61506a82615678565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006150f3826152ba565b91506150fe836152ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151335761513261554a565b5b828201905092915050565b6000615149826152d4565b9150615154836152d4565b92508260ff0382111561516a5761516961554a565b5b828201905092915050565b6000615180826152ba565b915061518b836152ba565b92508261519b5761519a615579565b5b828204905092915050565b60006151b1826152ba565b91506151bc836152ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151f5576151f461554a565b5b828202905092915050565b600061520b826152ba565b9150615216836152ba565b9250828210156152295761522861554a565b5b828203905092915050565b600061523f8261529a565b9050919050565b60006152518261529a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006152ec826152f3565b9050919050565b60006152fe8261529a565b9050919050565b600061531082615317565b9050919050565b60006153228261529a565b9050919050565b60006153348261533b565b9050919050565b60006153468261529a565b9050919050565b6000615358826152ba565b9050919050565b600061536a826152c4565b9050919050565b82818337600083830152505050565b60005b8381101561539e578082015181840152602081019050615383565b838111156153ad576000848401525b50505050565b600060028204905060018216806153cb57607f821691505b602082108114156153df576153de6155a8565b5b50919050565b6153ee82615678565b810181811067ffffffffffffffff8211171561540d5761540c615635565b5b80604052505050565b6000615421826152ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154545761545361554a565b5b600182019050919050565b600061546a826152c4565b915063ffffffff8214156154815761548061554a565b5b600182019050919050565b6000615497826154ba565b9050919050565b60006154a9826154d6565b9050919050565b6000819050919050565b60006154c582615696565b9050919050565b6000819050919050565b60006154e182615689565b9050919050565b60006154f3826152ba565b91506154fe836152ba565b92508261550e5761550d615579565b5b828206905092915050565b6000615524826152d4565b915061552f836152d4565b92508261553f5761553e615579565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e73206d696e746564000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e73206f6e2d73616c6520616c726561647920736f6c6400600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b615cc181615234565b8114615ccc57600080fd5b50565b615cd881615246565b8114615ce357600080fd5b50565b615cef81615258565b8114615cfa57600080fd5b50565b615d068161526e565b8114615d1157600080fd5b50565b615d1d816152ba565b8114615d2857600080fd5b5056fea26469706673582212203814aa52e992ba611607fbb9c067749591a1cf510219d2f6c9dbcf1496c4aa2d64736f6c6343000806003300000000000000000000000000000000000000000000000000000000000249f0
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000249f0
-----Decoded View---------------
Arg [0] : maxTokens_ (uint256): 150000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000249f0
Deployed ByteCode Sourcemap
46055:14910:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35435:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23412:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24971:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24494:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59915:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36075:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59023:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53785:488;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53502:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35743:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46949:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59409:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47112:26;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60247:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58912:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26271:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46480:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36265:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60111:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44810:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23106:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51539:1680;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59741:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47183:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22836:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43171:94;;;;;;;;;;;;;:::i;:::-;;59644:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42520:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58725:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23581:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46759:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25264:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26527:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46161:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46396:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60483:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59516:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46580:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;47308:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25630:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47254:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43420:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46278:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59306:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35435:224;35537:4;35576:35;35561:50;;;:11;:50;;;;:90;;;;35615:36;35639:11;35615:23;:36::i;:::-;35561:90;35554:97;;35435:224;;;:::o;23412:100::-;23466:13;23499:5;23492:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23412:100;:::o;24971:221::-;25047:7;25075:16;25083:7;25075;:16::i;:::-;25067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25160:15;:24;25176:7;25160:24;;;;;;;;;;;;;;;;;;;;;25153:31;;24971:221;;;:::o;24494:411::-;24575:13;24591:23;24606:7;24591:14;:23::i;:::-;24575:39;;24639:5;24633:11;;:2;:11;;;;24625:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24733:5;24717:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24742:37;24759:5;24766:12;:10;:12::i;:::-;24742:16;:37::i;:::-;24717:62;24695:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24876:21;24885:2;24889:7;24876:8;:21::i;:::-;24564:341;24494:411;;:::o;59915:118::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59982:7:::1;59978:47;;;59991:8;:6;:8::i;:::-;59978:47;;;60015:10;:8;:10::i;:::-;59978:47;59915:118:::0;:::o;36075:113::-;36136:7;36163:10;:17;;;;36156:24;;36075:113;:::o;59023:257::-;59106:13;59132:16;59151:33;59171:5;59178;59151:19;:33::i;:::-;59132:52;;59195:23;59221:22;59234:8;59221:12;:22::i;:::-;59195:48;;59263:9;59256:16;;;;59023:257;;;;:::o;53785:488::-;54045:13;;;;;;;;;;;54021:38;;:12;:10;:12::i;:::-;:38;;;54017:209;;54100:41;54119:12;:10;:12::i;:::-;54133:7;54100:18;:41::i;:::-;54074:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;54017:209;54237:28;54247:4;54253:2;54257:7;54237:9;:28::i;:::-;53785:488;;;:::o;53502:275::-;53558:7;53593:11;;53582:7;:22;53578:36;;53613:1;53606:8;;;;53578:36;53657:1;53653;53640:10;:14;;;;:::i;:::-;:18;;;;:::i;:::-;53629:7;:29;53625:53;;53667:11;53660:18;;;;53625:53;53721:1;53717;53704:10;:14;;;;:::i;:::-;:18;;;;:::i;:::-;53693:7;:29;53689:53;;53731:11;53724:18;;;;53689:53;53760:11;53753:18;;53502:275;;;;:::o;35743:256::-;35840:7;35876:23;35893:5;35876:16;:23::i;:::-;35868:5;:31;35860:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35965:12;:19;35978:5;35965:19;;;;;;;;;;;;;;;:26;35985:5;35965:26;;;;;;;;;;;;35958:33;;35743:256;;;;:::o;46949:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59409:99::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59493:7:::1;59479:11;:21;;;;59409:99:::0;:::o;47112:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60247:207::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60336:14:::1;60360:6;60353:24;;;60386:4;60353:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60336:56;;60410:6;60403:23;;;60427:10;60439:6;60403:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60325:129;60247:207:::0;;:::o;58912:103::-;58969:7;58996:11;;58989:18;;58912:103;:::o;26271:185::-;26409:39;26426:4;26432:2;26436:7;26409:39;;;;;;;;;;;;:16;:39::i;:::-;26271:185;;;:::o;46480:20::-;;;;;;;;;;;;;:::o;36265:233::-;36340:7;36376:30;:28;:30::i;:::-;36368:5;:38;36360:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36473:10;36484:5;36473:17;;;;;;;;:::i;:::-;;;;;;;;;;36466:24;;36265:233;;;:::o;60111:128::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60187:10:::1;:19;;:42;60207:21;60187:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60111:128:::0;:::o;44810:86::-;44857:4;44881:7;;;;;;;;;;;44874:14;;44810:86;:::o;23106:239::-;23178:7;23198:13;23214:7;:16;23222:7;23214:16;;;;;;;;;;;;;;;;;;;;;23198:32;;23266:1;23249:19;;:5;:19;;;;23241:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23332:5;23325:12;;;23106:239;;;:::o;51539:1680::-;51620:15;45136:8;:6;:8::i;:::-;45135:9;45127:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51648:14:::1;51665:12;:10;:12::i;:::-;51648:29;;51709:6;51696:19;;:9;:19;;;51688:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;51766:10;51756:6;51747;;;;;;;;;;;:15;;;;;;:::i;:::-;:29;;51739:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51826:1;51817:6;:10;:26;;;;;51841:2;51831:6;:12;;51817:26;51809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51891:11;;51882:6;;;;;;;;;;;:20;;;51878:314;;;51964:11;;51954:6;51945;;;;;;;;;;;:15;;;;;;:::i;:::-;:30;;51919:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;52088:9;52074:10;;52065:6;:19;;;;:::i;:::-;:32;52057:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51878:314;;;52178:1;52165:9;:14;52157:23;;;::::0;::::1;;51878:314;52204:21;52240:24:::0;52280:6:::1;52267:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52240:47;;52298:12;52326:9:::0;52338:1:::1;52326:13;;52321:720;52345:6;52341:1;:10;52321:720;;;52373:6;;:8;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;52403:32;52419:15;52410:6;;;;;;;;;;;:24;;;;;;:::i;:::-;52403:6;:32::i;:::-;52396:39;;52450:22;52459:6;;;;;;;;;;;52450:22;;52467:4;52450:8;:22::i;:::-;;52487:17;52507:21;52523:4;52507:15;:21::i;:::-;52487:41;;52560:6;52547:19;;:9;:19;;;52543:439;;52587:28;52597:9;52608:6;;;;;;;;;;;52587:28;;:9;:28::i;:::-;52639:24;52653:6;52661:1;52639:24;;;;;;;:::i;:::-;;;;;;;;52543:439;;;52707:5;52704:171;;;52737:41;52755:13;;;;;;;;;;;52771:6;;;;;;;;;;;52737:41;;:9;:41::i;:::-;52704:171;;;52827:28;52837:9;52848:6;;;;;;;;;;;52827:28;;:9;:28::i;:::-;52704:171;52907:6;;;;;;;;;;;52893:8;52902:1;52893:11;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;;::::0;::::1;52937:29;52951:6;52959;;;;;;;;;;;52937:29;;;;;;;:::i;:::-;;;;;;;;52543:439;53013:16;53022:6;;;;;;;;;;;53013:16;;:8;:16::i;:::-;52996:33;;;;;:::i;:::-;;;52358:683;52353:3;;;;;:::i;:::-;;;;52321:720;;;;53073:1;53057:13;:17;53053:55;;;53076:4;;;;;;;;;;;:9;;;53086:6;53094:13;53076:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53053:55;53123:5;53119:66;;;53130:13;;;;;;;;;;;:37;;;53168:6;53176:8;53130:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53119:66;53203:8;53196:15;;;;;;51539:1680:::0;;;;:::o;59741:99::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59824:7:::1;59807:6;;:25;;;;;;;;;;;;;;;;;;59741:99:::0;:::o;47183:35::-;;;;;;;;;;;;;:::o;22836:208::-;22908:7;22953:1;22936:19;;:5;:19;;;;22928:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23020:9;:16;23030:5;23020:16;;;;;;;;;;;;;;;;23013:23;;22836:208;;;:::o;43171:94::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43236:21:::1;43254:1;43236:9;:21::i;:::-;43171:94::o:0;59644:89::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59719:5:::1;59706:4;;:19;;;;;;;;;;;;;;;;;;59644:89:::0;:::o;42520:87::-;42566:7;42593:6;;;;;;;;;;;42586:13;;42520:87;:::o;58725:179::-;58834:17;;:::i;:::-;58876:11;:20;58888:7;58876:20;;;;;;;;;;;58869:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58725:179;;;:::o;23581:104::-;23637:13;23670:7;23663:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23581:104;:::o;46759:55::-;;;;;;;;;;;;;;;;;:::o;25264:295::-;25379:12;:10;:12::i;:::-;25367:24;;:8;:24;;;;25359:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25479:8;25434:18;:32;25453:12;:10;:12::i;:::-;25434:32;;;;;;;;;;;;;;;:42;25467:8;25434:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25532:8;25503:48;;25518:12;:10;:12::i;:::-;25503:48;;;25542:8;25503:48;;;;;;:::i;:::-;;;;;;;;25264:295;;:::o;26527:328::-;26702:41;26721:12;:10;:12::i;:::-;26735:7;26702:18;:41::i;:::-;26694:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26808:39;26822:4;26828:2;26832:7;26841:5;26808:13;:39::i;:::-;26527:328;;;;:::o;46161:36::-;;;;:::o;46396:26::-;;;;:::o;60483:214::-;60584:13;60615:23;60641:21;60654:7;60641:12;:21::i;:::-;60615:47;;60680:9;60673:16;;;60483:214;;;:::o;59516:120::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59620:7:::1;59589:13;;:39;;;;;;;;;;;;;;;;;;59516:120:::0;:::o;46580:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47308:21::-;;;;;;;;;;;;;:::o;25630:164::-;25727:4;25751:18;:25;25770:5;25751:25;;;;;;;;;;;;;;;:35;25777:8;25751:35;;;;;;;;;;;;;;;;;;;;;;;;;25744:42;;25630:164;;;;:::o;47254:17::-;;;;;;;;;;;;;:::o;43420:192::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43529:1:::1;43509:22;;:8;:22;;;;43501:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43585:19;43595:8;43585:9;:19::i;:::-;43420:192:::0;:::o;46278:35::-;;;:::o;59306:95::-;42751:12;:10;:12::i;:::-;42740:23;;:7;:5;:7::i;:::-;:23;;;42732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59387:6:::1;59374:10;:19;;;;59306:95:::0;:::o;22467:305::-;22569:4;22621:25;22606:40;;;:11;:40;;;;:105;;;;22678:33;22663:48;;;:11;:48;;;;22606:105;:158;;;;22728:36;22752:11;22728:23;:36::i;:::-;22606:158;22586:178;;22467:305;;;:::o;28365:127::-;28430:4;28482:1;28454:30;;:7;:16;28462:7;28454:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28447:37;;28365:127;;;:::o;19976:98::-;20029:7;20056:10;20049:17;;19976:98;:::o;32347:174::-;32449:2;32422:15;:24;32438:7;32422:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32505:7;32501:2;32467:46;;32476:23;32491:7;32476:14;:23::i;:::-;32467:46;;;;;;;;;;;;32347:174;;:::o;45610:118::-;45136:8;:6;:8::i;:::-;45135:9;45127:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45680:4:::1;45670:7;;:14;;;;;;;;;;;;;;;;;;45700:20;45707:12;:10;:12::i;:::-;45700:20;;;;;;:::i;:::-;;;;;;;;45610:118::o:0;45869:120::-;45413:8;:6;:8::i;:::-;45405:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45938:5:::1;45928:7;;:15;;;;;;;;;;;;;;;;;;45959:22;45968:12;:10;:12::i;:::-;45959:22;;;;;;:::i;:::-;;;;;;;;45869:120::o:0;60705:257::-;60766:13;60814:16;60822:7;60814;:16::i;:::-;60792:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;60923:6;;;;;;;;;;;:15;;;60939:7;60923:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60916:31;;60705:257;;;:::o;28659:348::-;28752:4;28777:16;28785:7;28777;:16::i;:::-;28769:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28853:13;28869:23;28884:7;28869:14;:23::i;:::-;28853:39;;28922:5;28911:16;;:7;:16;;;:51;;;;28955:7;28931:31;;:20;28943:7;28931:11;:20::i;:::-;:31;;;28911:51;:87;;;;28966:32;28983:5;28990:7;28966:16;:32::i;:::-;28911:87;28903:96;;;28659:348;;;;:::o;31651:578::-;31810:4;31783:31;;:23;31798:7;31783:14;:23::i;:::-;:31;;;31775:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31893:1;31879:16;;:2;:16;;;;31871:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31949:39;31970:4;31976:2;31980:7;31949:20;:39::i;:::-;32053:29;32070:1;32074:7;32053:8;:29::i;:::-;32114:1;32095:9;:15;32105:4;32095:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32143:1;32126:9;:13;32136:2;32126:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32174:2;32155:7;:16;32163:7;32155:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32213:7;32209:2;32194:27;;32203:4;32194:27;;;;;;;;;;;;31651:578;;;:::o;58303:395::-;58356:7;58497:9;58558:1;58543:12;:16;;;;:::i;:::-;58533:27;58587:15;58629:4;58454:202;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58422:253;;;;;;58396:294;;58376:314;;58303:395;;;:::o;54603:::-;54688:19;;:::i;:::-;54729:18;54742:4;54729:12;:18::i;:::-;54725:22;;54803:1;54762:20;:37;54783:15;54796:1;54783:12;:15::i;:::-;54762:37;;;;;;;;;;;;:42;54758:184;;;54844:1;54821:11;:20;54833:7;54821:20;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54900:7;54860:20;:37;54881:15;54894:1;54881:12;:15::i;:::-;54860:37;;;;;;;;;;;:47;;;;54922:8;;54758:184;54959:31;54968:7;54977:12;54984:4;54977:6;:12::i;:::-;54959:8;:31::i;:::-;54952:38;;54603:395;;;;;:::o;57022:402::-;57084:7;57118:11;;57108:6;;;;;;;;;;;:21;;;;:50;;;;57157:1;57150:2;57143:3;57135:4;:11;;57134:18;;;;:::i;:::-;57133:25;;57108:50;57104:88;;;57180:12;:10;:12::i;:::-;57173:19;;;;57104:88;57236:13;57252;;;;;;;;;;;:30;;;57291:3;57283:4;:11;;57252:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57236:59;;57368:3;57351:21;;:5;:21;;;57347:46;;;57381:12;:10;:12::i;:::-;57374:19;;;;;57347:46;57411:5;57404:12;;;57022:402;;;;:::o;29349:110::-;29425:26;29435:2;29439:7;29425:26;;;;;;;;;;;;:9;:26::i;:::-;29349:110;;:::o;43620:173::-;43676:16;43695:6;;;;;;;;;;;43676:25;;43721:8;43712:6;;:17;;;;;;;;;;;;;;;;;;43776:8;43745:40;;43766:8;43745:40;;;;;;;;;;;;43665:128;43620:173;:::o;27737:315::-;27894:28;27904:4;27910:2;27914:7;27894:9;:28::i;:::-;27941:48;27964:4;27970:2;27974:7;27983:5;27941:22;:48::i;:::-;27933:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27737:315;;;;:::o;21049:157::-;21134:4;21173:25;21158:40;;;:11;:40;;;;21151:47;;21049:157;;;:::o;37111:589::-;37255:45;37282:4;37288:2;37292:7;37255:26;:45::i;:::-;37333:1;37317:18;;:4;:18;;;37313:187;;;37352:40;37384:7;37352:31;:40::i;:::-;37313:187;;;37422:2;37414:10;;:4;:10;;;37410:90;;37441:47;37474:4;37480:7;37441:32;:47::i;:::-;37410:90;37313:187;37528:1;37514:16;;:2;:16;;;37510:183;;;37547:45;37584:7;37547:36;:45::i;:::-;37510:183;;;37620:4;37614:10;;:2;:10;;;37610:83;;37641:40;37669:2;37673:7;37641:27;:40::i;:::-;37610:83;37510:183;37111:589;;;:::o;55964:744::-;56050:19;;:::i;:::-;56123:1;56117:2;56107:6;56100:4;:13;56099:20;;;;:::i;:::-;:25;;56087:1;:9;;:37;;;;;;;;;;;56135:11;56149:1;:9;;;:17;;56165:1;56149:17;;;56161:1;56149:17;56135:31;;56186:2;56177:11;;;;;56208:45;56234:6;56227:4;:13;56247:5;56243:1;:9;;;;:::i;:::-;56208:11;:45::i;:::-;56199:1;:6;;:54;;;;;;;;;;;56273:2;56264:11;;;;;56295:45;56321:6;56314:4;:13;56334:5;56330:1;:9;;;;:::i;:::-;56295:11;:45::i;:::-;56286:1;:6;;:54;;;;;;;;;;;56360:2;56351:11;;;;;56383:45;56409:6;56402:4;:13;56422:5;56418:1;:9;;;;:::i;:::-;56383:11;:45::i;:::-;56373:1;:7;;:55;;;;;;;;;;;56448:2;56439:11;;;;;56470:45;56496:6;56489:4;:13;56509:5;56505:1;:9;;;;:::i;:::-;56470:11;:45::i;:::-;56461:1;:6;;:54;;;;;;;;;;;56535:2;56526:11;;;;;56562:45;56588:6;56581:4;:13;56601:5;56597:1;:9;;;;:::i;:::-;56562:11;:45::i;:::-;56548:1;:11;;:59;;;;;;;;;;;56627:2;56618:11;;;;;56655:45;56681:6;56674:4;:13;56694:5;56690:1;:9;;;;:::i;:::-;56655:11;:45::i;:::-;56640:1;:12;;:60;;;;;;;;;;;56076:632;55964:744;;;:::o;57615:491::-;57681:7;57822:1;:9;;;57858:1;:6;;;57891:1;:6;;;57924:1;:7;;;57958:1;:6;;;57991:1;:11;;;58029:1;:12;;;57779:285;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57747:336;;;;;;57721:377;;57701:397;;57615:491;;;:::o;29686:321::-;29816:18;29822:2;29826:7;29816:5;:18::i;:::-;29867:54;29898:1;29902:2;29906:7;29915:5;29867:22;:54::i;:::-;29845:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29686:321;;;:::o;33086:803::-;33241:4;33262:15;:2;:13;;;:15::i;:::-;33258:624;;;33314:2;33298:36;;;33335:12;:10;:12::i;:::-;33349:4;33355:7;33364:5;33298:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33294:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33561:1;33544:6;:13;:18;33540:272;;;33587:60;;;;;;;;;;:::i;:::-;;;;;;;;33540:272;33762:6;33756:13;33747:6;33743:2;33739:15;33732:38;33294:533;33431:45;;;33421:55;;;:6;:55;;;;33414:62;;;;;33258:624;33866:4;33859:11;;33086:803;;;;;;;:::o;34461:126::-;;;;:::o;38423:164::-;38527:10;:17;;;;38500:15;:24;38516:7;38500:24;;;;;;;;;;;:44;;;;38555:10;38571:7;38555:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38423:164;:::o;39214:988::-;39480:22;39530:1;39505:22;39522:4;39505:16;:22::i;:::-;:26;;;;:::i;:::-;39480:51;;39542:18;39563:17;:26;39581:7;39563:26;;;;;;;;;;;;39542:47;;39710:14;39696:10;:28;39692:328;;39741:19;39763:12;:18;39776:4;39763:18;;;;;;;;;;;;;;;:34;39782:14;39763:34;;;;;;;;;;;;39741:56;;39847:11;39814:12;:18;39827:4;39814:18;;;;;;;;;;;;;;;:30;39833:10;39814:30;;;;;;;;;;;:44;;;;39964:10;39931:17;:30;39949:11;39931:30;;;;;;;;;;;:43;;;;39726:294;39692:328;40116:17;:26;40134:7;40116:26;;;;;;;;;;;40109:33;;;40160:12;:18;40173:4;40160:18;;;;;;;;;;;;;;;:34;40179:14;40160:34;;;;;;;;;;;40153:41;;;39295:907;;39214:988;;:::o;40497:1079::-;40750:22;40795:1;40775:10;:17;;;;:21;;;;:::i;:::-;40750:46;;40807:18;40828:15;:24;40844:7;40828:24;;;;;;;;;;;;40807:45;;41179:19;41201:10;41212:14;41201:26;;;;;;;;:::i;:::-;;;;;;;;;;41179:48;;41265:11;41240:10;41251;41240:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41376:10;41345:15;:28;41361:11;41345:28;;;;;;;;;;;:41;;;;41517:15;:24;41533:7;41517:24;;;;;;;;;;;41510:31;;;41552:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40568:1008;;;40497:1079;:::o;38001:221::-;38086:14;38103:20;38120:2;38103:16;:20::i;:::-;38086:37;;38161:7;38134:12;:16;38147:2;38134:16;;;;;;;;;;;;;;;:24;38151:6;38134:24;;;;;;;;;;;:34;;;;38208:6;38179:17;:26;38197:7;38179:26;;;;;;;;;;;:35;;;;38075:147;38001:221;;:::o;55431:303::-;55532:5;55555:11;55589:8;55598:9;55589:19;;;;;;;;;:::i;:::-;;;:26;;;;55575:4;55569:47;;;;:::i;:::-;55555:61;;55643:8;55652:9;55643:19;;;;;;;;;:::i;:::-;;;55663:5;55643:26;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;55631:38;;55639:1;55631:4;:9;;;;:38;;;55627:56;;;55678:5;55671:12;;;;;55627:56;55701:7;55709:9;55701:18;;;;;;;;;:::i;:::-;;;55720:5;55701:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;55694:32;;;55431:303;;;;;:::o;30343:382::-;30437:1;30423:16;;:2;:16;;;;30415:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30496:16;30504:7;30496;:16::i;:::-;30495:17;30487:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30558:45;30587:1;30591:2;30595:7;30558:20;:45::i;:::-;30633:1;30616:9;:13;30626:2;30616:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30664:2;30645:7;:16;30653:7;30645:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30709:7;30705:2;30684:33;;30701:1;30684:33;;;;;;;;;;;;30343:382;;:::o;10193:387::-;10253:4;10461:12;10528:7;10516:20;10508:28;;10571:1;10564:4;:8;10557:15;;;10193:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:2;;;709:79;;:::i;:::-;678:2;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;902:87;;;;:::o;995:143::-;1052:5;1083:6;1077:13;1068:22;;1099:33;1126:5;1099:33;:::i;:::-;1058:80;;;;:::o;1144:155::-;1198:5;1236:6;1223:20;1214:29;;1252:41;1287:5;1252:41;:::i;:::-;1204:95;;;;:::o;1305:133::-;1348:5;1386:6;1373:20;1364:29;;1402:30;1426:5;1402:30;:::i;:::-;1354:84;;;;:::o;1444:137::-;1498:5;1529:6;1523:13;1514:22;;1545:30;1569:5;1545:30;:::i;:::-;1504:77;;;;:::o;1587:137::-;1632:5;1670:6;1657:20;1648:29;;1686:32;1712:5;1686:32;:::i;:::-;1638:86;;;;:::o;1730:141::-;1786:5;1817:6;1811:13;1802:22;;1833:32;1859:5;1833:32;:::i;:::-;1792:79;;;;:::o;1890:338::-;1945:5;1994:3;1987:4;1979:6;1975:17;1971:27;1961:2;;2002:79;;:::i;:::-;1961:2;2119:6;2106:20;2144:78;2218:3;2210:6;2203:4;2195:6;2191:17;2144:78;:::i;:::-;2135:87;;1951:277;;;;;:::o;2248:355::-;2315:5;2364:3;2357:4;2349:6;2345:17;2341:27;2331:2;;2372:79;;:::i;:::-;2331:2;2482:6;2476:13;2507:90;2593:3;2585:6;2578:4;2570:6;2566:17;2507:90;:::i;:::-;2498:99;;2321:282;;;;;:::o;2609:139::-;2655:5;2693:6;2680:20;2671:29;;2709:33;2736:5;2709:33;:::i;:::-;2661:87;;;;:::o;2754:143::-;2811:5;2842:6;2836:13;2827:22;;2858:33;2885:5;2858:33;:::i;:::-;2817:80;;;;:::o;2903:329::-;2962:6;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3017:79;;:::i;:::-;2979:2;3137:1;3162:53;3207:7;3198:6;3187:9;3183:22;3162:53;:::i;:::-;3152:63;;3108:117;2969:263;;;;:::o;3238:351::-;3308:6;3357:2;3345:9;3336:7;3332:23;3328:32;3325:2;;;3363:79;;:::i;:::-;3325:2;3483:1;3508:64;3564:7;3555:6;3544:9;3540:22;3508:64;:::i;:::-;3498:74;;3454:128;3315:274;;;;:::o;3595:345::-;3662:6;3711:2;3699:9;3690:7;3686:23;3682:32;3679:2;;;3717:79;;:::i;:::-;3679:2;3837:1;3862:61;3915:7;3906:6;3895:9;3891:22;3862:61;:::i;:::-;3852:71;;3808:125;3669:271;;;;:::o;3946:474::-;4014:6;4022;4071:2;4059:9;4050:7;4046:23;4042:32;4039:2;;;4077:79;;:::i;:::-;4039:2;4197:1;4222:53;4267:7;4258:6;4247:9;4243:22;4222:53;:::i;:::-;4212:63;;4168:117;4324:2;4350:53;4395:7;4386:6;4375:9;4371:22;4350:53;:::i;:::-;4340:63;;4295:118;4029:391;;;;;:::o;4426:619::-;4503:6;4511;4519;4568:2;4556:9;4547:7;4543:23;4539:32;4536:2;;;4574:79;;:::i;:::-;4536:2;4694:1;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4665:117;4821:2;4847:53;4892:7;4883:6;4872:9;4868:22;4847:53;:::i;:::-;4837:63;;4792:118;4949:2;4975:53;5020:7;5011:6;5000:9;4996:22;4975:53;:::i;:::-;4965:63;;4920:118;4526:519;;;;;:::o;5051:943::-;5146:6;5154;5162;5170;5219:3;5207:9;5198:7;5194:23;5190:33;5187:2;;;5226:79;;:::i;:::-;5187:2;5346:1;5371:53;5416:7;5407:6;5396:9;5392:22;5371:53;:::i;:::-;5361:63;;5317:117;5473:2;5499:53;5544:7;5535:6;5524:9;5520:22;5499:53;:::i;:::-;5489:63;;5444:118;5601:2;5627:53;5672:7;5663:6;5652:9;5648:22;5627:53;:::i;:::-;5617:63;;5572:118;5757:2;5746:9;5742:18;5729:32;5788:18;5780:6;5777:30;5774:2;;;5810:79;;:::i;:::-;5774:2;5915:62;5969:7;5960:6;5949:9;5945:22;5915:62;:::i;:::-;5905:72;;5700:287;5177:817;;;;;;;:::o;6000:468::-;6065:6;6073;6122:2;6110:9;6101:7;6097:23;6093:32;6090:2;;;6128:79;;:::i;:::-;6090:2;6248:1;6273:53;6318:7;6309:6;6298:9;6294:22;6273:53;:::i;:::-;6263:63;;6219:117;6375:2;6401:50;6443:7;6434:6;6423:9;6419:22;6401:50;:::i;:::-;6391:60;;6346:115;6080:388;;;;;:::o;6474:474::-;6542:6;6550;6599:2;6587:9;6578:7;6574:23;6570:32;6567:2;;;6605:79;;:::i;:::-;6567:2;6725:1;6750:53;6795:7;6786:6;6775:9;6771:22;6750:53;:::i;:::-;6740:63;;6696:117;6852:2;6878:53;6923:7;6914:6;6903:9;6899:22;6878:53;:::i;:::-;6868:63;;6823:118;6557:391;;;;;:::o;6954:323::-;7010:6;7059:2;7047:9;7038:7;7034:23;7030:32;7027:2;;;7065:79;;:::i;:::-;7027:2;7185:1;7210:50;7252:7;7243:6;7232:9;7228:22;7210:50;:::i;:::-;7200:60;;7156:114;7017:260;;;;:::o;7283:345::-;7350:6;7399:2;7387:9;7378:7;7374:23;7370:32;7367:2;;;7405:79;;:::i;:::-;7367:2;7525:1;7550:61;7603:7;7594:6;7583:9;7579:22;7550:61;:::i;:::-;7540:71;;7496:125;7357:271;;;;:::o;7634:327::-;7692:6;7741:2;7729:9;7720:7;7716:23;7712:32;7709:2;;;7747:79;;:::i;:::-;7709:2;7867:1;7892:52;7936:7;7927:6;7916:9;7912:22;7892:52;:::i;:::-;7882:62;;7838:116;7699:262;;;;:::o;7967:349::-;8036:6;8085:2;8073:9;8064:7;8060:23;8056:32;8053:2;;;8091:79;;:::i;:::-;8053:2;8211:1;8236:63;8291:7;8282:6;8271:9;8267:22;8236:63;:::i;:::-;8226:73;;8182:127;8043:273;;;;:::o;8322:524::-;8402:6;8451:2;8439:9;8430:7;8426:23;8422:32;8419:2;;;8457:79;;:::i;:::-;8419:2;8598:1;8587:9;8583:17;8577:24;8628:18;8620:6;8617:30;8614:2;;;8650:79;;:::i;:::-;8614:2;8755:74;8821:7;8812:6;8801:9;8797:22;8755:74;:::i;:::-;8745:84;;8548:291;8409:437;;;;:::o;8852:329::-;8911:6;8960:2;8948:9;8939:7;8935:23;8931:32;8928:2;;;8966:79;;:::i;:::-;8928:2;9086:1;9111:53;9156:7;9147:6;9136:9;9132:22;9111:53;:::i;:::-;9101:63;;9057:117;8918:263;;;;:::o;9187:351::-;9257:6;9306:2;9294:9;9285:7;9281:23;9277:32;9274:2;;;9312:79;;:::i;:::-;9274:2;9432:1;9457:64;9513:7;9504:6;9493:9;9489:22;9457:64;:::i;:::-;9447:74;;9403:128;9264:274;;;;:::o;9544:468::-;9609:6;9617;9666:2;9654:9;9645:7;9641:23;9637:32;9634:2;;;9672:79;;:::i;:::-;9634:2;9792:1;9817:53;9862:7;9853:6;9842:9;9838:22;9817:53;:::i;:::-;9807:63;;9763:117;9919:2;9945:50;9987:7;9978:6;9967:9;9963:22;9945:50;:::i;:::-;9935:60;;9890:115;9624:388;;;;;:::o;10018:474::-;10086:6;10094;10143:2;10131:9;10122:7;10118:23;10114:32;10111:2;;;10149:79;;:::i;:::-;10111:2;10269:1;10294:53;10339:7;10330:6;10319:9;10315:22;10294:53;:::i;:::-;10284:63;;10240:117;10396:2;10422:53;10467:7;10458:6;10447:9;10443:22;10422:53;:::i;:::-;10412:63;;10367:118;10101:391;;;;;:::o;10498:175::-;10565:10;10586:44;10626:3;10618:6;10586:44;:::i;:::-;10662:4;10657:3;10653:14;10639:28;;10576:97;;;;:::o;10679:118::-;10766:24;10784:5;10766:24;:::i;:::-;10761:3;10754:37;10744:53;;:::o;10803:157::-;10908:45;10928:24;10946:5;10928:24;:::i;:::-;10908:45;:::i;:::-;10903:3;10896:58;10886:74;;:::o;10994:724::-;11111:3;11140:53;11187:5;11140:53;:::i;:::-;11209:85;11287:6;11282:3;11209:85;:::i;:::-;11202:92;;11318:55;11367:5;11318:55;:::i;:::-;11396:7;11427:1;11412:281;11437:6;11434:1;11431:13;11412:281;;;11513:6;11507:13;11540:61;11597:3;11582:13;11540:61;:::i;:::-;11533:68;;11624:59;11676:6;11624:59;:::i;:::-;11614:69;;11472:221;11459:1;11456;11452:9;11447:14;;11412:281;;;11416:14;11709:3;11702:10;;11116:602;;;;;;;:::o;11724:99::-;11795:21;11810:5;11795:21;:::i;:::-;11790:3;11783:34;11773:50;;:::o;11829:109::-;11910:21;11925:5;11910:21;:::i;:::-;11905:3;11898:34;11888:50;;:::o;11944:145::-;12043:39;12060:21;12075:5;12060:21;:::i;:::-;12043:39;:::i;:::-;12038:3;12031:52;12021:68;;:::o;12095:157::-;12200:45;12220:24;12238:5;12220:24;:::i;:::-;12200:45;:::i;:::-;12195:3;12188:58;12178:74;;:::o;12258:360::-;12344:3;12372:38;12404:5;12372:38;:::i;:::-;12426:70;12489:6;12484:3;12426:70;:::i;:::-;12419:77;;12505:52;12550:6;12545:3;12538:4;12531:5;12527:16;12505:52;:::i;:::-;12582:29;12604:6;12582:29;:::i;:::-;12577:3;12573:39;12566:46;;12348:270;;;;;:::o;12624:157::-;12724:50;12768:5;12724:50;:::i;:::-;12719:3;12712:63;12702:79;;:::o;12787:175::-;12896:59;12949:5;12896:59;:::i;:::-;12891:3;12884:72;12874:88;;:::o;12968:161::-;13070:52;13116:5;13070:52;:::i;:::-;13065:3;13058:65;13048:81;;:::o;13135:147::-;13230:45;13269:5;13230:45;:::i;:::-;13225:3;13218:58;13208:74;;:::o;13288:364::-;13376:3;13404:39;13437:5;13404:39;:::i;:::-;13459:71;13523:6;13518:3;13459:71;:::i;:::-;13452:78;;13539:52;13584:6;13579:3;13572:4;13565:5;13561:16;13539:52;:::i;:::-;13616:29;13638:6;13616:29;:::i;:::-;13611:3;13607:39;13600:46;;13380:272;;;;;:::o;13658:366::-;13800:3;13821:67;13885:2;13880:3;13821:67;:::i;:::-;13814:74;;13897:93;13986:3;13897:93;:::i;:::-;14015:2;14010:3;14006:12;13999:19;;13804:220;;;:::o;14030:366::-;14172:3;14193:67;14257:2;14252:3;14193:67;:::i;:::-;14186:74;;14269:93;14358:3;14269:93;:::i;:::-;14387:2;14382:3;14378:12;14371:19;;14176:220;;;:::o;14402:366::-;14544:3;14565:67;14629:2;14624:3;14565:67;:::i;:::-;14558:74;;14641:93;14730:3;14641:93;:::i;:::-;14759:2;14754:3;14750:12;14743:19;;14548:220;;;:::o;14774:366::-;14916:3;14937:67;15001:2;14996:3;14937:67;:::i;:::-;14930:74;;15013:93;15102:3;15013:93;:::i;:::-;15131:2;15126:3;15122:12;15115:19;;14920:220;;;:::o;15146:366::-;15288:3;15309:67;15373:2;15368:3;15309:67;:::i;:::-;15302:74;;15385:93;15474:3;15385:93;:::i;:::-;15503:2;15498:3;15494:12;15487:19;;15292:220;;;:::o;15518:366::-;15660:3;15681:67;15745:2;15740:3;15681:67;:::i;:::-;15674:74;;15757:93;15846:3;15757:93;:::i;:::-;15875:2;15870:3;15866:12;15859:19;;15664:220;;;:::o;15890:366::-;16032:3;16053:67;16117:2;16112:3;16053:67;:::i;:::-;16046:74;;16129:93;16218:3;16129:93;:::i;:::-;16247:2;16242:3;16238:12;16231:19;;16036:220;;;:::o;16262:365::-;16404:3;16425:66;16489:1;16484:3;16425:66;:::i;:::-;16418:73;;16500:93;16589:3;16500:93;:::i;:::-;16618:2;16613:3;16609:12;16602:19;;16408:219;;;:::o;16633:366::-;16775:3;16796:67;16860:2;16855:3;16796:67;:::i;:::-;16789:74;;16872:93;16961:3;16872:93;:::i;:::-;16990:2;16985:3;16981:12;16974:19;;16779:220;;;:::o;17005:366::-;17147:3;17168:67;17232:2;17227:3;17168:67;:::i;:::-;17161:74;;17244:93;17333:3;17244:93;:::i;:::-;17362:2;17357:3;17353:12;17346:19;;17151:220;;;:::o;17377:366::-;17519:3;17540:67;17604:2;17599:3;17540:67;:::i;:::-;17533:74;;17616:93;17705:3;17616:93;:::i;:::-;17734:2;17729:3;17725:12;17718:19;;17523:220;;;:::o;17749:366::-;17891:3;17912:67;17976:2;17971:3;17912:67;:::i;:::-;17905:74;;17988:93;18077:3;17988:93;:::i;:::-;18106:2;18101:3;18097:12;18090:19;;17895:220;;;:::o;18121:366::-;18263:3;18284:67;18348:2;18343:3;18284:67;:::i;:::-;18277:74;;18360:93;18449:3;18360:93;:::i;:::-;18478:2;18473:3;18469:12;18462:19;;18267:220;;;:::o;18493:366::-;18635:3;18656:67;18720:2;18715:3;18656:67;:::i;:::-;18649:74;;18732:93;18821:3;18732:93;:::i;:::-;18850:2;18845:3;18841:12;18834:19;;18639:220;;;:::o;18865:366::-;19007:3;19028:67;19092:2;19087:3;19028:67;:::i;:::-;19021:74;;19104:93;19193:3;19104:93;:::i;:::-;19222:2;19217:3;19213:12;19206:19;;19011:220;;;:::o;19237:366::-;19379:3;19400:67;19464:2;19459:3;19400:67;:::i;:::-;19393:74;;19476:93;19565:3;19476:93;:::i;:::-;19594:2;19589:3;19585:12;19578:19;;19383:220;;;:::o;19609:366::-;19751:3;19772:67;19836:2;19831:3;19772:67;:::i;:::-;19765:74;;19848:93;19937:3;19848:93;:::i;:::-;19966:2;19961:3;19957:12;19950:19;;19755:220;;;:::o;19981:366::-;20123:3;20144:67;20208:2;20203:3;20144:67;:::i;:::-;20137:74;;20220:93;20309:3;20220:93;:::i;:::-;20338:2;20333:3;20329:12;20322:19;;20127:220;;;:::o;20353:366::-;20495:3;20516:67;20580:2;20575:3;20516:67;:::i;:::-;20509:74;;20592:93;20681:3;20592:93;:::i;:::-;20710:2;20705:3;20701:12;20694:19;;20499:220;;;:::o;20725:366::-;20867:3;20888:67;20952:2;20947:3;20888:67;:::i;:::-;20881:74;;20964:93;21053:3;20964:93;:::i;:::-;21082:2;21077:3;21073:12;21066:19;;20871:220;;;:::o;21097:366::-;21239:3;21260:67;21324:2;21319:3;21260:67;:::i;:::-;21253:74;;21336:93;21425:3;21336:93;:::i;:::-;21454:2;21449:3;21445:12;21438:19;;21243:220;;;:::o;21469:366::-;21611:3;21632:67;21696:2;21691:3;21632:67;:::i;:::-;21625:74;;21708:93;21797:3;21708:93;:::i;:::-;21826:2;21821:3;21817:12;21810:19;;21615:220;;;:::o;21841:366::-;21983:3;22004:67;22068:2;22063:3;22004:67;:::i;:::-;21997:74;;22080:93;22169:3;22080:93;:::i;:::-;22198:2;22193:3;22189:12;22182:19;;21987:220;;;:::o;22213:366::-;22355:3;22376:67;22440:2;22435:3;22376:67;:::i;:::-;22369:74;;22452:93;22541:3;22452:93;:::i;:::-;22570:2;22565:3;22561:12;22554:19;;22359:220;;;:::o;22585:366::-;22727:3;22748:67;22812:2;22807:3;22748:67;:::i;:::-;22741:74;;22824:93;22913:3;22824:93;:::i;:::-;22942:2;22937:3;22933:12;22926:19;;22731:220;;;:::o;23033:1366::-;23184:4;23179:3;23175:14;23274:4;23267:5;23263:16;23257:23;23293:57;23344:4;23339:3;23335:14;23321:12;23293:57;:::i;:::-;23199:161;23442:4;23435:5;23431:16;23425:23;23461:59;23514:4;23509:3;23505:14;23491:12;23461:59;:::i;:::-;23370:160;23612:4;23605:5;23601:16;23595:23;23631:59;23684:4;23679:3;23675:14;23661:12;23631:59;:::i;:::-;23540:160;23783:4;23776:5;23772:16;23766:23;23802:59;23855:4;23850:3;23846:14;23832:12;23802:59;:::i;:::-;23710:161;23953:4;23946:5;23942:16;23936:23;23972:59;24025:4;24020:3;24016:14;24002:12;23972:59;:::i;:::-;23881:160;24128:4;24121:5;24117:16;24111:23;24147:59;24200:4;24195:3;24191:14;24177:12;24147:59;:::i;:::-;24051:165;24304:4;24297:5;24293:16;24287:23;24323:59;24376:4;24371:3;24367:14;24353:12;24323:59;:::i;:::-;24226:166;23153:1246;;;:::o;24405:118::-;24492:24;24510:5;24492:24;:::i;:::-;24487:3;24480:37;24470:53;;:::o;24529:157::-;24634:45;24654:24;24672:5;24654:24;:::i;:::-;24634:45;:::i;:::-;24629:3;24622:58;24612:74;;:::o;24692:129::-;24778:36;24808:5;24778:36;:::i;:::-;24773:3;24766:49;24756:65;;:::o;24827:105::-;24902:23;24919:5;24902:23;:::i;:::-;24897:3;24890:36;24880:52;;:::o;24938:115::-;25023:23;25040:5;25023:23;:::i;:::-;25018:3;25011:36;25001:52;;:::o;25059:102::-;25132:22;25148:5;25132:22;:::i;:::-;25127:3;25120:35;25110:51;;:::o;25167:112::-;25250:22;25266:5;25250:22;:::i;:::-;25245:3;25238:35;25228:51;;:::o;25285:149::-;25386:41;25404:22;25420:5;25404:22;:::i;:::-;25386:41;:::i;:::-;25381:3;25374:54;25364:70;;:::o;25440:679::-;25636:3;25651:75;25722:3;25713:6;25651:75;:::i;:::-;25751:2;25746:3;25742:12;25735:19;;25764:75;25835:3;25826:6;25764:75;:::i;:::-;25864:2;25859:3;25855:12;25848:19;;25877:75;25948:3;25939:6;25877:75;:::i;:::-;25977:2;25972:3;25968:12;25961:19;;25990:75;26061:3;26052:6;25990:75;:::i;:::-;26090:2;26085:3;26081:12;26074:19;;26110:3;26103:10;;25640:479;;;;;;;:::o;26125:1035::-;26375:3;26390:69;26455:3;26446:6;26390:69;:::i;:::-;26484:1;26479:3;26475:11;26468:18;;26496:71;26563:3;26554:6;26496:71;:::i;:::-;26592:1;26587:3;26583:11;26576:18;;26604:71;26671:3;26662:6;26604:71;:::i;:::-;26700:1;26695:3;26691:11;26684:18;;26712:71;26779:3;26770:6;26712:71;:::i;:::-;26808:1;26803:3;26799:11;26792:18;;26820:71;26887:3;26878:6;26820:71;:::i;:::-;26916:1;26911:3;26907:11;26900:18;;26928:71;26995:3;26986:6;26928:71;:::i;:::-;27024:1;27019:3;27015:11;27008:18;;27036:71;27103:3;27094:6;27036:71;:::i;:::-;27132:1;27127:3;27123:11;27116:18;;27151:3;27144:10;;26379:781;;;;;;;;;;:::o;27166:222::-;27259:4;27297:2;27286:9;27282:18;27274:26;;27310:71;27378:1;27367:9;27363:17;27354:6;27310:71;:::i;:::-;27264:124;;;;:::o;27394:640::-;27589:4;27627:3;27616:9;27612:19;27604:27;;27641:71;27709:1;27698:9;27694:17;27685:6;27641:71;:::i;:::-;27722:72;27790:2;27779:9;27775:18;27766:6;27722:72;:::i;:::-;27804;27872:2;27861:9;27857:18;27848:6;27804:72;:::i;:::-;27923:9;27917:4;27913:20;27908:2;27897:9;27893:18;27886:48;27951:76;28022:4;28013:6;27951:76;:::i;:::-;27943:84;;27594:440;;;;;;;:::o;28040:479::-;28209:4;28247:2;28236:9;28232:18;28224:26;;28260:71;28328:1;28317:9;28313:17;28304:6;28260:71;:::i;:::-;28378:9;28372:4;28368:20;28363:2;28352:9;28348:18;28341:48;28406:106;28507:4;28498:6;28406:106;:::i;:::-;28398:114;;28214:305;;;;;:::o;28525:348::-;28654:4;28692:2;28681:9;28677:18;28669:26;;28705:71;28773:1;28762:9;28758:17;28749:6;28705:71;:::i;:::-;28786:80;28862:2;28851:9;28847:18;28838:6;28786:80;:::i;:::-;28659:214;;;;;:::o;28879:332::-;29000:4;29038:2;29027:9;29023:18;29015:26;;29051:71;29119:1;29108:9;29104:17;29095:6;29051:71;:::i;:::-;29132:72;29200:2;29189:9;29185:18;29176:6;29132:72;:::i;:::-;29005:206;;;;;:::o;29217:330::-;29337:4;29375:2;29364:9;29360:18;29352:26;;29388:71;29456:1;29445:9;29441:17;29432:6;29388:71;:::i;:::-;29469;29536:2;29525:9;29521:18;29512:6;29469:71;:::i;:::-;29342:205;;;;;:::o;29553:369::-;29694:4;29732:2;29721:9;29717:18;29709:26;;29781:9;29775:4;29771:20;29767:1;29756:9;29752:17;29745:47;29809:106;29910:4;29901:6;29809:106;:::i;:::-;29801:114;;29699:223;;;;:::o;29928:210::-;30015:4;30053:2;30042:9;30038:18;30030:26;;30066:65;30128:1;30117:9;30113:17;30104:6;30066:65;:::i;:::-;30020:118;;;;:::o;30144:826::-;30375:4;30413:3;30402:9;30398:19;30390:27;;30427:65;30489:1;30478:9;30474:17;30465:6;30427:65;:::i;:::-;30502:68;30566:2;30555:9;30551:18;30542:6;30502:68;:::i;:::-;30580;30644:2;30633:9;30629:18;30620:6;30580:68;:::i;:::-;30658;30722:2;30711:9;30707:18;30698:6;30658:68;:::i;:::-;30736:69;30800:3;30789:9;30785:19;30776:6;30736:69;:::i;:::-;30815;30879:3;30868:9;30864:19;30855:6;30815:69;:::i;:::-;30894;30958:3;30947:9;30943:19;30934:6;30894:69;:::i;:::-;30380:590;;;;;;;;;;:::o;30976:248::-;31082:4;31120:2;31109:9;31105:18;31097:26;;31133:84;31214:1;31203:9;31199:17;31190:6;31133:84;:::i;:::-;31087:137;;;;:::o;31230:266::-;31345:4;31383:2;31372:9;31368:18;31360:26;;31396:93;31486:1;31475:9;31471:17;31462:6;31396:93;:::i;:::-;31350:146;;;;:::o;31502:252::-;31610:4;31648:2;31637:9;31633:18;31625:26;;31661:86;31744:1;31733:9;31729:17;31720:6;31661:86;:::i;:::-;31615:139;;;;:::o;31760:313::-;31873:4;31911:2;31900:9;31896:18;31888:26;;31960:9;31954:4;31950:20;31946:1;31935:9;31931:17;31924:47;31988:78;32061:4;32052:6;31988:78;:::i;:::-;31980:86;;31878:195;;;;:::o;32079:419::-;32245:4;32283:2;32272:9;32268:18;32260:26;;32332:9;32326:4;32322:20;32318:1;32307:9;32303:17;32296:47;32360:131;32486:4;32360:131;:::i;:::-;32352:139;;32250:248;;;:::o;32504:419::-;32670:4;32708:2;32697:9;32693:18;32685:26;;32757:9;32751:4;32747:20;32743:1;32732:9;32728:17;32721:47;32785:131;32911:4;32785:131;:::i;:::-;32777:139;;32675:248;;;:::o;32929:419::-;33095:4;33133:2;33122:9;33118:18;33110:26;;33182:9;33176:4;33172:20;33168:1;33157:9;33153:17;33146:47;33210:131;33336:4;33210:131;:::i;:::-;33202:139;;33100:248;;;:::o;33354:419::-;33520:4;33558:2;33547:9;33543:18;33535:26;;33607:9;33601:4;33597:20;33593:1;33582:9;33578:17;33571:47;33635:131;33761:4;33635:131;:::i;:::-;33627:139;;33525:248;;;:::o;33779:419::-;33945:4;33983:2;33972:9;33968:18;33960:26;;34032:9;34026:4;34022:20;34018:1;34007:9;34003:17;33996:47;34060:131;34186:4;34060:131;:::i;:::-;34052:139;;33950:248;;;:::o;34204:419::-;34370:4;34408:2;34397:9;34393:18;34385:26;;34457:9;34451:4;34447:20;34443:1;34432:9;34428:17;34421:47;34485:131;34611:4;34485:131;:::i;:::-;34477:139;;34375:248;;;:::o;34629:419::-;34795:4;34833:2;34822:9;34818:18;34810:26;;34882:9;34876:4;34872:20;34868:1;34857:9;34853:17;34846:47;34910:131;35036:4;34910:131;:::i;:::-;34902:139;;34800:248;;;:::o;35054:419::-;35220:4;35258:2;35247:9;35243:18;35235:26;;35307:9;35301:4;35297:20;35293:1;35282:9;35278:17;35271:47;35335:131;35461:4;35335:131;:::i;:::-;35327:139;;35225:248;;;:::o;35479:419::-;35645:4;35683:2;35672:9;35668:18;35660:26;;35732:9;35726:4;35722:20;35718:1;35707:9;35703:17;35696:47;35760:131;35886:4;35760:131;:::i;:::-;35752:139;;35650:248;;;:::o;35904:419::-;36070:4;36108:2;36097:9;36093:18;36085:26;;36157:9;36151:4;36147:20;36143:1;36132:9;36128:17;36121:47;36185:131;36311:4;36185:131;:::i;:::-;36177:139;;36075:248;;;:::o;36329:419::-;36495:4;36533:2;36522:9;36518:18;36510:26;;36582:9;36576:4;36572:20;36568:1;36557:9;36553:17;36546:47;36610:131;36736:4;36610:131;:::i;:::-;36602:139;;36500:248;;;:::o;36754:419::-;36920:4;36958:2;36947:9;36943:18;36935:26;;37007:9;37001:4;36997:20;36993:1;36982:9;36978:17;36971:47;37035:131;37161:4;37035:131;:::i;:::-;37027:139;;36925:248;;;:::o;37179:419::-;37345:4;37383:2;37372:9;37368:18;37360:26;;37432:9;37426:4;37422:20;37418:1;37407:9;37403:17;37396:47;37460:131;37586:4;37460:131;:::i;:::-;37452:139;;37350:248;;;:::o;37604:419::-;37770:4;37808:2;37797:9;37793:18;37785:26;;37857:9;37851:4;37847:20;37843:1;37832:9;37828:17;37821:47;37885:131;38011:4;37885:131;:::i;:::-;37877:139;;37775:248;;;:::o;38029:419::-;38195:4;38233:2;38222:9;38218:18;38210:26;;38282:9;38276:4;38272:20;38268:1;38257:9;38253:17;38246:47;38310:131;38436:4;38310:131;:::i;:::-;38302:139;;38200:248;;;:::o;38454:419::-;38620:4;38658:2;38647:9;38643:18;38635:26;;38707:9;38701:4;38697:20;38693:1;38682:9;38678:17;38671:47;38735:131;38861:4;38735:131;:::i;:::-;38727:139;;38625:248;;;:::o;38879:419::-;39045:4;39083:2;39072:9;39068:18;39060:26;;39132:9;39126:4;39122:20;39118:1;39107:9;39103:17;39096:47;39160:131;39286:4;39160:131;:::i;:::-;39152:139;;39050:248;;;:::o;39304:419::-;39470:4;39508:2;39497:9;39493:18;39485:26;;39557:9;39551:4;39547:20;39543:1;39532:9;39528:17;39521:47;39585:131;39711:4;39585:131;:::i;:::-;39577:139;;39475:248;;;:::o;39729:419::-;39895:4;39933:2;39922:9;39918:18;39910:26;;39982:9;39976:4;39972:20;39968:1;39957:9;39953:17;39946:47;40010:131;40136:4;40010:131;:::i;:::-;40002:139;;39900:248;;;:::o;40154:419::-;40320:4;40358:2;40347:9;40343:18;40335:26;;40407:9;40401:4;40397:20;40393:1;40382:9;40378:17;40371:47;40435:131;40561:4;40435:131;:::i;:::-;40427:139;;40325:248;;;:::o;40579:419::-;40745:4;40783:2;40772:9;40768:18;40760:26;;40832:9;40826:4;40822:20;40818:1;40807:9;40803:17;40796:47;40860:131;40986:4;40860:131;:::i;:::-;40852:139;;40750:248;;;:::o;41004:419::-;41170:4;41208:2;41197:9;41193:18;41185:26;;41257:9;41251:4;41247:20;41243:1;41232:9;41228:17;41221:47;41285:131;41411:4;41285:131;:::i;:::-;41277:139;;41175:248;;;:::o;41429:419::-;41595:4;41633:2;41622:9;41618:18;41610:26;;41682:9;41676:4;41672:20;41668:1;41657:9;41653:17;41646:47;41710:131;41836:4;41710:131;:::i;:::-;41702:139;;41600:248;;;:::o;41854:419::-;42020:4;42058:2;42047:9;42043:18;42035:26;;42107:9;42101:4;42097:20;42093:1;42082:9;42078:17;42071:47;42135:131;42261:4;42135:131;:::i;:::-;42127:139;;42025:248;;;:::o;42279:419::-;42445:4;42483:2;42472:9;42468:18;42460:26;;42532:9;42526:4;42522:20;42518:1;42507:9;42503:17;42496:47;42560:131;42686:4;42560:131;:::i;:::-;42552:139;;42450:248;;;:::o;42704:331::-;42851:4;42889:3;42878:9;42874:19;42866:27;;42903:125;43025:1;43014:9;43010:17;43001:6;42903:125;:::i;:::-;42856:179;;;;:::o;43041:222::-;43134:4;43172:2;43161:9;43157:18;43149:26;;43185:71;43253:1;43242:9;43238:17;43229:6;43185:71;:::i;:::-;43139:124;;;;:::o;43269:218::-;43360:4;43398:2;43387:9;43383:18;43375:26;;43411:69;43477:1;43466:9;43462:17;43453:6;43411:69;:::i;:::-;43365:122;;;;:::o;43493:214::-;43582:4;43620:2;43609:9;43605:18;43597:26;;43633:67;43697:1;43686:9;43682:17;43673:6;43633:67;:::i;:::-;43587:120;;;;:::o;43713:129::-;43747:6;43774:20;;:::i;:::-;43764:30;;43803:33;43831:4;43823:6;43803:33;:::i;:::-;43754:88;;;:::o;43848:75::-;43881:6;43914:2;43908:9;43898:19;;43888:35;:::o;43929:307::-;43990:4;44080:18;44072:6;44069:30;44066:2;;;44102:18;;:::i;:::-;44066:2;44140:29;44162:6;44140:29;:::i;:::-;44132:37;;44224:4;44218;44214:15;44206:23;;43995:241;;;:::o;44242:308::-;44304:4;44394:18;44386:6;44383:30;44380:2;;;44416:18;;:::i;:::-;44380:2;44454:29;44476:6;44454:29;:::i;:::-;44446:37;;44538:4;44532;44528:15;44520:23;;44309:241;;;:::o;44556:131::-;44622:4;44645:3;44637:11;;44675:4;44670:3;44666:14;44658:22;;44627:60;;;:::o;44693:113::-;44759:6;44793:5;44787:12;44777:22;;44766:40;;;:::o;44812:98::-;44863:6;44897:5;44891:12;44881:22;;44870:40;;;:::o;44916:99::-;44968:6;45002:5;44996:12;44986:22;;44975:40;;;:::o;45021:112::-;45090:4;45122;45117:3;45113:14;45105:22;;45095:38;;;:::o;45139:183::-;45237:11;45271:6;45266:3;45259:19;45311:4;45306:3;45302:14;45287:29;;45249:73;;;;:::o;45328:168::-;45411:11;45445:6;45440:3;45433:19;45485:4;45480:3;45476:14;45461:29;;45423:73;;;;:::o;45502:169::-;45586:11;45620:6;45615:3;45608:19;45660:4;45655:3;45651:14;45636:29;;45598:73;;;;:::o;45677:305::-;45717:3;45736:20;45754:1;45736:20;:::i;:::-;45731:25;;45770:20;45788:1;45770:20;:::i;:::-;45765:25;;45924:1;45856:66;45852:74;45849:1;45846:81;45843:2;;;45930:18;;:::i;:::-;45843:2;45974:1;45971;45967:9;45960:16;;45721:261;;;;:::o;45988:237::-;46026:3;46045:18;46061:1;46045:18;:::i;:::-;46040:23;;46077:18;46093:1;46077:18;:::i;:::-;46072:23;;46167:1;46161:4;46157:12;46154:1;46151:19;46148:2;;;46173:18;;:::i;:::-;46148:2;46217:1;46214;46210:9;46203:16;;46030:195;;;;:::o;46231:185::-;46271:1;46288:20;46306:1;46288:20;:::i;:::-;46283:25;;46322:20;46340:1;46322:20;:::i;:::-;46317:25;;46361:1;46351:2;;46366:18;;:::i;:::-;46351:2;46408:1;46405;46401:9;46396:14;;46273:143;;;;:::o;46422:348::-;46462:7;46485:20;46503:1;46485:20;:::i;:::-;46480:25;;46519:20;46537:1;46519:20;:::i;:::-;46514:25;;46707:1;46639:66;46635:74;46632:1;46629:81;46624:1;46617:9;46610:17;46606:105;46603:2;;;46714:18;;:::i;:::-;46603:2;46762:1;46759;46755:9;46744:20;;46470:300;;;;:::o;46776:191::-;46816:4;46836:20;46854:1;46836:20;:::i;:::-;46831:25;;46870:20;46888:1;46870:20;:::i;:::-;46865:25;;46909:1;46906;46903:8;46900:2;;;46914:18;;:::i;:::-;46900:2;46959:1;46956;46952:9;46944:17;;46821:146;;;;:::o;46973:96::-;47010:7;47039:24;47057:5;47039:24;:::i;:::-;47028:35;;47018:51;;;:::o;47075:104::-;47120:7;47149:24;47167:5;47149:24;:::i;:::-;47138:35;;47128:51;;;:::o;47185:90::-;47219:7;47262:5;47255:13;47248:21;47237:32;;47227:48;;;:::o;47281:77::-;47318:7;47347:5;47336:16;;47326:32;;;:::o;47364:149::-;47400:7;47440:66;47433:5;47429:78;47418:89;;47408:105;;;:::o;47519:126::-;47556:7;47596:42;47589:5;47585:54;47574:65;;47564:81;;;:::o;47651:77::-;47688:7;47717:5;47706:16;;47696:32;;;:::o;47734:93::-;47770:7;47810:10;47803:5;47799:22;47788:33;;47778:49;;;:::o;47833:86::-;47868:7;47908:4;47901:5;47897:16;47886:27;;47876:43;;;:::o;47925:152::-;47988:9;48021:50;48065:5;48021:50;:::i;:::-;48008:63;;47998:79;;;:::o;48083:126::-;48146:9;48179:24;48197:5;48179:24;:::i;:::-;48166:37;;48156:53;;;:::o;48215:170::-;48287:9;48320:59;48373:5;48320:59;:::i;:::-;48307:72;;48297:88;;;:::o;48391:135::-;48463:9;48496:24;48514:5;48496:24;:::i;:::-;48483:37;;48473:53;;;:::o;48532:156::-;48597:9;48630:52;48676:5;48630:52;:::i;:::-;48617:65;;48607:81;;;:::o;48694:128::-;48759:9;48792:24;48810:5;48792:24;:::i;:::-;48779:37;;48769:53;;;:::o;48828:121::-;48886:9;48919:24;48937:5;48919:24;:::i;:::-;48906:37;;48896:53;;;:::o;48955:111::-;49004:9;49037:23;49054:5;49037:23;:::i;:::-;49024:36;;49014:52;;;:::o;49072:154::-;49156:6;49151:3;49146;49133:30;49218:1;49209:6;49204:3;49200:16;49193:27;49123:103;;;:::o;49232:307::-;49300:1;49310:113;49324:6;49321:1;49318:13;49310:113;;;49409:1;49404:3;49400:11;49394:18;49390:1;49385:3;49381:11;49374:39;49346:2;49343:1;49339:10;49334:15;;49310:113;;;49441:6;49438:1;49435:13;49432:2;;;49521:1;49512:6;49507:3;49503:16;49496:27;49432:2;49281:258;;;;:::o;49545:320::-;49589:6;49626:1;49620:4;49616:12;49606:22;;49673:1;49667:4;49663:12;49694:18;49684:2;;49750:4;49742:6;49738:17;49728:27;;49684:2;49812;49804:6;49801:14;49781:18;49778:38;49775:2;;;49831:18;;:::i;:::-;49775:2;49596:269;;;;:::o;49871:281::-;49954:27;49976:4;49954:27;:::i;:::-;49946:6;49942:40;50084:6;50072:10;50069:22;50048:18;50036:10;50033:34;50030:62;50027:2;;;50095:18;;:::i;:::-;50027:2;50135:10;50131:2;50124:22;49914:238;;;:::o;50158:233::-;50197:3;50220:24;50238:5;50220:24;:::i;:::-;50211:33;;50266:66;50259:5;50256:77;50253:2;;;50336:18;;:::i;:::-;50253:2;50383:1;50376:5;50372:13;50365:20;;50201:190;;;:::o;50397:175::-;50435:3;50458:23;50475:5;50458:23;:::i;:::-;50449:32;;50503:10;50496:5;50493:21;50490:2;;;50517:18;;:::i;:::-;50490:2;50564:1;50557:5;50553:13;50546:20;;50439:133;;;:::o;50578:100::-;50617:7;50646:26;50666:5;50646:26;:::i;:::-;50635:37;;50625:53;;;:::o;50684:95::-;50720:7;50749:24;50767:5;50749:24;:::i;:::-;50738:35;;50728:51;;;:::o;50785:79::-;50824:7;50853:5;50842:16;;50832:32;;;:::o;50870:94::-;50909:7;50938:20;50952:5;50938:20;:::i;:::-;50927:31;;50917:47;;;:::o;50970:79::-;51009:7;51038:5;51027:16;;51017:32;;;:::o;51055:93::-;51092:7;51121:21;51136:5;51121:21;:::i;:::-;51110:32;;51100:48;;;:::o;51154:176::-;51186:1;51203:20;51221:1;51203:20;:::i;:::-;51198:25;;51237:20;51255:1;51237:20;:::i;:::-;51232:25;;51276:1;51266:2;;51281:18;;:::i;:::-;51266:2;51322:1;51319;51315:9;51310:14;;51188:142;;;;:::o;51336:170::-;51366:1;51383:18;51399:1;51383:18;:::i;:::-;51378:23;;51415:18;51431:1;51415:18;:::i;:::-;51410:23;;51452:1;51442:2;;51457:18;;:::i;:::-;51442:2;51498:1;51495;51491:9;51486:14;;51368:138;;;;:::o;51512:180::-;51560:77;51557:1;51550:88;51657:4;51654:1;51647:15;51681:4;51678:1;51671:15;51698:180;51746:77;51743:1;51736:88;51843:4;51840:1;51833:15;51867:4;51864:1;51857:15;51884:180;51932:77;51929:1;51922:88;52029:4;52026:1;52019:15;52053:4;52050:1;52043:15;52070:180;52118:77;52115:1;52108:88;52215:4;52212:1;52205:15;52239:4;52236:1;52229:15;52256:180;52304:77;52301:1;52294:88;52401:4;52398:1;52391:15;52425:4;52422:1;52415:15;52442:180;52490:77;52487:1;52480:88;52587:4;52584:1;52577:15;52611:4;52608:1;52601:15;52628:117;52737:1;52734;52727:12;52751:117;52860:1;52857;52850:12;52874:117;52983:1;52980;52973:12;52997:117;53106:1;53103;53096:12;53120:102;53161:6;53212:2;53208:7;53203:2;53196:5;53192:14;53188:28;53178:38;;53168:54;;;:::o;53228:96::-;53262:8;53311:5;53306:3;53302:15;53281:36;;53271:53;;;:::o;53330:94::-;53363:8;53411:5;53407:2;53403:14;53382:35;;53372:52;;;:::o;53430:170::-;53570:22;53566:1;53558:6;53554:14;53547:46;53536:64;:::o;53606:230::-;53746:34;53742:1;53734:6;53730:14;53723:58;53815:13;53810:2;53802:6;53798:15;53791:38;53712:124;:::o;53842:237::-;53982:34;53978:1;53970:6;53966:14;53959:58;54051:20;54046:2;54038:6;54034:15;54027:45;53948:131;:::o;54085:225::-;54225:34;54221:1;54213:6;54209:14;54202:58;54294:8;54289:2;54281:6;54277:15;54270:33;54191:119;:::o;54316:167::-;54456:19;54452:1;54444:6;54440:14;54433:43;54422:61;:::o;54489:178::-;54629:30;54625:1;54617:6;54613:14;54606:54;54595:72;:::o;54673:172::-;54813:24;54809:1;54801:6;54797:14;54790:48;54779:66;:::o;54851:158::-;54991:10;54987:1;54979:6;54975:14;54968:34;54957:52;:::o;55015:223::-;55155:34;55151:1;55143:6;55139:14;55132:58;55224:6;55219:2;55211:6;55207:15;55200:31;55121:117;:::o;55244:175::-;55384:27;55380:1;55372:6;55368:14;55361:51;55350:69;:::o;55425:231::-;55565:34;55561:1;55553:6;55549:14;55542:58;55634:14;55629:2;55621:6;55617:15;55610:39;55531:125;:::o;55662:181::-;55802:33;55798:1;55790:6;55786:14;55779:57;55768:75;:::o;55849:166::-;55989:18;55985:1;55977:6;55973:14;55966:42;55955:60;:::o;56021:243::-;56161:34;56157:1;56149:6;56145:14;56138:58;56230:26;56225:2;56217:6;56213:15;56206:51;56127:137;:::o;56270:229::-;56410:34;56406:1;56398:6;56394:14;56387:58;56479:12;56474:2;56466:6;56462:15;56455:37;56376:123;:::o;56505:228::-;56645:34;56641:1;56633:6;56629:14;56622:58;56714:11;56709:2;56701:6;56697:15;56690:36;56611:122;:::o;56739:182::-;56879:34;56875:1;56867:6;56863:14;56856:58;56845:76;:::o;56927:231::-;57067:34;57063:1;57055:6;57051:14;57044:58;57136:14;57131:2;57123:6;57119:15;57112:39;57033:125;:::o;57164:182::-;57304:34;57300:1;57292:6;57288:14;57281:58;57270:76;:::o;57352:228::-;57492:34;57488:1;57480:6;57476:14;57469:58;57561:11;57556:2;57548:6;57544:15;57537:36;57458:122;:::o;57586:234::-;57726:34;57722:1;57714:6;57710:14;57703:58;57795:17;57790:2;57782:6;57778:15;57771:42;57692:128;:::o;57826:220::-;57966:34;57962:1;57954:6;57950:14;57943:58;58035:3;58030:2;58022:6;58018:15;58011:28;57932:114;:::o;58052:236::-;58192:34;58188:1;58180:6;58176:14;58169:58;58261:19;58256:2;58248:6;58244:15;58237:44;58158:130;:::o;58294:169::-;58434:21;58430:1;58422:6;58418:14;58411:45;58400:63;:::o;58469:231::-;58609:34;58605:1;58597:6;58593:14;58586:58;58678:14;58673:2;58665:6;58661:15;58654:39;58575:125;:::o;58706:122::-;58779:24;58797:5;58779:24;:::i;:::-;58772:5;58769:35;58759:2;;58818:1;58815;58808:12;58759:2;58749:79;:::o;58834:138::-;58915:32;58941:5;58915:32;:::i;:::-;58908:5;58905:43;58895:2;;58962:1;58959;58952:12;58895:2;58885:87;:::o;58978:116::-;59048:21;59063:5;59048:21;:::i;:::-;59041:5;59038:32;59028:2;;59084:1;59081;59074:12;59028:2;59018:76;:::o;59100:120::-;59172:23;59189:5;59172:23;:::i;:::-;59165:5;59162:34;59152:2;;59210:1;59207;59200:12;59152:2;59142:78;:::o;59226:122::-;59299:24;59317:5;59299:24;:::i;:::-;59292:5;59289:35;59279:2;;59338:1;59335;59328:12;59279:2;59269:79;:::o
Swarm Source
ipfs://3814aa52e992ba611607fbb9c067749591a1cf510219d2f6c9dbcf1496c4aa2d