Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract contains unverified libraries: Looting
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EvoSnails
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-01 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // SPDX-License-Identifier: MIT 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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] 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 IERC721ReceiverUpgradeable { /** * @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); } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] 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 IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] 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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected] 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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable 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. */ function __ERC721_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.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 {} uint256[44] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] 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 IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] 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 ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { function __ERC721Enumerable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721Enumerable_init_unchained(); } function __ERC721Enumerable_init_unchained() internal initializer { } // 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(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721Upgradeable.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 < ERC721EnumerableUpgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(); } uint256[46] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] 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 PausableUpgradeable is Initializable, ContextUpgradeable { /** * @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. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _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()); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] 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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _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); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable { function __ERC721Burnable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721Burnable_init_unchained(); } function __ERC721Burnable_init_unchained() internal initializer { } /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal initializer { __Context_init_unchained(); __ERC20Burnable_init_unchained(); } function __ERC20Burnable_init_unchained() internal initializer { } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { function __ERC20Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); __ERC20Pausable_init_unchained(); } function __ERC20Pausable_init_unchained() internal initializer { } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/structs/[email protected] pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { function __AccessControlEnumerable_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __AccessControlEnumerable_init_unchained(); } function __AccessControlEnumerable_init_unchained() internal initializer { } using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/presets/[email protected] pragma solidity ^0.8.0; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable { function initialize(string memory name, string memory symbol) public virtual initializer { __ERC20PresetMinterPauser_init(name, symbol); } bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ function __ERC20PresetMinterPauser_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); __AccessControlEnumerable_init_unchained(); __ERC20_init_unchained(name, symbol); __ERC20Burnable_init_unchained(); __Pausable_init_unchained(); __ERC20Pausable_init_unchained(); __ERC20PresetMinterPauser_init_unchained(name, symbol); } function __ERC20PresetMinterPauser_init_unchained(string memory name, string memory symbol) internal initializer { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC20Upgradeable, ERC20PausableUpgradeable) { super._beforeTokenTransfer(from, to, amount); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File contracts/NFT.sol pragma solidity ^0.8.2; interface InventoryManager { function getTokenURI( uint16 id, uint8 background_, uint8 trail_, uint8 body_, uint8 shell_, uint8 eyes_, uint8 mouth_, uint8 accessory_, bool staked_, uint8 modifier_ ) external view returns (string memory); } contract Leaf is ERC20PresetMinterPauserUpgradeable { function init() public initializer { __ERC20PresetMinterPauser_init("Leaf", "LEAF"); } function burnFrom(address from, uint256 amount) public override { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _burn(from, amount); } } struct LootPool { uint16 cost; uint16 total; uint8 minTier; uint16 tier1; uint16 tier2; uint16 tier3; uint16 tier4; } struct Snail { uint8 background; uint8 trail; uint8 body; uint8 shell; uint8 eyes; uint8 mouth; uint8 accessory; } library Looting { function init(mapping(uint8 => LootPool) storage pools, mapping(uint8 => uint8[]) storage bodyToEyesMouth) public { pools[0] = LootPool({cost: 0, total: 100, minTier: 0, tier1: 95, tier2: 5, tier3: 0, tier4: 0}); pools[1] = LootPool({cost: 1, total: 100, minTier: 1, tier1: 80, tier2: 15, tier3: 5, tier4: 0}); pools[2] = LootPool({cost: 3, total: 30000, minTier: 1, tier1: 3900, tier2: 21000, tier3: 5100, tier4: 0}); pools[3] = LootPool({cost: 6, total: 20300, minTier: 2, tier1: 3048, tier2: 15222, tier3: 2030, tier4: 0}); pools[4] = LootPool({cost: 12, total: 13500, minTier: 3, tier1: 6750, tier2: 6750, tier3: 0, tier4: 0}); pools[5] = LootPool({cost: 24, total: 1666, minTier: 4, tier1: 833, tier2: 833, tier3: 0, tier4: 0}); pools[6] = LootPool({cost: 48, total: 3333, minTier: 5, tier1: 3328, tier2: 5, tier3: 0, tier4: 0}); bodyToEyesMouth[1] = [4, 6, 18, 8, 16, 20]; bodyToEyesMouth[2] = [4, 21, 26, 5, 16, 23]; bodyToEyesMouth[3] = [6, 21, 33, 2, 14, 23]; bodyToEyesMouth[4] = [21, 22, 33, 5, 8, 16]; bodyToEyesMouth[5] = [4, 6, 26, 20, 22, 23]; bodyToEyesMouth[6] = [8, 13, 26, 5, 12, 16]; bodyToEyesMouth[7] = [4, 25, 33, 3, 8, 18]; bodyToEyesMouth[8] = [2, 6, 25, 3, 10, 14]; bodyToEyesMouth[9] = [15, 21, 29, 3, 4, 17]; bodyToEyesMouth[10] = [18, 25, 31, 5, 19, 20]; bodyToEyesMouth[11] = [5, 10, 12, 9, 15, 16]; bodyToEyesMouth[12] = [1, 16, 29, 3, 7, 19]; bodyToEyesMouth[13] = [3, 8, 17, 10, 15, 20]; bodyToEyesMouth[14] = [2, 18, 30, 2, 5, 21]; bodyToEyesMouth[15] = [1, 4, 14, 10, 19, 21]; bodyToEyesMouth[16] = [6, 10, 28, 1, 9, 16]; bodyToEyesMouth[17] = [5, 8, 18, 9, 19, 21]; bodyToEyesMouth[18] = [1, 25, 26, 4, 7, 19]; bodyToEyesMouth[19] = [10, 13, 18, 1, 8, 15]; bodyToEyesMouth[20] = [1, 7, 33, 8, 9, 10]; bodyToEyesMouth[21] = [1, 3, 25, 9, 10, 22]; bodyToEyesMouth[22] = [2, 11, 18, 6, 9, 21]; bodyToEyesMouth[23] = [1, 3, 28, 9, 13, 18]; bodyToEyesMouth[24] = [26, 27, 32, 4, 10, 19]; bodyToEyesMouth[25] = [8, 14, 28, 1, 6, 7]; bodyToEyesMouth[26] = [1, 20, 28, 1, 10, 19]; bodyToEyesMouth[27] = [7, 25, 28, 8, 9, 15]; bodyToEyesMouth[28] = [7, 9, 25, 1, 7, 16]; bodyToEyesMouth[29] = [3, 10, 23, 15, 19, 23]; bodyToEyesMouth[30] = [7, 27, 32, 6, 9, 21]; } function checkFullSet(Snail storage snail, mapping(uint8 => bool) storage setClaimed) public { uint8[5][5] memory sets = [ [23, 16, 27, 13, 36], [25, 26, 29, 14, 37], [30, 29, 23, 29, 38], [27, 20, 20, 25, 40], [26, 30, 15, 27, 39] ]; for (uint8 i = 0; i < 5; i++) { if (setClaimed[i]) continue; if (snail.background == sets[i][0] && snail.body == sets[i][1] && snail.shell == sets[i][2] && snail.trail == sets[i][3]) { snail.accessory = sets[i][4]; setClaimed[i] = true; break; } } } } contract EvoSnails is ERC721Upgradeable, ERC721EnumerableUpgradeable, PausableUpgradeable, OwnableUpgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private _tokenIdCounter; ///////////////////////////////////////////////////////////// // CONFIGURATION ///////////////////////////////////////////////////////////// uint256 public constant cost = 0.05 ether; uint256 public constant maxSupply = 5555; uint256 public constant maxMintAmount = 1; uint256 internal constant partsPerTier = 5; bool internal cooldownEnabled; bool internal gamePaused; uint88 public whitelistMintStartTime; uint88 public publicMintStartTime; uint88 public startTime; bytes32 public merkleRoot; mapping(address => uint256) snailsMinted; ERC20PresetMinterPauserUpgradeable public leaf; InventoryManager inventoryManager; ///////////////////////////////////////////////////////////// // UTILS ///////////////////////////////////////////////////////////// uint256 entropy; ///////////////////////////////////////////////////////////// // STRUCTURES ///////////////////////////////////////////////////////////// mapping(uint256 => Snail) public snails; enum ActivityState { UNSTAKED, GREENHOUSE } struct Activity { ActivityState state; address user; uint48 since; uint40 lastRoll; } mapping(uint256 => Activity) public snailActivities; enum Part { ACCESSORY, BACKGROUND, BODY, EYES, MOUTH, SHELL, TRAIL } mapping(uint8 => LootPool) public pools; mapping(uint8 => bool) public setClaimed; mapping(uint8 => uint8[]) internal bodyToEyesMouth; ///////////////////////////////////////////////////////////// // SET UP ///////////////////////////////////////////////////////////// function initialize() public initializer { __ERC721_init("EvoSnails", "EVOSNAIL"); __ERC721Enumerable_init(); __Pausable_init(); __Ownable_init(); cooldownEnabled = true; gamePaused = false; whitelistMintStartTime = 1635753600; publicMintStartTime = 1635796800; startTime = 1635800400; Looting.init(pools, bodyToEyesMouth); } function setInventoryManager(address manager) public onlyOwner { inventoryManager = InventoryManager(manager); } function setLeaf(address leaf_) public onlyOwner { leaf = Leaf(leaf_); } ///////////////////////////////////////////////////////////// // MINTING ///////////////////////////////////////////////////////////// function mint(uint256 _mintAmount) public payable noCheaters { uint256 supply = totalSupply(); require(block.timestamp > publicMintStartTime, "mint locked"); require(_mintAmount > 0, "amount must be >0"); require(_mintAmount <= maxMintAmount, "amount must < max"); require(supply + _mintAmount <= maxSupply, "sold out!"); if (msg.sender != owner()) { require(msg.value >= cost * _mintAmount, "no funds"); } for (uint256 i = 1; i <= _mintAmount; i++) { _mintSnail(msg.sender); } } function mintWhitelist( address account, uint256 tokenId, bytes32[] calldata proof ) public payable noCheaters { require(block.timestamp > whitelistMintStartTime, "mint locked"); if (msg.sender != owner() && tokenId > 113) { require(msg.value >= cost, "no funds"); } require(_verify(_leaf(account, tokenId), proof), "Invalid proof"); require(snailsMinted[account] == 0, "already minted"); snailsMinted[account]++; _mintSnail(account); } ///////////////////////////////////////////////////////////// // STAKING ///////////////////////////////////////////////////////////// function claimableLeaf(uint256 id) public view returns (uint256 _claimable) { Activity memory currentActivity = snailActivities[id]; uint256 diff = uint48(block.timestamp) - snailActivities[id].since; if (currentActivity.state == ActivityState.UNSTAKED) { _claimable = 0; return _claimable; } _claimable = ((diff * (leafModifier(id)) * 1 ether)) / 1 days; return _claimable; } function greenhouseSnails(uint256[] calldata ids) public noCheaters { require(block.timestamp > startTime, "not started"); require(!gamePaused, "game paused"); for (uint256 index = 0; index < ids.length; index++) { _greenhouse(ids[index]); } } function _greenhouse(uint256 id) private { Activity memory currentActivity = snailActivities[id]; require(currentActivity.state != ActivityState.GREENHOUSE, "already staked"); require(msg.sender == ownerOf(id), "not yours"); _transfer(msg.sender, address(this), id); snailActivities[id] = Activity({ state: ActivityState.GREENHOUSE, since: uint48(block.timestamp), user: msg.sender, lastRoll: currentActivity.lastRoll }); } function returnSnails(uint256[] calldata ids) public noCheaters { for (uint256 index = 0; index < ids.length; index++) { _returnSnail(ids[index]); } } function _returnSnail(uint256 id) private { Activity memory currentActivity = snailActivities[id]; require(currentActivity.state != ActivityState.UNSTAKED, "already unstaked"); require(msg.sender == snailActivities[id].user); _transfer(address(this), msg.sender, id); _withdrawLeaf(id); snailActivities[id] = Activity({ state: ActivityState.UNSTAKED, since: uint48(block.timestamp), user: msg.sender, lastRoll: currentActivity.lastRoll }); } function withdrawLeaf(uint256[] calldata ids) public noCheaters { for (uint256 index = 0; index < ids.length; index++) { _withdrawLeaf(ids[index]); } } function _withdrawLeaf(uint256 id) private { Activity memory currentActivity = snailActivities[id]; if (currentActivity.state == ActivityState.UNSTAKED) { require(msg.sender == ownerOf(id)); } else if (currentActivity.state == ActivityState.GREENHOUSE) { require(msg.sender == currentActivity.user); } uint256 claimable = claimableLeaf(id); if (claimable == 0) return; leaf.mint(msg.sender, claimableLeaf(id)); snailActivities[id].since = uint48(block.timestamp); } function leafModifier(uint256 id) public view returns (uint256 mod) { Snail memory snail = snails[id]; // Check to see if this is a 1 of 1 if (_getTier(snail.body) >= 6) return 60; mod = 5; uint256 a_t = _getTier(snail.accessory); if (a_t == 7) mod += 25; else if (a_t >= 2) mod += a_t; mod += _getTier(snail.background); mod += _getTier(snail.body); mod += _getTier(snail.shell); mod += _getTier(snail.trail); return mod; } function stakedSnailsCount(address _owner) public view returns (uint256) { uint256 numIds = 0; Activity memory activity; for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) { activity = snailActivities[i]; if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) numIds++; } return numIds; } function stakedSnailByIndex(address _owner, uint256 index) public view returns (uint256) { uint256 numIds = 0; Activity memory activity; for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) { activity = snailActivities[i]; if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) { if (numIds == index) return i; numIds++; } } return 0; } ///////////////////////////////////////////////////////////// // LOOTING ///////////////////////////////////////////////////////////// function lootForSnail( uint256 id, uint8 rollTier, bool rollAccessory, bool rollBackground, bool rollBody, bool rollShell, bool rollTrail ) public noCheaters { Activity memory currentActivity = snailActivities[id]; if (currentActivity.state == ActivityState.UNSTAKED) { require(msg.sender == ownerOf(id)); } else if (currentActivity.state == ActivityState.GREENHOUSE) { require(msg.sender == currentActivity.user); } Snail memory snail = snails[id]; require(!gamePaused, "game paused"); require(rollAccessory || rollBackground || rollBody || rollShell || rollTrail, "roll >0 parts"); require(canLoot(id, rollTier), "cooldown"); require(rollTier > 0 && rollTier <= 6, "invalid tier"); require(tierUnlocked(rollTier), "tier locked"); require(_getTier(snail.body) < 6, "can't roll a unique"); snailActivities[id].lastRoll = uint40(block.timestamp); // Withdraw current rewards to avoid multiplying _withdrawLeaf(id); leaf.burnFrom(msg.sender, _costToRoll(rollTier, rollAccessory, rollBackground, rollBody, rollShell, rollTrail)); uint8 newItem; if (rollAccessory) { newItem = _rollPart(id, rollTier, Part.ACCESSORY); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollBackground) { newItem = _rollPart(id, rollTier, Part.BACKGROUND); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollBody) { newItem = _rollPart(id, rollTier, Part.BODY); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollShell) { newItem = _rollPart(id, rollTier, Part.SHELL); if (_getTier(newItem) == 6) { _setUnique(id); return; } } if (rollTrail) { newItem = _rollPart(id, rollTier, Part.TRAIL); if (_getTier(newItem) == 6) { _setUnique(id); return; } } _checkFullSet(id); } function canLoot(uint256 id, uint8 rollTier) public view returns (bool) { Activity memory currentActivity = snailActivities[id]; return block.timestamp - currentActivity.lastRoll > uint40(_cooldownForTier(rollTier)); } function _costToRoll( uint8 rollTier, bool rollAccessory, bool rollBackground, bool rollBody, bool rollShell, bool rollTrail ) internal view returns (uint256) { uint8 numberOfTraits = 0; if (rollAccessory) numberOfTraits++; if (rollBackground) numberOfTraits++; if (rollBody) numberOfTraits++; if (rollShell) numberOfTraits++; if (rollTrail) numberOfTraits++; return uint256(pools[rollTier].cost) * uint256(numberOfTraits) * 1 ether; } function _rollPart( uint256 id, uint8 rollTier, Part part ) internal returns (uint8) { uint256 seed = _rand(); uint256 rand = _randomiseFromSeed(seed, uint256(part), id); LootPool memory lootPool = pools[rollTier]; require(lootPool.total > 0, "pool empty"); (uint8 newItem, LootPool memory newLootPool) = _getItem(rand, lootPool); Snail memory snail = snails[id]; if (part == Part.ACCESSORY) snail.accessory = newItem; else if (part == Part.BACKGROUND) snail.background = newItem; else if (part == Part.BODY) { snail.body = newItem; if (newItem < 31) { uint8 eyeIdx = uint8(_randomiseFromSeed(seed, "eyes", 0) % 3); uint8 mouthIdx = uint8((_randomiseFromSeed(seed, "eyes", 0) % 3) + 3); snail.eyes = bodyToEyesMouth[newItem][eyeIdx]; snail.mouth = bodyToEyesMouth[newItem][mouthIdx]; } } else if (part == Part.SHELL) snail.shell = newItem; else if (part == Part.TRAIL) snail.trail = newItem; snails[id] = snail; if (rollTier >= 2) pools[rollTier] = newLootPool; return newItem; } function _getItem(uint256 rand, LootPool memory lootPool) internal pure returns (uint8, LootPool memory) { uint256 roll = rand % lootPool.total; lootPool.total--; uint8 item; if (roll >= lootPool.tier1 + lootPool.tier2 + lootPool.tier3 && lootPool.tier4 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 3) * partsPerTier); lootPool.tier4--; } else if (roll >= lootPool.tier1 + lootPool.tier2 && lootPool.tier3 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 2) * partsPerTier); lootPool.tier3--; } else if (roll >= lootPool.tier1 && lootPool.tier2 > 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 1) * partsPerTier); lootPool.tier2--; } else if (lootPool.tier1 >= 0) { item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier) * partsPerTier); lootPool.tier1--; } return (item, lootPool); } function _setUnique(uint256 id) internal { uint8 newItem = uint8(pools[6].tier2) + 1 + 30; Snail memory snail = snails[id]; snail.accessory = newItem; snail.background = newItem; snail.body = newItem; snail.shell = newItem; snail.trail = newItem; snails[id] = snail; } function _checkFullSet(uint256 id) internal { Looting.checkFullSet(snails[id], setClaimed); } function _getTier(uint256 partId) internal pure returns (uint8) { if (partId == 0) return 0; return uint8((partId - 1) / partsPerTier); } function _cooldownForTier(uint8 _tier) internal view returns (uint256) { if (!cooldownEnabled) return 0; return 8 hours; } function tierUnlocked(uint8 tier) public view returns (bool) { if (tier == 0) return true; return block.timestamp > (startTime + 1 * uint88(tier - 1) * 27 hours); } ///////////////////////////////////////////////////////////// // TOKEN FUNCTIONALITY ///////////////////////////////////////////////////////////// function tokenURI(uint256 id) public view override returns (string memory) { Snail memory snail = snails[id]; Activity memory activity = snailActivities[id]; uint8 modifier_ = uint8(leafModifier(id)); return inventoryManager.getTokenURI( uint16(id), snail.background, snail.trail, snail.body, snail.shell, snail.eyes, snail.mouth, snail.accessory, activity.state == ActivityState.GREENHOUSE, modifier_ ); } ///////////////////////////////////////////////////////////// // INTERNAL HELPERS ///////////////////////////////////////////////////////////// function withdraw() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance), "could not withdraw"); } function mintLeaf(address _to, uint256 _amount) public onlyOwner { leaf.mint(_to, _amount); } function _mintSnail(address _to) internal { _tokenIdCounter.increment(); uint256 id = _tokenIdCounter.current(); (uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail) = (1, 1, 0, 0, 0, 0, 0); uint8 numOptions = 3; uint256 seed = _rand(); LootPool memory pool = pools[0]; (body, pool) = _getItem(_randomiseFromSeed(seed, "body", id), pool); (shell, pool) = _getItem(_randomiseFromSeed(seed, "shell", id), pool); (trail, pool) = _getItem(_randomiseFromSeed(seed, "trail", id), pool); eyes = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "eyes", id) % numOptions)]; mouth = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "mouth", id) % numOptions) + 3]; _mint(_to, id); snails[id] = Snail({ accessory: accessory, background: background, body: body, eyes: eyes, mouth: mouth, shell: shell, trail: trail }); snailActivities[id] = Activity({user: _to, since: uint48(block.timestamp), state: ActivityState.UNSTAKED, lastRoll: 0}); } function _randomiseFromSeed( uint256 _seed, uint256 part, uint256 _additional ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_seed, part, _additional))); } function _randomiseFromSeed( uint256 _seed, string memory part, uint256 _additional ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_seed, part, _additional))); } function _rand() internal view returns (uint256) { uint256 ret = uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, entropy))); return ret; } modifier noCheaters() { // We thank EtherOrcs for the idea of this function. uint256 size = 0; address acc = msg.sender; assembly { size := extcodesize(acc) } require(msg.sender == tx.origin, "cheater"); require(size == 0, "cheater"); _; entropy = uint256(keccak256(abi.encodePacked(acc, block.coinbase))); } ///////////////////////////////////////////////////////////// // ADMINISTRATIVE ///////////////////////////////////////////////////////////// function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function setWhitelistMintStartTime(uint88 _time) public onlyOwner { whitelistMintStartTime = _time; } function setPublicMintStartTime(uint88 _time) public onlyOwner { publicMintStartTime = _time; } function setStartTime(uint88 _time) public onlyOwner { startTime = _time; } function setCooldownEnabled(bool _enabled) public onlyOwner { cooldownEnabled = _enabled; } function setGamePaused(bool _paused) public onlyOwner { gamePaused = _paused; } function safeMint(address _to, uint256 _tokenId) public onlyOwner { _safeMint(_to, _tokenId); } function adminSetSnail( uint256 id, uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail ) public onlyOwner { Snail memory snail = snails[id]; snail.accessory = accessory; snail.background = background; snail.body = body; snail.eyes = eyes; snail.mouth = mouth; snail.shell = shell; snail.trail = trail; snails[id] = snail; _checkFullSet(id); } function _leaf(address account, uint256 tokenId) internal pure returns (bytes32) { return keccak256(abi.encodePacked(tokenId, account)); } function _verify(bytes32 _leafNode, bytes32[] memory proof) internal view returns (bool) { return MerkleProofUpgradeable.verify(proof, merkleRoot, _leafNode); } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) whenNotPaused { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721EnumerableUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"accessory","type":"uint8"},{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"shell","type":"uint8"},{"internalType":"uint8","name":"trail","type":"uint8"}],"name":"adminSetSnail","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"rollTier","type":"uint8"}],"name":"canLoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimableLeaf","outputs":[{"internalType":"uint256","name":"_claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"greenhouseSnails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leaf","outputs":[{"internalType":"contract ERC20PresetMinterPauserUpgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"leafModifier","outputs":[{"internalType":"uint256","name":"mod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"rollTier","type":"uint8"},{"internalType":"bool","name":"rollAccessory","type":"bool"},{"internalType":"bool","name":"rollBackground","type":"bool"},{"internalType":"bool","name":"rollBody","type":"bool"},{"internalType":"bool","name":"rollShell","type":"bool"},{"internalType":"bool","name":"rollTrail","type":"bool"}],"name":"lootForSnail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"pools","outputs":[{"internalType":"uint16","name":"cost","type":"uint16"},{"internalType":"uint16","name":"total","type":"uint16"},{"internalType":"uint8","name":"minTier","type":"uint8"},{"internalType":"uint16","name":"tier1","type":"uint16"},{"internalType":"uint16","name":"tier2","type":"uint16"},{"internalType":"uint16","name":"tier3","type":"uint16"},{"internalType":"uint16","name":"tier4","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStartTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"returnSnails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeMint","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":"uint8","name":"","type":"uint8"}],"name":"setClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setGamePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setInventoryManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"leaf_","type":"address"}],"name":"setLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setPublicMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setWhitelistMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snailActivities","outputs":[{"internalType":"enum EvoSnails.ActivityState","name":"state","type":"uint8"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint48","name":"since","type":"uint48"},{"internalType":"uint40","name":"lastRoll","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snails","outputs":[{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"trail","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"shell","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"accessory","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"stakedSnailByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stakedSnailsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"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":"uint8","name":"tier","type":"uint8"}],"name":"tierUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintStartTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdrawLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615f4a80620000216000396000f3fe60806040526004361061029c5760003560e01c806301ffc9a7146102a157806306fdde03146102d6578063081812fc146102f8578063095ea7b31461032557806309647dfe146103475780630d0cdee01461036757806313faede61461038757806318160ddd146103b0578063239c70ae146103c557806323b872dd146103da5780632551cd34146103fa5780632bb1a91a1461041a5780632cc76cec146104595780632eb4a7ab146104795780632f745c59146104905780633a577ec9146104b05780633ccfd60b146104d05780633f4ba83a146104d8578063421f3d2d146104ed57806342842e0e1461050d5780634c8c32461461052d5780634f6ccce71461054d5780635932ead11461056d5780635bca47d51461058d5780635c975abb146105ad57806360ef50b9146105c55780636352211e146105d8578063668e780f146105f85780636cad4e5a1461062957806370a0823114610649578063715018a614610669578063719eb7c71461067e57806378e979251461069e5780637cb64759146106bf5780638129fc1c146106df5780638456cb59146106f457806386b75b44146107095780638da5cb5b1461072957806390494fb71461073e57806391d1ea4d1461075e57806395d89b411461077f578063972a4b4814610794578063a0712d68146107b4578063a1448194146107c7578063a22cb465146107e7578063ae40468114610807578063b02e893f14610877578063b54710c214610897578063b5c14adb14610946578063b7911ae614610966578063b88d4fde14610986578063c87b56dd146109a6578063d3cf00a3146109c6578063d5abeb01146109ee578063de230b9c14610a04578063e985e9c514610a24578063f158783a14610a44578063f2fde38b14610a64578063fb87a63514610a84575b600080fd5b3480156102ad57600080fd5b506102c16102bc3660046156f1565b610b3b565b60405190151581526020015b60405180910390f35b3480156102e257600080fd5b506102eb610b4c565b6040516102cd9190615a10565b34801561030457600080fd5b506103186103133660046156d9565b610bde565b6040516102cd9190615950565b34801561033157600080fd5b50610345610340366004615600565b610c6b565b005b34801561035357600080fd5b506103456103623660046154ae565b610d7c565b34801561037357600080fd5b506103456103823660046157b4565b610dce565b34801561039357600080fd5b506103a266b1a2bc2ec5000081565b6040519081526020016102cd565b3480156103bc57600080fd5b506099546103a2565b3480156103d157600080fd5b506103a2600181565b3480156103e657600080fd5b506103456103f53660046154fa565b611372565b34801561040657600080fd5b506103a26104153660046154ae565b6113a3565b34801561042657600080fd5b5061012e54610441906201000090046001600160581b031681565b6040516001600160581b0390911681526020016102cd565b34801561046557600080fd5b506103a2610474366004615600565b6114c9565b34801561048557600080fd5b506103a26101305481565b34801561049c57600080fd5b506103a26104ab366004615600565b611604565b3480156104bc57600080fd5b506102c16104cb3660046158c1565b61169a565b6103456116fa565b3480156104e457600080fd5b50610345611787565b3480156104f957600080fd5b50610345610508366004615680565b6117be565b34801561051957600080fd5b506103456105283660046154fa565b6118f3565b34801561053957600080fd5b50610345610548366004615680565b61190e565b34801561055957600080fd5b506103a26105683660046156d9565b61199b565b34801561057957600080fd5b506103456105883660046156bf565b611a3c565b34801561059957600080fd5b506103456105a8366004615600565b611a7f565b3480156105b957600080fd5b5060c95460ff166102c1565b6103456105d3366004615629565b611b17565b3480156105e457600080fd5b506103186105f33660046156d9565b611d22565b34801561060457600080fd5b506102c16106133660046158c1565b6101386020526000908152604090205460ff1681565b34801561063557600080fd5b506103456106443660046154ae565b611d99565b34801561065557600080fd5b506103a26106643660046154ae565b611deb565b34801561067557600080fd5b50610345611e72565b34801561068a57600080fd5b506103456106993660046158db565b611eab565b3480156106aa57600080fd5b5061012f54610441906001600160581b031681565b3480156106cb57600080fd5b506103456106da3660046156d9565b611f05565b3480156106eb57600080fd5b50610345611f3a565b34801561070057600080fd5b506103456120b0565b34801561071557600080fd5b506103456107243660046158db565b6120e7565b34801561073557600080fd5b50610318612143565b34801561074a57600080fd5b506103a26107593660046156d9565b612152565b34801561076a57600080fd5b5061013254610318906001600160a01b031681565b34801561078b57600080fd5b506102eb61229b565b3480156107a057600080fd5b506103a26107af3660046156d9565b6122aa565b6103456107c23660046156d9565b612402565b3480156107d357600080fd5b506103456107e2366004615600565b6125fe565b3480156107f357600080fd5b506103456108023660046155d7565b61263b565b34801561081357600080fd5b506108676108223660046156d9565b6101366020526000908152604090205460ff81169061010081046001600160a01b031690600160a81b810465ffffffffffff1690600160d81b900464ffffffffff1684565b6040516102cd94939291906159ba565b34801561088357600080fd5b506102c1610892366004615792565b6126fc565b3480156108a357600080fd5b506109036108b23660046156d9565b6101356020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b8104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e0016102cd565b34801561095257600080fd5b506103456109613660046156bf565b6127cf565b34801561097257600080fd5b50610345610981366004615680565b612819565b34801561099257600080fd5b506103456109a1366004615535565b6128a6565b3480156109b257600080fd5b506102eb6109c13660046156d9565b6128de565b3480156109d257600080fd5b5061012e5461044190600160681b90046001600160581b031681565b3480156109fa57600080fd5b506103a26115b381565b348015610a1057600080fd5b50610345610a1f3660046158db565b612b2e565b348015610a3057600080fd5b506102c1610a3f3660046154c8565b612b80565b348015610a5057600080fd5b50610345610a5f366004615832565b612bae565b348015610a7057600080fd5b50610345610a7f3660046154ae565b612e5c565b348015610a9057600080fd5b50610af4610a9f3660046158c1565b6101376020526000908152604090205461ffff8082169162010000810482169160ff600160201b83041691600160281b8104821691600160381b8204811691600160481b8104821691600160581b9091041687565b6040805161ffff9889168152968816602088015260ff90951694860194909452918516606085015284166080840152831660a08301529190911660c082015260e0016102cd565b6000610b4682612ef9565b92915050565b606060658054610b5b90615e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790615e12565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b6000610be982612f1e565b610c4f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610c7682611d22565b9050806001600160a01b0316836001600160a01b03161415610ce45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c46565b336001600160a01b0382161480610d005750610d008133612b80565b610d6d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c46565b610d778383612f3b565b505050565b33610d85612143565b6001600160a01b031614610dab5760405162461bcd60e51b8152600401610c4690615b55565b61013380546001600160a01b0319166001600160a01b0392909216919091179055565b33803b90328114610df15760405162461bcd60e51b8152600401610c4690615b34565b8115610e0f5760405162461bcd60e51b8152600401610c4690615b34565b600089815261013660205260408082208151608081019092528054829060ff166001811115610e4e57634e487b7160e01b600052602160045260246000fd5b6001811115610e6d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115610ed157634e487b7160e01b600052602160045260246000fd5b1415610f0257610ee08a611d22565b6001600160a01b0316336001600160a01b031614610efd57600080fd5b610f4d565b600181516001811115610f2557634e487b7160e01b600052602160045260246000fd5b1415610f4d5780602001516001600160a01b0316336001600160a01b031614610f4d57600080fd5b60008a81526101356020908152604091829020825160e081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b9004831660c082015261012e5490929190041615610fee5760405162461bcd60e51b8152600401610c4690615bdb565b8880610ff75750875b80610fff5750865b806110075750855b8061100f5750845b61104b5760405162461bcd60e51b815260206004820152600d60248201526c726f6c6c203e3020706172747360981b6044820152606401610c46565b6110558b8b6126fc565b61108c5760405162461bcd60e51b815260206004820152600860248201526731b7b7b63237bbb760c11b6044820152606401610c46565b60008a60ff161180156110a3575060068a60ff1611155b6110de5760405162461bcd60e51b815260206004820152600c60248201526b34b73b30b634b2103a34b2b960a11b6044820152606401610c46565b6110e78a61169a565b6111215760405162461bcd60e51b815260206004820152600b60248201526a1d1a595c881b1bd8dad95960aa1b6044820152606401610c46565b6006611133826040015160ff16612fa9565b60ff16106111795760405162461bcd60e51b815260206004820152601360248201527263616e277420726f6c6c206120756e6971756560681b6044820152606401610c46565b60008b81526101366020526040902080546001600160d81b0316600160d81b4264ffffffffff16021790556111ad8b612fcf565b610132546001600160a01b03166379cc6790336111ce8d8d8d8d8d8d6131c2565b6040518363ffffffff1660e01b81526004016111eb9291906159a1565b600060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050506000891561125b576112318c8c600061326c565b905061123f8160ff16612fa9565b60ff166006141561125b576112538c6137dc565b505050611338565b881561128f5761126d8c8c600161326c565b905061127b8160ff16612fa9565b60ff166006141561128f576112538c6137dc565b87156112c3576112a18c8c600261326c565b90506112af8160ff16612fa9565b60ff16600614156112c3576112538c6137dc565b86156112f7576112d58c8c600561326c565b90506112e38160ff16612fa9565b60ff16600614156112f7576112538c6137dc565b851561132b576113098c8c600661326c565b90506113178160ff16612fa9565b60ff166006141561132b576112538c6137dc565b6113348c613924565b5050505b804160405160200161134b92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050505050565b61137c33826139a6565b6113985760405162461bcd60e51b8152600401610c4690615b8a565b610d77838383613a68565b6000806113ae61536d565b60015b61012d5481116114c05760008181526101366020526040908190208151608081019092528054829060ff1660018111156113fb57634e487b7160e01b600052602160045260246000fd5b600181111561141a57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff16606090930192909252820151919350868116911614801561149b575060018251600181111561149957634e487b7160e01b600052602160045260246000fd5b145b156114ae57826114aa81615e4d565b9350505b806114b881615e4d565b9150506113b1565b50909392505050565b6000806114d461536d565b60015b61012d5481116115f85760008181526101366020526040908190208151608081019092528054829060ff16600181111561152157634e487b7160e01b600052602160045260246000fd5b600181111561154057634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff1660609093019290925282015191935087811691161480156115c157506001825160018111156115bf57634e487b7160e01b600052602160045260246000fd5b145b156115e657848314156115d8579250610b46915050565b826115e281615e4d565b9350505b806115f081615e4d565b9150506114d7565b50600095945050505050565b600061160f83611deb565b82106116715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c46565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b600060ff82166116ac57506001919050565b6116b7600183615da5565b6116c59060ff166001615d38565b6116d29062017bb0615d38565b61012f546116e991906001600160581b0316615ce3565b6001600160581b0316421192915050565b33611703612143565b6001600160a01b0316146117295760405162461bcd60e51b8152600401610c4690615b55565b60405133904780156108fc02916000818181858888f193505050506117855760405162461bcd60e51b8152602060048201526012602482015271636f756c64206e6f7420776974686472617760701b6044820152606401610c46565b565b33611790612143565b6001600160a01b0316146117b65760405162461bcd60e51b8152600401610c4690615b55565b611785613c01565b33803b903281146117e15760405162461bcd60e51b8152600401610c4690615b34565b81156117ff5760405162461bcd60e51b8152600401610c4690615b34565b61012f546001600160581b031642116118485760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610c46565b61012e54610100900460ff16156118715760405162461bcd60e51b8152600401610c4690615bdb565b60005b838110156118bd576118ab85858381811061189f57634e487b7160e01b600052603260045260246000fd5b90506020020135613c8e565b806118b581615e4d565b915050611874565b5080416040516020016118d192919061592e565b60408051601f1981840301815291905280516020909101206101345550505050565b610d77838383604051806020016040528060008152506128a6565b33803b903281146119315760405162461bcd60e51b8152600401610c4690615b34565b811561194f5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761198985858381811061197d57634e487b7160e01b600052603260045260246000fd5b90506020020135613ee3565b8061199381615e4d565b915050611952565b60006119a660995490565b8210611a095760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c46565b60998281548110611a2a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b33611a45612143565b6001600160a01b031614611a6b5760405162461bcd60e51b8152600401610c4690615b55565b61012e805460ff1916911515919091179055565b33611a88612143565b6001600160a01b031614611aae5760405162461bcd60e51b8152600401610c4690615b55565b610132546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611ae190859085906004016159a1565b600060405180830381600087803b158015611afb57600080fd5b505af1158015611b0f573d6000803e3d6000fd5b505050505050565b33803b90328114611b3a5760405162461bcd60e51b8152600401610c4690615b34565b8115611b585760405162461bcd60e51b8152600401610c4690615b34565b61012e546201000090046001600160581b03164211611b895760405162461bcd60e51b8152600401610c4690615a23565b611b91612143565b6001600160a01b0316336001600160a01b031614158015611bb25750607185115b15611bde5766b1a2bc2ec50000341015611bde5760405162461bcd60e51b8152600401610c4690615a9a565b611c24611beb8787614036565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061407f92505050565b611c605760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c46565b6001600160a01b0386166000908152610131602052604090205415611cb85760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b6044820152606401610c46565b6001600160a01b038616600090815261013160205260408120805491611cdd83615e4d565b9190505550611ceb86614096565b8041604051602001611cfe92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050565b6000818152606760205260408120546001600160a01b031680610b465760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c46565b33611da2612143565b6001600160a01b031614611dc85760405162461bcd60e51b8152600401610c4690615b55565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611e565760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c46565b506001600160a01b031660009081526068602052604090205490565b33611e7b612143565b6001600160a01b031614611ea15760405162461bcd60e51b8152600401610c4690615b55565b6117856000614590565b33611eb4612143565b6001600160a01b031614611eda5760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216620100000262010000600160681b0319909216919091179055565b33611f0e612143565b6001600160a01b031614611f345760405162461bcd60e51b8152600401610c4690615b55565b61013055565b600054610100900460ff1680611f53575060005460ff16155b611f6f5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015611f91576000805461ffff19166101011790555b611fdc6040518060400160405280600981526020016845766f536e61696c7360b81b81525060405180604001604052806008815260200167115593d4d390525360c21b8152506145e2565b611fe4614669565b611fec6146ec565b611ff4614753565b61012e80546001600160c01b03191665617f9e800001630186011d606e1b0117905561012f805463618055506001600160581b031990911617905560405163091ce90360e21b81526101376004820152610139602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb90632473a40c9060440160006040518083038186803b15801561208357600080fd5b505af4158015612097573d6000803e3d6000fd5b5050505080156120ad576000805461ff00191690555b50565b336120b9612143565b6001600160a01b0316146120df5760405162461bcd60e51b8152600401610c4690615b55565b6117856147ba565b336120f0612143565b6001600160a01b0316146121165760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216600160681b02600160681b600160c01b0319909216919091179055565b60fb546001600160a01b031690565b60008181526101366020526040808220815160808101909252805483929190829060ff16600181111561219557634e487b7160e01b600052602160045260246000fd5b60018111156121b457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b0316602080840191909152600160a81b80830465ffffffffffff908116604080870191909152600160d81b90940464ffffffffff1660609095019490945260008881526101369092529181205493945092612223929190041642615d7e565b65ffffffffffff16905060008251600181111561225057634e487b7160e01b600052602160045260246000fd5b1415612260575060009392505050565b6201518061226d856122aa565b6122779083615d19565b61228990670de0b6b3a7640000615d19565b6122939190615d05565b949350505050565b606060668054610b5b90615e12565b600081815261013560209081526040808320815160e081018352905460ff8082168352610100820481169483019490945262010000810484169282018390526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b900490921660c083015260069061232e90612fa9565b60ff161061233f5750603c92915050565b6005915060006123558260c0015160ff16612fa9565b60ff16905080600714156123755761236e601984615ca6565b925061238a565b6002811061238a576123878184615ca6565b92505b81516123989060ff16612fa9565b6123a59060ff1684615ca6565b92506123b7826040015160ff16612fa9565b6123c49060ff1684615ca6565b92506123d6826060015160ff16612fa9565b6123e39060ff1684615ca6565b92506123f5826020015160ff16612fa9565b6122939060ff1684615ca6565b33803b903281146124255760405162461bcd60e51b8152600401610c4690615b34565b81156124435760405162461bcd60e51b8152600401610c4690615b34565b600061244e60995490565b61012e54909150600160681b90046001600160581b031642116124835760405162461bcd60e51b8152600401610c4690615a23565b600084116124c75760405162461bcd60e51b81526020600482015260116024820152700616d6f756e74206d757374206265203e3607c1b6044820152606401610c46565b600184111561250c5760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b6044820152606401610c46565b6115b36125198583615ca6565b11156125535760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610c46565b61255b612143565b6001600160a01b0316336001600160a01b0316146125a3576125848466b1a2bc2ec50000615d19565b3410156125a35760405162461bcd60e51b8152600401610c4690615a9a565b60015b8481116125c8576125b633614096565b806125c081615e4d565b9150506125a6565b505080416040516020016125dd92919061592e565b60408051601f19818403018152919052805160209091012061013455505050565b33612607612143565b6001600160a01b03161461262d5760405162461bcd60e51b8152600401610c4690615b55565b6126378282614812565b5050565b6001600160a01b0382163314156126905760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c46565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008281526101366020526040808220815160808101909252805483929190829060ff16600181111561273f57634e487b7160e01b600052602160045260246000fd5b600181111561275e57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506127a88361482c565b64ffffffffff16816060015164ffffffffff16426127c69190615d67565b11949350505050565b336127d8612143565b6001600160a01b0316146127fe5760405162461bcd60e51b8152600401610c4690615b55565b61012e80549115156101000261ff0019909216919091179055565b33803b9032811461283c5760405162461bcd60e51b8152600401610c4690615b34565b811561285a5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761289485858381811061288857634e487b7160e01b600052603260045260246000fd5b90506020020135612fcf565b8061289e81615e4d565b91505061285d565b6128b033836139a6565b6128cc5760405162461bcd60e51b8152600401610c4690615b8a565b6128d88484848461484b565b50505050565b600081815261013560209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606084810191909152600160201b83048216608080860191909152600160281b8404831660a0860152600160301b909304821660c0850152878752610136909552838620845192830190945283549495929492939192839116600181111561299957634e487b7160e01b600052602160045260246000fd5b60018111156129b857634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506000612a04856122aa565b610133548451602086015160408701516060880151608089015160a08a015160c08b01519798506001600160a01b0390961696635d7d0289968d96959493929160018c516001811115612a6757634e487b7160e01b600052602160045260246000fd5b6040516001600160e01b031960e08d901b16815261ffff909a1660048b015260ff98891660248b015296881660448a01529487166064890152928616608488015290851660a4870152841660c4860152831660e48501521461010483015284166101248201526101440160006040518083038186803b158015612ae957600080fd5b505afa158015612afd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b259190810190615729565b95945050505050565b33612b37612143565b6001600160a01b031614612b5d5760405162461bcd60e51b8152600401610c4690615b55565b61012f80546001600160581b0319166001600160581b0392909216919091179055565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b33612bb7612143565b6001600160a01b031614612bdd5760405162461bcd60e51b8152600401610c4690615b55565b600061013560008a81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050878160c0019060ff16908160ff168152505086816000019060ff16908160ff168152505085816040019060ff16908160ff168152505084816080019060ff16908160ff1681525050838160a0019060ff16908160ff168152505082816060019060ff16908160ff168152505081816020019060ff16908160ff16815250508061013560008b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff160217905550905050612e5189613924565b505050505050505050565b33612e65612143565b6001600160a01b031614612e8b5760405162461bcd60e51b8152600401610c4690615b55565b6001600160a01b038116612ef05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b6120ad81614590565b60006001600160e01b0319821663780e9d6360e01b1480610b465750610b468261487e565b6000908152606760205260409020546001600160a01b0316151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f7082611d22565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081612fb857506000919050565b6005612fc5600184615d67565b610b469190615d05565b600081815261013660205260408082208151608081019092528054829060ff16600181111561300e57634e487b7160e01b600052602160045260246000fd5b600181111561302d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561309157634e487b7160e01b600052602160045260246000fd5b14156130c2576130a082611d22565b6001600160a01b0316336001600160a01b0316146130bd57600080fd5b61310d565b6001815160018111156130e557634e487b7160e01b600052602160045260246000fd5b141561310d5780602001516001600160a01b0316336001600160a01b03161461310d57600080fd5b600061311883612152565b90508061312457505050565b610132546001600160a01b03166340c10f193361314086612152565b6040518363ffffffff1660e01b815260040161315d9291906159a1565b600060405180830381600087803b15801561317757600080fd5b505af115801561318b573d6000803e3d6000fd5b505050600093845250506101366020525060409020805465ffffffffffff60a81b1916600160a81b4265ffffffffffff1602179055565b60008086156131d957806131d581615e68565b9150505b85156131ed57806131e981615e68565b9150505b841561320157806131fd81615e68565b9150505b8315613215578061321181615e68565b9150505b8215613229578061322581615e68565b9150505b60ff8881166000908152610137602052604090205461324e9183169061ffff16615d19565b61326090670de0b6b3a7640000615d19565b98975050505050505050565b6000806132776148ce565b905060006132a58285600681111561329f57634e487b7160e01b600052602160045260246000fd5b88614916565b60ff80871660009081526101376020908152604091829020825160e081018452905461ffff80821683526201000082048116938301849052600160201b820490951693820193909352600160281b830484166060820152600160381b830484166080820152600160481b8304841660a0820152600160581b90920490921660c08201529192506133645760405162461bcd60e51b815260206004820152600a602482015269706f6f6c20656d70747960b01b6044820152606401610c46565b6000806133718484614955565b60008b815261013560209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820483166060820152600160201b820483166080820152600160281b8204831660a0820152600160301b90910490911660c082015292945090925088600681111561341157634e487b7160e01b600052602160045260246000fd5b14156134255760ff831660c0820152613630565b600188600681111561344757634e487b7160e01b600052602160045260246000fd5b14156134585760ff83168152613630565b600288600681111561347a57634e487b7160e01b600052602160045260246000fd5b14156135c85760ff831660408201819052601f11156135c357600060036134bf88604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6134c99190615e88565b9050600060036134f789604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6135019190615e88565b61350c906003615ca6565b60ff80871660009081526101396020526040902080549293509190841690811061354657634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015460ff601f9093166101000a90048216608087015287821683526101399052604090912080549091831690811061359b57634e487b7160e01b600052603260045260246000fd5b60009182526020918290209181049091015460ff601f9092166101000a90041660a084015250505b613630565b60058860068111156135ea57634e487b7160e01b600052602160045260246000fd5b14156135fe5760ff83166060820152613630565b600688600681111561362057634e487b7160e01b600052602160045260246000fd5b14156136305760ff831660208201525b60008a815261013560209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160ff95861661ffff1990981697909717610100988616989098029790971763ffff00001916620100009385169390930263ff0000001916929092176301000000918416919091021761ffff60201b1916600160201b9183169190910260ff60281b191617600160281b948216949094029390931760ff60301b1916600160301b928416929092029190911790556002908a16106137ce5760ff808a16600090815261013760209081526040918290208551815492870151938701516060880151608089015160a08a015160c08b015161ffff908116600160581b0261ffff60581b19928216600160481b0261ffff60481b19948316600160381b029490941663ffffffff60381b19958316600160281b0261ffff60281b1997909c16600160201b029690961662ffffff60201b199a8316620100000263ffffffff19909a16929097169190911797909717979097169390931796909617959095169490941793909317919091161790555b509098975050505050505050565b600660009081526101376020527fe61ba6d5276b1f0e4decff92b6d57a453a7d0d5c2a55a75aaf612a522da84e675461382190600160381b900461ffff166001615cbe565b61382c90601e615cbe565b600083815261013560208181526040808420815160e081018352815460ff600160201b808304821660808501908152600160281b808504841660a087019081529b841660c0870181815281885298870181815260608801828152888c019283529f909c52999098529351975198519b5193519951955197821661ffff1990931692909217610100988216989098029790971763ffff00001916620100009a88169a909a0263ff0000001916999099176301000000918716919091021761ffff60201b191695851690970260ff60281b191694909417938316029290921760ff60301b1916600160301b92909116919091021790915550565b600081815261013560205260409081902090516001620f4f8b60e31b031981526004810191909152610138602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb9063ff8583a89060440160006040518083038186803b15801561398b57600080fd5b505af415801561399f573d6000803e3d6000fd5b5050505050565b60006139b182612f1e565b613a125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c46565b6000613a1d83611d22565b9050806001600160a01b0316846001600160a01b03161480613a585750836001600160a01b0316613a4d84610bde565b6001600160a01b0316145b8061229357506122938185612b80565b826001600160a01b0316613a7b82611d22565b6001600160a01b031614613ae35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c46565b6001600160a01b038216613b455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b613b50838383614bd0565b613b5b600082612f3b565b6001600160a01b0383166000908152606860205260408120805460019290613b84908490615d67565b90915550506001600160a01b0382166000908152606860205260408120805460019290613bb2908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615ef583398151915291a4505050565b60c95460ff16613c4a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c46565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613c849190615950565b60405180910390a1565b600081815261013660205260408082208151608081019092528054829060ff166001811115613ccd57634e487b7160e01b600052602160045260246000fd5b6001811115613cec57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600181516001811115613d5057634e487b7160e01b600052602160045260246000fd5b1415613d8f5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610c46565b613d9882611d22565b6001600160a01b0316336001600160a01b031614613de45760405162461bcd60e51b81526020600482015260096024820152686e6f7420796f75727360b81b6044820152606401610c46565b613def333084613a68565b60408051608081019091528060015b81523360208083019190915265ffffffffffff421660408084019190915260608581015164ffffffffff1693019290925260008581526101369091522081518154829060ff191660018381811115613e6657634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b03199092169190911791909117929092169190911790555050565b600081815261013660205260408082208151608081019092528054829060ff166001811115613f2257634e487b7160e01b600052602160045260246000fd5b6001811115613f4157634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115613fa557634e487b7160e01b600052602160045260246000fd5b1415613fe65760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610c46565b6000828152610136602052604090205461010090046001600160a01b0316331461400f57600080fd5b61401a303384613a68565b61402382612fcf565b6040805160808101909152806000613dfe565b6000818360405160200161406192919091825260601b6001600160601b031916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b600061408f826101305485614bfe565b9392505050565b6140a561012d80546001019055565b60006140b161012d5490565b90506001806000808080806003816140c76148ce565b6000805261013760209081526040805160e0810182527f9656a38e5b8bf16175eb4bca28ffa04d5646d4e9da9a5df333165c7cb8a8693f5461ffff8082168352620100008204811683860152600160201b820460ff1683850152600160281b820481166060840152600160381b820481166080840152600160481b8204811660a0840152600160581b9091041660c082015281518083019092526004825263626f647960e01b928201929092529192509061418e906141889084908e614bb9565b82614955565b80925081995050506141c161418883604051806040016040528060058152602001641cda195b1b60da1b8152508e614bb9565b80925081965050506141f461418883604051806040016040528060058152602001641d1c985a5b60da1b8152508e614bb9565b809250819550505061013960008960ff1660ff1681526020019081526020016000208360ff1661424184604051806040016040528060048152602001636579657360e01b8152508f614bb9565b61424b9190615e88565b8154811061426957634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16965061013960008960ff1660ff1681526020019081526020016000208360ff166142d184604051806040016040528060058152602001640dadeeae8d60db1b8152508f614bb9565b6142db9190615e88565b6142e6906003615ca6565b8154811061430457634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1695506143308c8c614cbb565b6040518060e001604052808a60ff1681526020018560ff1681526020018960ff1681526020018660ff1681526020018860ff1681526020018760ff1681526020018b60ff1681525061013560008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff1602179055509050506040518060800160405280600060018111156144a257634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038e1660208083019190915265ffffffffffff4216604080840191909152600060609093018390528e8352610136909152902081518154829060ff19166001838181111561450957634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b0319909216919091179190911792909216919091179055505050505050505050505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806145fb575060005460ff16155b6146175760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614639576000805461ffff19166101011790555b614641614de7565b614649614de7565b6146538383614e51565b8015610d77576000805461ff0019169055505050565b600054610100900460ff1680614682575060005460ff16155b61469e5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146c0576000805461ffff19166101011790555b6146c8614de7565b6146d0614de7565b6146d8614de7565b80156120ad576000805461ff001916905550565b600054610100900460ff1680614705575060005460ff16155b6147215760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614743576000805461ffff19166101011790555b61474b614de7565b6146d8614ee6565b600054610100900460ff168061476c575060005460ff16155b6147885760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156147aa576000805461ffff19166101011790555b6147b2614de7565b6146d8614f5b565b60c95460ff16156147dd5760405162461bcd60e51b8152600401610c4690615abc565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613c773390565b612637828260405180602001604052806000815250614fbb565b61012e5460009060ff1661484257506000919050565b50617080919050565b614856848484613a68565b61486284848484614fee565b6128d85760405162461bcd60e51b8152600401610c4690615a48565b60006001600160e01b031982166380ac58cd60e01b14806148af57506001600160e01b03198216635b5e139f60e01b145b80610b4657506301ffc9a760e01b6001600160e01b0319831614610b46565b61013454604080513360601b6001600160601b031916602080830191909152426034830152605480830194909452825180830390940184526074909101909152815191012090565b6040805160208101859052908101839052606081018290526000906080015b60408051601f198184030181529190528051602090910120949350505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000836020015161ffff16856149a39190615e88565b6020850180519192506149b582615df4565b61ffff1690525060a084015160808501516060860151600092916149d891615c80565b6149e29190615c80565b61ffff1682101580156149fd575060008560c0015161ffff16115b15614a6057600585604001516003614a159190615cbe565b60ff16614a229190615d19565b614a2d600584615e88565b614a38906001615ca6565b614a429190615ca6565b60c086018051919250614a5482615df4565b61ffff16905250614bab565b84608001518560600151614a749190615c80565b61ffff168210158015614a8f575060008560a0015161ffff16115b15614ae657600585604001516002614aa79190615cbe565b60ff16614ab49190615d19565b614abf600584615e88565b614aca906001615ca6565b614ad49190615ca6565b60a086018051919250614a5482615df4565b846060015161ffff168210158015614b0657506000856080015161ffff16115b15614b5d57600585604001516001614b1e9190615cbe565b60ff16614b2b9190615d19565b614b36600584615e88565b614b41906001615ca6565b614b4b9190615ca6565b608086018051919250614a5482615df4565b6005856040015160ff16614b719190615d19565b614b7c600584615e88565b614b87906001615ca6565b614b919190615ca6565b606086018051919250614ba382615df4565b61ffff169052505b9250839150505b9250929050565b600083838360405160200161493593929190615c00565b60c95460ff1615614bf35760405162461bcd60e51b8152600401610c4690615abc565b610d778383836150fb565b600081815b8551811015614cb0576000868281518110614c2e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311614c70576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614c9d565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ca881615e4d565b915050614c03565b509092149392505050565b6001600160a01b038216614d115760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c46565b614d1a81612f1e565b15614d665760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c46565b614d7260008383614bd0565b6001600160a01b0382166000908152606860205260408120805460019290614d9b908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615ef5833981519152908290a45050565b600054610100900460ff1680614e00575060005460ff16155b614e1c5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146d8576000805461ffff191661010117905580156120ad576000805461ff001916905550565b600054610100900460ff1680614e6a575060005460ff16155b614e865760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614ea8576000805461ffff19166101011790555b8251614ebb906065906020860190615396565b508151614ecf906066906020850190615396565b508015610d77576000805461ff0019169055505050565b600054610100900460ff1680614eff575060005460ff16155b614f1b5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614f3d576000805461ffff19166101011790555b60c9805460ff1916905580156120ad576000805461ff001916905550565b600054610100900460ff1680614f74575060005460ff16155b614f905760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614fb2576000805461ffff19166101011790555b6146d833614590565b614fc58383614cbb565b614fd26000848484614fee565b610d775760405162461bcd60e51b8152600401610c4690615a48565b60006001600160a01b0384163b156150f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290615032903390899088908890600401615964565b602060405180830381600087803b15801561504c57600080fd5b505af192505050801561507c575060408051601f3d908101601f191682019092526150799181019061570d565b60015b6150d6573d8080156150aa576040519150601f19603f3d011682016040523d82523d6000602084013e6150af565b606091505b5080516150ce5760405162461bcd60e51b8152600401610c4690615a48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612293565b506001949350505050565b6001600160a01b0383166151565761515181609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b615179565b816001600160a01b0316836001600160a01b0316146151795761517983826151b3565b6001600160a01b03821661519057610d7781615250565b826001600160a01b0316826001600160a01b031614610d7757610d778282615329565b600060016151c084611deb565b6151ca9190615d67565b60008381526098602052604090205490915080821461521d576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061526290600190615d67565b6000838152609a60205260408120546099805493945090928490811061529857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080609983815481106152c757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061530d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061533483611deb565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b8280546153a290615e12565b90600052602060002090601f0160209004810192826153c4576000855561540a565b82601f106153dd57805160ff191683800117855561540a565b8280016001018555821561540a579182015b8281111561540a5782518255916020019190600101906153ef565b5061541692915061541a565b5090565b5b80821115615416576000815560010161541b565b80356001600160a01b038116811461544657600080fd5b919050565b60008083601f84011261545c578081fd5b5081356001600160401b03811115615472578182fd5b6020830191508360208260051b8501011115614bb257600080fd5b8035801515811461544657600080fd5b803560ff8116811461544657600080fd5b6000602082840312156154bf578081fd5b61408f8261542f565b600080604083850312156154da578081fd5b6154e38361542f565b91506154f16020840161542f565b90509250929050565b60008060006060848603121561550e578081fd5b6155178461542f565b92506155256020850161542f565b9150604084013590509250925092565b6000806000806080858703121561554a578081fd5b6155538561542f565b93506155616020860161542f565b92506040850135915060608501356001600160401b03811115615582578182fd5b8501601f81018713615592578182fd5b80356155a56155a082615c59565b615c29565b8181528860208385010111156155b9578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156155e9578182fd5b6155f28361542f565b91506154f16020840161548d565b60008060408385031215615612578182fd5b61561b8361542f565b946020939093013593505050565b6000806000806060858703121561563e578384fd5b6156478561542f565b93506020850135925060408501356001600160401b03811115615668578283fd5b6156748782880161544b565b95989497509550505050565b60008060208385031215615692578182fd5b82356001600160401b038111156156a7578283fd5b6156b38582860161544b565b90969095509350505050565b6000602082840312156156d0578081fd5b61408f8261548d565b6000602082840312156156ea578081fd5b5035919050565b600060208284031215615702578081fd5b813561408f81615ede565b60006020828403121561571e578081fd5b815161408f81615ede565b60006020828403121561573a578081fd5b81516001600160401b0381111561574f578182fd5b8201601f8101841361575f578182fd5b805161576d6155a082615c59565b818152856020838501011115615781578384fd5b612b25826020830160208601615dc8565b600080604083850312156157a4578182fd5b823591506154f16020840161549d565b600080600080600080600060e0888a0312156157ce578485fd5b873596506157de6020890161549d565b95506157ec6040890161548d565b94506157fa6060890161548d565b93506158086080890161548d565b925061581660a0890161548d565b915061582460c0890161548d565b905092959891949750929550565b600080600080600080600080610100898b03121561584e578182fd5b8835975061585e60208a0161549d565b965061586c60408a0161549d565b955061587a60608a0161549d565b945061588860808a0161549d565b935061589660a08a0161549d565b92506158a460c08a0161549d565b91506158b260e08a0161549d565b90509295985092959890939650565b6000602082840312156158d2578081fd5b61408f8261549d565b6000602082840312156158ec578081fd5b81356001600160581b038116811461408f578182fd5b6000815180845261591a816020860160208601615dc8565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061599790830184615902565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b60808101600286106159dc57634e487b7160e01b600052602160045260246000fd5b9481526001600160a01b0393909316602084015265ffffffffffff91909116604083015264ffffffffff1660609091015290565b60208152600061408f6020830184615902565b6020808252600b908201526a1b5a5b9d081b1bd8dad95960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600890820152676e6f2066756e647360c01b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526007908201526631b432b0ba32b960c91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a19d85b59481c185d5cd95960aa1b604082015260600190565b838152606060208201526000615c196060830185615902565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715615c5157615c51615ec8565b604052919050565b60006001600160401b03821115615c7257615c72615ec8565b50601f01601f191660200190565b600061ffff808316818516808303821115615c9d57615c9d615e9c565b01949350505050565b60008219821115615cb957615cb9615e9c565b500190565b600060ff821660ff84168060ff03821115615cdb57615cdb615e9c565b019392505050565b60006001600160581b03828116848216808303821115615c9d57615c9d615e9c565b600082615d1457615d14615eb2565b500490565b6000816000190483118215151615615d3357615d33615e9c565b500290565b60006001600160581b0382811684821681151582840482111615615d5e57615d5e615e9c565b02949350505050565b600082821015615d7957615d79615e9c565b500390565b600065ffffffffffff83811690831681811015615d9d57615d9d615e9c565b039392505050565b600060ff821660ff841680821015615dbf57615dbf615e9c565b90039392505050565b60005b83811015615de3578181015183820152602001615dcb565b838111156128d85750506000910152565b600061ffff821680615e0857615e08615e9c565b6000190192915050565b600181811c90821680615e2657607f821691505b60208210811415615e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e6157615e61615e9c565b5060010190565b600060ff821660ff811415615e7f57615e7f615e9c565b60010192915050565b600082615e9757615e97615eb2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120ad57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028c344260942ef8bfab252b3aea5f5d5260ec44c7bbe19fd8584e0303bd83fa464736f6c63430008040033
Deployed Bytecode
0x60806040526004361061029c5760003560e01c806301ffc9a7146102a157806306fdde03146102d6578063081812fc146102f8578063095ea7b31461032557806309647dfe146103475780630d0cdee01461036757806313faede61461038757806318160ddd146103b0578063239c70ae146103c557806323b872dd146103da5780632551cd34146103fa5780632bb1a91a1461041a5780632cc76cec146104595780632eb4a7ab146104795780632f745c59146104905780633a577ec9146104b05780633ccfd60b146104d05780633f4ba83a146104d8578063421f3d2d146104ed57806342842e0e1461050d5780634c8c32461461052d5780634f6ccce71461054d5780635932ead11461056d5780635bca47d51461058d5780635c975abb146105ad57806360ef50b9146105c55780636352211e146105d8578063668e780f146105f85780636cad4e5a1461062957806370a0823114610649578063715018a614610669578063719eb7c71461067e57806378e979251461069e5780637cb64759146106bf5780638129fc1c146106df5780638456cb59146106f457806386b75b44146107095780638da5cb5b1461072957806390494fb71461073e57806391d1ea4d1461075e57806395d89b411461077f578063972a4b4814610794578063a0712d68146107b4578063a1448194146107c7578063a22cb465146107e7578063ae40468114610807578063b02e893f14610877578063b54710c214610897578063b5c14adb14610946578063b7911ae614610966578063b88d4fde14610986578063c87b56dd146109a6578063d3cf00a3146109c6578063d5abeb01146109ee578063de230b9c14610a04578063e985e9c514610a24578063f158783a14610a44578063f2fde38b14610a64578063fb87a63514610a84575b600080fd5b3480156102ad57600080fd5b506102c16102bc3660046156f1565b610b3b565b60405190151581526020015b60405180910390f35b3480156102e257600080fd5b506102eb610b4c565b6040516102cd9190615a10565b34801561030457600080fd5b506103186103133660046156d9565b610bde565b6040516102cd9190615950565b34801561033157600080fd5b50610345610340366004615600565b610c6b565b005b34801561035357600080fd5b506103456103623660046154ae565b610d7c565b34801561037357600080fd5b506103456103823660046157b4565b610dce565b34801561039357600080fd5b506103a266b1a2bc2ec5000081565b6040519081526020016102cd565b3480156103bc57600080fd5b506099546103a2565b3480156103d157600080fd5b506103a2600181565b3480156103e657600080fd5b506103456103f53660046154fa565b611372565b34801561040657600080fd5b506103a26104153660046154ae565b6113a3565b34801561042657600080fd5b5061012e54610441906201000090046001600160581b031681565b6040516001600160581b0390911681526020016102cd565b34801561046557600080fd5b506103a2610474366004615600565b6114c9565b34801561048557600080fd5b506103a26101305481565b34801561049c57600080fd5b506103a26104ab366004615600565b611604565b3480156104bc57600080fd5b506102c16104cb3660046158c1565b61169a565b6103456116fa565b3480156104e457600080fd5b50610345611787565b3480156104f957600080fd5b50610345610508366004615680565b6117be565b34801561051957600080fd5b506103456105283660046154fa565b6118f3565b34801561053957600080fd5b50610345610548366004615680565b61190e565b34801561055957600080fd5b506103a26105683660046156d9565b61199b565b34801561057957600080fd5b506103456105883660046156bf565b611a3c565b34801561059957600080fd5b506103456105a8366004615600565b611a7f565b3480156105b957600080fd5b5060c95460ff166102c1565b6103456105d3366004615629565b611b17565b3480156105e457600080fd5b506103186105f33660046156d9565b611d22565b34801561060457600080fd5b506102c16106133660046158c1565b6101386020526000908152604090205460ff1681565b34801561063557600080fd5b506103456106443660046154ae565b611d99565b34801561065557600080fd5b506103a26106643660046154ae565b611deb565b34801561067557600080fd5b50610345611e72565b34801561068a57600080fd5b506103456106993660046158db565b611eab565b3480156106aa57600080fd5b5061012f54610441906001600160581b031681565b3480156106cb57600080fd5b506103456106da3660046156d9565b611f05565b3480156106eb57600080fd5b50610345611f3a565b34801561070057600080fd5b506103456120b0565b34801561071557600080fd5b506103456107243660046158db565b6120e7565b34801561073557600080fd5b50610318612143565b34801561074a57600080fd5b506103a26107593660046156d9565b612152565b34801561076a57600080fd5b5061013254610318906001600160a01b031681565b34801561078b57600080fd5b506102eb61229b565b3480156107a057600080fd5b506103a26107af3660046156d9565b6122aa565b6103456107c23660046156d9565b612402565b3480156107d357600080fd5b506103456107e2366004615600565b6125fe565b3480156107f357600080fd5b506103456108023660046155d7565b61263b565b34801561081357600080fd5b506108676108223660046156d9565b6101366020526000908152604090205460ff81169061010081046001600160a01b031690600160a81b810465ffffffffffff1690600160d81b900464ffffffffff1684565b6040516102cd94939291906159ba565b34801561088357600080fd5b506102c1610892366004615792565b6126fc565b3480156108a357600080fd5b506109036108b23660046156d9565b6101356020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b8104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e0016102cd565b34801561095257600080fd5b506103456109613660046156bf565b6127cf565b34801561097257600080fd5b50610345610981366004615680565b612819565b34801561099257600080fd5b506103456109a1366004615535565b6128a6565b3480156109b257600080fd5b506102eb6109c13660046156d9565b6128de565b3480156109d257600080fd5b5061012e5461044190600160681b90046001600160581b031681565b3480156109fa57600080fd5b506103a26115b381565b348015610a1057600080fd5b50610345610a1f3660046158db565b612b2e565b348015610a3057600080fd5b506102c1610a3f3660046154c8565b612b80565b348015610a5057600080fd5b50610345610a5f366004615832565b612bae565b348015610a7057600080fd5b50610345610a7f3660046154ae565b612e5c565b348015610a9057600080fd5b50610af4610a9f3660046158c1565b6101376020526000908152604090205461ffff8082169162010000810482169160ff600160201b83041691600160281b8104821691600160381b8204811691600160481b8104821691600160581b9091041687565b6040805161ffff9889168152968816602088015260ff90951694860194909452918516606085015284166080840152831660a08301529190911660c082015260e0016102cd565b6000610b4682612ef9565b92915050565b606060658054610b5b90615e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790615e12565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b6000610be982612f1e565b610c4f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610c7682611d22565b9050806001600160a01b0316836001600160a01b03161415610ce45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c46565b336001600160a01b0382161480610d005750610d008133612b80565b610d6d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c46565b610d778383612f3b565b505050565b33610d85612143565b6001600160a01b031614610dab5760405162461bcd60e51b8152600401610c4690615b55565b61013380546001600160a01b0319166001600160a01b0392909216919091179055565b33803b90328114610df15760405162461bcd60e51b8152600401610c4690615b34565b8115610e0f5760405162461bcd60e51b8152600401610c4690615b34565b600089815261013660205260408082208151608081019092528054829060ff166001811115610e4e57634e487b7160e01b600052602160045260246000fd5b6001811115610e6d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115610ed157634e487b7160e01b600052602160045260246000fd5b1415610f0257610ee08a611d22565b6001600160a01b0316336001600160a01b031614610efd57600080fd5b610f4d565b600181516001811115610f2557634e487b7160e01b600052602160045260246000fd5b1415610f4d5780602001516001600160a01b0316336001600160a01b031614610f4d57600080fd5b60008a81526101356020908152604091829020825160e081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b9004831660c082015261012e5490929190041615610fee5760405162461bcd60e51b8152600401610c4690615bdb565b8880610ff75750875b80610fff5750865b806110075750855b8061100f5750845b61104b5760405162461bcd60e51b815260206004820152600d60248201526c726f6c6c203e3020706172747360981b6044820152606401610c46565b6110558b8b6126fc565b61108c5760405162461bcd60e51b815260206004820152600860248201526731b7b7b63237bbb760c11b6044820152606401610c46565b60008a60ff161180156110a3575060068a60ff1611155b6110de5760405162461bcd60e51b815260206004820152600c60248201526b34b73b30b634b2103a34b2b960a11b6044820152606401610c46565b6110e78a61169a565b6111215760405162461bcd60e51b815260206004820152600b60248201526a1d1a595c881b1bd8dad95960aa1b6044820152606401610c46565b6006611133826040015160ff16612fa9565b60ff16106111795760405162461bcd60e51b815260206004820152601360248201527263616e277420726f6c6c206120756e6971756560681b6044820152606401610c46565b60008b81526101366020526040902080546001600160d81b0316600160d81b4264ffffffffff16021790556111ad8b612fcf565b610132546001600160a01b03166379cc6790336111ce8d8d8d8d8d8d6131c2565b6040518363ffffffff1660e01b81526004016111eb9291906159a1565b600060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050506000891561125b576112318c8c600061326c565b905061123f8160ff16612fa9565b60ff166006141561125b576112538c6137dc565b505050611338565b881561128f5761126d8c8c600161326c565b905061127b8160ff16612fa9565b60ff166006141561128f576112538c6137dc565b87156112c3576112a18c8c600261326c565b90506112af8160ff16612fa9565b60ff16600614156112c3576112538c6137dc565b86156112f7576112d58c8c600561326c565b90506112e38160ff16612fa9565b60ff16600614156112f7576112538c6137dc565b851561132b576113098c8c600661326c565b90506113178160ff16612fa9565b60ff166006141561132b576112538c6137dc565b6113348c613924565b5050505b804160405160200161134b92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050505050565b61137c33826139a6565b6113985760405162461bcd60e51b8152600401610c4690615b8a565b610d77838383613a68565b6000806113ae61536d565b60015b61012d5481116114c05760008181526101366020526040908190208151608081019092528054829060ff1660018111156113fb57634e487b7160e01b600052602160045260246000fd5b600181111561141a57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff16606090930192909252820151919350868116911614801561149b575060018251600181111561149957634e487b7160e01b600052602160045260246000fd5b145b156114ae57826114aa81615e4d565b9350505b806114b881615e4d565b9150506113b1565b50909392505050565b6000806114d461536d565b60015b61012d5481116115f85760008181526101366020526040908190208151608081019092528054829060ff16600181111561152157634e487b7160e01b600052602160045260246000fd5b600181111561154057634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff1660609093019290925282015191935087811691161480156115c157506001825160018111156115bf57634e487b7160e01b600052602160045260246000fd5b145b156115e657848314156115d8579250610b46915050565b826115e281615e4d565b9350505b806115f081615e4d565b9150506114d7565b50600095945050505050565b600061160f83611deb565b82106116715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c46565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b600060ff82166116ac57506001919050565b6116b7600183615da5565b6116c59060ff166001615d38565b6116d29062017bb0615d38565b61012f546116e991906001600160581b0316615ce3565b6001600160581b0316421192915050565b33611703612143565b6001600160a01b0316146117295760405162461bcd60e51b8152600401610c4690615b55565b60405133904780156108fc02916000818181858888f193505050506117855760405162461bcd60e51b8152602060048201526012602482015271636f756c64206e6f7420776974686472617760701b6044820152606401610c46565b565b33611790612143565b6001600160a01b0316146117b65760405162461bcd60e51b8152600401610c4690615b55565b611785613c01565b33803b903281146117e15760405162461bcd60e51b8152600401610c4690615b34565b81156117ff5760405162461bcd60e51b8152600401610c4690615b34565b61012f546001600160581b031642116118485760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610c46565b61012e54610100900460ff16156118715760405162461bcd60e51b8152600401610c4690615bdb565b60005b838110156118bd576118ab85858381811061189f57634e487b7160e01b600052603260045260246000fd5b90506020020135613c8e565b806118b581615e4d565b915050611874565b5080416040516020016118d192919061592e565b60408051601f1981840301815291905280516020909101206101345550505050565b610d77838383604051806020016040528060008152506128a6565b33803b903281146119315760405162461bcd60e51b8152600401610c4690615b34565b811561194f5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761198985858381811061197d57634e487b7160e01b600052603260045260246000fd5b90506020020135613ee3565b8061199381615e4d565b915050611952565b60006119a660995490565b8210611a095760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c46565b60998281548110611a2a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b33611a45612143565b6001600160a01b031614611a6b5760405162461bcd60e51b8152600401610c4690615b55565b61012e805460ff1916911515919091179055565b33611a88612143565b6001600160a01b031614611aae5760405162461bcd60e51b8152600401610c4690615b55565b610132546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611ae190859085906004016159a1565b600060405180830381600087803b158015611afb57600080fd5b505af1158015611b0f573d6000803e3d6000fd5b505050505050565b33803b90328114611b3a5760405162461bcd60e51b8152600401610c4690615b34565b8115611b585760405162461bcd60e51b8152600401610c4690615b34565b61012e546201000090046001600160581b03164211611b895760405162461bcd60e51b8152600401610c4690615a23565b611b91612143565b6001600160a01b0316336001600160a01b031614158015611bb25750607185115b15611bde5766b1a2bc2ec50000341015611bde5760405162461bcd60e51b8152600401610c4690615a9a565b611c24611beb8787614036565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061407f92505050565b611c605760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c46565b6001600160a01b0386166000908152610131602052604090205415611cb85760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b6044820152606401610c46565b6001600160a01b038616600090815261013160205260408120805491611cdd83615e4d565b9190505550611ceb86614096565b8041604051602001611cfe92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050565b6000818152606760205260408120546001600160a01b031680610b465760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c46565b33611da2612143565b6001600160a01b031614611dc85760405162461bcd60e51b8152600401610c4690615b55565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611e565760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c46565b506001600160a01b031660009081526068602052604090205490565b33611e7b612143565b6001600160a01b031614611ea15760405162461bcd60e51b8152600401610c4690615b55565b6117856000614590565b33611eb4612143565b6001600160a01b031614611eda5760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216620100000262010000600160681b0319909216919091179055565b33611f0e612143565b6001600160a01b031614611f345760405162461bcd60e51b8152600401610c4690615b55565b61013055565b600054610100900460ff1680611f53575060005460ff16155b611f6f5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015611f91576000805461ffff19166101011790555b611fdc6040518060400160405280600981526020016845766f536e61696c7360b81b81525060405180604001604052806008815260200167115593d4d390525360c21b8152506145e2565b611fe4614669565b611fec6146ec565b611ff4614753565b61012e80546001600160c01b03191665617f9e800001630186011d606e1b0117905561012f805463618055506001600160581b031990911617905560405163091ce90360e21b81526101376004820152610139602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb90632473a40c9060440160006040518083038186803b15801561208357600080fd5b505af4158015612097573d6000803e3d6000fd5b5050505080156120ad576000805461ff00191690555b50565b336120b9612143565b6001600160a01b0316146120df5760405162461bcd60e51b8152600401610c4690615b55565b6117856147ba565b336120f0612143565b6001600160a01b0316146121165760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216600160681b02600160681b600160c01b0319909216919091179055565b60fb546001600160a01b031690565b60008181526101366020526040808220815160808101909252805483929190829060ff16600181111561219557634e487b7160e01b600052602160045260246000fd5b60018111156121b457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b0316602080840191909152600160a81b80830465ffffffffffff908116604080870191909152600160d81b90940464ffffffffff1660609095019490945260008881526101369092529181205493945092612223929190041642615d7e565b65ffffffffffff16905060008251600181111561225057634e487b7160e01b600052602160045260246000fd5b1415612260575060009392505050565b6201518061226d856122aa565b6122779083615d19565b61228990670de0b6b3a7640000615d19565b6122939190615d05565b949350505050565b606060668054610b5b90615e12565b600081815261013560209081526040808320815160e081018352905460ff8082168352610100820481169483019490945262010000810484169282018390526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b900490921660c083015260069061232e90612fa9565b60ff161061233f5750603c92915050565b6005915060006123558260c0015160ff16612fa9565b60ff16905080600714156123755761236e601984615ca6565b925061238a565b6002811061238a576123878184615ca6565b92505b81516123989060ff16612fa9565b6123a59060ff1684615ca6565b92506123b7826040015160ff16612fa9565b6123c49060ff1684615ca6565b92506123d6826060015160ff16612fa9565b6123e39060ff1684615ca6565b92506123f5826020015160ff16612fa9565b6122939060ff1684615ca6565b33803b903281146124255760405162461bcd60e51b8152600401610c4690615b34565b81156124435760405162461bcd60e51b8152600401610c4690615b34565b600061244e60995490565b61012e54909150600160681b90046001600160581b031642116124835760405162461bcd60e51b8152600401610c4690615a23565b600084116124c75760405162461bcd60e51b81526020600482015260116024820152700616d6f756e74206d757374206265203e3607c1b6044820152606401610c46565b600184111561250c5760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b6044820152606401610c46565b6115b36125198583615ca6565b11156125535760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610c46565b61255b612143565b6001600160a01b0316336001600160a01b0316146125a3576125848466b1a2bc2ec50000615d19565b3410156125a35760405162461bcd60e51b8152600401610c4690615a9a565b60015b8481116125c8576125b633614096565b806125c081615e4d565b9150506125a6565b505080416040516020016125dd92919061592e565b60408051601f19818403018152919052805160209091012061013455505050565b33612607612143565b6001600160a01b03161461262d5760405162461bcd60e51b8152600401610c4690615b55565b6126378282614812565b5050565b6001600160a01b0382163314156126905760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c46565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008281526101366020526040808220815160808101909252805483929190829060ff16600181111561273f57634e487b7160e01b600052602160045260246000fd5b600181111561275e57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506127a88361482c565b64ffffffffff16816060015164ffffffffff16426127c69190615d67565b11949350505050565b336127d8612143565b6001600160a01b0316146127fe5760405162461bcd60e51b8152600401610c4690615b55565b61012e80549115156101000261ff0019909216919091179055565b33803b9032811461283c5760405162461bcd60e51b8152600401610c4690615b34565b811561285a5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761289485858381811061288857634e487b7160e01b600052603260045260246000fd5b90506020020135612fcf565b8061289e81615e4d565b91505061285d565b6128b033836139a6565b6128cc5760405162461bcd60e51b8152600401610c4690615b8a565b6128d88484848461484b565b50505050565b600081815261013560209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606084810191909152600160201b83048216608080860191909152600160281b8404831660a0860152600160301b909304821660c0850152878752610136909552838620845192830190945283549495929492939192839116600181111561299957634e487b7160e01b600052602160045260246000fd5b60018111156129b857634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506000612a04856122aa565b610133548451602086015160408701516060880151608089015160a08a015160c08b01519798506001600160a01b0390961696635d7d0289968d96959493929160018c516001811115612a6757634e487b7160e01b600052602160045260246000fd5b6040516001600160e01b031960e08d901b16815261ffff909a1660048b015260ff98891660248b015296881660448a01529487166064890152928616608488015290851660a4870152841660c4860152831660e48501521461010483015284166101248201526101440160006040518083038186803b158015612ae957600080fd5b505afa158015612afd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b259190810190615729565b95945050505050565b33612b37612143565b6001600160a01b031614612b5d5760405162461bcd60e51b8152600401610c4690615b55565b61012f80546001600160581b0319166001600160581b0392909216919091179055565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b33612bb7612143565b6001600160a01b031614612bdd5760405162461bcd60e51b8152600401610c4690615b55565b600061013560008a81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050878160c0019060ff16908160ff168152505086816000019060ff16908160ff168152505085816040019060ff16908160ff168152505084816080019060ff16908160ff1681525050838160a0019060ff16908160ff168152505082816060019060ff16908160ff168152505081816020019060ff16908160ff16815250508061013560008b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff160217905550905050612e5189613924565b505050505050505050565b33612e65612143565b6001600160a01b031614612e8b5760405162461bcd60e51b8152600401610c4690615b55565b6001600160a01b038116612ef05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b6120ad81614590565b60006001600160e01b0319821663780e9d6360e01b1480610b465750610b468261487e565b6000908152606760205260409020546001600160a01b0316151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f7082611d22565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081612fb857506000919050565b6005612fc5600184615d67565b610b469190615d05565b600081815261013660205260408082208151608081019092528054829060ff16600181111561300e57634e487b7160e01b600052602160045260246000fd5b600181111561302d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561309157634e487b7160e01b600052602160045260246000fd5b14156130c2576130a082611d22565b6001600160a01b0316336001600160a01b0316146130bd57600080fd5b61310d565b6001815160018111156130e557634e487b7160e01b600052602160045260246000fd5b141561310d5780602001516001600160a01b0316336001600160a01b03161461310d57600080fd5b600061311883612152565b90508061312457505050565b610132546001600160a01b03166340c10f193361314086612152565b6040518363ffffffff1660e01b815260040161315d9291906159a1565b600060405180830381600087803b15801561317757600080fd5b505af115801561318b573d6000803e3d6000fd5b505050600093845250506101366020525060409020805465ffffffffffff60a81b1916600160a81b4265ffffffffffff1602179055565b60008086156131d957806131d581615e68565b9150505b85156131ed57806131e981615e68565b9150505b841561320157806131fd81615e68565b9150505b8315613215578061321181615e68565b9150505b8215613229578061322581615e68565b9150505b60ff8881166000908152610137602052604090205461324e9183169061ffff16615d19565b61326090670de0b6b3a7640000615d19565b98975050505050505050565b6000806132776148ce565b905060006132a58285600681111561329f57634e487b7160e01b600052602160045260246000fd5b88614916565b60ff80871660009081526101376020908152604091829020825160e081018452905461ffff80821683526201000082048116938301849052600160201b820490951693820193909352600160281b830484166060820152600160381b830484166080820152600160481b8304841660a0820152600160581b90920490921660c08201529192506133645760405162461bcd60e51b815260206004820152600a602482015269706f6f6c20656d70747960b01b6044820152606401610c46565b6000806133718484614955565b60008b815261013560209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820483166060820152600160201b820483166080820152600160281b8204831660a0820152600160301b90910490911660c082015292945090925088600681111561341157634e487b7160e01b600052602160045260246000fd5b14156134255760ff831660c0820152613630565b600188600681111561344757634e487b7160e01b600052602160045260246000fd5b14156134585760ff83168152613630565b600288600681111561347a57634e487b7160e01b600052602160045260246000fd5b14156135c85760ff831660408201819052601f11156135c357600060036134bf88604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6134c99190615e88565b9050600060036134f789604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6135019190615e88565b61350c906003615ca6565b60ff80871660009081526101396020526040902080549293509190841690811061354657634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015460ff601f9093166101000a90048216608087015287821683526101399052604090912080549091831690811061359b57634e487b7160e01b600052603260045260246000fd5b60009182526020918290209181049091015460ff601f9092166101000a90041660a084015250505b613630565b60058860068111156135ea57634e487b7160e01b600052602160045260246000fd5b14156135fe5760ff83166060820152613630565b600688600681111561362057634e487b7160e01b600052602160045260246000fd5b14156136305760ff831660208201525b60008a815261013560209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160ff95861661ffff1990981697909717610100988616989098029790971763ffff00001916620100009385169390930263ff0000001916929092176301000000918416919091021761ffff60201b1916600160201b9183169190910260ff60281b191617600160281b948216949094029390931760ff60301b1916600160301b928416929092029190911790556002908a16106137ce5760ff808a16600090815261013760209081526040918290208551815492870151938701516060880151608089015160a08a015160c08b015161ffff908116600160581b0261ffff60581b19928216600160481b0261ffff60481b19948316600160381b029490941663ffffffff60381b19958316600160281b0261ffff60281b1997909c16600160201b029690961662ffffff60201b199a8316620100000263ffffffff19909a16929097169190911797909717979097169390931796909617959095169490941793909317919091161790555b509098975050505050505050565b600660009081526101376020527fe61ba6d5276b1f0e4decff92b6d57a453a7d0d5c2a55a75aaf612a522da84e675461382190600160381b900461ffff166001615cbe565b61382c90601e615cbe565b600083815261013560208181526040808420815160e081018352815460ff600160201b808304821660808501908152600160281b808504841660a087019081529b841660c0870181815281885298870181815260608801828152888c019283529f909c52999098529351975198519b5193519951955197821661ffff1990931692909217610100988216989098029790971763ffff00001916620100009a88169a909a0263ff0000001916999099176301000000918716919091021761ffff60201b191695851690970260ff60281b191694909417938316029290921760ff60301b1916600160301b92909116919091021790915550565b600081815261013560205260409081902090516001620f4f8b60e31b031981526004810191909152610138602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb9063ff8583a89060440160006040518083038186803b15801561398b57600080fd5b505af415801561399f573d6000803e3d6000fd5b5050505050565b60006139b182612f1e565b613a125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c46565b6000613a1d83611d22565b9050806001600160a01b0316846001600160a01b03161480613a585750836001600160a01b0316613a4d84610bde565b6001600160a01b0316145b8061229357506122938185612b80565b826001600160a01b0316613a7b82611d22565b6001600160a01b031614613ae35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c46565b6001600160a01b038216613b455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b613b50838383614bd0565b613b5b600082612f3b565b6001600160a01b0383166000908152606860205260408120805460019290613b84908490615d67565b90915550506001600160a01b0382166000908152606860205260408120805460019290613bb2908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615ef583398151915291a4505050565b60c95460ff16613c4a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c46565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613c849190615950565b60405180910390a1565b600081815261013660205260408082208151608081019092528054829060ff166001811115613ccd57634e487b7160e01b600052602160045260246000fd5b6001811115613cec57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600181516001811115613d5057634e487b7160e01b600052602160045260246000fd5b1415613d8f5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610c46565b613d9882611d22565b6001600160a01b0316336001600160a01b031614613de45760405162461bcd60e51b81526020600482015260096024820152686e6f7420796f75727360b81b6044820152606401610c46565b613def333084613a68565b60408051608081019091528060015b81523360208083019190915265ffffffffffff421660408084019190915260608581015164ffffffffff1693019290925260008581526101369091522081518154829060ff191660018381811115613e6657634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b03199092169190911791909117929092169190911790555050565b600081815261013660205260408082208151608081019092528054829060ff166001811115613f2257634e487b7160e01b600052602160045260246000fd5b6001811115613f4157634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115613fa557634e487b7160e01b600052602160045260246000fd5b1415613fe65760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610c46565b6000828152610136602052604090205461010090046001600160a01b0316331461400f57600080fd5b61401a303384613a68565b61402382612fcf565b6040805160808101909152806000613dfe565b6000818360405160200161406192919091825260601b6001600160601b031916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b600061408f826101305485614bfe565b9392505050565b6140a561012d80546001019055565b60006140b161012d5490565b90506001806000808080806003816140c76148ce565b6000805261013760209081526040805160e0810182527f9656a38e5b8bf16175eb4bca28ffa04d5646d4e9da9a5df333165c7cb8a8693f5461ffff8082168352620100008204811683860152600160201b820460ff1683850152600160281b820481166060840152600160381b820481166080840152600160481b8204811660a0840152600160581b9091041660c082015281518083019092526004825263626f647960e01b928201929092529192509061418e906141889084908e614bb9565b82614955565b80925081995050506141c161418883604051806040016040528060058152602001641cda195b1b60da1b8152508e614bb9565b80925081965050506141f461418883604051806040016040528060058152602001641d1c985a5b60da1b8152508e614bb9565b809250819550505061013960008960ff1660ff1681526020019081526020016000208360ff1661424184604051806040016040528060048152602001636579657360e01b8152508f614bb9565b61424b9190615e88565b8154811061426957634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16965061013960008960ff1660ff1681526020019081526020016000208360ff166142d184604051806040016040528060058152602001640dadeeae8d60db1b8152508f614bb9565b6142db9190615e88565b6142e6906003615ca6565b8154811061430457634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1695506143308c8c614cbb565b6040518060e001604052808a60ff1681526020018560ff1681526020018960ff1681526020018660ff1681526020018860ff1681526020018760ff1681526020018b60ff1681525061013560008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff1602179055509050506040518060800160405280600060018111156144a257634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038e1660208083019190915265ffffffffffff4216604080840191909152600060609093018390528e8352610136909152902081518154829060ff19166001838181111561450957634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b0319909216919091179190911792909216919091179055505050505050505050505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806145fb575060005460ff16155b6146175760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614639576000805461ffff19166101011790555b614641614de7565b614649614de7565b6146538383614e51565b8015610d77576000805461ff0019169055505050565b600054610100900460ff1680614682575060005460ff16155b61469e5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146c0576000805461ffff19166101011790555b6146c8614de7565b6146d0614de7565b6146d8614de7565b80156120ad576000805461ff001916905550565b600054610100900460ff1680614705575060005460ff16155b6147215760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614743576000805461ffff19166101011790555b61474b614de7565b6146d8614ee6565b600054610100900460ff168061476c575060005460ff16155b6147885760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156147aa576000805461ffff19166101011790555b6147b2614de7565b6146d8614f5b565b60c95460ff16156147dd5760405162461bcd60e51b8152600401610c4690615abc565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613c773390565b612637828260405180602001604052806000815250614fbb565b61012e5460009060ff1661484257506000919050565b50617080919050565b614856848484613a68565b61486284848484614fee565b6128d85760405162461bcd60e51b8152600401610c4690615a48565b60006001600160e01b031982166380ac58cd60e01b14806148af57506001600160e01b03198216635b5e139f60e01b145b80610b4657506301ffc9a760e01b6001600160e01b0319831614610b46565b61013454604080513360601b6001600160601b031916602080830191909152426034830152605480830194909452825180830390940184526074909101909152815191012090565b6040805160208101859052908101839052606081018290526000906080015b60408051601f198184030181529190528051602090910120949350505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000836020015161ffff16856149a39190615e88565b6020850180519192506149b582615df4565b61ffff1690525060a084015160808501516060860151600092916149d891615c80565b6149e29190615c80565b61ffff1682101580156149fd575060008560c0015161ffff16115b15614a6057600585604001516003614a159190615cbe565b60ff16614a229190615d19565b614a2d600584615e88565b614a38906001615ca6565b614a429190615ca6565b60c086018051919250614a5482615df4565b61ffff16905250614bab565b84608001518560600151614a749190615c80565b61ffff168210158015614a8f575060008560a0015161ffff16115b15614ae657600585604001516002614aa79190615cbe565b60ff16614ab49190615d19565b614abf600584615e88565b614aca906001615ca6565b614ad49190615ca6565b60a086018051919250614a5482615df4565b846060015161ffff168210158015614b0657506000856080015161ffff16115b15614b5d57600585604001516001614b1e9190615cbe565b60ff16614b2b9190615d19565b614b36600584615e88565b614b41906001615ca6565b614b4b9190615ca6565b608086018051919250614a5482615df4565b6005856040015160ff16614b719190615d19565b614b7c600584615e88565b614b87906001615ca6565b614b919190615ca6565b606086018051919250614ba382615df4565b61ffff169052505b9250839150505b9250929050565b600083838360405160200161493593929190615c00565b60c95460ff1615614bf35760405162461bcd60e51b8152600401610c4690615abc565b610d778383836150fb565b600081815b8551811015614cb0576000868281518110614c2e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311614c70576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614c9d565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ca881615e4d565b915050614c03565b509092149392505050565b6001600160a01b038216614d115760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c46565b614d1a81612f1e565b15614d665760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c46565b614d7260008383614bd0565b6001600160a01b0382166000908152606860205260408120805460019290614d9b908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615ef5833981519152908290a45050565b600054610100900460ff1680614e00575060005460ff16155b614e1c5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146d8576000805461ffff191661010117905580156120ad576000805461ff001916905550565b600054610100900460ff1680614e6a575060005460ff16155b614e865760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614ea8576000805461ffff19166101011790555b8251614ebb906065906020860190615396565b508151614ecf906066906020850190615396565b508015610d77576000805461ff0019169055505050565b600054610100900460ff1680614eff575060005460ff16155b614f1b5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614f3d576000805461ffff19166101011790555b60c9805460ff1916905580156120ad576000805461ff001916905550565b600054610100900460ff1680614f74575060005460ff16155b614f905760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614fb2576000805461ffff19166101011790555b6146d833614590565b614fc58383614cbb565b614fd26000848484614fee565b610d775760405162461bcd60e51b8152600401610c4690615a48565b60006001600160a01b0384163b156150f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290615032903390899088908890600401615964565b602060405180830381600087803b15801561504c57600080fd5b505af192505050801561507c575060408051601f3d908101601f191682019092526150799181019061570d565b60015b6150d6573d8080156150aa576040519150601f19603f3d011682016040523d82523d6000602084013e6150af565b606091505b5080516150ce5760405162461bcd60e51b8152600401610c4690615a48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612293565b506001949350505050565b6001600160a01b0383166151565761515181609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b615179565b816001600160a01b0316836001600160a01b0316146151795761517983826151b3565b6001600160a01b03821661519057610d7781615250565b826001600160a01b0316826001600160a01b031614610d7757610d778282615329565b600060016151c084611deb565b6151ca9190615d67565b60008381526098602052604090205490915080821461521d576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061526290600190615d67565b6000838152609a60205260408120546099805493945090928490811061529857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080609983815481106152c757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061530d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061533483611deb565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b8280546153a290615e12565b90600052602060002090601f0160209004810192826153c4576000855561540a565b82601f106153dd57805160ff191683800117855561540a565b8280016001018555821561540a579182015b8281111561540a5782518255916020019190600101906153ef565b5061541692915061541a565b5090565b5b80821115615416576000815560010161541b565b80356001600160a01b038116811461544657600080fd5b919050565b60008083601f84011261545c578081fd5b5081356001600160401b03811115615472578182fd5b6020830191508360208260051b8501011115614bb257600080fd5b8035801515811461544657600080fd5b803560ff8116811461544657600080fd5b6000602082840312156154bf578081fd5b61408f8261542f565b600080604083850312156154da578081fd5b6154e38361542f565b91506154f16020840161542f565b90509250929050565b60008060006060848603121561550e578081fd5b6155178461542f565b92506155256020850161542f565b9150604084013590509250925092565b6000806000806080858703121561554a578081fd5b6155538561542f565b93506155616020860161542f565b92506040850135915060608501356001600160401b03811115615582578182fd5b8501601f81018713615592578182fd5b80356155a56155a082615c59565b615c29565b8181528860208385010111156155b9578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156155e9578182fd5b6155f28361542f565b91506154f16020840161548d565b60008060408385031215615612578182fd5b61561b8361542f565b946020939093013593505050565b6000806000806060858703121561563e578384fd5b6156478561542f565b93506020850135925060408501356001600160401b03811115615668578283fd5b6156748782880161544b565b95989497509550505050565b60008060208385031215615692578182fd5b82356001600160401b038111156156a7578283fd5b6156b38582860161544b565b90969095509350505050565b6000602082840312156156d0578081fd5b61408f8261548d565b6000602082840312156156ea578081fd5b5035919050565b600060208284031215615702578081fd5b813561408f81615ede565b60006020828403121561571e578081fd5b815161408f81615ede565b60006020828403121561573a578081fd5b81516001600160401b0381111561574f578182fd5b8201601f8101841361575f578182fd5b805161576d6155a082615c59565b818152856020838501011115615781578384fd5b612b25826020830160208601615dc8565b600080604083850312156157a4578182fd5b823591506154f16020840161549d565b600080600080600080600060e0888a0312156157ce578485fd5b873596506157de6020890161549d565b95506157ec6040890161548d565b94506157fa6060890161548d565b93506158086080890161548d565b925061581660a0890161548d565b915061582460c0890161548d565b905092959891949750929550565b600080600080600080600080610100898b03121561584e578182fd5b8835975061585e60208a0161549d565b965061586c60408a0161549d565b955061587a60608a0161549d565b945061588860808a0161549d565b935061589660a08a0161549d565b92506158a460c08a0161549d565b91506158b260e08a0161549d565b90509295985092959890939650565b6000602082840312156158d2578081fd5b61408f8261549d565b6000602082840312156158ec578081fd5b81356001600160581b038116811461408f578182fd5b6000815180845261591a816020860160208601615dc8565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061599790830184615902565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b60808101600286106159dc57634e487b7160e01b600052602160045260246000fd5b9481526001600160a01b0393909316602084015265ffffffffffff91909116604083015264ffffffffff1660609091015290565b60208152600061408f6020830184615902565b6020808252600b908201526a1b5a5b9d081b1bd8dad95960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600890820152676e6f2066756e647360c01b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526007908201526631b432b0ba32b960c91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a19d85b59481c185d5cd95960aa1b604082015260600190565b838152606060208201526000615c196060830185615902565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715615c5157615c51615ec8565b604052919050565b60006001600160401b03821115615c7257615c72615ec8565b50601f01601f191660200190565b600061ffff808316818516808303821115615c9d57615c9d615e9c565b01949350505050565b60008219821115615cb957615cb9615e9c565b500190565b600060ff821660ff84168060ff03821115615cdb57615cdb615e9c565b019392505050565b60006001600160581b03828116848216808303821115615c9d57615c9d615e9c565b600082615d1457615d14615eb2565b500490565b6000816000190483118215151615615d3357615d33615e9c565b500290565b60006001600160581b0382811684821681151582840482111615615d5e57615d5e615e9c565b02949350505050565b600082821015615d7957615d79615e9c565b500390565b600065ffffffffffff83811690831681811015615d9d57615d9d615e9c565b039392505050565b600060ff821660ff841680821015615dbf57615dbf615e9c565b90039392505050565b60005b83811015615de3578181015183820152602001615dcb565b838111156128d85750506000910152565b600061ffff821680615e0857615e08615e9c565b6000190192915050565b600181811c90821680615e2657607f821691505b60208210811415615e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e6157615e61615e9c565b5060010190565b600060ff821660ff811415615e7f57615e7f615e9c565b60010192915050565b600082615e9757615e97615eb2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120ad57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028c344260942ef8bfab252b3aea5f5d5260ec44c7bbe19fd8584e0303bd83fa464736f6c63430008040033
Deployed Bytecode Sourcemap
107667:21247:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128718:193;;;;;;;;;;-1:-1:-1;128718:193:0;;;;;:::i;:::-;;:::i;:::-;;;10786:14:1;;10779:22;10761:41;;10749:2;10734:18;128718:193:0;;;;;;;;23780:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25350:221::-;;;;;;;;;;-1:-1:-1;25350:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24862:422::-;;;;;;;;;;-1:-1:-1;24862:422:0;;;;;:::i;:::-;;:::i;:::-;;110152:126;;;;;;;;;;-1:-1:-1;110152:126:0;;;;;:::i;:::-;;:::i;116302:2417::-;;;;;;;;;;-1:-1:-1;116302:2417:0;;;;;:::i;:::-;;:::i;108068:41::-;;;;;;;;;;;;108099:10;108068:41;;;;;10959:25:1;;;10947:2;10932:18;108068:41:0;10914:76:1;38069:113:0;;;;;;;;;;-1:-1:-1;38157:10:0;:17;38069:113;;108163:41;;;;;;;;;;;;108203:1;108163:41;;26240:339;;;;;;;;;;-1:-1:-1;26240:339:0;;;;;:::i;:::-;;:::i;115263:390::-;;;;;;;;;;-1:-1:-1;115263:390:0;;;;;:::i;:::-;;:::i;108333:36::-;;;;;;;;;;-1:-1:-1;108333:36:0;;;;;;;-1:-1:-1;;;;;108333:36:0;;;;;;-1:-1:-1;;;;;30103:31:1;;;30085:50;;30073:2;30058:18;108333:36:0;30040:101:1;115661:483:0;;;;;;;;;;-1:-1:-1;115661:483:0;;;;;:::i;:::-;;:::i;108448:25::-;;;;;;;;;;;;;;;;37726:267;;;;;;;;;;-1:-1:-1;37726:267:0;;;;;:::i;:::-;;:::i;122658:187::-;;;;;;;;;;-1:-1:-1;122658:187:0;;;;;:::i;:::-;;:::i;123827:142::-;;;:::i;126624:65::-;;;;;;;;;;;;;:::i;112315:299::-;;;;;;;;;;-1:-1:-1;112315:299:0;;;;;:::i;:::-;;:::i;26650:185::-;;;;;;;;;;-1:-1:-1;26650:185:0;;;;;:::i;:::-;;:::i;113168:186::-;;;;;;;;;;-1:-1:-1;113168:186:0;;;;;:::i;:::-;;:::i;38259:244::-;;;;;;;;;;-1:-1:-1;38259:244:0;;;;;:::i;:::-;;:::i;127034:105::-;;;;;;;;;;-1:-1:-1;127034:105:0;;;;;:::i;:::-;;:::i;123977:107::-;;;;;;;;;;-1:-1:-1;123977:107:0;;;;;:::i;:::-;;:::i;44965:86::-;;;;;;;;;;-1:-1:-1;45036:7:0;;;;44965:86;;111133:549;;;;;;:::i;:::-;;:::i;23474:239::-;;;;;;;;;;-1:-1:-1;23474:239:0;;;;;:::i;:::-;;:::i;109457:40::-;;;;;;;;;;-1:-1:-1;109457:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;110286:86;;;;;;;;;;-1:-1:-1;110286:86:0;;;;;:::i;:::-;;:::i;23204:208::-;;;;;;;;;;-1:-1:-1;23204:208:0;;;;;:::i;:::-;;:::i;48078:94::-;;;;;;;;;;;;;:::i;126697:115::-;;;;;;;;;;-1:-1:-1;126697:115:0;;;;;:::i;:::-;;:::i;108416:23::-;;;;;;;;;;-1:-1:-1;108416:23:0;;;;-1:-1:-1;;;;;108416:23:0;;;128277:104;;;;;;;;;;-1:-1:-1;128277:104:0;;;;;:::i;:::-;;:::i;109716:428::-;;;;;;;;;;;;;:::i;126555:61::-;;;;;;;;;;;;;:::i;126820:109::-;;;;;;;;;;-1:-1:-1;126820:109:0;;;;;:::i;:::-;;:::i;47427:87::-;;;;;;;;;;;;;:::i;111840:467::-;;;;;;;;;;-1:-1:-1;111840:467:0;;;;;:::i;:::-;;:::i;108529:46::-;;;;;;;;;;-1:-1:-1;108529:46:0;;;;-1:-1:-1;;;;;108529:46:0;;;23949:104;;;;;;;;;;;;;:::i;114710:545::-;;;;;;;;;;-1:-1:-1;114710:545:0;;;;;:::i;:::-;;:::i;110530:595::-;;;;;;:::i;:::-;;:::i;127248:109::-;;;;;;;;;;-1:-1:-1;127248:109:0;;;;;:::i;:::-;;:::i;25643:295::-;;;;;;;;;;-1:-1:-1;25643:295:0;;;;;:::i;:::-;;:::i;109205:51::-;;;;;;;;;;-1:-1:-1;109205:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;109205:51:0;;-1:-1:-1;;;109205:51:0;;;;;-1:-1:-1;;;109205:51:0;;;;;;;;;;;;;;;;:::i;118727:241::-;;;;;;;;;;-1:-1:-1;118727:241:0;;;;;:::i;:::-;;:::i;108951:39::-;;;;;;;;;;-1:-1:-1;108951:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;108951:39:0;;;;;-1:-1:-1;;;108951:39:0;;;;;-1:-1:-1;;;108951:39:0;;;;;;;;;;30443:4:1;30474:15;;;30456:34;;30526:15;;;30521:2;30506:18;;30499:43;30578:15;;;30558:18;;;30551:43;;;;30630:15;;;30625:2;30610:18;;30603:43;30683:15;;30677:3;30662:19;;30655:44;30736:15;;30730:3;30715:19;;30708:44;30789:15;;;30783:3;30768:19;;30761:44;30420:3;30405:19;108951:39:0;30387:424:1;127147:93:0;;;;;;;;;;-1:-1:-1;127147:93:0;;;;;:::i;:::-;;:::i;113935:187::-;;;;;;;;;;-1:-1:-1;113935:187:0;;;;;:::i;:::-;;:::i;26906:328::-;;;;;;;;;;-1:-1:-1;26906:328:0;;;;;:::i;:::-;;:::i;123015:643::-;;;;;;;;;;-1:-1:-1;123015:643:0;;;;;:::i;:::-;;:::i;108376:33::-;;;;;;;;;;-1:-1:-1;108376:33:0;;;;-1:-1:-1;;;108376:33:0;;-1:-1:-1;;;;;108376:33:0;;;108116:40;;;;;;;;;;;;108152:4;108116:40;;126937:89;;;;;;;;;;-1:-1:-1;126937:89:0;;;;;:::i;:::-;;:::i;26009:164::-;;;;;;;;;;-1:-1:-1;26009:164:0;;;;;:::i;:::-;;:::i;127365:562::-;;;;;;;;;;-1:-1:-1;127365:562:0;;;;;:::i;:::-;;:::i;48327:192::-;;;;;;;;;;-1:-1:-1;48327:192:0;;;;;:::i;:::-;;:::i;109409:39::-;;;;;;;;;;-1:-1:-1;109409:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;109409:39:0;;;;-1:-1:-1;;;109409:39:0;;;;;-1:-1:-1;;;109409:39:0;;;;;-1:-1:-1;;;109409:39:0;;;;;-1:-1:-1;;;109409:39:0;;;;;;;;;;27780:6:1;27813:15;;;27795:34;;27865:15;;;27860:2;27845:18;;27838:43;27929:4;27917:17;;;27897:18;;;27890:45;;;;27971:15;;;27966:2;27951:18;;27944:43;28024:15;;28018:3;28003:19;;27996:44;28077:15;;28071:3;28056:19;;28049:44;28130:15;;;;28124:3;28109:19;;28102:44;27757:3;27742:19;109409:39:0;27724:428:1;128718:193:0;128843:4;128867:36;128891:11;128867:23;:36::i;:::-;128860:43;128718:193;-1:-1:-1;;128718:193:0:o;23780:100::-;23834:13;23867:5;23860:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23780:100;:::o;25350:221::-;25426:7;25454:16;25462:7;25454;:16::i;:::-;25446:73;;;;-1:-1:-1;;;25446:73:0;;21887:2:1;25446:73:0;;;21869:21:1;21926:2;21906:18;;;21899:30;21965:34;21945:18;;;21938:62;-1:-1:-1;;;22016:18:1;;;22009:42;22068:19;;25446:73:0;;;;;;;;;-1:-1:-1;25539:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25539:24:0;;25350:221::o;24862:422::-;24943:13;24959:34;24985:7;24959:25;:34::i;:::-;24943:50;;25018:5;-1:-1:-1;;;;;25012:11:0;:2;-1:-1:-1;;;;;25012:11:0;;;25004:57;;;;-1:-1:-1;;;25004:57:0;;24094:2:1;25004:57:0;;;24076:21:1;24133:2;24113:18;;;24106:30;24172:34;24152:18;;;24145:62;-1:-1:-1;;;24223:18:1;;;24216:31;24264:19;;25004:57:0;24066:223:1;25004:57:0;17554:10;-1:-1:-1;;;;;25096:21:0;;;;:62;;-1:-1:-1;25121:37:0;25138:5;17554:10;26009:164;:::i;25121:37::-;25074:168;;;;-1:-1:-1;;;25074:168:0;;18511:2:1;25074:168:0;;;18493:21:1;18550:2;18530:18;;;18523:30;18589:34;18569:18;;;18562:62;-1:-1:-1;;;18640:18:1;;;18633:54;18704:19;;25074:168:0;18483:246:1;25074:168:0;25255:21;25264:2;25268:7;25255:8;:21::i;:::-;24862:422;;;:::o;110152:126::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;110226:16:::1;:44:::0;;-1:-1:-1;;;;;;110226:44:0::1;-1:-1:-1::0;;;;;110226:44:0;;;::::1;::::0;;;::::1;::::0;;110152:126::o;116302:2417::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;116539:31:::1;116573:19:::0;;;:15:::1;:19;::::0;;;;;116539:53;;::::1;::::0;::::1;::::0;;;;;;;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;116539:53:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;116539:53:0::1;;;;;;;;;::::0;;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;116539:53:0::1;;::::0;::::1;::::0;-1:-1:-1;;;116539:53:0;::::1;;;::::0;;;;-1:-1:-1;;;116539:53:0;::::1;;;::::0;;;;;;-1:-1:-1;;116607:21:0;;:47:::1;::::0;::::1;;;;-1:-1:-1::0;;;116607:47:0::1;;;;;;;;;;116603:245;;;116693:11;116701:2;116693:7;:11::i;:::-;-1:-1:-1::0;;;;;116679:25:0::1;:10;-1:-1:-1::0;;;;;116679:25:0::1;;116671:34;;;::::0;::::1;;116603:245;;;116752:24;116727:21:::0;;:49:::1;::::0;::::1;;;;-1:-1:-1::0;;;116727:49:0::1;;;;;;;;;;116723:125;;;116815:15;:20;;;-1:-1:-1::0;;;;;116801:34:0::1;:10;-1:-1:-1::0;;;;;116801:34:0::1;;116793:43;;;::::0;::::1;;116860:18;116881:10:::0;;;:6:::1;:10;::::0;;;;;;;;116860:31;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;116860:31:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;116860:31:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;116860:31:0;::::1;::::0;::::1;::::0;;;;116913:10:::1;::::0;116860:31;;116913:10;;::::1;;116912:11;116904:35;;;;-1:-1:-1::0;;;116904:35:0::1;;;;;;;:::i;:::-;116960:13;:31;;;;116977:14;116960:31;:43;;;;116995:8;116960:43;:56;;;;117007:9;116960:56;:69;;;;117020:9;116960:69;116952:95;;;::::0;-1:-1:-1;;;116952:95:0;;20508:2:1;116952:95:0::1;::::0;::::1;20490:21:1::0;20547:2;20527:18;;;20520:30;-1:-1:-1;;;20566:18:1;;;20559:43;20619:18;;116952:95:0::1;20480:163:1::0;116952:95:0::1;117068:21;117076:2;117080:8;117068:7;:21::i;:::-;117060:42;;;::::0;-1:-1:-1;;;117060:42:0;;18936:2:1;117060:42:0::1;::::0;::::1;18918:21:1::0;18975:1;18955:18;;;18948:29;-1:-1:-1;;;18993:18:1;;;18986:38;19041:18;;117060:42:0::1;18908:157:1::0;117060:42:0::1;117134:1;117123:8;:12;;;:29;;;;;117151:1;117139:8;:13;;;;117123:29;117115:54;;;::::0;-1:-1:-1;;;117115:54:0;;20850:2:1;117115:54:0::1;::::0;::::1;20832:21:1::0;20889:2;20869:18;;;20862:30;-1:-1:-1;;;20908:18:1;;;20901:42;20960:18;;117115:54:0::1;20822:162:1::0;117115:54:0::1;117190:22;117203:8;117190:12;:22::i;:::-;117182:46;;;::::0;-1:-1:-1;;;117182:46:0;;23754:2:1;117182:46:0::1;::::0;::::1;23736:21:1::0;23793:2;23773:18;;;23766:30;-1:-1:-1;;;23812:18:1;;;23805:41;23863:18;;117182:46:0::1;23726:161:1::0;117182:46:0::1;117272:1;117249:20;117258:5;:10;;;117249:20;;:8;:20::i;:::-;:24;;;117241:56;;;::::0;-1:-1:-1;;;117241:56:0;;16384:2:1;117241:56:0::1;::::0;::::1;16366:21:1::0;16423:2;16403:18;;;16396:30;-1:-1:-1;;;16442:18:1;;;16435:49;16501:18;;117241:56:0::1;16356:169:1::0;117241:56:0::1;117310:19;::::0;;;:15:::1;:19;::::0;;;;:54;;-1:-1:-1;;;;;117310:54:0::1;-1:-1:-1::0;;;117348:15:0::1;117310:54;;;;::::0;;117433:17:::1;117310:19:::0;117433:13:::1;:17::i;:::-;117463:4;::::0;-1:-1:-1;;;;;117463:4:0::1;:13;117477:10;117489:84;117501:8:::0;117511:13;117526:14;117542:8;117552:9;117563;117489:11:::1;:84::i;:::-;117463:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;117587:13;117615;117611:211;;;117655:39;117665:2;117669:8;117679:14;117655:9;:39::i;:::-;117645:49;;117713:17;117722:7;117713:17;;:8;:17::i;:::-;:22;;117734:1;117713:22;117709:102;;;117756:14;117767:2;117756:10;:14::i;:::-;117789:7;;;;;117709:102;117836:14;117832:213;;;117877:40;117887:2;117891:8;117901:15;117877:9;:40::i;:::-;117867:50;;117936:17;117945:7;117936:17;;:8;:17::i;:::-;:22;;117957:1;117936:22;117932:102;;;117979:14;117990:2;117979:10;:14::i;117932:102::-;118059:8;118055:201;;;118094:34;118104:2;118108:8;118118:9;118094;:34::i;:::-;118084:44;;118147:17;118156:7;118147:17;;:8;:17::i;:::-;:22;;118168:1;118147:22;118143:102;;;118190:14;118201:2;118190:10;:14::i;118143:102::-;118270:9;118266:203;;;118306:35;118316:2;118320:8;118330:10;118306:9;:35::i;:::-;118296:45;;118360:17;118369:7;118360:17;;:8;:17::i;:::-;:22;;118381:1;118360:22;118356:102;;;118403:14;118414:2;118403:10;:14::i;118356:102::-;118483:9;118479:203;;;118519:35;118529:2;118533:8;118543:10;118519:9;:35::i;:::-;118509:45;;118573:17;118582:7;118573:17;;:8;:17::i;:::-;:22;;118594:1;118573:22;118569:102;;;118616:14;118627:2;118616:10;:14::i;118569:102::-;118694:17;118708:2;118694:13;:17::i;:::-;126299:1;;;;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;;;;;;;116302:2417:0:o;26240:339::-;26435:41;17554:10;26468:7;26435:18;:41::i;:::-;26427:103;;;;-1:-1:-1;;;26427:103:0;;;;;;;:::i;:::-;26543:28;26553:4;26559:2;26563:7;26543:9;:28::i;115263:390::-;115327:7;;115376:24;;:::i;:::-;115428:1;115411:211;115436:15;50771:14;115431:1;:30;115411:211;;115494:18;;;;:15;:18;;;;;;;115483:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115483:29:0;;;;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;;;;;;115531:13;;;;;-1:-1:-1;115531:23:0;;;;;;:69;;;;-1:-1:-1;115576:24:0;115558:14;;:42;;;;;;-1:-1:-1;;;115558:42:0;;;;;;;;;;115531:69;115527:83;;;115602:8;;;;:::i;:::-;;;;115527:83;115463:3;;;;:::i;:::-;;;;115411:211;;;-1:-1:-1;115639:6:0;;115263:390;-1:-1:-1;;;115263:390:0:o;115661:483::-;115741:7;;115790:24;;:::i;:::-;115842:1;115825:293;115850:15;50771:14;115845:1;:30;115825:293;;115908:18;;;;:15;:18;;;;;;;115897:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115897:29:0;;;;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;;;;;;115945:13;;;;;-1:-1:-1;115945:23:0;;;;;;:69;;;;-1:-1:-1;115990:24:0;115972:14;;:42;;;;;;-1:-1:-1;;;115972:42:0;;;;;;;;;;115945:69;115941:166;;;116049:5;116039:6;:15;116035:29;;;116063:1;-1:-1:-1;116056:8:0;;-1:-1:-1;;116056:8:0;116035:29;116083:8;;;;:::i;:::-;;;;115941:166;115877:3;;;;:::i;:::-;;;;115825:293;;;-1:-1:-1;116135:1:0;;115661:483;-1:-1:-1;;;;;115661:483:0:o;37726:267::-;37823:7;37859:34;37887:5;37859:27;:34::i;:::-;37851:5;:42;37843:98;;;;-1:-1:-1;;;37843:98:0;;13685:2:1;37843:98:0;;;13667:21:1;13724:2;13704:18;;;13697:30;13763:34;13743:18;;;13736:62;-1:-1:-1;;;13814:18:1;;;13807:41;13865:19;;37843:98:0;13657:233:1;37843:98:0;-1:-1:-1;;;;;;37959:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37726:267::o;122658:187::-;122713:4;122734:9;;;122730:26;;-1:-1:-1;122752:4:0;;122658:187;-1:-1:-1;122658:187:0:o;122730:26::-;122816:8;122823:1;122816:4;:8;:::i;:::-;122805:20;;122809:16;;122805:1;:20;:::i;:::-;:31;;122828:8;122805:31;:::i;:::-;122793:9;;:43;;;-1:-1:-1;;;;;122793:9:0;:43;:::i;:::-;-1:-1:-1;;;;;122774:63:0;:15;:63;;122658:187;-1:-1:-1;;122658:187:0:o;123827:142::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;123891:47:::1;::::0;123899:10:::1;::::0;123916:21:::1;123891:47:::0;::::1;;;::::0;::::1;::::0;;;123916:21;123899:10;123891:47;::::1;;;;;;123883:78;;;::::0;-1:-1:-1;;;123883:78:0;;12989:2:1;123883:78:0::1;::::0;::::1;12971:21:1::0;13028:2;13008:18;;;13001:30;-1:-1:-1;;;13047:18:1;;;13040:48;13105:18;;123883:78:0::1;12961:168:1::0;123883:78:0::1;123827:142::o:0;126624:65::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126671:10:::1;:8;:10::i;112315:299::-:0;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;112420:9:::1;::::0;-1:-1:-1;;;;;112420:9:0::1;112402:15;:27;112394:51;;;::::0;-1:-1:-1;;;112394:51:0;;25669:2:1;112394:51:0::1;::::0;::::1;25651:21:1::0;25708:2;25688:18;;;25681:30;-1:-1:-1;;;25727:18:1;;;25720:41;25778:18;;112394:51:0::1;25641:161:1::0;112394:51:0::1;112465:10;::::0;::::1;::::0;::::1;;;112464:11;112456:35;;;;-1:-1:-1::0;;;112456:35:0::1;;;;;;;:::i;:::-;112509:13;112504:103;112528:18:::0;;::::1;112504:103;;;112572:23;112584:3;;112588:5;112584:10;;;;;-1:-1:-1::0;;;112584:10:0::1;;;;;;;;;;;;;;;112572:11;:23::i;:::-;112548:7:::0;::::1;::::0;::::1;:::i;:::-;;;;112504:103;;;;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;;112315:299:0:o;26650:185::-;26788:39;26805:4;26811:2;26815:7;26788:39;;;;;;;;;;;;:16;:39::i;113168:186::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;113248:13:::1;113243:104;113267:18:::0;;::::1;113243:104;;;113311:24;113324:3;;113328:5;113324:10;;;;;-1:-1:-1::0;;;113324:10:0::1;;;;;;;;;;;;;;;113311:12;:24::i;:::-;113287:7:::0;::::1;::::0;::::1;:::i;:::-;;;;113243:104;;38259:244:::0;38334:7;38370:41;38157:10;:17;;38069:113;38370:41;38362:5;:49;38354:106;;;;-1:-1:-1;;;38354:106:0;;24914:2:1;38354:106:0;;;24896:21:1;24953:2;24933:18;;;24926:30;24992:34;24972:18;;;24965:62;-1:-1:-1;;;25043:18:1;;;25036:42;25095:19;;38354:106:0;24886:234:1;38354:106:0;38478:10;38489:5;38478:17;;;;;;-1:-1:-1;;;38478:17:0;;;;;;;;;;;;;;;;;38471:24;;38259:244;;;:::o;127034:105::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127105:15:::1;:26:::0;;-1:-1:-1;;127105:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;127034:105::o;123977:107::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;124053:4:::1;::::0;:23:::1;::::0;-1:-1:-1;;;124053:23:0;;-1:-1:-1;;;;;124053:4:0;;::::1;::::0;:9:::1;::::0;:23:::1;::::0;124063:3;;124068:7;;124053:23:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;123977:107:::0;;:::o;111133:549::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;111313:22:::1;::::0;;;::::1;-1:-1:-1::0;;;;;111313:22:0::1;111295:15;:40;111287:64;;;;-1:-1:-1::0;;;111287:64:0::1;;;;;;;:::i;:::-;111380:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;111366:21:0::1;:10;-1:-1:-1::0;;;;;111366:21:0::1;;;:38;;;;;111401:3;111391:7;:13;111366:38;111362:109;;;108099:10;111429:9;:17;;111421:38;;;;-1:-1:-1::0;;;111421:38:0::1;;;;;;;:::i;:::-;111489:39;111497:23;111503:7;111512;111497:5;:23::i;:::-;111522:5;;111489:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;111489:7:0::1;::::0;-1:-1:-1;;;111489:39:0:i:1;:::-;111481:65;;;::::0;-1:-1:-1;;;111481:65:0;;25327:2:1;111481:65:0::1;::::0;::::1;25309:21:1::0;25366:2;25346:18;;;25339:30;-1:-1:-1;;;25385:18:1;;;25378:43;25438:18;;111481:65:0::1;25299:163:1::0;111481:65:0::1;-1:-1:-1::0;;;;;111565:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;:26;111557:53:::1;;;::::0;-1:-1:-1;;;111557:53:0;;27029:2:1;111557:53:0::1;::::0;::::1;27011:21:1::0;27068:2;27048:18;;;27041:30;-1:-1:-1;;;27087:18:1;;;27080:44;27141:18;;111557:53:0::1;27001:164:1::0;111557:53:0::1;-1:-1:-1::0;;;;;111621:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;:23;;;::::1;::::0;::::1;:::i;:::-;;;;;;111655:19;111666:7;111655:10;:19::i;:::-;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;;;;111133:549:0:o;23474:239::-;23546:7;23582:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23582:16:0;23617:19;23609:73;;;;-1:-1:-1;;;23609:73:0;;19683:2:1;23609:73:0;;;19665:21:1;19722:2;19702:18;;;19695:30;19761:34;19741:18;;;19734:62;-1:-1:-1;;;19812:18:1;;;19805:39;19861:19;;23609:73:0;19655:231:1;110286:86:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;110346:4:::1;:18:::0;;-1:-1:-1;;;;;;110346:18:0::1;-1:-1:-1::0;;;;;110346:18:0;;;::::1;::::0;;;::::1;::::0;;110286:86::o;23204:208::-;23276:7;-1:-1:-1;;;;;23304:19:0;;23296:74;;;;-1:-1:-1;;;23296:74:0;;19272:2:1;23296:74:0;;;19254:21:1;19311:2;19291:18;;;19284:30;19350:34;19330:18;;;19323:62;-1:-1:-1;;;19401:18:1;;;19394:40;19451:19;;23296:74:0;19244:232:1;23296:74:0;-1:-1:-1;;;;;;23388:16:0;;;;;:9;:16;;;;;;;23204:208::o;48078:94::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;48143:21:::1;48161:1;48143:9;:21::i;126697:115::-:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126774:22:::1;:30:::0;;-1:-1:-1;;;;;126774:30:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;126774:30:0;;::::1;::::0;;;::::1;::::0;;126697:115::o;128277:104::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;128349:10:::1;:24:::0;128277:104::o;109716:428::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;109768:38:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;109768:38:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;109768:38:0::1;;::::0;:13:::1;:38::i;:::-;109817:25;:23;:25::i;:::-;109853:17;:15;:17::i;:::-;109881:16;:14;:16::i;:::-;109910:15;:22:::0;;-1:-1:-1;;;;;;110022:32:0;-1:-1:-1;;;;;110022:32:0;;;110065:9:::1;:22:::0;;110077:10:::1;-1:-1:-1::0;;;;;;110065:22:0;;::::1;;::::0;;110100:36:::1;::::0;-1:-1:-1;;;110100:36:0;;110113:5:::1;110100:36;::::0;::::1;12144:25:1::0;110120:15:0::1;12185:18:1::0;;;12178:34;110100:7:0::1;::::0;:12:::1;::::0;12117:18:1;;110100:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;16539:68;109716:428;:::o;126555:61::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126600:8:::1;:6;:8::i;126820:109::-:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126894:19:::1;:27:::0;;-1:-1:-1;;;;;126894:27:0;;::::1;-1:-1:-1::0;;;126894:27:0::1;-1:-1:-1::0;;;;;;;;126894:27:0;;::::1;::::0;;;::::1;::::0;;126820:109::o;47427:87::-;47500:6;;-1:-1:-1;;;;;47500:6:0;;47427:87::o;111840:467::-;111896:18;111961:19;;;:15;:19;;;;;;111927:53;;;;;;;;;;111896:18;;111927:53;111961:19;111927:53;;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111927:53:0;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;-1:-1:-1;112032:19:0;;;:15;:19;;;;;;:25;111927:53;;-1:-1:-1;;112006:51:0;;112032:25;;;;112013:15;112006:51;:::i;:::-;111991:66;;;-1:-1:-1;112099:22:0;112074:21;;:47;;;;;;-1:-1:-1;;;112074:47:0;;;;;;;;;;112070:126;;;-1:-1:-1;112151:1:0;;111840:467;-1:-1:-1;;;111840:467:0:o;112070:126::-;112263:6;112231:16;112244:2;112231:12;:16::i;:::-;112223:25;;:4;:25;:::i;:::-;:35;;112251:7;112223:35;:::i;:::-;112221:48;;;;:::i;:::-;112208:61;111840:467;-1:-1:-1;;;;111840:467:0:o;23949:104::-;24005:13;24038:7;24031:14;;;;;:::i;114710:545::-;114765:11;114810:10;;;:6;:10;;;;;;;;114789:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;114789:31:0;;;;;;;;-1:-1:-1;;;114789:31:0;;;;;;;;-1:-1:-1;;;114789:31:0;;;;;;;;;;;114882:20;;:8;:20::i;:::-;:25;;;114878:40;;-1:-1:-1;114916:2:0;;114710:545;-1:-1:-1;;114710:545:0:o;114878:40::-;114937:1;114931:7;;114951:11;114965:25;114974:5;:15;;;114965:25;;:8;:25::i;:::-;114951:39;;;;115005:3;115012:1;115005:8;115001:63;;;115015:9;115022:2;115015:9;;:::i;:::-;;;115001:63;;;115051:1;115044:3;:8;115040:24;;115054:10;115061:3;115054:10;;:::i;:::-;;;115040:24;115093:16;;115084:26;;;;:8;:26::i;:::-;115077:33;;;;;;:::i;:::-;;;115128:20;115137:5;:10;;;115128:20;;:8;:20::i;:::-;115121:27;;;;;;:::i;:::-;;;115166:21;115175:5;:11;;;115166:21;;:8;:21::i;:::-;115159:28;;;;;;:::i;:::-;;;115205:21;115214:5;:11;;;115205:21;;:8;:21::i;:::-;115198:28;;;;;;:::i;110530:595::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;110602:14:::1;110619:13;38157:10:::0;:17;;38069:113;110619:13:::1;110669:19;::::0;110602:30;;-1:-1:-1;;;;110669:19:0;::::1;-1:-1:-1::0;;;;;110669:19:0::1;110651:15;:37;110643:61;;;;-1:-1:-1::0;;;110643:61:0::1;;;;;;;:::i;:::-;110737:1;110723:11;:15;110715:45;;;::::0;-1:-1:-1;;;110715:45:0;;17820:2:1;110715:45:0::1;::::0;::::1;17802:21:1::0;17859:2;17839:18;;;17832:30;-1:-1:-1;;;17878:18:1;;;17871:47;17935:18;;110715:45:0::1;17792:167:1::0;110715:45:0::1;108203:1;110779:11;:28;;110771:58;;;::::0;-1:-1:-1;;;110771:58:0;;22637:2:1;110771:58:0::1;::::0;::::1;22619:21:1::0;22676:2;22656:18;;;22649:30;-1:-1:-1;;;22695:18:1;;;22688:47;22752:18;;110771:58:0::1;22609:167:1::0;110771:58:0::1;108152:4;110848:20;110857:11:::0;110848:6;:20:::1;:::i;:::-;:33;;110840:55;;;::::0;-1:-1:-1;;;110840:55:0;;26349:2:1;110840:55:0::1;::::0;::::1;26331:21:1::0;26388:1;26368:18;;;26361:29;-1:-1:-1;;;26406:18:1;;;26399:39;26455:18;;110840:55:0::1;26321:158:1::0;110840:55:0::1;110926:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;110912:21:0::1;:10;-1:-1:-1::0;;;;;110912:21:0::1;;110908:106;;110971:18;110978:11:::0;108099:10:::1;110971:18;:::i;:::-;110958:9;:31;;110950:52;;;;-1:-1:-1::0;;;110950:52:0::1;;;;;;;:::i;:::-;111043:1;111026:92;111051:11;111046:1;:16;111026:92;;111084:22;111095:10;111084;:22::i;:::-;111064:3:::0;::::1;::::0;::::1;:::i;:::-;;;;111026:92;;;;126299:1;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;110530:595:0:o;127248:109::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127325:24:::1;127335:3;127340:8;127325:9;:24::i;:::-;127248:109:::0;;:::o;25643:295::-;-1:-1:-1;;;;;25746:24:0;;17554:10;25746:24;;25738:62;;;;-1:-1:-1;;;25738:62:0;;16030:2:1;25738:62:0;;;16012:21:1;16069:2;16049:18;;;16042:30;-1:-1:-1;;;16088:18:1;;;16081:55;16153:18;;25738:62:0;16002:175:1;25738:62:0;17554:10;25813:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25813:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25813:53:0;;;;;;;;;;25882:48;;10761:41:1;;;25813:42:0;;17554:10;25882:48;;10734:18:1;25882:48:0;;;;;;;25643:295;;:::o;118727:241::-;118793:4;118844:19;;;:15;:19;;;;;;118810:53;;;;;;;;;;118793:4;;118810:53;118844:19;118810:53;;;;;;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;118810:53:0;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;;;-1:-1:-1;118933:26:0;118950:8;118933:16;:26::i;:::-;118881:79;;118899:15;:24;;;118881:42;;:15;:42;;;;:::i;:::-;:79;;118727:241;-1:-1:-1;;;;118727:241:0:o;127147:93::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127212:10:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;127212:20:0;;::::1;::::0;;;::::1;::::0;;127147:93::o;113935:187::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;114015:13:::1;114010:105;114034:18:::0;;::::1;114010:105;;;114078:25;114092:3;;114096:5;114092:10;;;;;-1:-1:-1::0;;;114092:10:0::1;;;;;;;;;;;;;;;114078:13;:25::i;:::-;114054:7:::0;::::1;::::0;::::1;:::i;:::-;;;;114010:105;;26906:328:::0;27081:41;17554:10;27114:7;27081:18;:41::i;:::-;27073:103;;;;-1:-1:-1;;;27073:103:0;;;;;;;:::i;:::-;27187:39;27201:4;27207:2;27211:7;27220:5;27187:13;:39::i;:::-;26906:328;;;;:::o;123015:643::-;123101:18;123122:10;;;:6;:10;;;;;;;;123101:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123075:13;123101:31;;;;;;;-1:-1:-1;;;123101:31:0;;;;;;;;;;;;-1:-1:-1;;;123101:31:0;;;;;;;;-1:-1:-1;;;123101:31:0;;;;;;;;;123170:19;;;:15;:19;;;;;;123143:46;;;;;;;;;;123075:13;;123101:31;;:18;;123143:46;;;;;123101:31;123143:46;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;;;;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;123143:46:0;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;;;-1:-1:-1;;123224:16:0;123237:2;123224:12;:16::i;:::-;123272;;123348;;123383:11;;;;123413:10;;;;123442:11;;;;123472:10;;;;123501:11;;;;123531:15;;;;123200:41;;-1:-1:-1;;;;;;123272:16:0;;;;:28;;123326:2;;123348:16;123383:11;123413:10;123442:11;123472:10;123272:16;123565:14;;:42;;;;;;-1:-1:-1;;;123565:42:0;;;;;;;;;123272:378;;-1:-1:-1;;;;;;123272:378:0;;;;;;;28546:6:1;28534:19;;;123272:378:0;;;28516:38:1;28573:4;28613:15;;;28593:18;;;28586:43;28665:15;;;28645:18;;;28638:43;28717:15;;;28697:18;;;28690:43;28770:15;;;28749:19;;;28742:44;28823:15;;;28802:19;;;28795:44;28876:15;;28855:19;;;28848:44;28929:15;;28908:19;;;28901:44;123565:42:0;28961:19:1;;;28954:51;29042:15;;29021:19;;;29014:44;28488:19;;123272:378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;123272:378:0;;;;;;;;;;;;:::i;:::-;123252:398;123015:643;-1:-1:-1;;;;;123015:643:0:o;126937:89::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127001:9:::1;:17:::0;;-1:-1:-1;;;;;;127001:17:0::1;-1:-1:-1::0;;;;;127001:17:0;;;::::1;::::0;;;::::1;::::0;;126937:89::o;26009:164::-;-1:-1:-1;;;;;26130:25:0;;;26106:4;26130:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26009:164::o;127365:562::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127605:18:::1;127626:6;:10;127633:2;127626:10;;;;;;;;;;;127605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;127665:9;127647:5;:15;;:27;;;;;;;;;::::0;::::1;127704:10;127685:5;:16;;:29;;;;;;;;;::::0;::::1;127738:4;127725:5;:10;;:17;;;;;;;;;::::0;::::1;127766:4;127753:5;:10;;:17;;;;;;;;;::::0;::::1;127795:5;127781;:11;;:19;;;;;;;;;::::0;::::1;127825:5;127811;:11;;:19;;;;;;;;;::::0;::::1;127855:5;127841;:11;;:19;;;;;;;;;::::0;::::1;127884:5;127871:6;:10;127878:2;127871:10;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127902:17;127916:2;127902:13;:17::i;:::-;47718:1;127365:562:::0;;;;;;;;:::o;48327:192::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48416:22:0;::::1;48408:73;;;::::0;-1:-1:-1;;;48408:73:0;;14516:2:1;48408:73:0::1;::::0;::::1;14498:21:1::0;14555:2;14535:18;;;14528:30;14594:34;14574:18;;;14567:62;-1:-1:-1;;;14645:18:1;;;14638:36;14691:19;;48408:73:0::1;14488:228:1::0;48408:73:0::1;48492:19;48502:8;48492:9;:19::i;37385:257::-:0;37509:4;-1:-1:-1;;;;;;37533:61:0;;-1:-1:-1;;;37533:61:0;;:101;;;37598:36;37622:11;37598:23;:36::i;28744:127::-;28809:4;28833:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28833:16:0;:30;;;28744:127::o;32759:185::-;32834:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32834:29:0;-1:-1:-1;;;;;32834:29:0;;;;;;;;:24;;32888:34;32834:24;32888:25;:34::i;:::-;-1:-1:-1;;;;;32879:57:0;;;;;;;;;;;32759:185;;:::o;122337:160::-;122394:5;122416:11;122412:25;;-1:-1:-1;122436:1:0;;122337:160;-1:-1:-1;122337:160:0:o;122412:25::-;108254:1;122462:10;122471:1;122462:6;:10;:::i;:::-;122461:27;;;;:::i;114130:572::-;114184:31;114218:19;;;:15;:19;;;;;;114184:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114184:53:0;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;;;-1:-1:-1;;114252:21:0;;:47;;;;;;-1:-1:-1;;;114252:47:0;;;;;;;;;;114248:245;;;114338:11;114346:2;114338:7;:11::i;:::-;-1:-1:-1;;;;;114324:25:0;:10;-1:-1:-1;;;;;114324:25:0;;114316:34;;;;;;114248:245;;;114397:24;114372:21;;:49;;;;;;-1:-1:-1;;;114372:49:0;;;;;;;;;;114368:125;;;114460:15;:20;;;-1:-1:-1;;;;;114446:34:0;:10;-1:-1:-1;;;;;114446:34:0;;114438:43;;;;;;114505:17;114525;114539:2;114525:13;:17::i;:::-;114505:37;-1:-1:-1;114557:14:0;114553:27;;114573:7;;114130:572;:::o;114553:27::-;114592:4;;-1:-1:-1;;;;;114592:4:0;:9;114602:10;114614:17;114628:2;114614:13;:17::i;:::-;114592:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;114643:19:0;;;;-1:-1:-1;;114643:15:0;:19;;-1:-1:-1;114643:19:0;;;:51;;-1:-1:-1;;;;114643:51:0;-1:-1:-1;;;114678:15:0;114643:51;;;;;;114130:572::o;118976:562::-;119185:7;;119240:35;;;;119259:16;;;;:::i;:::-;;;;119240:35;119290:14;119286:36;;;119306:16;;;;:::i;:::-;;;;119286:36;119337:8;119333:30;;;119347:16;;;;:::i;:::-;;;;119333:30;119378:9;119374:31;;;119389:16;;;;:::i;:::-;;;;119374:31;119420:9;119416:31;;;119431:16;;;;:::i;:::-;;;;119416:31;119497:23;119473:15;;;;;;;:5;:15;;;;;:20;119465:55;;119497:23;;;119473:20;;119465:55;:::i;:::-;:65;;119523:7;119465:65;:::i;:::-;119458:72;118976:562;-1:-1:-1;;;;;;;;118976:562:0:o;119546:1257::-;119656:5;119674:12;119689:7;:5;:7::i;:::-;119674:22;;119707:12;119722:43;119741:4;119755;119747:13;;;;;;-1:-1:-1;;;119747:13:0;;;;;;;;;119762:2;119722:18;:43::i;:::-;119803:15;;;;119776:24;119803:15;;;:5;:15;;;;;;;;;119776:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;;;119707:58;;-1:-1:-1;119831:41:0;;;;-1:-1:-1;;;119831:41:0;;16732:2:1;119831:41:0;;;16714:21:1;16771:2;16751:18;;;16744:30;-1:-1:-1;;;16790:18:1;;;16783:40;16840:18;;119831:41:0;16704:160:1;119831:41:0;119886:13;119901:27;119932:24;119941:4;119947:8;119932;:24::i;:::-;119967:18;119988:10;;;:6;:10;;;;;;;;119967:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;119967:31:0;;;;;;;;-1:-1:-1;;;119967:31:0;;;;;;;;-1:-1:-1;;;119967:31:0;;;;;;;;;;119885:71;;-1:-1:-1;119885:71:0;;-1:-1:-1;120013:4:0;:22;;;;;;-1:-1:-1;;;120013:22:0;;;;;;;;;;120009:669;;;120037:25;;;:15;;;:25;120009:669;;;120090:15;120082:4;:23;;;;;;-1:-1:-1;;;120082:23:0;;;;;;;;;;120078:600;;;120107:26;;;;;120078:600;;;120161:9;120153:4;:17;;;;;;-1:-1:-1;;;120153:17:0;;;;;;;;;;120149:529;;;120187:20;;;:10;;;:20;;;120236:2;-1:-1:-1;120222:333:0;;;120259:12;120318:1;120280:35;120299:4;120280:35;;;;;;;;;;;;;-1:-1:-1;;;120280:35:0;;;120313:1;120280:18;:35::i;:::-;:39;;;;:::i;:::-;120259:61;;120339:14;120401:1;120363:35;120382:4;120363:35;;;;;;;;;;;;;-1:-1:-1;;;120363:35:0;;;120396:1;120363:18;:35::i;:::-;:39;;;;:::i;:::-;120362:45;;120406:1;120362:45;:::i;:::-;120440:24;;;;;;;;:15;:24;;;;;:32;;120339:69;;-1:-1:-1;120440:24:0;:32;;;;;;;;-1:-1:-1;;;120440:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120427:10;;;:45;120505:24;;;;;:15;:24;;;;;;:34;;:24;;:34;;;;;;;-1:-1:-1;;;120505:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120491:11;;;:48;-1:-1:-1;;120222:333:0;120149:529;;;120584:10;120576:4;:18;;;;;;-1:-1:-1;;;120576:18:0;;;;;;;;;;120572:106;;;120596:21;;;:11;;;:21;120572:106;;;120645:10;120637:4;:18;;;;;;-1:-1:-1;;;120637:18:0;;;;;;;;;;120633:45;;;120657:21;;;:11;;;:21;120633:45;120691:10;;;;:6;:10;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;120691:18:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;120691:18:0;;;;;;;;;-1:-1:-1;;120691:18:0;;;;;;;;;;;;;;-1:-1:-1;;;;120691:18:0;-1:-1:-1;;;120691:18:0;;;;;;;-1:-1:-1;;;;120691:18:0;;-1:-1:-1;;;120691:18:0;;;;;;;;;;;-1:-1:-1;;;;120691:18:0;-1:-1:-1;;;120691:18:0;;;;;;;;;;;;;;120724:13;;;;120720:48;;120739:15;;;;;;;;:5;:15;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;120739:29:0;-1:-1:-1;;;;120739:29:0;;;-1:-1:-1;;;120739:29:0;-1:-1:-1;;;;120739:29:0;;;-1:-1:-1;;;120739:29:0;;;;;-1:-1:-1;;;;120739:29:0;;;-1:-1:-1;;;120739:29:0;-1:-1:-1;;;;120739:29:0;;;;-1:-1:-1;;;120739:29:0;;;;;-1:-1:-1;;;;120739:29:0;;;;;-1:-1:-1;;120739:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120720:48;-1:-1:-1;120788:7:0;;119546:1257;-1:-1:-1;;;;;;;;119546:1257:0:o;121869:345::-;121949:1;121921:13;121943:8;;;:5;:8;;;:14;121937:25;;-1:-1:-1;;;121943:14:0;;;;121961:1;121937:25;:::i;:::-;:30;;121965:2;121937:30;:::i;:::-;121978:18;121999:10;;;:6;:10;;;;;;;;121978:31;;;;;;;;;;-1:-1:-1;;;121978:31:0;;;;;;;;;;;-1:-1:-1;;;121978:31:0;;;;;;;;;;;122020:25;;;121978:31;;;122020:25;;;122056:26;;;121978:31;;;122093:20;;;-1:-1:-1;121978:31:0;;122124:21;;;121978:31;;;122156:21;;;122188:10;;;;;;;;:18;;;;;;;;;;;;;;;;;-1:-1:-1;;122188:18:0;;;;;;;121978:31;122188:18;;;;;;;;;;;-1:-1:-1;;122188:18:0;121978:31;122188:18;;;;;;;-1:-1:-1;;122188:18:0;;;;;121978:31;122188:18;;;;;;;;-1:-1:-1;;;;122188:18:0;;;;;;;-1:-1:-1;;;;122188:18:0;;;;;;;;;;;;;-1:-1:-1;;;;122188:18:0;-1:-1:-1;;;122188:18:0;;;;;;;;;;;;-1:-1:-1;121869:345:0:o;122222:107::-;122298:10;;;;:6;:10;;;;;;;122277:44;;-1:-1:-1;;;;;;122277:44:0;;;;;12144:25:1;;;;122310:10:0;12185:18:1;;;12178:34;122277:7:0;;:20;;12117:18:1;;122277:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122222:107;:::o;29038:359::-;29131:4;29156:16;29164:7;29156;:16::i;:::-;29148:73;;;;-1:-1:-1;;;29148:73:0;;17071:2:1;29148:73:0;;;17053:21:1;17110:2;17090:18;;;17083:30;17149:34;17129:18;;;17122:62;-1:-1:-1;;;17200:18:1;;;17193:42;17252:19;;29148:73:0;17043:234:1;29148:73:0;29232:13;29248:34;29274:7;29248:25;:34::i;:::-;29232:50;;29312:5;-1:-1:-1;;;;;29301:16:0;:7;-1:-1:-1;;;;;29301:16:0;;:51;;;;29345:7;-1:-1:-1;;;;;29321:31:0;:20;29333:7;29321:11;:20::i;:::-;-1:-1:-1;;;;;29321:31:0;;29301:51;:87;;;;29356:32;29373:5;29380:7;29356:16;:32::i;32052:589::-;32222:4;-1:-1:-1;;;;;32184:42:0;:34;32210:7;32184:25;:34::i;:::-;-1:-1:-1;;;;;32184:42:0;;32176:96;;;;-1:-1:-1;;;32176:96:0;;23344:2:1;32176:96:0;;;23326:21:1;23383:2;23363:18;;;23356:30;23422:34;23402:18;;;23395:62;-1:-1:-1;;;23473:18:1;;;23466:39;23522:19;;32176:96:0;23316:231:1;32176:96:0;-1:-1:-1;;;;;32291:16:0;;32283:65;;;;-1:-1:-1;;;32283:65:0;;15625:2:1;32283:65:0;;;15607:21:1;15664:2;15644:18;;;15637:30;15703:34;15683:18;;;15676:62;-1:-1:-1;;;15754:18:1;;;15747:34;15798:19;;32283:65:0;15597:226:1;32283:65:0;32361:39;32382:4;32388:2;32392:7;32361:20;:39::i;:::-;32465:29;32482:1;32486:7;32465:8;:29::i;:::-;-1:-1:-1;;;;;32507:15:0;;;;;;:9;:15;;;;;:20;;32526:1;;32507:15;:20;;32526:1;;32507:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32538:13:0;;;;;;:9;:13;;;;;:18;;32555:1;;32538:13;:18;;32555:1;;32538:18;:::i;:::-;;;;-1:-1:-1;;32567:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32567:21:0;-1:-1:-1;;;;;32567:21:0;;;;;;;;;32606:27;;32567:16;;32606:27;;;;-1:-1:-1;;;;;;;;;;;32606:27:0;;32052:589;;;:::o;46024:120::-;45036:7;;;;45560:41;;;;-1:-1:-1;;;45560:41:0;;13336:2:1;45560:41:0;;;13318:21:1;13375:2;13355:18;;;13348:30;-1:-1:-1;;;13394:18:1;;;13387:50;13454:18;;45560:41:0;13308:170:1;45560:41:0;46083:7:::1;:15:::0;;-1:-1:-1;;46083:15:0::1;::::0;;46114:22:::1;17554:10:::0;46123:12:::1;46114:22;;;;;;:::i;:::-;;;;;;;;46024:120::o:0;112622:538::-;112674:31;112708:19;;;:15;:19;;;;;;112674:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112674:53:0;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;;;-1:-1:-1;112674:53:0;112746:21;;:49;;;;;;-1:-1:-1;;;112746:49:0;;;;;;;;;;;112738:76;;;;-1:-1:-1;;;112738:76:0;;26686:2:1;112738:76:0;;;26668:21:1;26725:2;26705:18;;;26698:30;-1:-1:-1;;;26744:18:1;;;26737:44;26798:18;;112738:76:0;26658:164:1;112738:76:0;112847:11;112855:2;112847:7;:11::i;:::-;-1:-1:-1;;;;;112833:25:0;:10;-1:-1:-1;;;;;112833:25:0;;112825:47;;;;-1:-1:-1;;;112825:47:0;;22300:2:1;112825:47:0;;;22282:21:1;22339:1;22319:18;;;22312:29;-1:-1:-1;;;22357:18:1;;;22350:39;22406:18;;112825:47:0;22272:158:1;112825:47:0;112885:40;112895:10;112915:4;112922:2;112885:9;:40::i;:::-;112960:192;;;;;;;;;;112991:24;112960:192;;;113081:10;112960:192;;;;;;;;;113044:15;112960:192;;;;;;;;;;113116:24;;;;112960:192;;;;;;;;-1:-1:-1;112938:19:0;;;:15;:19;;;;:214;;;;:19;;-1:-1:-1;;112938:214:0;;;;;;;;;-1:-1:-1;;;112938:214:0;;;;;;;;;;;;;-1:-1:-1;112938:214:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;112938:214:0;-1:-1:-1;;;;;112938:214:0;;;;-1:-1:-1;;;112938:214:0;-1:-1:-1;;;;;;;;;112938:214:0;;;;;;;;;-1:-1:-1;;;;;;112938:214:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;112622:538:0:o;113362:565::-;113415:31;113449:19;;;:15;:19;;;;;;113415:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113415:53:0;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;;;-1:-1:-1;;113487:21:0;;:47;;;;;;-1:-1:-1;;;113487:47:0;;;;;;;;;;;113479:76;;;;-1:-1:-1;;;113479:76:0;;15280:2:1;113479:76:0;;;15262:21:1;15319:2;15299:18;;;15292:30;-1:-1:-1;;;15338:18:1;;;15331:46;15394:18;;113479:76:0;15252:166:1;113479:76:0;113588:19;;;;:15;:19;;;;;:24;;;;-1:-1:-1;;;;;113588:24:0;113574:10;:38;113566:47;;;;;;113626:40;113644:4;113651:10;113663:2;113626:9;:40::i;:::-;113677:17;113691:2;113677:13;:17::i;:::-;113729:190;;;;;;;;;;-1:-1:-1;113729:190:0;;127935:152;128007:7;128061;128070;128044:34;;;;;;;;9507:19:1;;;9589:2;9560:15;-1:-1:-1;;;;;;9556:45:1;9551:2;9542:12;;9535:67;9627:2;9618:12;;9497:139;128044:34:0;;;;;;;;;;;;;128034:45;;;;;;128027:52;;127935:152;;;;:::o;128095:174::-;128178:4;128202:59;128232:5;128239:10;;128251:9;128202:29;:59::i;:::-;128195:66;128095:174;-1:-1:-1;;;128095:174:0:o;124092:1218::-;124145:27;:15;50890:19;;50908:1;50890:19;;;50801:127;124145:27;124183:10;124196:25;:15;50771:14;;50679:114;124196:25;124183:38;-1:-1:-1;124336:1:0;;124235:15;;;;;124388:1;124235:15;124417:7;:5;:7::i;:::-;124437:20;124460:8;;:5;:8;;;;;124437:31;;;;;;;124460:8;124437:31;;;;;;;;;;;;;;;;-1:-1:-1;;;124437:31:0;;124460:8;124437:31;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;124503:36;;;;;;;;124437:31;124503:36;;-1:-1:-1;;;124503:36:0;;;;;;;124402:22;;-1:-1:-1;124437:31:0;124494:52;;124503:36;;124402:22;;124536:2;124503:18;:36::i;:::-;124541:4;124494:8;:52::i;:::-;124479:67;;;;;;;;124573:53;124582:37;124601:4;124582:37;;;;;;;;;;;;;-1:-1:-1;;;124582:37:0;;;124616:2;124582:18;:37::i;124573:53::-;124557:69;;;;;;;;124653:53;124662:37;124681:4;124662:37;;;;;;;;;;;;;-1:-1:-1;;;124662:37:0;;;124696:2;124662:18;:37::i;124653:53::-;124637:69;;;;;;;;124724:15;:21;124740:4;124724:21;;;;;;;;;;;;;;;124786:10;124747:49;;:36;124766:4;124747:36;;;;;;;;;;;;;-1:-1:-1;;;124747:36:0;;;124780:2;124747:18;:36::i;:::-;:49;;;;:::i;:::-;124724:74;;;;;;-1:-1:-1;;;124724:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124717:81;;124817:15;:21;124833:4;124817:21;;;;;;;;;;;;;;;124880:10;124840:50;;:37;124859:4;124840:37;;;;;;;;;;;;;-1:-1:-1;;;124840:37:0;;;124874:2;124840:18;:37::i;:::-;:50;;;;:::i;:::-;124839:56;;124894:1;124839:56;:::i;:::-;124817:79;;;;;;-1:-1:-1;;;124817:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124809:87;;124909:14;124915:3;124920:2;124909:5;:14::i;:::-;124949:221;;;;;;;;125017:10;124949:221;;;;;;125153:5;124949:221;;;;;;125048:4;124949:221;;;;;;125126:5;124949:221;;;;;;125073:4;124949:221;;;;;;125099:5;124949:221;;;;;;124981:9;124949:221;;;;;124936:6;:10;124943:2;124936:10;;;;;;;;;;;:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125205:97;;;;;;;;125265:22;125205:97;;;;;;-1:-1:-1;;;125205:97:0;;;;;;;;;;;-1:-1:-1;;;;;125205:97:0;;;;;;;;;;;125240:15;125205:97;;;;;;;;;-1:-1:-1;125205:97:0;;;;;;;125183:19;;;:15;:19;;;;;:119;;;;:19;;-1:-1:-1;;125183:119:0;;;;;;;;;-1:-1:-1;;;125183:119:0;;;;;;;;;;;;;-1:-1:-1;125183:119:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;125183:119:0;-1:-1:-1;;;;;125183:119:0;;;;-1:-1:-1;;;125183:119:0;-1:-1:-1;;;;;;;;;125183:119:0;;;;;;;;;-1:-1:-1;;;;;;125183:119:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;124092:1218:0:o;48527:173::-;48602:6;;;-1:-1:-1;;;;;48619:17:0;;;-1:-1:-1;;;;;;48619:17:0;;;;;;;48652:40;;48602:6;;;48619:17;48602:6;;48652:40;;48583:16;;48652:40;48527:173;;:::o;22334:219::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;22433:26:::1;:24;:26::i;:::-;22470:25;:23;:25::i;:::-;22506:39;22530:5;22537:7;22506:23;:39::i;:::-;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;22334:219;;;:::o;36576:183::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;36643:26:::1;:24;:26::i;:::-;36680:25;:23;:25::i;:::-;36716:35;:33;:35::i;:::-;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;36576:183;:::o;44634:131::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;44693:26:::1;:24;:26::i;:::-;44730:27;:25;:27::i;47110:129::-:0;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;47168:26:::1;:24;:26::i;:::-;47205;:24;:26::i;45765:118::-:0;45036:7;;;;45290:9;45282:38;;;;-1:-1:-1;;;45282:38:0;;;;;;;:::i;:::-;45825:7:::1;:14:::0;;-1:-1:-1;;45825:14:0::1;45835:4;45825:14;::::0;;45855:20:::1;45862:12;17554:10:::0;;17474:98;29739:110;29815:26;29825:2;29829:7;29815:26;;;;;;;;;;;;:9;:26::i;122505:145::-;122592:15;;122567:7;;122592:15;;122587:30;;-1:-1:-1;122616:1:0;;122505:145;-1:-1:-1;122505:145:0:o;122587:30::-;-1:-1:-1;122635:7:0;;122505:145;-1:-1:-1;122505:145:0:o;28116:315::-;28273:28;28283:4;28289:2;28293:7;28273:9;:28::i;:::-;28320:48;28343:4;28349:2;28353:7;28362:5;28320:22;:48::i;:::-;28312:111;;;;-1:-1:-1;;;28312:111:0;;;;;;;:::i;22791:349::-;22915:4;-1:-1:-1;;;;;;22952:51:0;;-1:-1:-1;;;22952:51:0;;:127;;-1:-1:-1;;;;;;;23020:59:0;;-1:-1:-1;;;23020:59:0;22952:127;:180;;;-1:-1:-1;;;;;;;;;;20971:51:0;;;23096:36;20862:168;125792:177;125930:7;;125884:54;;;125901:10;8972:2:1;8943:15;-1:-1:-1;;;;;;8939:45:1;125884:54:0;;;;8927:58:1;;;;125913:15:0;9001:12:1;;;8994:28;9038:12;;;;9031:28;;;;125884:54:0;;;;;;;;;;9075:12:1;;;;125884:54:0;;;125874:65;;;;;;125792:177::o;125318:226::-;125498:36;;;;;;29819:25:1;;;29860:18;;;29853:34;;;29903:18;;;29896:34;;;125453:7:0;;29792:18:1;;125498:36:0;;;;-1:-1:-1;;125498:36:0;;;;;;;;;125488:47;;125498:36;125488:47;;;;;125318:226;-1:-1:-1;;;;125318:226:0:o;120811:1050::-;-1:-1:-1;;;;;;;;120892:5:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120927:12:0;120949:8;:14;;;120942:21;;:4;:21;;;;:::i;:::-;120974:14;;;:16;;120927:36;;-1:-1:-1;120974:16:0;;;:::i;:::-;;;;;-1:-1:-1;121070:14:0;;;;121053;;;;121036;;;;121001:10;;121070:14;121036:31;;;:::i;:::-;:48;;;;:::i;:::-;121028:56;;:4;:56;;:78;;;;;121105:1;121088:8;:14;;;:18;;;121028:78;121024:796;;;108254:1;121167:8;:16;;;121186:1;121167:20;;;;:::i;:::-;121166:37;;;;;;:::i;:::-;121138:19;108254:1;121138:4;:19;:::i;:::-;121137:25;;121161:1;121137:25;:::i;:::-;121136:67;;;;:::i;:::-;121219:14;;;:16;;121123:81;;-1:-1:-1;121219:16:0;;;:::i;:::-;;;;;-1:-1:-1;121024:796:0;;;121282:8;:14;;;121265:8;:14;;;:31;;;;:::i;:::-;121257:39;;:4;:39;;:61;;;;;121317:1;121300:8;:14;;;:18;;;121257:61;121253:567;;;108254:1;121379:8;:16;;;121398:1;121379:20;;;;:::i;:::-;121378:37;;;;;;:::i;:::-;121350:19;108254:1;121350:4;:19;:::i;:::-;121349:25;;121373:1;121349:25;:::i;:::-;121348:67;;;;:::i;:::-;121431:14;;;:16;;121335:81;;-1:-1:-1;121431:16:0;;;:::i;121253:567::-;121477:8;:14;;;121469:22;;:4;:22;;:44;;;;;121512:1;121495:8;:14;;;:18;;;121469:44;121465:355;;;108254:1;121574:8;:16;;;121593:1;121574:20;;;;:::i;:::-;121573:37;;;;;;:::i;:::-;121545:19;108254:1;121545:4;:19;:::i;:::-;121544:25;;121568:1;121544:25;:::i;:::-;121543:67;;;;:::i;:::-;121626:14;;;:16;;121530:81;;-1:-1:-1;121626:16:0;;;:::i;121465:355::-;108254:1;121744:8;:16;;;121743:33;;;;;;:::i;:::-;121715:19;108254:1;121715:4;:19;:::i;:::-;121714:25;;121738:1;121714:25;:::i;:::-;121713:63;;;;:::i;:::-;121792:14;;;:16;;121700:77;;-1:-1:-1;121792:16:0;;;:::i;:::-;;;;;-1:-1:-1;121660:160:0;121838:4;-1:-1:-1;121844:8:0;;-1:-1:-1;;120811:1050:0;;;;;;:::o;125552:232::-;125693:7;125749:5;125756:4;125762:11;125738:36;;;;;;;;;;:::i;128389:251::-;45036:7;;;;45290:9;45282:38;;;;-1:-1:-1;;;45282:38:0;;;;;;;:::i;:::-;128587:45:::1;128614:4;128620:2;128624:7;128587:26;:45::i;102466:830::-:0;102591:4;102631;102591;102648:525;102672:5;:12;102668:1;:16;102648:525;;;102706:20;102729:5;102735:1;102729:8;;;;;;-1:-1:-1;;;102729:8:0;;;;;;;;;;;;;;;102706:31;;102774:12;102758;:28;102754:408;;102911:44;;;;;;9255:19:1;;;9290:12;;;9283:28;;;9327:12;;102911:44:0;;;;;;;;;;;;102901:55;;;;;;102886:70;;102754:408;;;103101:44;;;;;;9255:19:1;;;9290:12;;;9283:28;;;9327:12;;103101:44:0;;;;;;;;;;;;103091:55;;;;;;103076:70;;102754:408;-1:-1:-1;102686:3:0;;;;:::i;:::-;;;;102648:525;;;-1:-1:-1;103268:20:0;;;;102466:830;-1:-1:-1;;;102466:830:0:o;30733:382::-;-1:-1:-1;;;;;30813:16:0;;30805:61;;;;-1:-1:-1;;;30805:61:0;;21526:2:1;30805:61:0;;;21508:21:1;;;21545:18;;;21538:30;21604:34;21584:18;;;21577:62;21656:18;;30805:61:0;21498:182:1;30805:61:0;30886:16;30894:7;30886;:16::i;:::-;30885:17;30877:58;;;;-1:-1:-1;;;30877:58:0;;14923:2:1;30877:58:0;;;14905:21:1;14962:2;14942:18;;;14935:30;-1:-1:-1;;;14981:18:1;;;14974:58;15049:18;;30877:58:0;14895:178:1;30877:58:0;30948:45;30977:1;30981:2;30985:7;30948:20;:45::i;:::-;-1:-1:-1;;;;;31006:13:0;;;;;;:9;:13;;;;;:18;;31023:1;;31006:13;:18;;31023:1;;31006:18;:::i;:::-;;;;-1:-1:-1;;31035:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31035:21:0;-1:-1:-1;;;;;31035:21:0;;;;;;;;31074:33;;31035:16;;;-1:-1:-1;;;;;;;;;;;31074:33:0;31035:16;;31074:33;30733:382;;:::o;17403:65::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16539:68;;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;17403:65;:::o;22561:158::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;22670:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22694:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;22561:158;;;:::o;44773:92::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;44842:7:::1;:15:::0;;-1:-1:-1;;44842:15:0::1;::::0;;16539:68;;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;44773:92;:::o;47247:99::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;47315:23:::1;17554:10:::0;47315:9:::1;:23::i;30076:321::-:0;30206:18;30212:2;30216:7;30206:5;:18::i;:::-;30257:54;30288:1;30292:2;30296:7;30305:5;30257:22;:54::i;:::-;30235:154;;;;-1:-1:-1;;;30235:154:0;;;;;;;:::i;33509:821::-;33664:4;-1:-1:-1;;;;;33685:13:0;;8747:20;8795:8;33681:642;;33721:83;;-1:-1:-1;;;33721:83:0;;-1:-1:-1;;;;;33721:47:0;;;;;:83;;17554:10;;33783:4;;33789:7;;33798:5;;33721:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33721:83:0;;;;;;;;-1:-1:-1;;33721:83:0;;;;;;;;;;;;:::i;:::-;;;33717:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33985:13:0;;33981:272;;34028:60;;-1:-1:-1;;;34028:60:0;;;;;;;:::i;33981:272::-;34203:6;34197:13;34188:6;34184:2;34180:15;34173:38;33717:551;-1:-1:-1;;;;;;33855:62:0;-1:-1:-1;;;33855:62:0;;-1:-1:-1;33848:69:0;;33681:642;-1:-1:-1;34307:4:0;33509:821;;;;;;:::o;39116:589::-;-1:-1:-1;;;;;39322:18:0;;39318:187;;39357:40;39389:7;40543:10;:17;;40516:24;;;;:15;:24;;;;;:44;;;40571:24;;;;;;;;;;;;40439:164;39357:40;39318:187;;;39427:2;-1:-1:-1;;;;;39419:10:0;:4;-1:-1:-1;;;;;39419:10:0;;39415:90;;39446:47;39479:4;39485:7;39446:32;:47::i;:::-;-1:-1:-1;;;;;39519:16:0;;39515:183;;39552:45;39589:7;39552:36;:45::i;39515:183::-;39625:4;-1:-1:-1;;;;;39619:10:0;:2;-1:-1:-1;;;;;39619:10:0;;39615:83;;39646:40;39674:2;39678:7;39646:27;:40::i;41230:999::-;41496:22;41557:1;41521:33;41549:4;41521:27;:33::i;:::-;:37;;;;:::i;:::-;41569:18;41590:26;;;:17;:26;;;;;;41496:62;;-1:-1:-1;41723:28:0;;;41719:328;;-1:-1:-1;;;;;41790:18:0;;41768:19;41790:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41841:30;;;;;;:44;;;41958:30;;:17;:30;;;;;:43;;;41719:328;-1:-1:-1;42143:26:0;;;;:17;:26;;;;;;;;42136:33;;;-1:-1:-1;;;;;42187:18:0;;;;;:12;:18;;;;;:34;;;;;;;42180:41;41230:999::o;42524:1079::-;42802:10;:17;42777:22;;42802:21;;42822:1;;42802:21;:::i;:::-;42834:18;42855:24;;;:15;:24;;;;;;43228:10;:26;;42777:46;;-1:-1:-1;42855:24:0;;42777:46;;43228:26;;;;-1:-1:-1;;;43228:26:0;;;;;;;;;;;;;;;;;43206:48;;43292:11;43267:10;43278;43267:22;;;;;;-1:-1:-1;;;43267:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;43372:28;;;:15;:28;;;;;;;:41;;;43544:24;;;;;43537:31;43579:10;:16;;;;;-1:-1:-1;;;43579:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;42524:1079;;;;:::o;40006:232::-;40091:14;40108:31;40136:2;40108:27;:31::i;:::-;-1:-1:-1;;;;;40150:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40195:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40006:232:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:391::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:2;;342:6;334;327:22;286:2;-1:-1:-1;370:20:1;;-1:-1:-1;;;;;402:30:1;;399:2;;;452:8;442;435:26;399:2;496:4;488:6;484:17;472:29;;556:3;549:4;539:6;536:1;532:14;524:6;520:27;516:38;513:47;510:2;;;573:1;570;563:12;588:160;653:20;;709:13;;702:21;692:32;;682:2;;738:1;735;728:12;753:156;819:20;;879:4;868:16;;858:27;;848:2;;899:1;896;889:12;914:196;973:6;1026:2;1014:9;1005:7;1001:23;997:32;994:2;;;1047:6;1039;1032:22;994:2;1075:29;1094:9;1075:29;:::i;1115:270::-;1183:6;1191;1244:2;1232:9;1223:7;1219:23;1215:32;1212:2;;;1265:6;1257;1250:22;1212:2;1293:29;1312:9;1293:29;:::i;:::-;1283:39;;1341:38;1375:2;1364:9;1360:18;1341:38;:::i;:::-;1331:48;;1202:183;;;;;:::o;1390:338::-;1467:6;1475;1483;1536:2;1524:9;1515:7;1511:23;1507:32;1504:2;;;1557:6;1549;1542:22;1504:2;1585:29;1604:9;1585:29;:::i;:::-;1575:39;;1633:38;1667:2;1656:9;1652:18;1633:38;:::i;:::-;1623:48;;1718:2;1707:9;1703:18;1690:32;1680:42;;1494:234;;;;;:::o;1733:933::-;1828:6;1836;1844;1852;1905:3;1893:9;1884:7;1880:23;1876:33;1873:2;;;1927:6;1919;1912:22;1873:2;1955:29;1974:9;1955:29;:::i;:::-;1945:39;;2003:38;2037:2;2026:9;2022:18;2003:38;:::i;:::-;1993:48;-1:-1:-1;2088:2:1;2073:18;;2060:32;;-1:-1:-1;2143:2:1;2128:18;;2115:32;-1:-1:-1;;;;;2159:30:1;;2156:2;;;2207:6;2199;2192:22;2156:2;2235:22;;2288:4;2280:13;;2276:27;-1:-1:-1;2266:2:1;;2322:6;2314;2307:22;2266:2;2363;2350:16;2388:48;2404:31;2432:2;2404:31;:::i;:::-;2388:48;:::i;:::-;2459:2;2452:5;2445:17;2499:7;2494:2;2489;2485;2481:11;2477:20;2474:33;2471:2;;;2525:6;2517;2510:22;2471:2;2585;2580;2576;2572:11;2567:2;2560:5;2556:14;2543:45;2608:14;;;2624:2;2604:23;2597:39;;;;-1:-1:-1;1863:803:1;;;;-1:-1:-1;1863:803:1;-1:-1:-1;1863:803:1:o;2671:264::-;2736:6;2744;2797:2;2785:9;2776:7;2772:23;2768:32;2765:2;;;2818:6;2810;2803:22;2765:2;2846:29;2865:9;2846:29;:::i;:::-;2836:39;;2894:35;2925:2;2914:9;2910:18;2894:35;:::i;2940:264::-;3008:6;3016;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3090:6;3082;3075:22;3037:2;3118:29;3137:9;3118:29;:::i;:::-;3108:39;3194:2;3179:18;;;;3166:32;;-1:-1:-1;;;3027:177:1:o;3209:599::-;3313:6;3321;3329;3337;3390:2;3378:9;3369:7;3365:23;3361:32;3358:2;;;3411:6;3403;3396:22;3358:2;3439:29;3458:9;3439:29;:::i;:::-;3429:39;-1:-1:-1;3515:2:1;3500:18;;3487:32;;-1:-1:-1;3570:2:1;3555:18;;3542:32;-1:-1:-1;;;;;3586:30:1;;3583:2;;;3634:6;3626;3619:22;3583:2;3678:70;3740:7;3731:6;3720:9;3716:22;3678:70;:::i;:::-;3348:460;;;;-1:-1:-1;3767:8:1;-1:-1:-1;;;;3348:460:1:o;3813:457::-;3899:6;3907;3960:2;3948:9;3939:7;3935:23;3931:32;3928:2;;;3981:6;3973;3966:22;3928:2;4013:23;;-1:-1:-1;;;;;4048:30:1;;4045:2;;;4096:6;4088;4081:22;4045:2;4140:70;4202:7;4193:6;4182:9;4178:22;4140:70;:::i;:::-;4229:8;;4114:96;;-1:-1:-1;3918:352:1;-1:-1:-1;;;;3918:352:1:o;4275:190::-;4331:6;4384:2;4372:9;4363:7;4359:23;4355:32;4352:2;;;4405:6;4397;4390:22;4352:2;4433:26;4449:9;4433:26;:::i;4470:190::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:2;;;4603:6;4595;4588:22;4550:2;-1:-1:-1;4631:23:1;;4540:120;-1:-1:-1;4540:120:1:o;4665:255::-;4723:6;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4797:6;4789;4782:22;4744:2;4841:9;4828:23;4860:30;4884:5;4860:30;:::i;4925:259::-;4994:6;5047:2;5035:9;5026:7;5022:23;5018:32;5015:2;;;5068:6;5060;5053:22;5015:2;5105:9;5099:16;5124:30;5148:5;5124:30;:::i;5189:675::-;5269:6;5322:2;5310:9;5301:7;5297:23;5293:32;5290:2;;;5343:6;5335;5328:22;5290:2;5375:16;;-1:-1:-1;;;;;5403:30:1;;5400:2;;;5451:6;5443;5436:22;5400:2;5479:22;;5532:4;5524:13;;5520:27;-1:-1:-1;5510:2:1;;5566:6;5558;5551:22;5510:2;5600;5594:9;5625:48;5641:31;5669:2;5641:31;:::i;5625:48::-;5696:2;5689:5;5682:17;5736:7;5731:2;5726;5722;5718:11;5714:20;5711:33;5708:2;;;5762:6;5754;5747:22;5708:2;5780:54;5831:2;5826;5819:5;5815:14;5810:2;5806;5802:11;5780:54;:::i;6064:260::-;6130:6;6138;6191:2;6179:9;6170:7;6166:23;6162:32;6159:2;;;6212:6;6204;6197:22;6159:2;6253:9;6240:23;6230:33;;6282:36;6314:2;6303:9;6299:18;6282:36;:::i;6329:604::-;6425:6;6433;6441;6449;6457;6465;6473;6526:3;6514:9;6505:7;6501:23;6497:33;6494:2;;;6548:6;6540;6533:22;6494:2;6589:9;6576:23;6566:33;;6618:36;6650:2;6639:9;6635:18;6618:36;:::i;:::-;6608:46;;6673:35;6704:2;6693:9;6689:18;6673:35;:::i;:::-;6663:45;;6727:35;6758:2;6747:9;6743:18;6727:35;:::i;:::-;6717:45;;6781:36;6812:3;6801:9;6797:19;6781:36;:::i;:::-;6771:46;;6836:36;6867:3;6856:9;6852:19;6836:36;:::i;:::-;6826:46;;6891:36;6922:3;6911:9;6907:19;6891:36;:::i;:::-;6881:46;;6484:449;;;;;;;;;;:::o;6938:685::-;7046:6;7054;7062;7070;7078;7086;7094;7102;7155:3;7143:9;7134:7;7130:23;7126:33;7123:2;;;7177:6;7169;7162:22;7123:2;7218:9;7205:23;7195:33;;7247:36;7279:2;7268:9;7264:18;7247:36;:::i;:::-;7237:46;;7302:36;7334:2;7323:9;7319:18;7302:36;:::i;:::-;7292:46;;7357:36;7389:2;7378:9;7374:18;7357:36;:::i;:::-;7347:46;;7412:37;7444:3;7433:9;7429:19;7412:37;:::i;:::-;7402:47;;7468:37;7500:3;7489:9;7485:19;7468:37;:::i;:::-;7458:47;;7524:37;7556:3;7545:9;7541:19;7524:37;:::i;:::-;7514:47;;7580:37;7612:3;7601:9;7597:19;7580:37;:::i;:::-;7570:47;;7113:510;;;;;;;;;;;:::o;7628:192::-;7685:6;7738:2;7726:9;7717:7;7713:23;7709:32;7706:2;;;7759:6;7751;7744:22;7706:2;7787:27;7804:9;7787:27;:::i;7825:304::-;7883:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:2;;;7957:6;7949;7942:22;7904:2;7988:23;;-1:-1:-1;;;;;8040:30:1;;8030:41;;8020:2;;8090:6;8082;8075:22;8134:257;8175:3;8213:5;8207:12;8240:6;8235:3;8228:19;8256:63;8312:6;8305:4;8300:3;8296:14;8289:4;8282:5;8278:16;8256:63;:::i;:::-;8373:2;8352:15;-1:-1:-1;;8348:29:1;8339:39;;;;8380:4;8335:50;;8183:208;-1:-1:-1;;8183:208:1:o;8396:341::-;-1:-1:-1;;;;;;8591:2:1;8627:15;;;8623:24;;8611:37;;8682:15;;;;8678:24;8673:2;8664:12;;8657:46;8728:2;8719:12;;8559:178::o;9641:203::-;-1:-1:-1;;;;;9805:32:1;;;;9787:51;;9775:2;9760:18;;9742:102::o;9849:488::-;-1:-1:-1;;;;;10118:15:1;;;10100:34;;10170:15;;10165:2;10150:18;;10143:43;10217:2;10202:18;;10195:34;;;10265:3;10260:2;10245:18;;10238:31;;;10043:4;;10286:45;;10311:19;;10303:6;10286:45;:::i;:::-;10278:53;10052:285;-1:-1:-1;;;;;;10052:285:1:o;10342:274::-;-1:-1:-1;;;;;10534:32:1;;;;10516:51;;10598:2;10583:18;;10576:34;10504:2;10489:18;;10471:145::o;11246:622::-;11476:3;11461:19;;11510:1;11499:13;;11489:2;;11555:10;11550:3;11546:20;11543:1;11536:31;11590:4;11587:1;11580:15;11618:4;11615:1;11608:15;11489:2;11642:25;;;-1:-1:-1;;;;;11703:32:1;;;;11698:2;11683:18;;11676:60;11784:14;11772:27;;;;11767:2;11752:18;;11745:55;11848:12;11836:25;11831:2;11816:18;;;11809:53;11443:425;:::o;12223:219::-;12372:2;12361:9;12354:21;12335:4;12392:44;12432:2;12421:9;12417:18;12409:6;12392:44;:::i;12447:335::-;12649:2;12631:21;;;12688:2;12668:18;;;12661:30;-1:-1:-1;;;12722:2:1;12707:18;;12700:41;12773:2;12758:18;;12621:161::o;13895:414::-;14097:2;14079:21;;;14136:2;14116:18;;;14109:30;14175:34;14170:2;14155:18;;14148:62;-1:-1:-1;;;14241:2:1;14226:18;;14219:48;14299:3;14284:19;;14069:240::o;17282:331::-;17484:2;17466:21;;;17523:1;17503:18;;;17496:29;-1:-1:-1;;;17556:2:1;17541:18;;17534:38;17604:2;17589:18;;17456:157::o;17964:340::-;18166:2;18148:21;;;18205:2;18185:18;;;18178:30;-1:-1:-1;;;18239:2:1;18224:18;;18217:46;18295:2;18280:18;;18138:166::o;19891:410::-;20093:2;20075:21;;;20132:2;20112:18;;;20105:30;20171:34;20166:2;20151:18;;20144:62;-1:-1:-1;;;20237:2:1;20222:18;;20215:44;20291:3;20276:19;;20065:236::o;20989:330::-;21191:2;21173:21;;;21230:1;21210:18;;;21203:29;-1:-1:-1;;;21263:2:1;21248:18;;21241:37;21310:2;21295:18;;21163:156::o;22781:356::-;22983:2;22965:21;;;23002:18;;;22995:30;23061:34;23056:2;23041:18;;23034:62;23128:2;23113:18;;22955:182::o;24294:413::-;24496:2;24478:21;;;24535:2;24515:18;;;24508:30;24574:34;24569:2;24554:18;;24547:62;-1:-1:-1;;;24640:2:1;24625:18;;24618:47;24697:3;24682:19;;24468:239::o;25807:335::-;26009:2;25991:21;;;26048:2;26028:18;;;26021:30;-1:-1:-1;;;26082:2:1;26067:18;;26060:41;26133:2;26118:18;;25981:161::o;29251:361::-;29456:6;29445:9;29438:25;29499:2;29494;29483:9;29479:18;29472:30;29419:4;29519:44;29559:2;29548:9;29544:18;29536:6;29519:44;:::i;:::-;29511:52;;29599:6;29594:2;29583:9;29579:18;29572:34;29428:184;;;;;;:::o;30816:275::-;30887:2;30881:9;30952:2;30933:13;;-1:-1:-1;;30929:27:1;30917:40;;-1:-1:-1;;;;;30972:34:1;;31008:22;;;30969:62;30966:2;;;31034:18;;:::i;:::-;31070:2;31063:22;30861:230;;-1:-1:-1;30861:230:1:o;31096:186::-;31144:4;-1:-1:-1;;;;;31166:30:1;;31163:2;;;31199:18;;:::i;:::-;-1:-1:-1;31265:2:1;31244:15;-1:-1:-1;;31240:29:1;31271:4;31236:40;;31153:129::o;31287:224::-;31326:3;31354:6;31387:2;31384:1;31380:10;31417:2;31414:1;31410:10;31448:3;31444:2;31440:12;31435:3;31432:21;31429:2;;;31456:18;;:::i;:::-;31492:13;;31334:177;-1:-1:-1;;;;31334:177:1:o;31516:128::-;31556:3;31587:1;31583:6;31580:1;31577:13;31574:2;;;31593:18;;:::i;:::-;-1:-1:-1;31629:9:1;;31564:80::o;31649:204::-;31687:3;31723:4;31720:1;31716:12;31755:4;31752:1;31748:12;31790:3;31784:4;31780:14;31775:3;31772:23;31769:2;;;31798:18;;:::i;:::-;31834:13;;31695:158;-1:-1:-1;;;31695:158:1:o;31858:236::-;31897:3;-1:-1:-1;;;;;31963:10:1;;;31993;;;32023:12;;;32015:21;;32012:2;;;32039:18;;:::i;32099:120::-;32139:1;32165;32155:2;;32170:18;;:::i;:::-;-1:-1:-1;32204:9:1;;32145:74::o;32224:168::-;32264:7;32330:1;32326;32322:6;32318:14;32315:1;32312:21;32307:1;32300:9;32293:17;32289:45;32286:2;;;32337:18;;:::i;:::-;-1:-1:-1;32377:9:1;;32276:116::o;32397:270::-;32436:7;-1:-1:-1;;;;;32506:10:1;;;32536;;;32569:11;;32562:19;32591:12;;;32583:21;;32558:47;32555:2;;;32608:18;;:::i;:::-;32648:13;;32448:219;-1:-1:-1;;;;32448:219:1:o;32672:125::-;32712:4;32740:1;32737;32734:8;32731:2;;;32745:18;;:::i;:::-;-1:-1:-1;32782:9:1;;32721:76::o;32802:225::-;32841:4;32870:14;32934:10;;;;32904;;32956:12;;;32953:2;;;32971:18;;:::i;:::-;33008:13;;32850:177;-1:-1:-1;;;32850:177:1:o;33032:195::-;33070:4;33107;33104:1;33100:12;33139:4;33136:1;33132:12;33164:3;33159;33156:12;33153:2;;;33171:18;;:::i;:::-;33208:13;;;33079:148;-1:-1:-1;;;33079:148:1:o;33232:258::-;33304:1;33314:113;33328:6;33325:1;33322:13;33314:113;;;33404:11;;;33398:18;33385:11;;;33378:39;33350:2;33343:10;33314:113;;;33445:6;33442:1;33439:13;33436:2;;;-1:-1:-1;;33480:1:1;33462:16;;33455:27;33285:205::o;33495:181::-;33533:3;33577:6;33570:5;33566:18;33603:7;33593:2;;33614:18;;:::i;:::-;-1:-1:-1;;33650:20:1;;33541:135;-1:-1:-1;;33541:135:1:o;33681:380::-;33760:1;33756:12;;;;33803;;;33824:2;;33878:4;33870:6;33866:17;33856:27;;33824:2;33931;33923:6;33920:14;33900:18;33897:38;33894:2;;;33977:10;33972:3;33968:20;33965:1;33958:31;34012:4;34009:1;34002:15;34040:4;34037:1;34030:15;33894:2;;33736:325;;;:::o;34066:135::-;34105:3;-1:-1:-1;;34126:17:1;;34123:2;;;34146:18;;:::i;:::-;-1:-1:-1;34193:1:1;34182:13;;34113:88::o;34206:175::-;34243:3;34287:4;34280:5;34276:16;34316:4;34307:7;34304:17;34301:2;;;34324:18;;:::i;:::-;34373:1;34360:15;;34251:130;-1:-1:-1;;34251:130:1:o;34386:112::-;34418:1;34444;34434:2;;34449:18;;:::i;:::-;-1:-1:-1;34483:9:1;;34424:74::o;34503:127::-;34564:10;34559:3;34555:20;34552:1;34545:31;34595:4;34592:1;34585:15;34619:4;34616:1;34609:15;34635:127;34696:10;34691:3;34687:20;34684:1;34677:31;34727:4;34724:1;34717:15;34751:4;34748:1;34741:15;34767:127;34828:10;34823:3;34819:20;34816:1;34809:31;34859:4;34856:1;34849:15;34883:4;34880:1;34873:15;34899:131;-1:-1:-1;;;;;;34973:32:1;;34963:43;;34953:2;;35020:1;35017;35010:12
Swarm Source
ipfs://28c344260942ef8bfab252b3aea5f5d5260ec44c7bbe19fd8584e0303bd83fa4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.