ERC-721
Overview
Max Total Supply
1,430 PAL SKIN
Holders
211
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
4 PAL SKINLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
CustomSkins
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-04-02 */ //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.4; // File @openzeppelin/contracts/utils/[email protected] /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC721/[email protected] /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/introspection/[email protected] /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("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 {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/utils/[email protected] /** * @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 Counters { 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 contracts/skins/CustomSkins.sol contract CustomSkins is IERC721Receiver, ERC721Enumerable, Ownable { using Counters for Counters.Counter; event SkinMinted(uint tokenId); event SkinArrived(uint tokenId); event SkinLeftForOtherChain(uint tokenId, uint8 otherChainId); Counters.Counter _tokenIds; Counters.Counter _tokensOnThisChain; bytes4 private constant INTERFACE_ID_ERC2981 = 0x2a55205a; uint8 public chain; address private _royaltyAddress; /** * @dev we store each individual token URI rather than using a lookup, so that when a token move * across chain we don't have to stress about having matching lookup values on both chains */ mapping(uint => string) public tokenURIs; // tokenId => URI mapping(address => bool) public permittedMintAddresses; // addresses that can mint; mapping(address => bool) public permittedWormholeAddresses; // addresses that can send/receive via wormhole; constructor(uint8 _chain) ERC721("PocketPals Custom Skins", "PAL SKIN") { chain = _chain; _tokenIds._value = uint(chain) * 1000000; } /** * * ----------------------------------- READ -------------------------------------- * */ function totalSupply() public view override returns (uint256) { return _tokensOnThisChain.current(); } function pageOfOwnersTokenIds(address owner, uint page) external view returns (uint[10] memory ownedTokenIds) { for (uint i = 0; i < 10; i++) { uint ownerIndex = i + (page * 10); if (ownerIndex < ERC721.balanceOf(owner)) { ownedTokenIds[i] = tokenOfOwnerByIndex(owner, ownerIndex); } else { ownedTokenIds[i] = 0; } } } function royaltyInfo(uint256, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount) { receiver = _royaltyAddress; royaltyAmount = salePrice / 20; } function tokenURI(uint256 tokenId) public view override returns (string memory) { return tokenURIs[tokenId]; } /** * * ----------------------------------- WRITE -------------------------------------- * */ function setIsPermittedToMint(address permittedAddress, bool isPermitted) external onlyOwner { permittedMintAddresses[permittedAddress] = isPermitted; } function setIsPermittedForWormhole(address permittedAddress, bool isPermitted) external onlyOwner { permittedWormholeAddresses[permittedAddress] = isPermitted; } function arriveSkinFromOtherChain(uint tokenId, string calldata metadataURI, address owner) external { require(permittedWormholeAddresses[msg.sender], "Not permitted for Wormhole"); if (!_exists(tokenId)) { _safeMint(owner, tokenId); tokenURIs[tokenId] = metadataURI; } else { _safeTransfer(address(this), owner, tokenId, ""); } _tokensOnThisChain.increment(); emit SkinArrived(tokenId); } function mintSkin(address to, string calldata metadataURI) external { require(permittedMintAddresses[msg.sender], "Not permitted for Mint"); uint tokenId = _tokenIds.current() + 1; _safeMint(to, tokenId); tokenURIs[tokenId] = metadataURI; _tokenIds.increment(); _tokensOnThisChain.increment(); emit SkinMinted(tokenId); } /** * @dev update the contract for this Skin having left this chain via a wormhole * - we transfer the token on this chain into this contract so only one is ever in circulation */ function sendSkinToOtherChain(uint tokenId, uint8 otherChainId) external { require(permittedWormholeAddresses[msg.sender], "Not permitted for Wormhole"); require(_exists(tokenId), "CustomSkins: Token does not exist"); require(otherChainId != chain, "CustomSkins: Token is already on this chain"); require(ERC721.ownerOf(tokenId) != address(this), "CustomSkins: Token is already on another chain"); _tokensOnThisChain.decrement(); _safeTransfer(ownerOf(tokenId), address(this), tokenId, ""); emit SkinLeftForOtherChain(tokenId, otherChainId); } function setRoyaltyAddress(address newRoyaltyAddress) external onlyOwner { _royaltyAddress = newRoyaltyAddress; } function debit(address payable receiver) external onlyOwner { receiver.transfer(address(this).balance); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable) returns (bool) { return interfaceId == INTERFACE_ID_ERC2981 || super.supportsInterface(interfaceId); } function onERC721Received(address, address, uint256, bytes calldata) public view override returns (bytes4) { return IERC721Receiver(this).onERC721Received.selector; } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint8","name":"_chain","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SkinArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"otherChainId","type":"uint8"}],"name":"SkinLeftForOtherChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SkinMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"metadataURI","type":"string"},{"internalType":"address","name":"owner","type":"address"}],"name":"arriveSkinFromOtherChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chain","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"}],"name":"debit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"mintSkin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"page","type":"uint256"}],"name":"pageOfOwnersTokenIds","outputs":[{"internalType":"uint256[10]","name":"ownedTokenIds","type":"uint256[10]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permittedMintAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permittedWormholeAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"otherChainId","type":"uint8"}],"name":"sendSkinToOtherChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"permittedAddress","type":"address"},{"internalType":"bool","name":"isPermitted","type":"bool"}],"name":"setIsPermittedForWormhole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"permittedAddress","type":"address"},{"internalType":"bool","name":"isPermitted","type":"bool"}],"name":"setIsPermittedToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoyaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURIs","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620028de380380620028de8339810160408190526200003491620001f3565b604080518082018252601781527f506f636b657450616c7320437573746f6d20536b696e730000000000000000006020808301918252835180850190945260088452672820a61029a5a4a760c11b90840152815191929162000099916000916200014d565b508051620000af9060019060208401906200014d565b505050620000cc620000c6620000f760201b60201c565b620000fb565b600d805460ff191660ff8316908117909155620000ed90620f42406200021d565b600b555062000286565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015b9062000249565b90600052602060002090601f0160209004810192826200017f5760008555620001ca565b82601f106200019a57805160ff1916838001178555620001ca565b82800160010185558215620001ca579182015b82811115620001ca578251825591602001919060010190620001ad565b50620001d8929150620001dc565b5090565b5b80821115620001d85760008155600101620001dd565b60006020828403121562000205578081fd5b815160ff8116811462000216578182fd5b9392505050565b60008160001904831182151516156200024457634e487b7160e01b81526011600452602481fd5b500290565b600181811c908216806200025e57607f821691505b602082108114156200028057634e487b7160e01b600052602260045260246000fd5b50919050565b61264880620002966000396000f3fe6080604052600436106101f25760003560e01c80636c8b703f1161010d578063aa60df82116100a0578063c87b56dd1161006f578063c87b56dd14610607578063d37727c514610627578063e8b0f42114610647578063e985e9c514610677578063f2fde38b146106c057600080fd5b8063aa60df821461057b578063b88d4fde1461059b578063c5481bee146105bb578063c763e5a1146105db57600080fd5b8063861864e8116100dc578063861864e8146105085780638da5cb5b1461052857806395d89b4114610546578063a22cb4651461055b57600080fd5b80636c8b703f1461049357806370a08231146104b3578063715018a6146104d35780637f458c5a146104e857600080fd5b806323b872dd1161018557806341ce52471161015457806341ce52471461040657806342842e0e146104335780634f6ccce7146104535780636352211e1461047357600080fd5b806323b872dd1461036757806329d0ac5d146103875780632a55205a146103a75780632f745c59146103e657600080fd5b8063095ea7b3116101c1578063095ea7b3146102af5780630ec3fa02146102cf578063150b7a02146102ff57806318160ddd1461034457600080fd5b806301ffc9a7146101fe57806306d254da1461023357806306fdde0314610255578063081812fc1461027757600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021e61021936600461225b565b6106e0565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004611fc7565b61070b565b005b34801561026157600080fd5b5061026a610766565b60405161022a919061240c565b34801561028357600080fd5b50610297610292366004612293565b6107f8565b6040516001600160a01b03909116815260200161022a565b3480156102bb57600080fd5b506102536102ca366004612230565b61088d565b3480156102db57600080fd5b5061021e6102ea366004611fc7565b600f6020526000908152604090205460ff1681565b34801561030b57600080fd5b5061032b61031a366004612062565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161022a565b34801561035057600080fd5b506103596109a3565b60405190815260200161022a565b34801561037357600080fd5b50610253610382366004612022565b6109b3565b34801561039357600080fd5b506102536103a23660046121ac565b6109e4565b3480156103b357600080fd5b506103c76103c2366004612308565b610a39565b604080516001600160a01b03909316835260208301919091520161022a565b3480156103f257600080fd5b50610359610401366004612230565b610a60565b34801561041257600080fd5b50610426610421366004612230565b610af6565b60405161022a91906123da565b34801561043f57600080fd5b5061025361044e366004612022565b610ba9565b34801561045f57600080fd5b5061035961046e366004612293565b610bc4565b34801561047f57600080fd5b5061029761048e366004612293565b610c65565b34801561049f57600080fd5b5061026a6104ae366004612293565b610cdc565b3480156104bf57600080fd5b506103596104ce366004611fc7565b610d76565b3480156104df57600080fd5b50610253610dfd565b3480156104f457600080fd5b506102536105033660046121ac565b610e33565b34801561051457600080fd5b50610253610523366004611fc7565b610e88565b34801561053457600080fd5b50600a546001600160a01b0316610297565b34801561055257600080fd5b5061026a610eeb565b34801561056757600080fd5b506102536105763660046121ac565b610efa565b34801561058757600080fd5b50610253610596366004612329565b610f05565b3480156105a757600080fd5b506102536105b63660046120d3565b611122565b3480156105c757600080fd5b506102536105d63660046122ab565b61115a565b3480156105e757600080fd5b50600d546105f59060ff1681565b60405160ff909116815260200161022a565b34801561061357600080fd5b5061026a610622366004612293565b611261565b34801561063357600080fd5b506102536106423660046121dd565b611303565b34801561065357600080fd5b5061021e610662366004611fc7565b60106020526000908152604090205460ff1681565b34801561068357600080fd5b5061021e610692366004611fea565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cc57600080fd5b506102536106db366004611fc7565b6113e3565b60006001600160e01b0319821663152a902d60e11b148061070557506107058261147e565b92915050565b600a546001600160a01b0316331461073e5760405162461bcd60e51b815260040161073590612471565b60405180910390fd5b600d80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60606000805461077590612565565b80601f01602080910402602001604051908101604052809291908181526020018280546107a190612565565b80156107ee5780601f106107c3576101008083540402835291602001916107ee565b820191906000526020600020905b8154815290600101906020018083116107d157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108715760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610735565b506000908152600460205260409020546001600160a01b031690565b600061089882610c65565b9050806001600160a01b0316836001600160a01b031614156109065760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610735565b336001600160a01b038216148061092257506109228133610692565b6109945760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610735565b61099e83836114a3565b505050565b60006109ae600c5490565b905090565b6109bd3382611511565b6109d95760405162461bcd60e51b8152600401610735906124a6565b61099e838383611608565b600a546001600160a01b03163314610a0e5760405162461bcd60e51b815260040161073590612471565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600d5461010090046001600160a01b03166000610a5760148461250f565b90509250929050565b6000610a6b83610d76565b8210610acd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610735565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610afe611ec8565b60005b600a811015610ba2576000610b1784600a61252f565b610b2190836124f7565b9050610b2c85610d76565b811015610b6757610b3d8582610a60565b8383600a8110610b5d57634e487b7160e01b600052603260045260246000fd5b6020020152610b8f565b60008383600a8110610b8957634e487b7160e01b600052603260045260246000fd5b60200201525b5080610b9a816125a0565b915050610b01565b5092915050565b61099e83838360405180602001604052806000815250611122565b6000610bcf60085490565b8210610c325760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610735565b60088281548110610c5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610735565b600e6020526000908152604090208054610cf590612565565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2190612565565b8015610d6e5780601f10610d4357610100808354040283529160200191610d6e565b820191906000526020600020905b815481529060010190602001808311610d5157829003601f168201915b505050505081565b60006001600160a01b038216610de15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610735565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e275760405162461bcd60e51b815260040161073590612471565b610e3160006117b3565b565b600a546001600160a01b03163314610e5d5760405162461bcd60e51b815260040161073590612471565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b600a546001600160a01b03163314610eb25760405162461bcd60e51b815260040161073590612471565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610ee7573d6000803e3d6000fd5b5050565b60606001805461077590612565565b610ee7338383611805565b3360009081526010602052604090205460ff16610f645760405162461bcd60e51b815260206004820152601a60248201527f4e6f74207065726d697474656420666f7220576f726d686f6c650000000000006044820152606401610735565b6000828152600260205260409020546001600160a01b0316610fd25760405162461bcd60e51b815260206004820152602160248201527f437573746f6d536b696e733a20546f6b656e20646f6573206e6f7420657869736044820152601d60fa1b6064820152608401610735565b600d5460ff8281169116141561103e5760405162461bcd60e51b815260206004820152602b60248201527f437573746f6d536b696e733a20546f6b656e20697320616c7265616479206f6e60448201526a103a3434b99031b430b4b760a91b6064820152608401610735565b3061104883610c65565b6001600160a01b031614156110b65760405162461bcd60e51b815260206004820152602e60248201527f437573746f6d536b696e733a20546f6b656e20697320616c7265616479206f6e60448201526d1030b737ba3432b91031b430b4b760911b6064820152608401610735565b6110c0600c6118d4565b6110e36110cc83610c65565b30846040518060200160405280600081525061192b565b6040805183815260ff831660208201527fd1e9dc3cdfe0e9bdfeea611e3aa823f61543d050e28121be10de41eddc3c2052910160405180910390a15050565b61112c3383611511565b6111485760405162461bcd60e51b8152600401610735906124a6565b6111548484848461192b565b50505050565b3360009081526010602052604090205460ff166111b95760405162461bcd60e51b815260206004820152601a60248201527f4e6f74207065726d697474656420666f7220576f726d686f6c650000000000006044820152606401610735565b6000848152600260205260409020546001600160a01b03166111fe576111df818561195e565b6000848152600e602052604090206111f8908484611ee7565b50611219565b6112193082866040518060200160405280600081525061192b565b611227600c80546001019055565b6040518481527fc4f876c65f389e57568e188b44ccebfe938681e477f574c96a9a96f2b1eb7e30906020015b60405180910390a150505050565b6000818152600e6020526040902080546060919061127e90612565565b80601f01602080910402602001604051908101604052809291908181526020018280546112aa90612565565b80156112f75780601f106112cc576101008083540402835291602001916112f7565b820191906000526020600020905b8154815290600101906020018083116112da57829003601f168201915b50505050509050919050565b336000908152600f602052604090205460ff1661135b5760405162461bcd60e51b8152602060048201526016602482015275139bdd081c195c9b5a5d1d195908199bdc88135a5b9d60521b6044820152606401610735565b6000611366600b5490565b6113719060016124f7565b905061137d848261195e565b6000818152600e60205260409020611396908484611ee7565b506113a5600b80546001019055565b6113b3600c80546001019055565b6040518181527ff8a1d8b71931385fc2643b62738ac48b2b5dfed67d40bebe158bca04f9995e9590602001611253565b600a546001600160a01b0316331461140d5760405162461bcd60e51b815260040161073590612471565b6001600160a01b0381166114725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610735565b61147b816117b3565b50565b60006001600160e01b0319821663780e9d6360e01b1480610705575061070582611978565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114d882610c65565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661158a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610735565b600061159583610c65565b9050806001600160a01b0316846001600160a01b031614806115d05750836001600160a01b03166115c5846107f8565b6001600160a01b0316145b8061160057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661161b82610c65565b6001600160a01b0316146116835760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610735565b6001600160a01b0382166116e55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610735565b6116f08383836119c8565b6116fb6000826114a3565b6001600160a01b038316600090815260036020526040812080546001929061172490849061254e565b90915550506001600160a01b03821660009081526003602052604081208054600192906117529084906124f7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156118675760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610735565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b8054806119235760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610735565b600019019055565b611936848484611608565b61194284848484611a80565b6111545760405162461bcd60e51b81526004016107359061241f565b610ee7828260405180602001604052806000815250611b8d565b60006001600160e01b031982166380ac58cd60e01b14806119a957506001600160e01b03198216635b5e139f60e01b145b8061070557506301ffc9a760e01b6001600160e01b0319831614610705565b6001600160a01b038316611a2357611a1e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a46565b816001600160a01b0316836001600160a01b031614611a4657611a468382611bc0565b6001600160a01b038216611a5d5761099e81611c5d565b826001600160a01b0316826001600160a01b03161461099e5761099e8282611d36565b60006001600160a01b0384163b15611b8257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ac490339089908890889060040161239d565b602060405180830381600087803b158015611ade57600080fd5b505af1925050508015611b0e575060408051601f3d908101601f19168201909252611b0b91810190612277565b60015b611b68573d808015611b3c576040519150601f19603f3d011682016040523d82523d6000602084013e611b41565b606091505b508051611b605760405162461bcd60e51b81526004016107359061241f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611600565b506001949350505050565b611b978383611d7a565b611ba46000848484611a80565b61099e5760405162461bcd60e51b81526004016107359061241f565b60006001611bcd84610d76565b611bd7919061254e565b600083815260076020526040902054909150808214611c2a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c6f9060019061254e565b60008381526009602052604081205460088054939450909284908110611ca557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611cd457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d1a57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611d4183610d76565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611dd05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610735565b6000818152600260205260409020546001600160a01b031615611e355760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610735565b611e41600083836119c8565b6001600160a01b0382166000908152600360205260408120805460019290611e6a9084906124f7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806101400160405280600a906020820280368337509192915050565b828054611ef390612565565b90600052602060002090601f016020900481019282611f155760008555611f5b565b82601f10611f2e5782800160ff19823516178555611f5b565b82800160010185558215611f5b579182015b82811115611f5b578235825591602001919060010190611f40565b50611f67929150611f6b565b5090565b5b80821115611f675760008155600101611f6c565b60008083601f840112611f91578182fd5b50813567ffffffffffffffff811115611fa8578182fd5b602083019150836020828501011115611fc057600080fd5b9250929050565b600060208284031215611fd8578081fd5b8135611fe3816125e7565b9392505050565b60008060408385031215611ffc578081fd5b8235612007816125e7565b91506020830135612017816125e7565b809150509250929050565b600080600060608486031215612036578081fd5b8335612041816125e7565b92506020840135612051816125e7565b929592945050506040919091013590565b600080600080600060808688031215612079578081fd5b8535612084816125e7565b94506020860135612094816125e7565b935060408601359250606086013567ffffffffffffffff8111156120b6578182fd5b6120c288828901611f80565b969995985093965092949392505050565b600080600080608085870312156120e8578384fd5b84356120f3816125e7565b93506020850135612103816125e7565b925060408501359150606085013567ffffffffffffffff80821115612126578283fd5b818701915087601f830112612139578283fd5b81358181111561214b5761214b6125d1565b604051601f8201601f19908116603f01168101908382118183101715612173576121736125d1565b816040528281528a602084870101111561218b578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156121be578182fd5b82356121c9816125e7565b915060208301358015158114612017578182fd5b6000806000604084860312156121f1578283fd5b83356121fc816125e7565b9250602084013567ffffffffffffffff811115612217578283fd5b61222386828701611f80565b9497909650939450505050565b60008060408385031215612242578182fd5b823561224d816125e7565b946020939093013593505050565b60006020828403121561226c578081fd5b8135611fe3816125fc565b600060208284031215612288578081fd5b8151611fe3816125fc565b6000602082840312156122a4578081fd5b5035919050565b600080600080606085870312156122c0578182fd5b84359350602085013567ffffffffffffffff8111156122dd578283fd5b6122e987828801611f80565b90945092505060408501356122fd816125e7565b939692955090935050565b6000806040838503121561231a578182fd5b50508035926020909101359150565b6000806040838503121561233b578182fd5b82359150602083013560ff81168114612017578182fd5b60008151808452815b818110156123775760208185018101518683018201520161235b565b818111156123885782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123d090830184612352565b9695505050505050565b6101408101818360005b600a8110156124035781518352602092830192909101906001016123e4565b50505092915050565b602081526000611fe36020830184612352565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561250a5761250a6125bb565b500190565b60008261252a57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612549576125496125bb565b500290565b600082821015612560576125606125bb565b500390565b600181811c9082168061257957607f821691505b6020821081141561259a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125b4576125b46125bb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461147b57600080fd5b6001600160e01b03198116811461147b57600080fdfea264697066735822122099310aacc15cc04a9a697a24a614078510c146e0df962f69eb4e89a6fccb2c3464736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode
0x6080604052600436106101f25760003560e01c80636c8b703f1161010d578063aa60df82116100a0578063c87b56dd1161006f578063c87b56dd14610607578063d37727c514610627578063e8b0f42114610647578063e985e9c514610677578063f2fde38b146106c057600080fd5b8063aa60df821461057b578063b88d4fde1461059b578063c5481bee146105bb578063c763e5a1146105db57600080fd5b8063861864e8116100dc578063861864e8146105085780638da5cb5b1461052857806395d89b4114610546578063a22cb4651461055b57600080fd5b80636c8b703f1461049357806370a08231146104b3578063715018a6146104d35780637f458c5a146104e857600080fd5b806323b872dd1161018557806341ce52471161015457806341ce52471461040657806342842e0e146104335780634f6ccce7146104535780636352211e1461047357600080fd5b806323b872dd1461036757806329d0ac5d146103875780632a55205a146103a75780632f745c59146103e657600080fd5b8063095ea7b3116101c1578063095ea7b3146102af5780630ec3fa02146102cf578063150b7a02146102ff57806318160ddd1461034457600080fd5b806301ffc9a7146101fe57806306d254da1461023357806306fdde0314610255578063081812fc1461027757600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021e61021936600461225b565b6106e0565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004611fc7565b61070b565b005b34801561026157600080fd5b5061026a610766565b60405161022a919061240c565b34801561028357600080fd5b50610297610292366004612293565b6107f8565b6040516001600160a01b03909116815260200161022a565b3480156102bb57600080fd5b506102536102ca366004612230565b61088d565b3480156102db57600080fd5b5061021e6102ea366004611fc7565b600f6020526000908152604090205460ff1681565b34801561030b57600080fd5b5061032b61031a366004612062565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161022a565b34801561035057600080fd5b506103596109a3565b60405190815260200161022a565b34801561037357600080fd5b50610253610382366004612022565b6109b3565b34801561039357600080fd5b506102536103a23660046121ac565b6109e4565b3480156103b357600080fd5b506103c76103c2366004612308565b610a39565b604080516001600160a01b03909316835260208301919091520161022a565b3480156103f257600080fd5b50610359610401366004612230565b610a60565b34801561041257600080fd5b50610426610421366004612230565b610af6565b60405161022a91906123da565b34801561043f57600080fd5b5061025361044e366004612022565b610ba9565b34801561045f57600080fd5b5061035961046e366004612293565b610bc4565b34801561047f57600080fd5b5061029761048e366004612293565b610c65565b34801561049f57600080fd5b5061026a6104ae366004612293565b610cdc565b3480156104bf57600080fd5b506103596104ce366004611fc7565b610d76565b3480156104df57600080fd5b50610253610dfd565b3480156104f457600080fd5b506102536105033660046121ac565b610e33565b34801561051457600080fd5b50610253610523366004611fc7565b610e88565b34801561053457600080fd5b50600a546001600160a01b0316610297565b34801561055257600080fd5b5061026a610eeb565b34801561056757600080fd5b506102536105763660046121ac565b610efa565b34801561058757600080fd5b50610253610596366004612329565b610f05565b3480156105a757600080fd5b506102536105b63660046120d3565b611122565b3480156105c757600080fd5b506102536105d63660046122ab565b61115a565b3480156105e757600080fd5b50600d546105f59060ff1681565b60405160ff909116815260200161022a565b34801561061357600080fd5b5061026a610622366004612293565b611261565b34801561063357600080fd5b506102536106423660046121dd565b611303565b34801561065357600080fd5b5061021e610662366004611fc7565b60106020526000908152604090205460ff1681565b34801561068357600080fd5b5061021e610692366004611fea565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cc57600080fd5b506102536106db366004611fc7565b6113e3565b60006001600160e01b0319821663152a902d60e11b148061070557506107058261147e565b92915050565b600a546001600160a01b0316331461073e5760405162461bcd60e51b815260040161073590612471565b60405180910390fd5b600d80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60606000805461077590612565565b80601f01602080910402602001604051908101604052809291908181526020018280546107a190612565565b80156107ee5780601f106107c3576101008083540402835291602001916107ee565b820191906000526020600020905b8154815290600101906020018083116107d157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108715760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610735565b506000908152600460205260409020546001600160a01b031690565b600061089882610c65565b9050806001600160a01b0316836001600160a01b031614156109065760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610735565b336001600160a01b038216148061092257506109228133610692565b6109945760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610735565b61099e83836114a3565b505050565b60006109ae600c5490565b905090565b6109bd3382611511565b6109d95760405162461bcd60e51b8152600401610735906124a6565b61099e838383611608565b600a546001600160a01b03163314610a0e5760405162461bcd60e51b815260040161073590612471565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600d5461010090046001600160a01b03166000610a5760148461250f565b90509250929050565b6000610a6b83610d76565b8210610acd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610735565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610afe611ec8565b60005b600a811015610ba2576000610b1784600a61252f565b610b2190836124f7565b9050610b2c85610d76565b811015610b6757610b3d8582610a60565b8383600a8110610b5d57634e487b7160e01b600052603260045260246000fd5b6020020152610b8f565b60008383600a8110610b8957634e487b7160e01b600052603260045260246000fd5b60200201525b5080610b9a816125a0565b915050610b01565b5092915050565b61099e83838360405180602001604052806000815250611122565b6000610bcf60085490565b8210610c325760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610735565b60088281548110610c5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610735565b600e6020526000908152604090208054610cf590612565565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2190612565565b8015610d6e5780601f10610d4357610100808354040283529160200191610d6e565b820191906000526020600020905b815481529060010190602001808311610d5157829003601f168201915b505050505081565b60006001600160a01b038216610de15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610735565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e275760405162461bcd60e51b815260040161073590612471565b610e3160006117b3565b565b600a546001600160a01b03163314610e5d5760405162461bcd60e51b815260040161073590612471565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b600a546001600160a01b03163314610eb25760405162461bcd60e51b815260040161073590612471565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610ee7573d6000803e3d6000fd5b5050565b60606001805461077590612565565b610ee7338383611805565b3360009081526010602052604090205460ff16610f645760405162461bcd60e51b815260206004820152601a60248201527f4e6f74207065726d697474656420666f7220576f726d686f6c650000000000006044820152606401610735565b6000828152600260205260409020546001600160a01b0316610fd25760405162461bcd60e51b815260206004820152602160248201527f437573746f6d536b696e733a20546f6b656e20646f6573206e6f7420657869736044820152601d60fa1b6064820152608401610735565b600d5460ff8281169116141561103e5760405162461bcd60e51b815260206004820152602b60248201527f437573746f6d536b696e733a20546f6b656e20697320616c7265616479206f6e60448201526a103a3434b99031b430b4b760a91b6064820152608401610735565b3061104883610c65565b6001600160a01b031614156110b65760405162461bcd60e51b815260206004820152602e60248201527f437573746f6d536b696e733a20546f6b656e20697320616c7265616479206f6e60448201526d1030b737ba3432b91031b430b4b760911b6064820152608401610735565b6110c0600c6118d4565b6110e36110cc83610c65565b30846040518060200160405280600081525061192b565b6040805183815260ff831660208201527fd1e9dc3cdfe0e9bdfeea611e3aa823f61543d050e28121be10de41eddc3c2052910160405180910390a15050565b61112c3383611511565b6111485760405162461bcd60e51b8152600401610735906124a6565b6111548484848461192b565b50505050565b3360009081526010602052604090205460ff166111b95760405162461bcd60e51b815260206004820152601a60248201527f4e6f74207065726d697474656420666f7220576f726d686f6c650000000000006044820152606401610735565b6000848152600260205260409020546001600160a01b03166111fe576111df818561195e565b6000848152600e602052604090206111f8908484611ee7565b50611219565b6112193082866040518060200160405280600081525061192b565b611227600c80546001019055565b6040518481527fc4f876c65f389e57568e188b44ccebfe938681e477f574c96a9a96f2b1eb7e30906020015b60405180910390a150505050565b6000818152600e6020526040902080546060919061127e90612565565b80601f01602080910402602001604051908101604052809291908181526020018280546112aa90612565565b80156112f75780601f106112cc576101008083540402835291602001916112f7565b820191906000526020600020905b8154815290600101906020018083116112da57829003601f168201915b50505050509050919050565b336000908152600f602052604090205460ff1661135b5760405162461bcd60e51b8152602060048201526016602482015275139bdd081c195c9b5a5d1d195908199bdc88135a5b9d60521b6044820152606401610735565b6000611366600b5490565b6113719060016124f7565b905061137d848261195e565b6000818152600e60205260409020611396908484611ee7565b506113a5600b80546001019055565b6113b3600c80546001019055565b6040518181527ff8a1d8b71931385fc2643b62738ac48b2b5dfed67d40bebe158bca04f9995e9590602001611253565b600a546001600160a01b0316331461140d5760405162461bcd60e51b815260040161073590612471565b6001600160a01b0381166114725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610735565b61147b816117b3565b50565b60006001600160e01b0319821663780e9d6360e01b1480610705575061070582611978565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114d882610c65565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661158a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610735565b600061159583610c65565b9050806001600160a01b0316846001600160a01b031614806115d05750836001600160a01b03166115c5846107f8565b6001600160a01b0316145b8061160057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661161b82610c65565b6001600160a01b0316146116835760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610735565b6001600160a01b0382166116e55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610735565b6116f08383836119c8565b6116fb6000826114a3565b6001600160a01b038316600090815260036020526040812080546001929061172490849061254e565b90915550506001600160a01b03821660009081526003602052604081208054600192906117529084906124f7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156118675760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610735565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b8054806119235760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610735565b600019019055565b611936848484611608565b61194284848484611a80565b6111545760405162461bcd60e51b81526004016107359061241f565b610ee7828260405180602001604052806000815250611b8d565b60006001600160e01b031982166380ac58cd60e01b14806119a957506001600160e01b03198216635b5e139f60e01b145b8061070557506301ffc9a760e01b6001600160e01b0319831614610705565b6001600160a01b038316611a2357611a1e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a46565b816001600160a01b0316836001600160a01b031614611a4657611a468382611bc0565b6001600160a01b038216611a5d5761099e81611c5d565b826001600160a01b0316826001600160a01b03161461099e5761099e8282611d36565b60006001600160a01b0384163b15611b8257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ac490339089908890889060040161239d565b602060405180830381600087803b158015611ade57600080fd5b505af1925050508015611b0e575060408051601f3d908101601f19168201909252611b0b91810190612277565b60015b611b68573d808015611b3c576040519150601f19603f3d011682016040523d82523d6000602084013e611b41565b606091505b508051611b605760405162461bcd60e51b81526004016107359061241f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611600565b506001949350505050565b611b978383611d7a565b611ba46000848484611a80565b61099e5760405162461bcd60e51b81526004016107359061241f565b60006001611bcd84610d76565b611bd7919061254e565b600083815260076020526040902054909150808214611c2a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c6f9060019061254e565b60008381526009602052604081205460088054939450909284908110611ca557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611cd457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d1a57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611d4183610d76565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611dd05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610735565b6000818152600260205260409020546001600160a01b031615611e355760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610735565b611e41600083836119c8565b6001600160a01b0382166000908152600360205260408120805460019290611e6a9084906124f7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806101400160405280600a906020820280368337509192915050565b828054611ef390612565565b90600052602060002090601f016020900481019282611f155760008555611f5b565b82601f10611f2e5782800160ff19823516178555611f5b565b82800160010185558215611f5b579182015b82811115611f5b578235825591602001919060010190611f40565b50611f67929150611f6b565b5090565b5b80821115611f675760008155600101611f6c565b60008083601f840112611f91578182fd5b50813567ffffffffffffffff811115611fa8578182fd5b602083019150836020828501011115611fc057600080fd5b9250929050565b600060208284031215611fd8578081fd5b8135611fe3816125e7565b9392505050565b60008060408385031215611ffc578081fd5b8235612007816125e7565b91506020830135612017816125e7565b809150509250929050565b600080600060608486031215612036578081fd5b8335612041816125e7565b92506020840135612051816125e7565b929592945050506040919091013590565b600080600080600060808688031215612079578081fd5b8535612084816125e7565b94506020860135612094816125e7565b935060408601359250606086013567ffffffffffffffff8111156120b6578182fd5b6120c288828901611f80565b969995985093965092949392505050565b600080600080608085870312156120e8578384fd5b84356120f3816125e7565b93506020850135612103816125e7565b925060408501359150606085013567ffffffffffffffff80821115612126578283fd5b818701915087601f830112612139578283fd5b81358181111561214b5761214b6125d1565b604051601f8201601f19908116603f01168101908382118183101715612173576121736125d1565b816040528281528a602084870101111561218b578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156121be578182fd5b82356121c9816125e7565b915060208301358015158114612017578182fd5b6000806000604084860312156121f1578283fd5b83356121fc816125e7565b9250602084013567ffffffffffffffff811115612217578283fd5b61222386828701611f80565b9497909650939450505050565b60008060408385031215612242578182fd5b823561224d816125e7565b946020939093013593505050565b60006020828403121561226c578081fd5b8135611fe3816125fc565b600060208284031215612288578081fd5b8151611fe3816125fc565b6000602082840312156122a4578081fd5b5035919050565b600080600080606085870312156122c0578182fd5b84359350602085013567ffffffffffffffff8111156122dd578283fd5b6122e987828801611f80565b90945092505060408501356122fd816125e7565b939692955090935050565b6000806040838503121561231a578182fd5b50508035926020909101359150565b6000806040838503121561233b578182fd5b82359150602083013560ff81168114612017578182fd5b60008151808452815b818110156123775760208185018101518683018201520161235b565b818111156123885782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123d090830184612352565b9695505050505050565b6101408101818360005b600a8110156124035781518352602092830192909101906001016123e4565b50505092915050565b602081526000611fe36020830184612352565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561250a5761250a6125bb565b500190565b60008261252a57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612549576125496125bb565b500290565b600082821015612560576125606125bb565b500390565b600181811c9082168061257957607f821691505b6020821081141561259a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125b4576125b46125bb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461147b57600080fd5b6001600160e01b03198116811461147b57600080fdfea264697066735822122099310aacc15cc04a9a697a24a614078510c146e0df962f69eb4e89a6fccb2c3464736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000fa
-----Decoded View---------------
Arg [0] : _chain (uint8): 250
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode Sourcemap
44860:5040:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49470:202;;;;;;;;;;-1:-1:-1;49470:202:0;;;;;:::i;:::-;;:::i;:::-;;;9345:14:1;;9338:22;9320:41;;9308:2;9293:18;49470:202:0;;;;;;;;49208:127;;;;;;;;;;-1:-1:-1;49208:127:0;;;;;:::i;:::-;;:::i;:::-;;23908:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25467:221::-;;;;;;;;;;-1:-1:-1;25467:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7862:32:1;;;7844:51;;7832:2;7817:18;25467:221:0;7799:102:1;24990:411:0;;;;;;;;;;-1:-1:-1;24990:411:0;;;;;:::i;:::-;;:::i;45615:54::-;;;;;;;;;;-1:-1:-1;45615:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49680:180;;;;;;;;;;-1:-1:-1;49680:180:0;;;;;:::i;:::-;-1:-1:-1;;;49680:180:0;;;;;;;;;;;-1:-1:-1;;;;;;9534:33:1;;;9516:52;;9504:2;9489:18;49680:180:0;9471:103:1;46106:116:0;;;;;;;;;;;;;:::i;:::-;;;19031:25:1;;;19019:2;19004:18;46106:116:0;18986:76:1;26217:339:0;;;;;;;;;;-1:-1:-1;26217:339:0;;;;;:::i;:::-;;:::i;47131:166::-;;;;;;;;;;-1:-1:-1;47131:166:0;;;;;:::i;:::-;;:::i;46667:199::-;;;;;;;;;;-1:-1:-1;46667:199:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8591:32:1;;;8573:51;;8655:2;8640:18;;8633:34;;;;8546:18;46667:199:0;8528:145:1;37584:256:0;;;;;;;;;;-1:-1:-1;37584:256:0;;;;;:::i;:::-;;:::i;46230:429::-;;;;;;;;;;-1:-1:-1;46230:429:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26627:185::-;;;;;;;;;;-1:-1:-1;26627:185:0;;;;;:::i;:::-;;:::i;38106:233::-;;;;;;;;;;-1:-1:-1;38106:233:0;;;;;:::i;:::-;;:::i;23602:239::-;;;;;;;;;;-1:-1:-1;23602:239:0;;;;;:::i;:::-;;:::i;45548:40::-;;;;;;;;;;-1:-1:-1;45548:40:0;;;;;:::i;:::-;;:::i;23332:208::-;;;;;;;;;;-1:-1:-1;23332:208:0;;;;;:::i;:::-;;:::i;2518:103::-;;;;;;;;;;;;;:::i;47305:175::-;;;;;;;;;;-1:-1:-1;47305:175:0;;;;;:::i;:::-;;:::i;49343:119::-;;;;;;;;;;-1:-1:-1;49343:119:0;;;;;:::i;:::-;;:::i;1867:87::-;;;;;;;;;;-1:-1:-1;1940:6:0;;-1:-1:-1;;;;;1940:6:0;1867:87;;24077:104;;;;;;;;;;;;;:::i;25760:155::-;;;;;;;;;;-1:-1:-1;25760:155:0;;;;;:::i;:::-;;:::i;48587:613::-;;;;;;;;;;-1:-1:-1;48587:613:0;;;;;:::i;:::-;;:::i;26883:328::-;;;;;;;;;;-1:-1:-1;26883:328:0;;;;;:::i;:::-;;:::i;47488:489::-;;;;;;;;;;-1:-1:-1;47488:489:0;;;;;:::i;:::-;;:::i;45266:18::-;;;;;;;;;;-1:-1:-1;45266:18:0;;;;;;;;;;;19499:4:1;19487:17;;;19469:36;;19457:2;19442:18;45266::0;19424:87:1;46876:124:0;;;;;;;;;;-1:-1:-1;46876:124:0;;;;;:::i;:::-;;:::i;47985:393::-;;;;;;;;;;-1:-1:-1;47985:393:0;;;;;:::i;:::-;;:::i;45704:58::-;;;;;;;;;;-1:-1:-1;45704:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25986:164;;;;;;;;;;-1:-1:-1;25986:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26107:25:0;;;26083:4;26107:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25986:164;2776:201;;;;;;;;;;-1:-1:-1;2776:201:0;;;;;:::i;:::-;;:::i;49470:202::-;49565:4;-1:-1:-1;;;;;;49589:35:0;;-1:-1:-1;;;49589:35:0;;:75;;;49628:36;49652:11;49628:23;:36::i;:::-;49582:82;49470:202;-1:-1:-1;;49470:202:0:o;49208:127::-;1940:6;;-1:-1:-1;;;;;1940:6:0;751:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;;;;;;:::i;:::-;;;;;;;;;49292:15:::1;:35:::0;;-1:-1:-1;;;;;49292:35:0;;::::1;;;-1:-1:-1::0;;;;;;49292:35:0;;::::1;::::0;;;::::1;::::0;;49208:127::o;23908:100::-;23962:13;23995:5;23988:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23908:100;:::o;25467:221::-;25543:7;28810:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28810:16:0;25563:73;;;;-1:-1:-1;;;25563:73:0;;15843:2:1;25563:73:0;;;15825:21:1;15882:2;15862:18;;;15855:30;15921:34;15901:18;;;15894:62;-1:-1:-1;;;15972:18:1;;;15965:42;16024:19;;25563:73:0;15815:234:1;25563:73:0;-1:-1:-1;25656:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25656:24:0;;25467:221::o;24990:411::-;25071:13;25087:23;25102:7;25087:14;:23::i;:::-;25071:39;;25135:5;-1:-1:-1;;;;;25129:11:0;:2;-1:-1:-1;;;;;25129:11:0;;;25121:57;;;;-1:-1:-1;;;25121:57:0;;17442:2:1;25121:57:0;;;17424:21:1;17481:2;17461:18;;;17454:30;17520:34;17500:18;;;17493:62;-1:-1:-1;;;17571:18:1;;;17564:31;17612:19;;25121:57:0;17414:223:1;25121:57:0;751:10;-1:-1:-1;;;;;25213:21:0;;;;:62;;-1:-1:-1;25238:37:0;25255:5;751:10;25986:164;:::i;25238:37::-;25191:168;;;;-1:-1:-1;;;25191:168:0;;13881:2:1;25191:168:0;;;13863:21:1;13920:2;13900:18;;;13893:30;13959:34;13939:18;;;13932:62;14030:26;14010:18;;;14003:54;14074:19;;25191:168:0;13853:246:1;25191:168:0;25372:21;25381:2;25385:7;25372:8;:21::i;:::-;24990:411;;;:::o;46106:116::-;46159:7;46186:28;:18;44312:14;;44220:114;46186:28;46179:35;;46106:116;:::o;26217:339::-;26412:41;751:10;26445:7;26412:18;:41::i;:::-;26404:103;;;;-1:-1:-1;;;26404:103:0;;;;;;;:::i;:::-;26520:28;26530:4;26536:2;26540:7;26520:9;:28::i;47131:166::-;1940:6;;-1:-1:-1;;;;;1940:6:0;751:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47235:40:0;;;::::1;;::::0;;;:22:::1;:40;::::0;;;;:54;;-1:-1:-1;;47235:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47131:166::o;46667:199::-;46802:15;;;;;-1:-1:-1;;;;;46802:15:0;46739:16;46844:14;46856:2;46844:9;:14;:::i;:::-;46828:30;;46667:199;;;;;:::o;37584:256::-;37681:7;37717:23;37734:5;37717:16;:23::i;:::-;37709:5;:31;37701:87;;;;-1:-1:-1;;;37701:87:0;;10407:2:1;37701:87:0;;;10389:21:1;10446:2;10426:18;;;10419:30;10485:34;10465:18;;;10458:62;-1:-1:-1;;;10536:18:1;;;10529:41;10587:19;;37701:87:0;10379:233:1;37701:87:0;-1:-1:-1;;;;;;37806:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37584:256::o;46230:429::-;46309:29;;:::i;:::-;46358:6;46353:299;46374:2;46370:1;:6;46353:299;;;46398:15;46421:9;:4;46428:2;46421:9;:::i;:::-;46416:15;;:1;:15;:::i;:::-;46398:33;;46463:23;46480:5;46463:16;:23::i;:::-;46450:10;:36;46446:195;;;46526:38;46546:5;46553:10;46526:19;:38::i;:::-;46507:13;46521:1;46507:16;;;;;-1:-1:-1;;;46507:16:0;;;;;;;;;;;;:57;46446:195;;;46624:1;46605:13;46619:1;46605:16;;;;;-1:-1:-1;;;46605:16:0;;;;;;;;;;;;:20;46446:195;-1:-1:-1;46378:3:0;;;;:::i;:::-;;;;46353:299;;;;46230:429;;;;:::o;26627:185::-;26765:39;26782:4;26788:2;26792:7;26765:39;;;;;;;;;;;;:16;:39::i;38106:233::-;38181:7;38217:30;38004:10;:17;;37916:113;38217:30;38209:5;:38;38201:95;;;;-1:-1:-1;;;38201:95:0;;18262:2:1;38201:95:0;;;18244:21:1;18301:2;18281:18;;;18274:30;18340:34;18320:18;;;18313:62;-1:-1:-1;;;18391:18:1;;;18384:42;18443:19;;38201:95:0;18234:234:1;38201:95:0;38314:10;38325:5;38314:17;;;;;;-1:-1:-1;;;38314:17:0;;;;;;;;;;;;;;;;;38307:24;;38106:233;;;:::o;23602:239::-;23674:7;23710:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23710:16:0;23745:19;23737:73;;;;-1:-1:-1;;;23737:73:0;;14717:2:1;23737:73:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:34;14775:18;;;14768:62;-1:-1:-1;;;14846:18:1;;;14839:39;14895:19;;23737:73:0;14689:231:1;45548:40:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23332:208::-;23404:7;-1:-1:-1;;;;;23432:19:0;;23424:74;;;;-1:-1:-1;;;23424:74:0;;14306:2:1;23424:74:0;;;14288:21:1;14345:2;14325:18;;;14318:30;14384:34;14364:18;;;14357:62;-1:-1:-1;;;14435:18:1;;;14428:40;14485:19;;23424:74:0;14278:232:1;23424:74:0;-1:-1:-1;;;;;;23516:16:0;;;;;:9;:16;;;;;;;23332:208::o;2518:103::-;1940:6;;-1:-1:-1;;;;;1940:6:0;751:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;;;;;;:::i;:::-;2583:30:::1;2610:1;2583:18;:30::i;:::-;2518:103::o:0;47305:175::-;1940:6;;-1:-1:-1;;;;;1940:6:0;751:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47414:44:0;;;::::1;;::::0;;;:26:::1;:44;::::0;;;;:58;;-1:-1:-1;;47414:58:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47305:175::o;49343:119::-;1940:6;;-1:-1:-1;;;;;1940:6:0;751:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;;;;;;:::i;:::-;49414:40:::1;::::0;-1:-1:-1;;;;;49414:17:0;::::1;::::0;49432:21:::1;49414:40:::0;::::1;;;::::0;::::1;::::0;;;49432:21;49414:17;:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49343:119:::0;:::o;24077:104::-;24133:13;24166:7;24159:14;;;;;:::i;25760:155::-;25855:52;751:10;25888:8;25898;25855:18;:52::i;48587:613::-;48706:10;48679:38;;;;:26;:38;;;;;;;;48671:77;;;;-1:-1:-1;;;48671:77:0;;15127:2:1;48671:77:0;;;15109:21:1;15166:2;15146:18;;;15139:30;15205:28;15185:18;;;15178:56;15251:18;;48671:77:0;15099:176:1;48671:77:0;28786:4;28810:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28810:16:0;48759:62;;;;-1:-1:-1;;;48759:62:0;;10005:2:1;48759:62:0;;;9987:21:1;10044:2;10024:18;;;10017:30;10083:34;10063:18;;;10056:62;-1:-1:-1;;;10134:18:1;;;10127:31;10175:19;;48759:62:0;9977:223:1;48759:62:0;48856:5;;;48840:21;;;48856:5;;48840:21;;48832:77;;;;-1:-1:-1;;;48832:77:0;;18675:2:1;48832:77:0;;;18657:21:1;18714:2;18694:18;;;18687:30;18753:34;18733:18;;;18726:62;-1:-1:-1;;;18804:18:1;;;18797:41;18855:19;;48832:77:0;18647:233:1;48832:77:0;48963:4;48928:23;48943:7;48928:14;:23::i;:::-;-1:-1:-1;;;;;48928:40:0;;;48920:99;;;;-1:-1:-1;;;48920:99:0;;17027:2:1;48920:99:0;;;17009:21:1;17066:2;17046:18;;;17039:30;17105:34;17085:18;;;17078:62;-1:-1:-1;;;17156:18:1;;;17149:44;17210:19;;48920:99:0;16999:236:1;48920:99:0;49032:30;:18;:28;:30::i;:::-;49073:59;49087:16;49095:7;49087;:16::i;:::-;49113:4;49120:7;49073:59;;;;;;;;;;;;:13;:59::i;:::-;49148:44;;;19237:25:1;;;19310:4;19298:17;;19293:2;19278:18;;19271:45;49148:44:0;;19210:18:1;49148:44:0;;;;;;;48587:613;;:::o;26883:328::-;27058:41;751:10;27091:7;27058:18;:41::i;:::-;27050:103;;;;-1:-1:-1;;;27050:103:0;;;;;;;:::i;:::-;27164:39;27178:4;27184:2;27188:7;27197:5;27164:13;:39::i;:::-;26883:328;;;;:::o;47488:489::-;47635:10;47608:38;;;;:26;:38;;;;;;;;47600:77;;;;-1:-1:-1;;;47600:77:0;;15127:2:1;47600:77:0;;;15109:21:1;15166:2;15146:18;;;15139:30;15205:28;15185:18;;;15178:56;15251:18;;47600:77:0;15099:176:1;47600:77:0;28786:4;28810:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28810:16:0;47690:203;;47728:25;47738:5;47745:7;47728:9;:25::i;:::-;47768:18;;;;:9;:18;;;;;:32;;47789:11;;47768:32;:::i;:::-;;47690:203;;;47833:48;47855:4;47862:5;47869:7;47833:48;;;;;;;;;;;;:13;:48::i;:::-;47903:30;:18;44431:19;;44449:1;44431:19;;;44342:127;47903:30;47949:20;;19031:25:1;;;47949:20:0;;19019:2:1;19004:18;47949:20:0;;;;;;;;47488:489;;;;:::o;46876:124::-;46974:18;;;;:9;:18;;;;;46967:25;;46941:13;;46974:18;46967:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46876:124;;;:::o;47985:393::-;48095:10;48072:34;;;;:22;:34;;;;;;;;48064:69;;;;-1:-1:-1;;;48064:69:0;;12358:2:1;48064:69:0;;;12340:21:1;12397:2;12377:18;;;12370:30;-1:-1:-1;;;12416:18:1;;;12409:52;12478:18;;48064:69:0;12330:172:1;48064:69:0;48146:12;48161:19;:9;44312:14;;44220:114;48161:19;:23;;48183:1;48161:23;:::i;:::-;48146:38;;48195:22;48205:2;48209:7;48195:9;:22::i;:::-;48228:18;;;;:9;:18;;;;;:32;;48249:11;;48228:32;:::i;:::-;;48271:21;:9;44431:19;;44449:1;44431:19;;;44342:127;48271:21;48303:30;:18;44431:19;;44449:1;44431:19;;;44342:127;48303:30;48351:19;;19031:25:1;;;48351:19:0;;19019:2:1;19004:18;48351:19:0;18986:76:1;2776:201:0;1940:6;;-1:-1:-1;;;;;1940:6:0;751:10;2087:23;2079:68;;;;-1:-1:-1;;;2079:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2865:22:0;::::1;2857:73;;;::::0;-1:-1:-1;;;2857:73:0;;11594:2:1;2857:73:0::1;::::0;::::1;11576:21:1::0;11633:2;11613:18;;;11606:30;11672:34;11652:18;;;11645:62;-1:-1:-1;;;11723:18:1;;;11716:36;11769:19;;2857:73:0::1;11566:228:1::0;2857:73:0::1;2941:28;2960:8;2941:18;:28::i;:::-;2776:201:::0;:::o;37276:224::-;37378:4;-1:-1:-1;;;;;;37402:50:0;;-1:-1:-1;;;37402:50:0;;:90;;;37456:36;37480:11;37456:23;:36::i;32703:174::-;32778:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32778:29:0;-1:-1:-1;;;;;32778:29:0;;;;;;;;:24;;32832:23;32778:24;32832:14;:23::i;:::-;-1:-1:-1;;;;;32823:46:0;;;;;;;;;;;32703:174;;:::o;29015:348::-;29108:4;28810:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28810:16:0;29125:73;;;;-1:-1:-1;;;29125:73:0;;13468:2:1;29125:73:0;;;13450:21:1;13507:2;13487:18;;;13480:30;13546:34;13526:18;;;13519:62;-1:-1:-1;;;13597:18:1;;;13590:42;13649:19;;29125:73:0;13440:234:1;29125:73:0;29209:13;29225:23;29240:7;29225:14;:23::i;:::-;29209:39;;29278:5;-1:-1:-1;;;;;29267:16:0;:7;-1:-1:-1;;;;;29267:16:0;;:51;;;;29311:7;-1:-1:-1;;;;;29287:31:0;:20;29299:7;29287:11;:20::i;:::-;-1:-1:-1;;;;;29287:31:0;;29267:51;:87;;;-1:-1:-1;;;;;;26107:25:0;;;26083:4;26107:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29322:32;29259:96;29015:348;-1:-1:-1;;;;29015:348:0:o;32007:578::-;32166:4;-1:-1:-1;;;;;32139:31:0;:23;32154:7;32139:14;:23::i;:::-;-1:-1:-1;;;;;32139:31:0;;32131:85;;;;-1:-1:-1;;;32131:85:0;;16617:2:1;32131:85:0;;;16599:21:1;16656:2;16636:18;;;16629:30;16695:34;16675:18;;;16668:62;-1:-1:-1;;;16746:18:1;;;16739:39;16795:19;;32131:85:0;16589:231:1;32131:85:0;-1:-1:-1;;;;;32235:16:0;;32227:65;;;;-1:-1:-1;;;32227:65:0;;12709:2:1;32227:65:0;;;12691:21:1;12748:2;12728:18;;;12721:30;12787:34;12767:18;;;12760:62;-1:-1:-1;;;12838:18:1;;;12831:34;12882:19;;32227:65:0;12681:226:1;32227:65:0;32305:39;32326:4;32332:2;32336:7;32305:20;:39::i;:::-;32409:29;32426:1;32430:7;32409:8;:29::i;:::-;-1:-1:-1;;;;;32451:15:0;;;;;;:9;:15;;;;;:20;;32470:1;;32451:15;:20;;32470:1;;32451:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32482:13:0;;;;;;:9;:13;;;;;:18;;32499:1;;32482:13;:18;;32499:1;;32482:18;:::i;:::-;;;;-1:-1:-1;;32511:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32511:21:0;-1:-1:-1;;;;;32511:21:0;;;;;;;;;32550:27;;32511:16;;32550:27;;;;;;;32007:578;;;:::o;3137:191::-;3230:6;;;-1:-1:-1;;;;;3247:17:0;;;-1:-1:-1;;;;;;3247:17:0;;;;;;;3280:40;;3230:6;;;3247:17;3230:6;;3280:40;;3211:16;;3280:40;3137:191;;:::o;33019:315::-;33174:8;-1:-1:-1;;;;;33165:17:0;:5;-1:-1:-1;;;;;33165:17:0;;;33157:55;;;;-1:-1:-1;;;33157:55:0;;13114:2:1;33157:55:0;;;13096:21:1;13153:2;13133:18;;;13126:30;13192:27;13172:18;;;13165:55;13237:18;;33157:55:0;13086:175:1;33157:55:0;-1:-1:-1;;;;;33223:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33223:46:0;;;;;;;;;;33285:41;;9320::1;;;33285::0;;9293:18:1;33285:41:0;;;;;;;33019:315;;;:::o;44477:235::-;44557:14;;44590:9;44582:49;;;;-1:-1:-1;;;44582:49:0;;10819:2:1;44582:49:0;;;10801:21:1;10858:2;10838:18;;;10831:30;10897:29;10877:18;;;10870:57;10944:18;;44582:49:0;10791:177:1;44582:49:0;-1:-1:-1;;44684:9:0;44667:26;;44477:235::o;28093:315::-;28250:28;28260:4;28266:2;28270:7;28250:9;:28::i;:::-;28297:48;28320:4;28326:2;28330:7;28339:5;28297:22;:48::i;:::-;28289:111;;;;-1:-1:-1;;;28289:111:0;;;;;;;:::i;29705:110::-;29781:26;29791:2;29795:7;29781:26;;;;;;;;;;;;:9;:26::i;22963:305::-;23065:4;-1:-1:-1;;;;;;23102:40:0;;-1:-1:-1;;;23102:40:0;;:105;;-1:-1:-1;;;;;;;23159:48:0;;-1:-1:-1;;;23159:48:0;23102:105;:158;;;-1:-1:-1;;;;;;;;;;21599:40:0;;;23224:36;21490:157;38952:589;-1:-1:-1;;;;;39158:18:0;;39154:187;;39193:40;39225:7;40368:10;:17;;40341:24;;;;:15;:24;;;;;:44;;;40396:24;;;;;;;;;;;;40264:164;39193:40;39154:187;;;39263:2;-1:-1:-1;;;;;39255:10:0;:4;-1:-1:-1;;;;;39255:10:0;;39251:90;;39282:47;39315:4;39321:7;39282:32;:47::i;:::-;-1:-1:-1;;;;;39355:16:0;;39351:183;;39388:45;39425:7;39388:36;:45::i;39351:183::-;39461:4;-1:-1:-1;;;;;39455:10:0;:2;-1:-1:-1;;;;;39455:10:0;;39451:83;;39482:40;39510:2;39514:7;39482:27;:40::i;33899:799::-;34054:4;-1:-1:-1;;;;;34075:13:0;;11660:20;11708:8;34071:620;;34111:72;;-1:-1:-1;;;34111:72:0;;-1:-1:-1;;;;;34111:36:0;;;;;:72;;751:10;;34162:4;;34168:7;;34177:5;;34111:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34111:72:0;;;;;;;;-1:-1:-1;;34111:72:0;;;;;;;;;;;;:::i;:::-;;;34107:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34353:13:0;;34349:272;;34396:60;;-1:-1:-1;;;34396:60:0;;;;;;;:::i;34349:272::-;34571:6;34565:13;34556:6;34552:2;34548:15;34541:38;34107:529;-1:-1:-1;;;;;;34234:51:0;-1:-1:-1;;;34234:51:0;;-1:-1:-1;34227:58:0;;34071:620;-1:-1:-1;34675:4:0;33899:799;;;;;;:::o;30042:321::-;30172:18;30178:2;30182:7;30172:5;:18::i;:::-;30223:54;30254:1;30258:2;30262:7;30271:5;30223:22;:54::i;:::-;30201:154;;;;-1:-1:-1;;;30201:154:0;;;;;;;:::i;41055:988::-;41321:22;41371:1;41346:22;41363:4;41346:16;:22::i;:::-;:26;;;;:::i;:::-;41383:18;41404:26;;;:17;:26;;;;;;41321:51;;-1:-1:-1;41537:28:0;;;41533:328;;-1:-1:-1;;;;;41604:18:0;;41582:19;41604:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41655:30;;;;;;:44;;;41772:30;;:17;:30;;;;;:43;;;41533:328;-1:-1:-1;41957:26:0;;;;:17;:26;;;;;;;;41950:33;;;-1:-1:-1;;;;;42001:18:0;;;;;:12;:18;;;;;:34;;;;;;;41994:41;41055:988::o;42338:1079::-;42616:10;:17;42591:22;;42616:21;;42636:1;;42616:21;:::i;:::-;42648:18;42669:24;;;:15;:24;;;;;;43042:10;:26;;42591:46;;-1:-1:-1;42669:24:0;;42591:46;;43042:26;;;;-1:-1:-1;;;43042:26:0;;;;;;;;;;;;;;;;;43020:48;;43106:11;43081:10;43092;43081:22;;;;;;-1:-1:-1;;;43081:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;43186:28;;;:15;:28;;;;;;;:41;;;43358:24;;;;;43351:31;43393:10;:16;;;;;-1:-1:-1;;;43393:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;42338:1079;;;;:::o;39842:221::-;39927:14;39944:20;39961:2;39944:16;:20::i;:::-;-1:-1:-1;;;;;39975:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40020:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39842:221:0:o;30699:382::-;-1:-1:-1;;;;;30779:16:0;;30771:61;;;;-1:-1:-1;;;30771:61:0;;15482:2:1;30771:61:0;;;15464:21:1;;;15501:18;;;15494:30;15560:34;15540:18;;;15533:62;15612:18;;30771:61:0;15454:182:1;30771:61:0;28786:4;28810:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28810:16:0;:30;30843:58;;;;-1:-1:-1;;;30843:58:0;;12001:2:1;30843:58:0;;;11983:21:1;12040:2;12020:18;;;12013:30;12079;12059:18;;;12052:58;12127:18;;30843:58:0;11973:178:1;30843:58:0;30914:45;30943:1;30947:2;30951:7;30914:20;:45::i;:::-;-1:-1:-1;;;;;30972:13:0;;;;;;:9;:13;;;;;:18;;30989:1;;30972:13;:18;;30989:1;;30972:18;:::i;:::-;;;;-1:-1:-1;;31001:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31001:21:0;-1:-1:-1;;;;;31001:21:0;;;;;;;;31040:33;;31001:16;;;31040:33;;31001:16;;31040:33;30699:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:375:1;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:2;;154:8;144;137:26;96:2;-1:-1:-1;184:20:1;;227:18;216:30;;213:2;;;266:8;256;249:26;213:2;310:4;302:6;298:17;286:29;;362:3;355:4;346:6;338;334:19;330:30;327:39;324:2;;;379:1;376;369:12;324:2;86:303;;;;;:::o;394:257::-;453:6;506:2;494:9;485:7;481:23;477:32;474:2;;;527:6;519;512:22;474:2;571:9;558:23;590:31;615:5;590:31;:::i;:::-;640:5;464:187;-1:-1:-1;;;464:187:1:o;926:398::-;994:6;1002;1055:2;1043:9;1034:7;1030:23;1026:32;1023:2;;;1076:6;1068;1061:22;1023:2;1120:9;1107:23;1139:31;1164:5;1139:31;:::i;:::-;1189:5;-1:-1:-1;1246:2:1;1231:18;;1218:32;1259:33;1218:32;1259:33;:::i;:::-;1311:7;1301:17;;;1013:311;;;;;:::o;1329:466::-;1406:6;1414;1422;1475:2;1463:9;1454:7;1450:23;1446:32;1443:2;;;1496:6;1488;1481:22;1443:2;1540:9;1527:23;1559:31;1584:5;1559:31;:::i;:::-;1609:5;-1:-1:-1;1666:2:1;1651:18;;1638:32;1679:33;1638:32;1679:33;:::i;:::-;1433:362;;1731:7;;-1:-1:-1;;;1785:2:1;1770:18;;;;1757:32;;1433:362::o;1800:774::-;1897:6;1905;1913;1921;1929;1982:3;1970:9;1961:7;1957:23;1953:33;1950:2;;;2004:6;1996;1989:22;1950:2;2048:9;2035:23;2067:31;2092:5;2067:31;:::i;:::-;2117:5;-1:-1:-1;2174:2:1;2159:18;;2146:32;2187:33;2146:32;2187:33;:::i;:::-;2239:7;-1:-1:-1;2293:2:1;2278:18;;2265:32;;-1:-1:-1;2348:2:1;2333:18;;2320:32;2375:18;2364:30;;2361:2;;;2412:6;2404;2397:22;2361:2;2456:58;2506:7;2497:6;2486:9;2482:22;2456:58;:::i;:::-;1940:634;;;;-1:-1:-1;1940:634:1;;-1:-1:-1;2533:8:1;;2430:84;1940:634;-1:-1:-1;;;1940:634:1:o;2579:1311::-;2674:6;2682;2690;2698;2751:3;2739:9;2730:7;2726:23;2722:33;2719:2;;;2773:6;2765;2758:22;2719:2;2817:9;2804:23;2836:31;2861:5;2836:31;:::i;:::-;2886:5;-1:-1:-1;2943:2:1;2928:18;;2915:32;2956:33;2915:32;2956:33;:::i;:::-;3008:7;-1:-1:-1;3062:2:1;3047:18;;3034:32;;-1:-1:-1;3117:2:1;3102:18;;3089:32;3140:18;3170:14;;;3167:2;;;3202:6;3194;3187:22;3167:2;3245:6;3234:9;3230:22;3220:32;;3290:7;3283:4;3279:2;3275:13;3271:27;3261:2;;3317:6;3309;3302:22;3261:2;3358;3345:16;3380:2;3376;3373:10;3370:2;;;3386:18;;:::i;:::-;3461:2;3455:9;3429:2;3515:13;;-1:-1:-1;;3511:22:1;;;3535:2;3507:31;3503:40;3491:53;;;3559:18;;;3579:22;;;3556:46;3553:2;;;3605:18;;:::i;:::-;3645:10;3641:2;3634:22;3680:2;3672:6;3665:18;3720:7;3715:2;3710;3706;3702:11;3698:20;3695:33;3692:2;;;3746:6;3738;3731:22;3692:2;3807;3802;3798;3794:11;3789:2;3781:6;3777:15;3764:46;3830:15;;;3847:2;3826:24;3819:40;;;;2709:1181;;;;-1:-1:-1;2709:1181:1;;-1:-1:-1;;;;2709:1181:1:o;3895:436::-;3960:6;3968;4021:2;4009:9;4000:7;3996:23;3992:32;3989:2;;;4042:6;4034;4027:22;3989:2;4086:9;4073:23;4105:31;4130:5;4105:31;:::i;:::-;4155:5;-1:-1:-1;4212:2:1;4197:18;;4184:32;4254:15;;4247:23;4235:36;;4225:2;;4290:6;4282;4275:22;4336:565;4416:6;4424;4432;4485:2;4473:9;4464:7;4460:23;4456:32;4453:2;;;4506:6;4498;4491:22;4453:2;4550:9;4537:23;4569:31;4594:5;4569:31;:::i;:::-;4619:5;-1:-1:-1;4675:2:1;4660:18;;4647:32;4702:18;4691:30;;4688:2;;;4739:6;4731;4724:22;4688:2;4783:58;4833:7;4824:6;4813:9;4809:22;4783:58;:::i;:::-;4443:458;;4860:8;;-1:-1:-1;4757:84:1;;-1:-1:-1;;;;4443:458:1:o;4906:325::-;4974:6;4982;5035:2;5023:9;5014:7;5010:23;5006:32;5003:2;;;5056:6;5048;5041:22;5003:2;5100:9;5087:23;5119:31;5144:5;5119:31;:::i;:::-;5169:5;5221:2;5206:18;;;;5193:32;;-1:-1:-1;;;4993:238:1:o;5236:255::-;5294:6;5347:2;5335:9;5326:7;5322:23;5318:32;5315:2;;;5368:6;5360;5353:22;5315:2;5412:9;5399:23;5431:30;5455:5;5431:30;:::i;5496:259::-;5565:6;5618:2;5606:9;5597:7;5593:23;5589:32;5586:2;;;5639:6;5631;5624:22;5586:2;5676:9;5670:16;5695:30;5719:5;5695:30;:::i;5760:190::-;5819:6;5872:2;5860:9;5851:7;5847:23;5843:32;5840:2;;;5893:6;5885;5878:22;5840:2;-1:-1:-1;5921:23:1;;5830:120;-1:-1:-1;5830:120:1:o;5955:633::-;6044:6;6052;6060;6068;6121:2;6109:9;6100:7;6096:23;6092:32;6089:2;;;6142:6;6134;6127:22;6089:2;6183:9;6170:23;6160:33;;6244:2;6233:9;6229:18;6216:32;6271:18;6263:6;6260:30;6257:2;;;6308:6;6300;6293:22;6257:2;6352:58;6402:7;6393:6;6382:9;6378:22;6352:58;:::i;:::-;6429:8;;-1:-1:-1;6326:84:1;-1:-1:-1;;6514:2:1;6499:18;;6486:32;6527:31;6486:32;6527:31;:::i;:::-;6079:509;;;;-1:-1:-1;6079:509:1;;-1:-1:-1;;6079:509:1:o;6593:258::-;6661:6;6669;6722:2;6710:9;6701:7;6697:23;6693:32;6690:2;;;6743:6;6735;6728:22;6690:2;-1:-1:-1;;6771:23:1;;;6841:2;6826:18;;;6813:32;;-1:-1:-1;6680:171:1:o;6856:357::-;6922:6;6930;6983:2;6971:9;6962:7;6958:23;6954:32;6951:2;;;7004:6;6996;6989:22;6951:2;7045:9;7032:23;7022:33;;7105:2;7094:9;7090:18;7077:32;7149:4;7142:5;7138:16;7131:5;7128:27;7118:2;;7174:6;7166;7159:22;7218:475;7259:3;7297:5;7291:12;7324:6;7319:3;7312:19;7349:3;7361:162;7375:6;7372:1;7369:13;7361:162;;;7437:4;7493:13;;;7489:22;;7483:29;7465:11;;;7461:20;;7454:59;7390:12;7361:162;;;7541:6;7538:1;7535:13;7532:2;;;7607:3;7600:4;7591:6;7586:3;7582:16;7578:27;7571:40;7532:2;-1:-1:-1;7675:2:1;7654:15;-1:-1:-1;;7650:29:1;7641:39;;;;7682:4;7637:50;;7267:426;-1:-1:-1;;7267:426:1:o;7906:488::-;-1:-1:-1;;;;;8175:15:1;;;8157:34;;8227:15;;8222:2;8207:18;;8200:43;8274:2;8259:18;;8252:34;;;8322:3;8317:2;8302:18;;8295:31;;;8100:4;;8343:45;;8368:19;;8360:6;8343:45;:::i;:::-;8335:53;8109:285;-1:-1:-1;;;;;;8109:285:1:o;8678:497::-;8860:3;8845:19;;8849:9;8941:6;8818:4;8975:194;8989:4;8986:1;8983:11;8975:194;;;9048:13;;9036:26;;9085:4;9109:12;;;;9144:15;;;;9009:1;9002:9;8975:194;;;8979:3;;;8827:348;;;;:::o;9579:219::-;9728:2;9717:9;9710:21;9691:4;9748:44;9788:2;9777:9;9773:18;9765:6;9748:44;:::i;10973:414::-;11175:2;11157:21;;;11214:2;11194:18;;;11187:30;11253:34;11248:2;11233:18;;11226:62;-1:-1:-1;;;11319:2:1;11304:18;;11297:48;11377:3;11362:19;;11147:240::o;16054:356::-;16256:2;16238:21;;;16275:18;;;16268:30;16334:34;16329:2;16314:18;;16307:62;16401:2;16386:18;;16228:182::o;17642:413::-;17844:2;17826:21;;;17883:2;17863:18;;;17856:30;17922:34;17917:2;17902:18;;17895:62;-1:-1:-1;;;17988:2:1;17973:18;;17966:47;18045:3;18030:19;;17816:239::o;19516:128::-;19556:3;19587:1;19583:6;19580:1;19577:13;19574:2;;;19593:18;;:::i;:::-;-1:-1:-1;19629:9:1;;19564:80::o;19649:217::-;19689:1;19715;19705:2;;-1:-1:-1;;;19740:31:1;;19794:4;19791:1;19784:15;19822:4;19747:1;19812:15;19705:2;-1:-1:-1;19851:9:1;;19695:171::o;19871:168::-;19911:7;19977:1;19973;19969:6;19965:14;19962:1;19959:21;19954:1;19947:9;19940:17;19936:45;19933:2;;;19984:18;;:::i;:::-;-1:-1:-1;20024:9:1;;19923:116::o;20044:125::-;20084:4;20112:1;20109;20106:8;20103:2;;;20117:18;;:::i;:::-;-1:-1:-1;20154:9:1;;20093:76::o;20174:380::-;20253:1;20249:12;;;;20296;;;20317:2;;20371:4;20363:6;20359:17;20349:27;;20317:2;20424;20416:6;20413:14;20393:18;20390:38;20387:2;;;20470:10;20465:3;20461:20;20458:1;20451:31;20505:4;20502:1;20495:15;20533:4;20530:1;20523:15;20387:2;;20229:325;;;:::o;20559:135::-;20598:3;-1:-1:-1;;20619:17:1;;20616:2;;;20639:18;;:::i;:::-;-1:-1:-1;20686:1:1;20675:13;;20606:88::o;20699:127::-;20760:10;20755:3;20751:20;20748:1;20741:31;20791:4;20788:1;20781:15;20815:4;20812:1;20805:15;20831:127;20892:10;20887:3;20883:20;20880:1;20873:31;20923:4;20920:1;20913:15;20947:4;20944:1;20937:15;20963:131;-1:-1:-1;;;;;21038:31:1;;21028:42;;21018:2;;21084:1;21081;21074:12;21099:131;-1:-1:-1;;;;;;21173:32:1;;21163:43;;21153:2;;21220:1;21217;21210:12
Swarm Source
ipfs://99310aacc15cc04a9a697a24a614078510c146e0df962f69eb4e89a6fccb2c34
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.