ERC-721
Overview
Max Total Supply
101 nXOC
Holders
63
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OtakuCoin
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-21 */ // Sources flattened with hardhat v2.1.1 https://hardhat.org // File openzeppelin-solidity/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File openzeppelin-solidity/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File openzeppelin-solidity/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface 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-solidity/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface 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-solidity/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File openzeppelin-solidity/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File openzeppelin-solidity/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File contracts/erc/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. 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 || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` 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 { } } // File contracts/roles/Roles.sol pragma solidity ^0.8.0; library Roles { struct Role { mapping(address => bool) bearer; } function add(Role storage role, address account) internal { require(!has(role, account), "role already has the account"); role.bearer[account] = true; } function remove(Role storage role, address account) internal { require(has(role, account), "role dosen't have the account"); role.bearer[account] = false; } function has(Role storage role, address account) internal view returns (bool) { return role.bearer[account]; } } // File contracts/roles/ERC173.sol pragma solidity ^0.8.0; //import "openzeppelin-solidity/contracts/utils/introspection/ERC165.sol"; /// @title ERC-173 Contract Ownership Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-173.md /// Note: the ERC-165 identifier for this interface is 0x7f5828d0 interface IERC173 /* is ERC165 */ { /// @dev This emits when ownership of a contract changes. event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @notice Get the address of the owner /// @return The address of the owner. function owner() external view returns (address); /// @notice Set the address of the new owner of the contract /// @param _newOwner The address of the new owner of the contract function transferOwnership(address _newOwner) external; } abstract contract ERC173 is IERC173 { address private _owner; constructor() { _transferOwnership(msg.sender); } modifier onlyOwner() { require(msg.sender == owner(), "Must be owner"); _; } function owner() override public view returns (address) { return _owner; } function transferOwnership(address _newOwner) virtual override public onlyOwner() { _transferOwnership(_newOwner); } function _transferOwnership(address _newOwner) internal { address previousOwner = owner(); _owner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } } // File contracts/roles/Operatable.sol pragma solidity ^0.8.0; abstract contract Operatable is ERC173 { using Roles for Roles.Role; event OperatorAdded(address indexed account); event OperatorRemoved(address indexed account); event Paused(address account); event Unpaused(address account); bool private _paused; Roles.Role private operators; constructor() { operators.add(msg.sender); _paused = false; } modifier onlyOperator() { require(isOperator(msg.sender), "Must be operator"); _; } modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } function transferOwnership(address _newOwner) public override onlyOperator() { _transferOwnership(_newOwner); } function isOperator(address account) public view returns (bool) { return operators.has(account); } function addOperator(address account) public onlyOperator() { operators.add(account); emit OperatorAdded(account); } function removeOperator(address account) public onlyOperator() { operators.remove(account); emit OperatorRemoved(account); } function paused() public view returns (bool) { return _paused; } function pause() public onlyOperator() whenNotPaused() { _paused = true; emit Paused(msg.sender); } function unpause() public onlyOperator() whenPaused() { _paused = false; emit Unpaused(msg.sender); } } // File contracts/erc/ERC721Mintable.sol pragma solidity ^0.8.0; interface IERC721Mintable { event MinterAdded(address indexed account); event MinterRemoved(address indexed account); function exists(uint256 _tokenId) external view returns (bool); function mint(address _to, uint256 _tokenId) external; function isMinter(address account) external view returns (bool); function addMinter(address account) external; function removeMinter(address account) external; } abstract contract ERC721Mintable is ERC721, IERC721Mintable, Operatable { using Roles for Roles.Role; Roles.Role private minters; constructor () { addMinter(msg.sender); } modifier onlyMinter() { require(isMinter(msg.sender), "Must be minter"); _; } function isMinter(address account) override public view returns (bool) { return minters.has(account); } function addMinter(address account) override public onlyOperator() { minters.add(account); emit MinterAdded(account); } function removeMinter(address account) override public onlyOperator() { minters.remove(account); emit MinterRemoved(account); } function exists(uint256 tokenId) override public view returns (bool) { return super._exists(tokenId); } function mint(address to, uint256 tokenId) virtual override public onlyMinter() { super._mint(to, tokenId); } } // File contracts/erc/ERC721Metadata.sol pragma solidity ^0.8.0; abstract contract ERC721Metadata is IERC721Metadata, ERC721, Operatable { using Strings for uint256; string private _defaultURI; string private baseURI; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; event UpdateDefaultURI(string defaultURI); event UpdateBaseURI(string baseURI); event UpdateTokenURI(uint256 tokenId, string tokenURI); constructor(string memory name_, string memory symbol_, string memory defaultURI_) ERC721(name_, symbol_) { setDefaultURI(defaultURI_); } function setDefaultURI(string memory defaultURI_) public onlyOperator() { _defaultURI = defaultURI_; emit UpdateDefaultURI(_defaultURI); } function setBaseURI(string memory baseURI_) public onlyOperator() { baseURI = baseURI_; emit UpdateBaseURI(baseURI_); } function getTokenURI(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId), "getTokenURI query for nonexistent token"); return _tokenURIs[tokenId]; } // set specific uri by tokenID function setTokenURI(uint256 tokenId, string memory _tokenURI) public onlyOperator() { require(_exists(tokenId), "setTokenURI query for nonexistent token"); _tokenURIs[tokenId] = _tokenURI; emit UpdateTokenURI(tokenId, _tokenURI); } function tokenURI(uint256 tokenId) virtual public view override(IERC721Metadata, ERC721) returns (string memory) { string memory _tokenURI = getTokenURI(tokenId); // baseURI + sepecific _tokenURI if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(baseURI, tokenId.toString())); } // If there is no tokenURI, defaultURI + tokenID return string(abi.encodePacked(_defaultURI, tokenId.toString())); } } // File contracts/rarible/IHasSecondarySaleFees.sol pragma solidity ^0.8.0; interface IHasSecondarySaleFees { function getFeeBps(uint256 id) external view returns (uint256[] memory); function getFeeRecipients(uint256 id) external view returns (address payable[] memory); } // File contracts/rarible/HasSecondarySaleFees.sol pragma solidity ^0.8.0; abstract contract HasSecondarySaleFees is IERC165, ERC721, IHasSecondarySaleFees { address payable[] private defaultRoyaltyAddressMemory; uint256[] private defaultRoyaltyMemory; mapping(uint256 => address payable[]) private royaltyAddressMemory; mapping(uint256 => uint256[]) private royaltyMemory; function _setRoyality( uint256 _tokenId, address payable[] memory _royaltyAddress, uint256[] memory _royalty ) internal { require(_royaltyAddress.length == _royalty.length, "input length must be same"); royaltyAddressMemory[_tokenId] = _royaltyAddress; royaltyMemory[_tokenId] = _royalty; } function _setDefaultRoyality(address payable[] memory _royaltyAddress, uint256[] memory _royalty) internal { require(_royaltyAddress.length == _royalty.length, "input length must be same"); defaultRoyaltyAddressMemory = _royaltyAddress; defaultRoyaltyMemory = _royalty; } function getFeeRecipients(uint256 _tokenId) external view override returns (address payable[] memory) { return royaltyAddressMemory[_tokenId].length > 0 ? royaltyAddressMemory[_tokenId] : defaultRoyaltyAddressMemory; } function getFeeBps(uint256 _tokenId) external view override returns (uint256[] memory) { return royaltyMemory[_tokenId].length > 0 ? royaltyMemory[_tokenId] : defaultRoyaltyMemory; } } // File contracts/OtakuCoin.sol pragma solidity 0.8.1; contract OtakuCoin is ERC721Mintable, ERC721Metadata( "Limited Edition Otaku Coin", "nXOC", "https://nftstudio.herokuapp.com/api/metadata/otakucoin/" ), HasSecondarySaleFees { uint256 private totalCount = 0; constructor() {} function setDefaultRoyality(address payable[] memory _royaltyAddress, uint256[] memory _royalty) public onlyOwner { _setDefaultRoyality(_royaltyAddress, _royalty); } function setCustomRoyality( uint256 _tokenId, address payable[] memory _royaltyAddress, uint256[] memory _royalty ) public onlyOwner { _setRoyality(_tokenId, _royaltyAddress, _royalty); } function setCustomRoyality( uint256[] memory _tokenIdList, address payable[][] memory _royaltyAddressList, uint256[][] memory _royaltyList ) public onlyOwner { require( _tokenIdList.length == _royaltyAddressList.length && _tokenIdList.length == _royaltyList.length, "input length must be same" ); for (uint256 i = 0; i < _tokenIdList.length; i++) { _setRoyality(_tokenIdList[i], _royaltyAddressList[i], _royaltyList[i]); } } function mint(address to, uint256 tokenId) public override onlyMinter() { totalCount++; super.mint(to, tokenId); } function bulkMint(address[] memory _tos, uint256[] memory _tokenIds) public onlyMinter { require(_tos.length == _tokenIds.length); uint8 i; for (i = 0; i < _tos.length; i++) { mint(_tos[i], _tokenIds[i]); } } function totalSupply() public view returns (uint256) { return totalCount; } function tokenURI(uint256 tokenId) public view override(ERC721Metadata, ERC721) returns (string memory) { return super.tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"UpdateBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"defaultURI","type":"string"}],"name":"UpdateDefaultURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"UpdateTokenURI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"bulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable[]","name":"_royaltyAddress","type":"address[]"},{"internalType":"uint256[]","name":"_royalty","type":"uint256[]"}],"name":"setCustomRoyality","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIdList","type":"uint256[]"},{"internalType":"address payable[][]","name":"_royaltyAddressList","type":"address[][]"},{"internalType":"uint256[][]","name":"_royaltyList","type":"uint256[][]"}],"name":"setCustomRoyality","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"_royaltyAddress","type":"address[]"},{"internalType":"uint256[]","name":"_royalty","type":"uint256[]"}],"name":"setDefaultRoyality","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"defaultURI_","type":"string"}],"name":"setDefaultURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006010553480156200001657600080fd5b506040518060400160405280601a81526020017f4c696d697465642045646974696f6e204f74616b7520436f696e000000000000815250604051806040016040528060048152602001636e584f4360e01b81525060405180606001604052806037815260200162003025603791398251839083906200009d90600090602085019062000312565b508051620000b390600190602084019062000312565b505050620000c7336200010e60201b60201c565b620000e23360076200016e60201b620011e21790919060201c565b6006805460ff60a01b19169055620000fa33620001c8565b620001058162000244565b50505062000521565b60006200011a620002c1565b600680546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200017a8282620002d0565b15620001a35760405162461bcd60e51b81526004016200019a9062000498565b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b620001d333620002ef565b620001f25760405162461bcd60e51b81526004016200019a906200046e565b6200020d8160086200016e60201b620011e21790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6200024f33620002ef565b6200026e5760405162461bcd60e51b81526004016200019a906200046e565b80516200028390600990602084019062000312565b507f2405b30cce1d59580c3cc7fbdce2d552bd8e943d5dc4f66a37053027fc7ce8806009604051620002b69190620003b8565b60405180910390a150565b6006546001600160a01b031690565b6001600160a01b03166000908152602091909152604090205460ff1690565b60006200030c826007620002d060201b6200122e1790919060201c565b92915050565b8280546200032090620004e4565b90600052602060002090601f0160209004810192826200034457600085556200038f565b82601f106200035f57805160ff19168380011785556200038f565b828001600101855582156200038f579182015b828111156200038f57825182559160200191906001019062000372565b506200039d929150620003a1565b5090565b5b808211156200039d5760008155600101620003a2565b6000602080835281845483600282049050600180831680620003db57607f831692505b858310811415620003fa57634e487b7160e01b87526022600452602487fd5b6200040883878a01620004db565b8180156200041f576001811462000431576200045f565b60ff198616825287820196506200045f565b6200043c8b620004cf565b895b8681101562000459578154848201529085019089016200043e565b83019750505b50949998505050505050505050565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b6020808252601c908201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604082015260600190565b60009081526020902090565b90815260200190565b600281046001821680620004f957607f821691505b602082108114156200051b57634e487b7160e01b600052602260045260246000fd5b50919050565b612af480620005316000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636352211e116101305780639870d7fe116100b8578063b9c4d9fb1161007c578063b9c4d9fb1461048b578063c87b56dd146104ab578063da1b9e08146104be578063e985e9c5146104d1578063f2fde38b146104e457610227565b80639870d7fe1461042c578063a22cb4651461043f578063aa271e1a14610452578063ac8a584a14610465578063b88d4fde1461047857610227565b806374962126116100ff57806374962126146103ee5780638456cb59146104015780638da5cb5b1461040957806395d89b4114610411578063983b2d561461041957610227565b80636352211e146103a25780636ae459bd146103b55780636d70f7ae146103c857806370a08231146103db57610227565b806323b872dd116101b357806340c10f191161018257806340c10f191461034e57806342842e0e146103615780634f558e791461037457806355f804b3146103875780635c975abb1461039a57610227565b806323b872dd1461030d5780633092afd5146103205780633bb3a24d146103335780633f4ba83a1461034657610227565b8063095ea7b3116101fa578063095ea7b31461029f5780630ebd4c7f146102b2578063162094c4146102d257806318160ddd146102e55780631f1288be146102fa57610227565b806301e8c1b01461022c57806301ffc9a71461024157806306fdde031461026a578063081812fc1461027f575b600080fd5b61023f61023a366004612085565b6104f7565b005b61025461024f366004612002565b610548565b60405161026191906122a2565b60405180910390f35b610272610590565b60405161026191906122ad565b61029261028d36600461206d565b610622565b60405161026191906121cc565b61023f6102ad366004611dfb565b610665565b6102c56102c036600461206d565b6106f8565b604051610261919061226a565b61023f6102e03660046120e5565b61077a565b6102ed610821565b60405161026191906128e1565b61023f610308366004611ee6565b610827565b61023f61031b366004611d0d565b61086d565b61023f61032e366004611cb9565b6108a5565b61027261034136600461206d565b61090c565b61023f6109c7565b61023f61035c366004611dfb565b610a5c565b61023f61036f366004611d0d565b610aa0565b61025461038236600461206d565b610abb565b61023f61039536600461203a565b610ac6565b610254610b39565b6102926103b036600461206d565b610b49565b61023f6103c3366004611e26565b610b7e565b6102546103d6366004611cb9565b610c30565b6102ed6103e9366004611cb9565b610c3d565b61023f6103fc366004611f30565b610c81565b61023f610d8b565b610292610e1d565b610272610e2c565b61023f610427366004611cb9565b610e3b565b61023f61043a366004611cb9565b610ea2565b61023f61044d366004611dca565b610f09565b610254610460366004611cb9565b610fd7565b61023f610473366004611cb9565b610fe4565b61023f610486366004611d4d565b61104b565b61049e61049936600461206d565b611084565b604051610261919061221d565b6102726104b936600461206d565b61110f565b61023f6104cc36600461203a565b61111a565b6102546104df366004611cd5565b611183565b61023f6104f2366004611cb9565b6111b1565b6104ff610e1d565b6001600160a01b0316336001600160a01b0316146105385760405162461bcd60e51b815260040161052f90612603565b60405180910390fd5b61054383838361124d565b505050565b60006001600160e01b031982166380ac58cd60e01b148061057957506001600160e01b03198216635b5e139f60e01b145b806105885750610588826112ad565b90505b919050565b60606000805461059f906129c7565b80601f01602080910402602001604051908101604052809291908181526020018280546105cb906129c7565b80156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b600061062d826112c6565b6106495760405162461bcd60e51b815260040161052f906126a6565b506000908152600460205260409020546001600160a01b031690565b600061067082610b49565b9050806001600160a01b0316836001600160a01b031614156106a45760405162461bcd60e51b815260040161052f906127b9565b806001600160a01b03166106b66112e3565b6001600160a01b031614806106d257506106d2816104df6112e3565b6106ee5760405162461bcd60e51b815260040161052f90612513565b61054383836112e7565b6000818152600f602052604090205460609061071557600d610724565b6000828152600f602052604090205b80548060200260200160405190810160405280929190818152602001828054801561076e57602002820191906000526020600020905b81548152602001906001019080831161075a575b50505050509050919050565b61078333610c30565b61079f5760405162461bcd60e51b815260040161052f9061236f565b6107a8826112c6565b6107c45760405162461bcd60e51b815260040161052f9061273b565b6000828152600b6020908152604090912082516107e3928401906119ef565b507f0418254f69edc41d3d2b429767526234e99f60018e7e21cda80307bf3ef28cc482826040516108159291906128ea565b60405180910390a15050565b60105490565b61082f610e1d565b6001600160a01b0316336001600160a01b03161461085f5760405162461bcd60e51b815260040161052f90612603565b6108698282611355565b5050565b61087e6108786112e3565b8261139d565b61089a5760405162461bcd60e51b815260040161052f906127fa565b610543838383611422565b6108ae33610c30565b6108ca5760405162461bcd60e51b815260040161052f9061236f565b6108d560088261154f565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6060610917826112c6565b6109335760405162461bcd60e51b815260040161052f9061262a565b6000828152600b60205260409020805461094c906129c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610978906129c7565b801561076e5780601f1061099a5761010080835404028352916020019161076e565b820191906000526020600020905b8154815290600101906020018083116109a85750939695505050505050565b6109d033610c30565b6109ec5760405162461bcd60e51b815260040161052f9061236f565b600654600160a01b900460ff16610a155760405162461bcd60e51b815260040161052f90612341565b6006805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90610a529033906121cc565b60405180910390a1565b610a6533610fd7565b610a815760405162461bcd60e51b815260040161052f90612882565b60108054906000610a9183612a02565b91905055506108698282611597565b6105438383836040518060200160405280600081525061104b565b6000610588826112c6565b610acf33610c30565b610aeb5760405162461bcd60e51b815260040161052f9061236f565b8051610afe90600a9060208401906119ef565b507f157d450c8fb1377294d9db75af1de2753efc52d8e5578551d70d2c7d9cd74df981604051610b2e91906122ad565b60405180910390a150565b600654600160a01b900460ff1690565b6000818152600260205260408120546001600160a01b0316806105885760405162461bcd60e51b815260040161052f906125ba565b610b8733610fd7565b610ba35760405162461bcd60e51b815260040161052f90612882565b8051825114610bb157600080fd5b60005b82518160ff16101561054357610c1e838260ff1681518110610be657634e487b7160e01b600052603260045260246000fd5b6020026020010151838360ff1681518110610c1157634e487b7160e01b600052603260045260246000fd5b6020026020010151610a5c565b80610c2881612a1d565b915050610bb4565b600061058860078361122e565b60006001600160a01b038216610c655760405162461bcd60e51b815260040161052f90612570565b506001600160a01b031660009081526003602052604090205490565b610c89610e1d565b6001600160a01b0316336001600160a01b031614610cb95760405162461bcd60e51b815260040161052f90612603565b81518351148015610ccb575080518351145b610ce75760405162461bcd60e51b815260040161052f9061284b565b60005b8351811015610d8557610d73848281518110610d1657634e487b7160e01b600052603260045260246000fd5b6020026020010151848381518110610d3e57634e487b7160e01b600052603260045260246000fd5b6020026020010151848481518110610d6657634e487b7160e01b600052603260045260246000fd5b602002602001015161124d565b80610d7d81612a02565b915050610cea565b50505050565b610d9433610c30565b610db05760405162461bcd60e51b815260040161052f9061236f565b600654600160a01b900460ff1615610dda5760405162461bcd60e51b815260040161052f906124e9565b6006805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890610a529033906121cc565b6006546001600160a01b031690565b60606001805461059f906129c7565b610e4433610c30565b610e605760405162461bcd60e51b815260040161052f9061236f565b610e6b6008826111e2565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b610eab33610c30565b610ec75760405162461bcd60e51b815260040161052f9061236f565b610ed26007826111e2565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b610f116112e3565b6001600160a01b0316826001600160a01b03161415610f425760405162461bcd60e51b815260040161052f90612466565b8060056000610f4f6112e3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610f936112e3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fcb91906122a2565b60405180910390a35050565b600061058860088361122e565b610fed33610c30565b6110095760405162461bcd60e51b815260040161052f9061236f565b61101460078261154f565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b61105c6110566112e3565b8361139d565b6110785760405162461bcd60e51b815260040161052f906127fa565b610d85848484846115c6565b6000818152600e60205260409020546060906110a157600c6110b0565b6000828152600e602052604090205b80548060200260200160405190810160405280929190818152602001828054801561076e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e65750505050509050919050565b6060610588826115f9565b61112333610c30565b61113f5760405162461bcd60e51b815260040161052f9061236f565b80516111529060099060208401906119ef565b507f2405b30cce1d59580c3cc7fbdce2d552bd8e943d5dc4f66a37053027fc7ce8806009604051610b2e91906122c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6111ba33610c30565b6111d65760405162461bcd60e51b815260040161052f9061236f565b6111df81611676565b50565b6111ec828261122e565b156112095760405162461bcd60e51b815260040161052f90612782565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b03166000908152602091909152604090205460ff1690565b805182511461126e5760405162461bcd60e51b815260040161052f9061284b565b6000838152600e60209081526040909120835161128d92850190611a73565b506000838152600f602090815260409091208251610d8592840190611ac8565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061131c82610b49565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80518251146113765760405162461bcd60e51b815260040161052f9061284b565b815161138990600c906020850190611a73565b50805161054390600d906020840190611ac8565b60006113a8826112c6565b6113c45760405162461bcd60e51b815260040161052f9061249d565b60006113cf83610b49565b9050806001600160a01b0316846001600160a01b0316148061140a5750836001600160a01b03166113ff84610622565b6001600160a01b0316145b8061141a575061141a8185611183565b949350505050565b826001600160a01b031661143582610b49565b6001600160a01b03161461145b5760405162461bcd60e51b815260040161052f906126f2565b6001600160a01b0382166114815760405162461bcd60e51b815260040161052f90612422565b61148c838383610543565b6114976000826112e7565b6001600160a01b03831660009081526003602052604081208054600192906114c0908490612984565b90915550506001600160a01b03821660009081526003602052604081208054600192906114ee908490612958565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611559828261122e565b6115755760405162461bcd60e51b815260040161052f906128aa565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6115a033610fd7565b6115bc5760405162461bcd60e51b815260040161052f90612882565b61086982826116d4565b6115d1848484611422565b6115dd848484846117b3565b610d855760405162461bcd60e51b815260040161052f90612399565b606060006116068361090c565b80519091501561164357600a61161b846118ce565b60405160200161162c92919061214c565b60405160208183030381529060405291505061058b565b600961164e846118ce565b60405160200161165f92919061214c565b604051602081830303815290604052915050919050565b6000611680610e1d565b600680546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166116fa5760405162461bcd60e51b815260040161052f90612671565b611703816112c6565b156117205760405162461bcd60e51b815260040161052f906123eb565b61172c60008383610543565b6001600160a01b0382166000908152600360205260408120805460019290611755908490612958565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006117c7846001600160a01b03166119e9565b156118c357836001600160a01b031663150b7a026117e36112e3565b8786866040518563ffffffff1660e01b815260040161180594939291906121e0565b602060405180830381600087803b15801561181f57600080fd5b505af192505050801561184f575060408051601f3d908101601f1916820190925261184c9181019061201e565b60015b6118a9573d80801561187d576040519150601f19603f3d011682016040523d82523d6000602084013e611882565b606091505b5080516118a15760405162461bcd60e51b815260040161052f90612399565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061141a565b506001949350505050565b6060816118f357506040805180820190915260018152600360fc1b602082015261058b565b8160005b811561191d578061190781612a02565b91506119169050600a83612970565b91506118f7565b60008167ffffffffffffffff81111561194657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611970576020820181803683370190505b5090505b841561141a57611985600183612984565b9150611992600a86612a3d565b61199d906030612958565b60f81b8183815181106119c057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506119e2600a86612970565b9450611974565b3b151590565b8280546119fb906129c7565b90600052602060002090601f016020900481019282611a1d5760008555611a63565b82601f10611a3657805160ff1916838001178555611a63565b82800160010185558215611a63579182015b82811115611a63578251825591602001919060010190611a48565b50611a6f929150611b02565b5090565b828054828255906000526020600020908101928215611a63579160200282015b82811115611a6357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611a93565b828054828255906000526020600020908101928215611a635791602002820182811115611a63578251825591602001919060010190611a48565b5b80821115611a6f5760008155600101611b03565b600067ffffffffffffffff831115611b3157611b31612a7d565b611b44601f8401601f1916602001612903565b9050828152838383011115611b5857600080fd5b828260208301376000602084830101529392505050565b600082601f830112611b7f578081fd5b81356020611b94611b8f83612934565b612903565b8281528181019085830183850287018401881015611bb0578586fd5b855b85811015611bd7578135611bc581612a93565b84529284019290840190600101611bb2565b5090979650505050505050565b600082601f830112611bf4578081fd5b81356020611c04611b8f83612934565b82815281810190858301855b85811015611bd757611c27898684358b0101611c39565b84529284019290840190600101611c10565b600082601f830112611c49578081fd5b81356020611c59611b8f83612934565b8281528181019085830183850287018401881015611c75578586fd5b855b85811015611bd757813584529284019290840190600101611c77565b600082601f830112611ca3578081fd5b611cb283833560208501611b17565b9392505050565b600060208284031215611cca578081fd5b8135611cb281612a93565b60008060408385031215611ce7578081fd5b8235611cf281612a93565b91506020830135611d0281612a93565b809150509250929050565b600080600060608486031215611d21578081fd5b8335611d2c81612a93565b92506020840135611d3c81612a93565b929592945050506040919091013590565b60008060008060808587031215611d62578182fd5b8435611d6d81612a93565b93506020850135611d7d81612a93565b925060408501359150606085013567ffffffffffffffff811115611d9f578182fd5b8501601f81018713611daf578182fd5b611dbe87823560208401611b17565b91505092959194509250565b60008060408385031215611ddc578182fd5b8235611de781612a93565b915060208301358015158114611d02578182fd5b60008060408385031215611e0d578182fd5b8235611e1881612a93565b946020939093013593505050565b60008060408385031215611e38578182fd5b823567ffffffffffffffff80821115611e4f578384fd5b818501915085601f830112611e62578384fd5b81356020611e72611b8f83612934565b82815281810190858301838502870184018b1015611e8e578889fd5b8896505b84871015611eb9578035611ea581612a93565b835260019690960195918301918301611e92565b5096505086013592505080821115611ecf578283fd5b50611edc85828601611c39565b9150509250929050565b60008060408385031215611ef8578182fd5b823567ffffffffffffffff80821115611f0f578384fd5b611f1b86838701611b6f565b93506020850135915080821115611ecf578283fd5b600080600060608486031215611f44578081fd5b833567ffffffffffffffff80821115611f5b578283fd5b611f6787838801611c39565b9450602091508186013581811115611f7d578384fd5b8601601f81018813611f8d578384fd5b8035611f9b611b8f82612934565b81815284810190838601875b84811015611fd057611fbe8d898435890101611b6f565b84529287019290870190600101611fa7565b50909750505050604087013592505080821115611feb578283fd5b50611ff886828701611be4565b9150509250925092565b600060208284031215612013578081fd5b8135611cb281612aa8565b60006020828403121561202f578081fd5b8151611cb281612aa8565b60006020828403121561204b578081fd5b813567ffffffffffffffff811115612061578182fd5b61141a84828501611c93565b60006020828403121561207e578081fd5b5035919050565b600080600060608486031215612099578081fd5b83359250602084013567ffffffffffffffff808211156120b7578283fd5b6120c387838801611b6f565b935060408601359150808211156120d8578283fd5b50611ff886828701611c39565b600080604083850312156120f7578182fd5b82359150602083013567ffffffffffffffff811115612114578182fd5b611edc85828601611c93565b6000815180845261213881602086016020860161299b565b601f01601f19169290920160200192915050565b600080845461215a816129c7565b600182811680156121725760018114612183576121af565b60ff198416875282870194506121af565b8886526020808720875b858110156121a65781548a82015290840190820161218d565b50505082870194505b5050505083516121c381836020880161299b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221390830184612120565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561225e5783516001600160a01b031683529284019291840191600101612239565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561225e57835183529284019291840191600101612286565b901515815260200190565b600060208252611cb26020830184612120565b600060208083528184546122d3816129c7565b808487015260406001808416600081146122f4576001811461230857612333565b60ff19851689840152606089019550612333565b898852868820885b8581101561232b5781548b8201860152908301908801612310565b8a0184019650505b509398975050505050505050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252600d908201526c26bab9ba1031329037bbb732b960991b604082015260600190565b60208082526027908201527f676574546f6b656e55524920717565727920666f72206e6f6e6578697374656e6040820152663a103a37b5b2b760c91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526027908201527f736574546f6b656e55524920717565727920666f72206e6f6e6578697374656e6040820152663a103a37b5b2b760c91b606082015260800190565b6020808252601c908201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f696e707574206c656e677468206d7573742062652073616d6500000000000000604082015260600190565b6020808252600e908201526d26bab9ba1031329036b4b73a32b960911b604082015260600190565b6020808252601d908201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604082015260600190565b90815260200190565b60008382526040602083015261141a6040830184612120565b604051601f8201601f1916810167ffffffffffffffff8111828210171561292c5761292c612a7d565b604052919050565b600067ffffffffffffffff82111561294e5761294e612a7d565b5060209081020190565b6000821982111561296b5761296b612a51565b500190565b60008261297f5761297f612a67565b500490565b60008282101561299657612996612a51565b500390565b60005b838110156129b657818101518382015260200161299e565b83811115610d855750506000910152565b6002810460018216806129db57607f821691505b602082108114156129fc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a1657612a16612a51565b5060010190565b600060ff821660ff811415612a3457612a34612a51565b60010192915050565b600082612a4c57612a4c612a67565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111df57600080fd5b6001600160e01b0319811681146111df57600080fdfea2646970667358221220022d020cb5204d0962c1ff20facac625db2f5b9644620eef6e7d0d3c4725522564736f6c6343000801003368747470733a2f2f6e667473747564696f2e6865726f6b756170702e636f6d2f6170692f6d657461646174612f6f74616b75636f696e2f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636352211e116101305780639870d7fe116100b8578063b9c4d9fb1161007c578063b9c4d9fb1461048b578063c87b56dd146104ab578063da1b9e08146104be578063e985e9c5146104d1578063f2fde38b146104e457610227565b80639870d7fe1461042c578063a22cb4651461043f578063aa271e1a14610452578063ac8a584a14610465578063b88d4fde1461047857610227565b806374962126116100ff57806374962126146103ee5780638456cb59146104015780638da5cb5b1461040957806395d89b4114610411578063983b2d561461041957610227565b80636352211e146103a25780636ae459bd146103b55780636d70f7ae146103c857806370a08231146103db57610227565b806323b872dd116101b357806340c10f191161018257806340c10f191461034e57806342842e0e146103615780634f558e791461037457806355f804b3146103875780635c975abb1461039a57610227565b806323b872dd1461030d5780633092afd5146103205780633bb3a24d146103335780633f4ba83a1461034657610227565b8063095ea7b3116101fa578063095ea7b31461029f5780630ebd4c7f146102b2578063162094c4146102d257806318160ddd146102e55780631f1288be146102fa57610227565b806301e8c1b01461022c57806301ffc9a71461024157806306fdde031461026a578063081812fc1461027f575b600080fd5b61023f61023a366004612085565b6104f7565b005b61025461024f366004612002565b610548565b60405161026191906122a2565b60405180910390f35b610272610590565b60405161026191906122ad565b61029261028d36600461206d565b610622565b60405161026191906121cc565b61023f6102ad366004611dfb565b610665565b6102c56102c036600461206d565b6106f8565b604051610261919061226a565b61023f6102e03660046120e5565b61077a565b6102ed610821565b60405161026191906128e1565b61023f610308366004611ee6565b610827565b61023f61031b366004611d0d565b61086d565b61023f61032e366004611cb9565b6108a5565b61027261034136600461206d565b61090c565b61023f6109c7565b61023f61035c366004611dfb565b610a5c565b61023f61036f366004611d0d565b610aa0565b61025461038236600461206d565b610abb565b61023f61039536600461203a565b610ac6565b610254610b39565b6102926103b036600461206d565b610b49565b61023f6103c3366004611e26565b610b7e565b6102546103d6366004611cb9565b610c30565b6102ed6103e9366004611cb9565b610c3d565b61023f6103fc366004611f30565b610c81565b61023f610d8b565b610292610e1d565b610272610e2c565b61023f610427366004611cb9565b610e3b565b61023f61043a366004611cb9565b610ea2565b61023f61044d366004611dca565b610f09565b610254610460366004611cb9565b610fd7565b61023f610473366004611cb9565b610fe4565b61023f610486366004611d4d565b61104b565b61049e61049936600461206d565b611084565b604051610261919061221d565b6102726104b936600461206d565b61110f565b61023f6104cc36600461203a565b61111a565b6102546104df366004611cd5565b611183565b61023f6104f2366004611cb9565b6111b1565b6104ff610e1d565b6001600160a01b0316336001600160a01b0316146105385760405162461bcd60e51b815260040161052f90612603565b60405180910390fd5b61054383838361124d565b505050565b60006001600160e01b031982166380ac58cd60e01b148061057957506001600160e01b03198216635b5e139f60e01b145b806105885750610588826112ad565b90505b919050565b60606000805461059f906129c7565b80601f01602080910402602001604051908101604052809291908181526020018280546105cb906129c7565b80156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b600061062d826112c6565b6106495760405162461bcd60e51b815260040161052f906126a6565b506000908152600460205260409020546001600160a01b031690565b600061067082610b49565b9050806001600160a01b0316836001600160a01b031614156106a45760405162461bcd60e51b815260040161052f906127b9565b806001600160a01b03166106b66112e3565b6001600160a01b031614806106d257506106d2816104df6112e3565b6106ee5760405162461bcd60e51b815260040161052f90612513565b61054383836112e7565b6000818152600f602052604090205460609061071557600d610724565b6000828152600f602052604090205b80548060200260200160405190810160405280929190818152602001828054801561076e57602002820191906000526020600020905b81548152602001906001019080831161075a575b50505050509050919050565b61078333610c30565b61079f5760405162461bcd60e51b815260040161052f9061236f565b6107a8826112c6565b6107c45760405162461bcd60e51b815260040161052f9061273b565b6000828152600b6020908152604090912082516107e3928401906119ef565b507f0418254f69edc41d3d2b429767526234e99f60018e7e21cda80307bf3ef28cc482826040516108159291906128ea565b60405180910390a15050565b60105490565b61082f610e1d565b6001600160a01b0316336001600160a01b03161461085f5760405162461bcd60e51b815260040161052f90612603565b6108698282611355565b5050565b61087e6108786112e3565b8261139d565b61089a5760405162461bcd60e51b815260040161052f906127fa565b610543838383611422565b6108ae33610c30565b6108ca5760405162461bcd60e51b815260040161052f9061236f565b6108d560088261154f565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b6060610917826112c6565b6109335760405162461bcd60e51b815260040161052f9061262a565b6000828152600b60205260409020805461094c906129c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610978906129c7565b801561076e5780601f1061099a5761010080835404028352916020019161076e565b820191906000526020600020905b8154815290600101906020018083116109a85750939695505050505050565b6109d033610c30565b6109ec5760405162461bcd60e51b815260040161052f9061236f565b600654600160a01b900460ff16610a155760405162461bcd60e51b815260040161052f90612341565b6006805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90610a529033906121cc565b60405180910390a1565b610a6533610fd7565b610a815760405162461bcd60e51b815260040161052f90612882565b60108054906000610a9183612a02565b91905055506108698282611597565b6105438383836040518060200160405280600081525061104b565b6000610588826112c6565b610acf33610c30565b610aeb5760405162461bcd60e51b815260040161052f9061236f565b8051610afe90600a9060208401906119ef565b507f157d450c8fb1377294d9db75af1de2753efc52d8e5578551d70d2c7d9cd74df981604051610b2e91906122ad565b60405180910390a150565b600654600160a01b900460ff1690565b6000818152600260205260408120546001600160a01b0316806105885760405162461bcd60e51b815260040161052f906125ba565b610b8733610fd7565b610ba35760405162461bcd60e51b815260040161052f90612882565b8051825114610bb157600080fd5b60005b82518160ff16101561054357610c1e838260ff1681518110610be657634e487b7160e01b600052603260045260246000fd5b6020026020010151838360ff1681518110610c1157634e487b7160e01b600052603260045260246000fd5b6020026020010151610a5c565b80610c2881612a1d565b915050610bb4565b600061058860078361122e565b60006001600160a01b038216610c655760405162461bcd60e51b815260040161052f90612570565b506001600160a01b031660009081526003602052604090205490565b610c89610e1d565b6001600160a01b0316336001600160a01b031614610cb95760405162461bcd60e51b815260040161052f90612603565b81518351148015610ccb575080518351145b610ce75760405162461bcd60e51b815260040161052f9061284b565b60005b8351811015610d8557610d73848281518110610d1657634e487b7160e01b600052603260045260246000fd5b6020026020010151848381518110610d3e57634e487b7160e01b600052603260045260246000fd5b6020026020010151848481518110610d6657634e487b7160e01b600052603260045260246000fd5b602002602001015161124d565b80610d7d81612a02565b915050610cea565b50505050565b610d9433610c30565b610db05760405162461bcd60e51b815260040161052f9061236f565b600654600160a01b900460ff1615610dda5760405162461bcd60e51b815260040161052f906124e9565b6006805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890610a529033906121cc565b6006546001600160a01b031690565b60606001805461059f906129c7565b610e4433610c30565b610e605760405162461bcd60e51b815260040161052f9061236f565b610e6b6008826111e2565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b610eab33610c30565b610ec75760405162461bcd60e51b815260040161052f9061236f565b610ed26007826111e2565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b610f116112e3565b6001600160a01b0316826001600160a01b03161415610f425760405162461bcd60e51b815260040161052f90612466565b8060056000610f4f6112e3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610f936112e3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fcb91906122a2565b60405180910390a35050565b600061058860088361122e565b610fed33610c30565b6110095760405162461bcd60e51b815260040161052f9061236f565b61101460078261154f565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b61105c6110566112e3565b8361139d565b6110785760405162461bcd60e51b815260040161052f906127fa565b610d85848484846115c6565b6000818152600e60205260409020546060906110a157600c6110b0565b6000828152600e602052604090205b80548060200260200160405190810160405280929190818152602001828054801561076e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e65750505050509050919050565b6060610588826115f9565b61112333610c30565b61113f5760405162461bcd60e51b815260040161052f9061236f565b80516111529060099060208401906119ef565b507f2405b30cce1d59580c3cc7fbdce2d552bd8e943d5dc4f66a37053027fc7ce8806009604051610b2e91906122c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6111ba33610c30565b6111d65760405162461bcd60e51b815260040161052f9061236f565b6111df81611676565b50565b6111ec828261122e565b156112095760405162461bcd60e51b815260040161052f90612782565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b03166000908152602091909152604090205460ff1690565b805182511461126e5760405162461bcd60e51b815260040161052f9061284b565b6000838152600e60209081526040909120835161128d92850190611a73565b506000838152600f602090815260409091208251610d8592840190611ac8565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061131c82610b49565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80518251146113765760405162461bcd60e51b815260040161052f9061284b565b815161138990600c906020850190611a73565b50805161054390600d906020840190611ac8565b60006113a8826112c6565b6113c45760405162461bcd60e51b815260040161052f9061249d565b60006113cf83610b49565b9050806001600160a01b0316846001600160a01b0316148061140a5750836001600160a01b03166113ff84610622565b6001600160a01b0316145b8061141a575061141a8185611183565b949350505050565b826001600160a01b031661143582610b49565b6001600160a01b03161461145b5760405162461bcd60e51b815260040161052f906126f2565b6001600160a01b0382166114815760405162461bcd60e51b815260040161052f90612422565b61148c838383610543565b6114976000826112e7565b6001600160a01b03831660009081526003602052604081208054600192906114c0908490612984565b90915550506001600160a01b03821660009081526003602052604081208054600192906114ee908490612958565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611559828261122e565b6115755760405162461bcd60e51b815260040161052f906128aa565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6115a033610fd7565b6115bc5760405162461bcd60e51b815260040161052f90612882565b61086982826116d4565b6115d1848484611422565b6115dd848484846117b3565b610d855760405162461bcd60e51b815260040161052f90612399565b606060006116068361090c565b80519091501561164357600a61161b846118ce565b60405160200161162c92919061214c565b60405160208183030381529060405291505061058b565b600961164e846118ce565b60405160200161165f92919061214c565b604051602081830303815290604052915050919050565b6000611680610e1d565b600680546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166116fa5760405162461bcd60e51b815260040161052f90612671565b611703816112c6565b156117205760405162461bcd60e51b815260040161052f906123eb565b61172c60008383610543565b6001600160a01b0382166000908152600360205260408120805460019290611755908490612958565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006117c7846001600160a01b03166119e9565b156118c357836001600160a01b031663150b7a026117e36112e3565b8786866040518563ffffffff1660e01b815260040161180594939291906121e0565b602060405180830381600087803b15801561181f57600080fd5b505af192505050801561184f575060408051601f3d908101601f1916820190925261184c9181019061201e565b60015b6118a9573d80801561187d576040519150601f19603f3d011682016040523d82523d6000602084013e611882565b606091505b5080516118a15760405162461bcd60e51b815260040161052f90612399565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061141a565b506001949350505050565b6060816118f357506040805180820190915260018152600360fc1b602082015261058b565b8160005b811561191d578061190781612a02565b91506119169050600a83612970565b91506118f7565b60008167ffffffffffffffff81111561194657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611970576020820181803683370190505b5090505b841561141a57611985600183612984565b9150611992600a86612a3d565b61199d906030612958565b60f81b8183815181106119c057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506119e2600a86612970565b9450611974565b3b151590565b8280546119fb906129c7565b90600052602060002090601f016020900481019282611a1d5760008555611a63565b82601f10611a3657805160ff1916838001178555611a63565b82800160010185558215611a63579182015b82811115611a63578251825591602001919060010190611a48565b50611a6f929150611b02565b5090565b828054828255906000526020600020908101928215611a63579160200282015b82811115611a6357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611a93565b828054828255906000526020600020908101928215611a635791602002820182811115611a63578251825591602001919060010190611a48565b5b80821115611a6f5760008155600101611b03565b600067ffffffffffffffff831115611b3157611b31612a7d565b611b44601f8401601f1916602001612903565b9050828152838383011115611b5857600080fd5b828260208301376000602084830101529392505050565b600082601f830112611b7f578081fd5b81356020611b94611b8f83612934565b612903565b8281528181019085830183850287018401881015611bb0578586fd5b855b85811015611bd7578135611bc581612a93565b84529284019290840190600101611bb2565b5090979650505050505050565b600082601f830112611bf4578081fd5b81356020611c04611b8f83612934565b82815281810190858301855b85811015611bd757611c27898684358b0101611c39565b84529284019290840190600101611c10565b600082601f830112611c49578081fd5b81356020611c59611b8f83612934565b8281528181019085830183850287018401881015611c75578586fd5b855b85811015611bd757813584529284019290840190600101611c77565b600082601f830112611ca3578081fd5b611cb283833560208501611b17565b9392505050565b600060208284031215611cca578081fd5b8135611cb281612a93565b60008060408385031215611ce7578081fd5b8235611cf281612a93565b91506020830135611d0281612a93565b809150509250929050565b600080600060608486031215611d21578081fd5b8335611d2c81612a93565b92506020840135611d3c81612a93565b929592945050506040919091013590565b60008060008060808587031215611d62578182fd5b8435611d6d81612a93565b93506020850135611d7d81612a93565b925060408501359150606085013567ffffffffffffffff811115611d9f578182fd5b8501601f81018713611daf578182fd5b611dbe87823560208401611b17565b91505092959194509250565b60008060408385031215611ddc578182fd5b8235611de781612a93565b915060208301358015158114611d02578182fd5b60008060408385031215611e0d578182fd5b8235611e1881612a93565b946020939093013593505050565b60008060408385031215611e38578182fd5b823567ffffffffffffffff80821115611e4f578384fd5b818501915085601f830112611e62578384fd5b81356020611e72611b8f83612934565b82815281810190858301838502870184018b1015611e8e578889fd5b8896505b84871015611eb9578035611ea581612a93565b835260019690960195918301918301611e92565b5096505086013592505080821115611ecf578283fd5b50611edc85828601611c39565b9150509250929050565b60008060408385031215611ef8578182fd5b823567ffffffffffffffff80821115611f0f578384fd5b611f1b86838701611b6f565b93506020850135915080821115611ecf578283fd5b600080600060608486031215611f44578081fd5b833567ffffffffffffffff80821115611f5b578283fd5b611f6787838801611c39565b9450602091508186013581811115611f7d578384fd5b8601601f81018813611f8d578384fd5b8035611f9b611b8f82612934565b81815284810190838601875b84811015611fd057611fbe8d898435890101611b6f565b84529287019290870190600101611fa7565b50909750505050604087013592505080821115611feb578283fd5b50611ff886828701611be4565b9150509250925092565b600060208284031215612013578081fd5b8135611cb281612aa8565b60006020828403121561202f578081fd5b8151611cb281612aa8565b60006020828403121561204b578081fd5b813567ffffffffffffffff811115612061578182fd5b61141a84828501611c93565b60006020828403121561207e578081fd5b5035919050565b600080600060608486031215612099578081fd5b83359250602084013567ffffffffffffffff808211156120b7578283fd5b6120c387838801611b6f565b935060408601359150808211156120d8578283fd5b50611ff886828701611c39565b600080604083850312156120f7578182fd5b82359150602083013567ffffffffffffffff811115612114578182fd5b611edc85828601611c93565b6000815180845261213881602086016020860161299b565b601f01601f19169290920160200192915050565b600080845461215a816129c7565b600182811680156121725760018114612183576121af565b60ff198416875282870194506121af565b8886526020808720875b858110156121a65781548a82015290840190820161218d565b50505082870194505b5050505083516121c381836020880161299b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221390830184612120565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561225e5783516001600160a01b031683529284019291840191600101612239565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561225e57835183529284019291840191600101612286565b901515815260200190565b600060208252611cb26020830184612120565b600060208083528184546122d3816129c7565b808487015260406001808416600081146122f4576001811461230857612333565b60ff19851689840152606089019550612333565b898852868820885b8581101561232b5781548b8201860152908301908801612310565b8a0184019650505b509398975050505050505050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252600d908201526c26bab9ba1031329037bbb732b960991b604082015260600190565b60208082526027908201527f676574546f6b656e55524920717565727920666f72206e6f6e6578697374656e6040820152663a103a37b5b2b760c91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526027908201527f736574546f6b656e55524920717565727920666f72206e6f6e6578697374656e6040820152663a103a37b5b2b760c91b606082015260800190565b6020808252601c908201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f696e707574206c656e677468206d7573742062652073616d6500000000000000604082015260600190565b6020808252600e908201526d26bab9ba1031329036b4b73a32b960911b604082015260600190565b6020808252601d908201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604082015260600190565b90815260200190565b60008382526040602083015261141a6040830184612120565b604051601f8201601f1916810167ffffffffffffffff8111828210171561292c5761292c612a7d565b604052919050565b600067ffffffffffffffff82111561294e5761294e612a7d565b5060209081020190565b6000821982111561296b5761296b612a51565b500190565b60008261297f5761297f612a67565b500490565b60008282101561299657612996612a51565b500390565b60005b838110156129b657818101518382015260200161299e565b83811115610d855750506000910152565b6002810460018216806129db57607f821691505b602082108114156129fc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a1657612a16612a51565b5060010190565b600060ff821660ff811415612a3457612a34612a51565b60010192915050565b600082612a4c57612a4c612a67565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111df57600080fd5b6001600160e01b0319811681146111df57600080fdfea2646970667358221220022d020cb5204d0962c1ff20facac625db2f5b9644620eef6e7d0d3c4725522564736f6c63430008010033
Deployed Bytecode Sourcemap
44303:1934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44784:233;;;;;;:::i;:::-;;:::i;:::-;;23054:292;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23986:100;;;:::i;:::-;;;;;;;:::i;25453:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24983:404::-;;;;;;:::i;:::-;;:::i;44029:196::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41636:264::-;;;;;;:::i;:::-;;:::i;45982:89::-;;;:::i;:::-;;;;;;;:::i;44597:179::-;;;;;;:::i;:::-;;:::i;26343:305::-;;;;;;:::i;:::-;;:::i;39979:150::-;;;;;;:::i;:::-;;:::i;41392:200::-;;;;;;:::i;:::-;;:::i;38740:124::-;;;:::i;45569:137::-;;;;;;:::i;:::-;;:::i;26719:151::-;;;;;;:::i;:::-;;:::i;40141:117::-;;;;;;:::i;:::-;;:::i;41242:142::-;;;;;;:::i;:::-;;:::i;38524:78::-;;;:::i;23680:239::-;;;;;;:::i;:::-;;:::i;45714:260::-;;;;;;:::i;:::-;;:::i;38102:112::-;;;;;;:::i;:::-;;:::i;23410:208::-;;;;;;:::i;:::-;;:::i;45025:536::-;;;;;;:::i;:::-;;:::i;38610:122::-;;;:::i;36696:88::-;;;:::i;24155:104::-;;;:::i;39829:142::-;;;;;;:::i;:::-;;:::i;38222:139::-;;;;;;:::i;:::-;;:::i;25746:295::-;;;;;;:::i;:::-;;:::i;39704:117::-;;;;;;:::i;:::-;;:::i;38369:147::-;;;;;;:::i;:::-;;:::i;26941:285::-;;;;;;:::i;:::-;;:::i;43789:232::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46079:153::-;;;;;;:::i;:::-;;:::i;41073:161::-;;;;;;:::i;:::-;;:::i;26112:164::-;;;;;;:::i;:::-;;:::i;37937:157::-;;;;;;:::i;:::-;;:::i;44784:233::-;36643:7;:5;:7::i;:::-;-1:-1:-1;;;;;36629:21:0;:10;-1:-1:-1;;;;;36629:21:0;;36621:47;;;;-1:-1:-1;;;36621:47:0;;;;;;;:::i;:::-;;;;;;;;;44960:49:::1;44973:8;44983:15;45000:8;44960:12;:49::i;:::-;44784:233:::0;;;:::o;23054:292::-;23156:4;-1:-1:-1;;;;;;23180:40:0;;-1:-1:-1;;;23180:40:0;;:105;;-1:-1:-1;;;;;;;23237:48:0;;-1:-1:-1;;;23237:48:0;23180:105;:158;;;;23302:36;23326:11;23302:23;:36::i;:::-;23173:165;;23054:292;;;;:::o;23986:100::-;24040:13;24073:5;24066:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23986:100;:::o;25453:221::-;25529:7;25557:16;25565:7;25557;:16::i;:::-;25549:73;;;;-1:-1:-1;;;25549:73:0;;;;;;;:::i;:::-;-1:-1:-1;25642:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25642:24:0;;25453:221::o;24983:404::-;25064:13;25080:23;25095:7;25080:14;:23::i;:::-;25064:39;;25128:5;-1:-1:-1;;;;;25122:11:0;:2;-1:-1:-1;;;;;25122:11:0;;;25114:57;;;;-1:-1:-1;;;25114:57:0;;;;;;;:::i;:::-;25208:5;-1:-1:-1;;;;;25192:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;25192:21:0;;:69;;;;25217:44;25241:5;25248:12;:10;:12::i;25217:44::-;25184:161;;;;-1:-1:-1;;;25184:161:0;;;;;;;:::i;:::-;25358:21;25367:2;25371:7;25358:8;:21::i;44029:196::-;44167:1;44134:23;;;:13;:23;;;;;:30;44098:16;;44134:83;;44197:20;44134:83;;;44171:23;;;;:13;:23;;;;;44134:83;44127:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44029:196;;;:::o;41636:264::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;41740:16:::1;41748:7;41740;:16::i;:::-;41732:68;;;;-1:-1:-1::0;;;41732:68:0::1;;;;;;;:::i;:::-;41811:19;::::0;;;:10:::1;:19;::::0;;;;;;;:31;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;41858:34;41873:7;41882:9;41858:34;;;;;;;:::i;:::-;;;;;;;;41636:264:::0;;:::o;45982:89::-;46053:10;;45982:89;:::o;44597:179::-;36643:7;:5;:7::i;:::-;-1:-1:-1;;;;;36629:21:0;:10;-1:-1:-1;;;;;36629:21:0;;36621:47;;;;-1:-1:-1;;;36621:47:0;;;;;;;:::i;:::-;44722:46:::1;44742:15;44759:8;44722:19;:46::i;:::-;44597:179:::0;;:::o;26343:305::-;26504:41;26523:12;:10;:12::i;:::-;26537:7;26504:18;:41::i;:::-;26496:103;;;;-1:-1:-1;;;26496:103:0;;;;;;;:::i;:::-;26612:28;26622:4;26628:2;26632:7;26612:9;:28::i;39979:150::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;40060:23:::1;:7;40075::::0;40060:14:::1;:23::i;:::-;40099:22;::::0;-1:-1:-1;;;;;40099:22:0;::::1;::::0;::::1;::::0;;;::::1;39979:150:::0;:::o;41392:200::-;41451:13;41485:16;41493:7;41485;:16::i;:::-;41477:68;;;;-1:-1:-1;;;41477:68:0;;;;;;;:::i;:::-;41565:19;;;;:10;:19;;;;;41558:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41558:26:0;;41392:200;-1:-1:-1;;;;;;41392:200:0:o;38740:124::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;37877:7:::1;::::0;-1:-1:-1;;;37877:7:0;::::1;;;37869:40;;;;-1:-1:-1::0;;;37869:40:0::1;;;;;;;:::i;:::-;38805:7:::2;:15:::0;;-1:-1:-1;;;;38805:15:0::2;::::0;;38836:20:::2;::::0;::::2;::::0;::::2;::::0;38845:10:::2;::::0;38836:20:::2;:::i;:::-;;;;;;;;38740:124::o:0;45569:137::-;39637:20;39646:10;39637:8;:20::i;:::-;39629:47;;;;-1:-1:-1;;;39629:47:0;;;;;;;:::i;:::-;45652:10:::1;:12:::0;;;:10:::1;:12;::::0;::::1;:::i;:::-;;;;;;45675:23;45686:2;45690:7;45675:10;:23::i;26719:151::-:0;26823:39;26840:4;26846:2;26850:7;26823:39;;;;;;;;;;;;:16;:39::i;40141:117::-;40204:4;40228:22;40242:7;40228:13;:22::i;41242:142::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;41319:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41353:23;41367:8;41353:23;;;;;;:::i;:::-;;;;;;;;41242:142:::0;:::o;38524:78::-;38587:7;;-1:-1:-1;;;38587:7:0;;;;;38524:78::o;23680:239::-;23752:7;23788:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23788:16:0;23823:19;23815:73;;;;-1:-1:-1;;;23815:73:0;;;;;;;:::i;45714:260::-;39637:20;39646:10;39637:8;:20::i;:::-;39629:47;;;;-1:-1:-1;;;39629:47:0;;;;;;;:::i;:::-;45835:9:::1;:16;45820:4;:11;:31;45812:40;;;::::0;::::1;;45863:7;45881:86;45897:4;:11;45893:1;:15;;;45881:86;;;45928:27;45933:4;45938:1;45933:7;;;;;;;;-1:-1:-1::0;;;45933:7:0::1;;;;;;;;;;;;;;;45942:9;45952:1;45942:12;;;;;;;;-1:-1:-1::0;;;45942:12:0::1;;;;;;;;;;;;;;;45928:4;:27::i;:::-;45910:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45881:86;;38102:112:::0;38160:4;38184:22;:9;38198:7;38184:13;:22::i;23410:208::-;23482:7;-1:-1:-1;;;;;23510:19:0;;23502:74;;;;-1:-1:-1;;;23502:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23594:16:0;;;;;:9;:16;;;;;;;23410:208::o;45025:536::-;36643:7;:5;:7::i;:::-;-1:-1:-1;;;;;36629:21:0;:10;-1:-1:-1;;;;;36629:21:0;;36621:47;;;;-1:-1:-1;;;36621:47:0;;;;;;;:::i;:::-;45271:19:::1;:26;45248:12;:19;:49;:95;;;;;45324:12;:19;45301:12;:19;:42;45248:95;45226:170;;;;-1:-1:-1::0;;;45226:170:0::1;;;;;;;:::i;:::-;45412:9;45407:147;45431:12;:19;45427:1;:23;45407:147;;;45472:70;45485:12;45498:1;45485:15;;;;;;-1:-1:-1::0;;;45485:15:0::1;;;;;;;;;;;;;;;45502:19;45522:1;45502:22;;;;;;-1:-1:-1::0;;;45502:22:0::1;;;;;;;;;;;;;;;45526:12;45539:1;45526:15;;;;;;-1:-1:-1::0;;;45526:15:0::1;;;;;;;;;;;;;;;45472:12;:70::i;:::-;45452:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45407:147;;;;45025:536:::0;;;:::o;38610:122::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;37780:7:::1;::::0;-1:-1:-1;;;37780:7:0;::::1;;;37779:8;37771:37;;;;-1:-1:-1::0;;;37771:37:0::1;;;;;;;:::i;:::-;38676:7:::2;:14:::0;;-1:-1:-1;;;;38676:14:0::2;-1:-1:-1::0;;;38676:14:0::2;::::0;;38706:18:::2;::::0;::::2;::::0;::::2;::::0;38713:10:::2;::::0;38706:18:::2;:::i;36696:88::-:0;36770:6;;-1:-1:-1;;;;;36770:6:0;36696:88;:::o;24155:104::-;24211:13;24244:7;24237:14;;;;;:::i;39829:142::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;39907:20:::1;:7;39919::::0;39907:11:::1;:20::i;:::-;39943;::::0;-1:-1:-1;;;;;39943:20:0;::::1;::::0;::::1;::::0;;;::::1;39829:142:::0;:::o;38222:139::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;38293:22:::1;:9;38307:7:::0;38293:13:::1;:22::i;:::-;38331;::::0;-1:-1:-1;;;;;38331:22:0;::::1;::::0;::::1;::::0;;;::::1;38222:139:::0;:::o;25746:295::-;25861:12;:10;:12::i;:::-;-1:-1:-1;;;;;25849:24:0;:8;-1:-1:-1;;;;;25849:24:0;;;25841:62;;;;-1:-1:-1;;;25841:62:0;;;;;;;:::i;:::-;25961:8;25916:18;:32;25935:12;:10;:12::i;:::-;-1:-1:-1;;;;;25916:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25916:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;25916:53:0;;;;;;;;;;;26000:12;:10;:12::i;:::-;-1:-1:-1;;;;;25985:48:0;;26024:8;25985:48;;;;;;:::i;:::-;;;;;;;;25746:295;;:::o;39704:117::-;39769:4;39793:20;:7;39805;39793:11;:20::i;38369:147::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;38443:25:::1;:9;38460:7:::0;38443:16:::1;:25::i;:::-;38484:24;::::0;-1:-1:-1;;;;;38484:24:0;::::1;::::0;::::1;::::0;;;::::1;38369:147:::0;:::o;26941:285::-;27073:41;27092:12;:10;:12::i;:::-;27106:7;27073:18;:41::i;:::-;27065:103;;;;-1:-1:-1;;;27065:103:0;;;;;;;:::i;:::-;27179:39;27193:4;27199:2;27203:7;27212:5;27179:13;:39::i;43789:232::-;43949:1;43909:30;;;:20;:30;;;;;:37;43865:24;;43909:104;;43986:27;43909:104;;;43953:30;;;;:20;:30;;;;;43909:104;43902:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43902:111:0;;;;;;;;;;;;;;;;;;;;;;43789:232;;;:::o;46079:153::-;46168:13;46201:23;46216:7;46201:14;:23::i;41073:161::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;41156:25;;::::1;::::0;:11:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41197:29;41214:11;41197:29;;;;;;:::i;26112:164::-:0;-1:-1:-1;;;;;26233:25:0;;;26209:4;26233:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26112:164::o;37937:157::-;37664:22;37675:10;37664;:22::i;:::-;37656:51;;;;-1:-1:-1;;;37656:51:0;;;;;;;:::i;:::-;38057:29:::1;38076:9;38057:18;:29::i;:::-;37937:157:::0;:::o;35032:175::-;35110:18;35114:4;35120:7;35110:3;:18::i;:::-;35109:19;35101:60;;;;-1:-1:-1;;;35101:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35172:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;35172:27:0;35195:4;35172:27;;;35032:175::o;35402:156::-;-1:-1:-1;;;;;35530:20:0;35501:4;35530:20;;;;;;;;;;;;;;;35402:156::o;43116:354::-;43313:8;:15;43287;:22;:41;43279:79;;;;-1:-1:-1;;;43279:79:0;;;;;;;:::i;:::-;43369:30;;;;:20;:30;;;;;;;;:48;;;;;;;;:::i;:::-;-1:-1:-1;43428:23:0;;;;:13;:23;;;;;;;;:34;;;;;;;;:::i;21578:157::-;-1:-1:-1;;;;;;21687:40:0;;-1:-1:-1;;;21687:40:0;21578:157;;;:::o;28693:127::-;28758:4;28782:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28782:16:0;:30;;;28693:127::o;733:98::-;813:10;733:98;:::o;32578:174::-;32653:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32653:29:0;-1:-1:-1;;;;;32653:29:0;;;;;;;;:24;;32707:23;32653:24;32707:14;:23::i;:::-;-1:-1:-1;;;;;32698:46:0;;;;;;;;;;;32578:174;;:::o;43478:303::-;43630:8;:15;43604;:22;:41;43596:79;;;;-1:-1:-1;;;43596:79:0;;;;;;;:::i;:::-;43686:45;;;;:27;;:45;;;;;:::i;:::-;-1:-1:-1;43742:31:0;;;;:20;;:31;;;;;:::i;28987:355::-;29080:4;29105:16;29113:7;29105;:16::i;:::-;29097:73;;;;-1:-1:-1;;;29097:73:0;;;;;;;:::i;:::-;29181:13;29197:23;29212:7;29197:14;:23::i;:::-;29181:39;;29250:5;-1:-1:-1;;;;;29239:16:0;:7;-1:-1:-1;;;;;29239:16:0;;:51;;;;29283:7;-1:-1:-1;;;;;29259:31:0;:20;29271:7;29259:11;:20::i;:::-;-1:-1:-1;;;;;29259:31:0;;29239:51;:94;;;;29294:39;29318:5;29325:7;29294:23;:39::i;:::-;29231:103;28987:355;-1:-1:-1;;;;28987:355:0:o;31916:544::-;32041:4;-1:-1:-1;;;;;32014:31:0;:23;32029:7;32014:14;:23::i;:::-;-1:-1:-1;;;;;32014:31:0;;32006:85;;;;-1:-1:-1;;;32006:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32110:16:0;;32102:65;;;;-1:-1:-1;;;32102:65:0;;;;;;;:::i;:::-;32180:39;32201:4;32207:2;32211:7;32180:20;:39::i;:::-;32284:29;32301:1;32305:7;32284:8;:29::i;:::-;-1:-1:-1;;;;;32326:15:0;;;;;;:9;:15;;;;;:20;;32345:1;;32326:15;:20;;32345:1;;32326:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32357:13:0;;;;;;:9;:13;;;;;:18;;32374:1;;32357:13;:18;;32374:1;;32357:18;:::i;:::-;;;;-1:-1:-1;;32386:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32386:21:0;-1:-1:-1;;;;;32386:21:0;;;;;;;;;32425:27;;32386:16;;32425:27;;;;;;;31916:544;;;:::o;35215:179::-;35295:18;35299:4;35305:7;35295:3;:18::i;:::-;35287:60;;;;-1:-1:-1;;;35287:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35358:20:0;35381:5;35358:20;;;;;;;;;;;:28;;-1:-1:-1;;35358:28:0;;;35215:179::o;40266:123::-;39637:20;39646:10;39637:8;:20::i;:::-;39629:47;;;;-1:-1:-1;;;39629:47:0;;;;;;;:::i;:::-;40357:24:::1;40369:2;40373:7;40357:11;:24::i;28108:272::-:0;28222:28;28232:4;28238:2;28242:7;28222:9;:28::i;:::-;28269:48;28292:4;28298:2;28302:7;28311:5;28269:22;:48::i;:::-;28261:111;;;;-1:-1:-1;;;28261:111:0;;;;;;;:::i;41908:487::-;42006:13;42032:23;42058:20;42070:7;42058:11;:20::i;:::-;42137:23;;42032:46;;-1:-1:-1;42137:27:0;42133:120;;42212:7;42221:18;:7;:16;:18::i;:::-;42195:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42181:60;;;;;42133:120;42354:11;42367:18;:7;:16;:18::i;:::-;42337:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42323:64;;;41908:487;;;:::o;36930:190::-;36997:21;37021:7;:5;:7::i;:::-;37032:6;:18;;-1:-1:-1;;;;;;37032:18:0;-1:-1:-1;;;;;37032:18:0;;;;;;;;;37066:46;;36997:31;;-1:-1:-1;37032:18:0;37066:46;;;;;;-1:-1:-1;;37066:46:0;36930:190;;:::o;30608:382::-;-1:-1:-1;;;;;30688:16:0;;30680:61;;;;-1:-1:-1;;;30680:61:0;;;;;;;:::i;:::-;30761:16;30769:7;30761;:16::i;:::-;30760:17;30752:58;;;;-1:-1:-1;;;30752:58:0;;;;;;;:::i;:::-;30823:45;30852:1;30856:2;30860:7;30823:20;:45::i;:::-;-1:-1:-1;;;;;30881:13:0;;;;;;:9;:13;;;;;:18;;30898:1;;30881:13;:18;;30898:1;;30881:18;:::i;:::-;;;;-1:-1:-1;;30910:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30910:21:0;-1:-1:-1;;;;;30910:21:0;;;;;;;;30949:33;;30910:16;;;30949:33;;30910:16;;30949:33;30608:382;;:::o;33317:843::-;33438:4;33464:15;:2;-1:-1:-1;;;;;33464:13:0;;:15::i;:::-;33460:693;;;33516:2;-1:-1:-1;;;;;33500:36:0;;33537:12;:10;:12::i;:::-;33551:4;33557:7;33566:5;33500:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33500:72:0;;;;;;;;-1:-1:-1;;33500:72:0;;;;;;;;;;;;:::i;:::-;;;33496:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33746:13:0;;33742:341;;33789:60;;-1:-1:-1;;;33789:60:0;;;;;;;:::i;33742:341::-;34033:6;34027:13;34018:6;34014:2;34010:15;34003:38;33496:602;-1:-1:-1;;;;;;33623:55:0;-1:-1:-1;;;33623:55:0;;-1:-1:-1;33616:62:0;;33460:693;-1:-1:-1;34137:4:0;33317:843;;;;;;:::o;19011:723::-;19067:13;19288:10;19284:53;;-1:-1:-1;19315:10:0;;;;;;;;;;;;-1:-1:-1;;;19315:10:0;;;;;;19284:53;19362:5;19347:12;19403:78;19410:9;;19403:78;;19436:8;;;;:::i;:::-;;-1:-1:-1;19459:10:0;;-1:-1:-1;19467:2:0;19459:10;;:::i;:::-;;;19403:78;;;19491:19;19523:6;19513:17;;;;;;-1:-1:-1;;;19513:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19513:17:0;;19491:39;;19541:154;19548:10;;19541:154;;19575:11;19585:1;19575:11;;:::i;:::-;;-1:-1:-1;19644:10:0;19652:2;19644:5;:10;:::i;:::-;19631:24;;:2;:24;:::i;:::-;19618:39;;19601:6;19608;19601:14;;;;;;-1:-1:-1;;;19601:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;19601:56:0;;;;;;;;-1:-1:-1;19672:11:0;19681:2;19672:11;;:::i;:::-;;;19541:154;;11431:422;11798:20;11837:8;;;11431:422::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:408:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:57;219:2;198:15;;-1:-1:-1;;194:29:1;225:4;190:40;174:57;:::i;:::-;165:66;;254:6;247:5;240:21;294:3;285:6;280:3;276:16;273:25;270:2;;;311:1;308;301:12;270:2;360:6;355:3;348:4;341:5;337:16;324:43;414:1;407:4;398:6;391:5;387:18;383:29;376:40;90:332;;;;;:::o;427:791::-;;548:3;541:4;533:6;529:17;525:27;515:2;;570:5;563;556:20;515:2;610:6;597:20;636:4;660:66;676:49;722:2;676:49;:::i;:::-;660:66;:::i;:::-;760:15;;;791:12;;;;823:15;;;869:11;;;857:24;;853:33;;850:42;-1:-1:-1;847:2:1;;;909:5;902;895:20;847:2;935:5;949:240;963:2;960:1;957:9;949:240;;;1034:3;1021:17;1051:33;1078:5;1051:33;:::i;:::-;1097:18;;1135:12;;;;1167;;;;981:1;974:9;949:240;;;-1:-1:-1;1207:5:1;;505:713;-1:-1:-1;;;;;;;505:713:1:o;1223:704::-;;1350:3;1343:4;1335:6;1331:17;1327:27;1317:2;;1372:5;1365;1358:20;1317:2;1412:6;1399:20;1438:4;1462:66;1478:49;1524:2;1478:49;:::i;1462:66::-;1562:15;;;1593:12;;;;1625:15;;;1658:5;1672:226;1686:2;1683:1;1680:9;1672:226;;;1743:80;1819:3;1814:2;1807:3;1794:17;1786:6;1782:30;1778:39;1743:80;:::i;:::-;1731:93;;1844:12;;;;1876;;;;1704:1;1697:9;1672:226;;1932:706;;2045:3;2038:4;2030:6;2026:17;2022:27;2012:2;;2067:5;2060;2053:20;2012:2;2107:6;2094:20;2133:4;2157:66;2173:49;2219:2;2173:49;:::i;2157:66::-;2257:15;;;2288:12;;;;2320:15;;;2366:11;;;2354:24;;2350:33;;2347:42;-1:-1:-1;2344:2:1;;;2406:5;2399;2392:20;2344:2;2432:5;2446:163;2460:2;2457:1;2454:9;2446:163;;;2517:17;;2505:30;;2555:12;;;;2587;;;;2478:1;2471:9;2446:163;;2643:233;;2741:3;2734:4;2726:6;2722:17;2718:27;2708:2;;2763:5;2756;2749:20;2708:2;2789:81;2866:3;2857:6;2844:20;2837:4;2829:6;2825:17;2789:81;:::i;:::-;2780:90;2698:178;-1:-1:-1;;;2698:178:1:o;2881:259::-;;2993:2;2981:9;2972:7;2968:23;2964:32;2961:2;;;3014:6;3006;2999:22;2961:2;3058:9;3045:23;3077:33;3104:5;3077:33;:::i;3145:402::-;;;3274:2;3262:9;3253:7;3249:23;3245:32;3242:2;;;3295:6;3287;3280:22;3242:2;3339:9;3326:23;3358:33;3385:5;3358:33;:::i;:::-;3410:5;-1:-1:-1;3467:2:1;3452:18;;3439:32;3480:35;3439:32;3480:35;:::i;:::-;3534:7;3524:17;;;3232:315;;;;;:::o;3552:470::-;;;;3698:2;3686:9;3677:7;3673:23;3669:32;3666:2;;;3719:6;3711;3704:22;3666:2;3763:9;3750:23;3782:33;3809:5;3782:33;:::i;:::-;3834:5;-1:-1:-1;3891:2:1;3876:18;;3863:32;3904:35;3863:32;3904:35;:::i;:::-;3656:366;;3958:7;;-1:-1:-1;;;4012:2:1;3997:18;;;;3984:32;;3656:366::o;4027:830::-;;;;;4199:3;4187:9;4178:7;4174:23;4170:33;4167:2;;;4221:6;4213;4206:22;4167:2;4265:9;4252:23;4284:33;4311:5;4284:33;:::i;:::-;4336:5;-1:-1:-1;4393:2:1;4378:18;;4365:32;4406:35;4365:32;4406:35;:::i;:::-;4460:7;-1:-1:-1;4514:2:1;4499:18;;4486:32;;-1:-1:-1;4569:2:1;4554:18;;4541:32;4596:18;4585:30;;4582:2;;;4633:6;4625;4618:22;4582:2;4661:22;;4714:4;4706:13;;4702:27;-1:-1:-1;4692:2:1;;4748:6;4740;4733:22;4692:2;4776:75;4843:7;4838:2;4825:16;4820:2;4816;4812:11;4776:75;:::i;:::-;4766:85;;;4157:700;;;;;;;:::o;4862:438::-;;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5009:6;5001;4994:22;4956:2;5053:9;5040:23;5072:33;5099:5;5072:33;:::i;:::-;5124:5;-1:-1:-1;5181:2:1;5166:18;;5153:32;5223:15;;5216:23;5204:36;;5194:2;;5259:6;5251;5244:22;5305:327;;;5434:2;5422:9;5413:7;5409:23;5405:32;5402:2;;;5455:6;5447;5440:22;5402:2;5499:9;5486:23;5518:33;5545:5;5518:33;:::i;:::-;5570:5;5622:2;5607:18;;;;5594:32;;-1:-1:-1;;;5392:240:1:o;5637:1296::-;;;5816:2;5804:9;5795:7;5791:23;5787:32;5784:2;;;5837:6;5829;5822:22;5784:2;5882:9;5869:23;5911:18;5952:2;5944:6;5941:14;5938:2;;;5973:6;5965;5958:22;5938:2;6016:6;6005:9;6001:22;5991:32;;6061:7;6054:4;6050:2;6046:13;6042:27;6032:2;;6088:6;6080;6073:22;6032:2;6129;6116:16;6151:4;6175:66;6191:49;6237:2;6191:49;:::i;6175:66::-;6275:15;;;6306:12;;;;6338:11;;;6376;;;6368:20;;6364:29;;6361:42;-1:-1:-1;6358:2:1;;;6421:6;6413;6406:22;6358:2;6448:6;6439:15;;6463:240;6477:2;6474:1;6471:9;6463:240;;;6548:3;6535:17;6565:33;6592:5;6565:33;:::i;:::-;6611:18;;6495:1;6488:9;;;;;6649:12;;;;6681;;6463:240;;;-1:-1:-1;6722:5:1;-1:-1:-1;;6765:18:1;;6752:32;;-1:-1:-1;;6796:16:1;;;6793:2;;;6830:6;6822;6815:22;6793:2;;6858:69;6919:7;6908:8;6897:9;6893:24;6858:69;:::i;:::-;6848:79;;;5774:1159;;;;;:::o;6938:653::-;;;7125:2;7113:9;7104:7;7100:23;7096:32;7093:2;;;7146:6;7138;7131:22;7093:2;7191:9;7178:23;7220:18;7261:2;7253:6;7250:14;7247:2;;;7282:6;7274;7267:22;7247:2;7310:75;7377:7;7368:6;7357:9;7353:22;7310:75;:::i;:::-;7300:85;;7438:2;7427:9;7423:18;7410:32;7394:48;;7467:2;7457:8;7454:16;7451:2;;;7488:6;7480;7473:22;7596:1521;;;;7875:2;7863:9;7854:7;7850:23;7846:32;7843:2;;;7896:6;7888;7881:22;7843:2;7941:9;7928:23;7970:18;8011:2;8003:6;8000:14;7997:2;;;8032:6;8024;8017:22;7997:2;8060:67;8119:7;8110:6;8099:9;8095:22;8060:67;:::i;:::-;8050:77;;8146:2;8136:12;;8201:2;8190:9;8186:18;8173:32;8230:2;8220:8;8217:16;8214:2;;;8251:6;8243;8236:22;8214:2;8279:24;;8334:4;8326:13;;8322:27;-1:-1:-1;8312:2:1;;8368:6;8360;8353:22;8312:2;8409;8396:16;8432:66;8448:49;8494:2;8448:49;:::i;8432:66::-;8532:15;;;8563:12;;;;8595:11;;;8624:6;8639:234;8653:2;8650:1;8647:9;8639:234;;;8710:88;8790:7;8785:2;8778:3;8765:17;8761:2;8757:26;8753:35;8710:88;:::i;:::-;8698:101;;8819:12;;;;8851;;;;8671:1;8664:9;8639:234;;;-1:-1:-1;8892:5:1;;-1:-1:-1;;;;8950:2:1;8935:18;;8922:32;;-1:-1:-1;;8966:16:1;;;8963:2;;;9000:6;8992;8985:22;8963:2;;9028:83;9103:7;9092:8;9081:9;9077:24;9028:83;:::i;:::-;9018:93;;;7833:1284;;;;;:::o;9122:257::-;;9233:2;9221:9;9212:7;9208:23;9204:32;9201:2;;;9254:6;9246;9239:22;9201:2;9298:9;9285:23;9317:32;9343:5;9317:32;:::i;9384:261::-;;9506:2;9494:9;9485:7;9481:23;9477:32;9474:2;;;9527:6;9519;9512:22;9474:2;9564:9;9558:16;9583:32;9609:5;9583:32;:::i;9650:344::-;;9772:2;9760:9;9751:7;9747:23;9743:32;9740:2;;;9793:6;9785;9778:22;9740:2;9838:9;9825:23;9871:18;9863:6;9860:30;9857:2;;;9908:6;9900;9893:22;9857:2;9936:52;9980:7;9971:6;9960:9;9956:22;9936:52;:::i;9999:190::-;;10111:2;10099:9;10090:7;10086:23;10082:32;10079:2;;;10132:6;10124;10117:22;10079:2;-1:-1:-1;10160:23:1;;10069:120;-1:-1:-1;10069:120:1:o;10194:721::-;;;;10398:2;10386:9;10377:7;10373:23;10369:32;10366:2;;;10419:6;10411;10404:22;10366:2;10460:9;10447:23;10437:33;;10521:2;10510:9;10506:18;10493:32;10544:18;10585:2;10577:6;10574:14;10571:2;;;10606:6;10598;10591:22;10571:2;10634:75;10701:7;10692:6;10681:9;10677:22;10634:75;:::i;:::-;10624:85;;10762:2;10751:9;10747:18;10734:32;10718:48;;10791:2;10781:8;10778:16;10775:2;;;10812:6;10804;10797:22;10775:2;;10840:69;10901:7;10890:8;10879:9;10875:24;10840:69;:::i;10920:412::-;;;11059:2;11047:9;11038:7;11034:23;11030:32;11027:2;;;11080:6;11072;11065:22;11027:2;11121:9;11108:23;11098:33;;11182:2;11171:9;11167:18;11154:32;11209:18;11201:6;11198:30;11195:2;;;11246:6;11238;11231:22;11195:2;11274:52;11318:7;11309:6;11298:9;11294:22;11274:52;:::i;11337:259::-;;11418:5;11412:12;11445:6;11440:3;11433:19;11461:63;11517:6;11510:4;11505:3;11501:14;11494:4;11487:5;11483:16;11461:63;:::i;:::-;11578:2;11557:15;-1:-1:-1;;11553:29:1;11544:39;;;;11585:4;11540:50;;11388:208;-1:-1:-1;;11388:208:1:o;11601:986::-;;11806:3;11841:6;11835:13;11871:36;11897:9;11871:36;:::i;:::-;11926:1;11943:18;;;11970:104;;;;12088:1;12083:362;;;;11936:509;;11970:104;-1:-1:-1;;12003:24:1;;11991:37;;12048:16;;;;-1:-1:-1;11970:104:1;;12083:362;12116:6;12111:3;12104:19;12146:4;12193:2;12188:3;12178:18;12218:3;12234:165;12248:6;12245:1;12242:13;12234:165;;;12326:14;;12313:11;;;12306:35;12369:16;;;;12263:10;;12234:165;;;12238:3;;;12428:6;12423:3;12419:16;12412:23;;11936:509;;;;;12476:6;12470:13;12492:55;12538:8;12533:3;12526:4;12518:6;12514:17;12492:55;:::i;:::-;12563:18;;11785:802;-1:-1:-1;;;;11785:802:1:o;12592:203::-;-1:-1:-1;;;;;12756:32:1;;;;12738:51;;12726:2;12711:18;;12693:102::o;12800:490::-;-1:-1:-1;;;;;13069:15:1;;;13051:34;;13121:15;;13116:2;13101:18;;13094:43;13168:2;13153:18;;13146:34;;;13216:3;13211:2;13196:18;;13189:31;;;12800:490;;13237:47;;13264:19;;13256:6;13237:47;:::i;:::-;13229:55;13003:287;-1:-1:-1;;;;;;13003:287:1:o;13295:677::-;13482:2;13534:21;;;13604:13;;13507:18;;;13626:22;;;13295:677;;13482:2;13705:15;;;;13679:2;13664:18;;;13295:677;13751:195;13765:6;13762:1;13759:13;13751:195;;;13830:13;;-1:-1:-1;;;;;13826:39:1;13814:52;;13921:15;;;;13886:12;;;;13862:1;13780:9;13751:195;;;-1:-1:-1;13963:3:1;;13462:510;-1:-1:-1;;;;;;13462:510:1:o;13977:635::-;14148:2;14200:21;;;14270:13;;14173:18;;;14292:22;;;13977:635;;14148:2;14371:15;;;;14345:2;14330:18;;;13977:635;14417:169;14431:6;14428:1;14425:13;14417:169;;;14492:13;;14480:26;;14561:15;;;;14526:12;;;;14453:1;14446:9;14417:169;;14617:187;14782:14;;14775:22;14757:41;;14745:2;14730:18;;14712:92::o;14809:221::-;;14958:2;14947:9;14940:21;14978:46;15020:2;15009:9;15005:18;14997:6;14978:46;:::i;15035:938::-;;15173:2;15202;15191:9;15184:21;15225:4;15261:6;15255:13;15291:36;15317:9;15291:36;:::i;:::-;15363:6;15358:2;15347:9;15343:18;15336:34;15389:2;15410:1;15442:2;15431:9;15427:18;15459:1;15454:121;;;;15589:1;15584:363;;;;15420:527;;15454:121;-1:-1:-1;;15502:24:1;;15482:18;;;15475:52;15562:2;15547:18;;;-1:-1:-1;15454:121:1;;15584:363;15618:6;15612:4;15605:20;15669:2;15663:4;15653:19;15694:4;15711:180;15725:6;15722:1;15719:13;15711:180;;;15818:14;;15794:17;;;15790:26;;15783:50;15861:16;;;;15740:10;;15711:180;;;15915:17;;15911:26;;;-1:-1:-1;;15420:527:1;-1:-1:-1;15964:3:1;;15153:820;-1:-1:-1;;;;;;;;15153:820:1:o;15978:344::-;16180:2;16162:21;;;16219:2;16199:18;;;16192:30;-1:-1:-1;;;16253:2:1;16238:18;;16231:50;16313:2;16298:18;;16152:170::o;16327:340::-;16529:2;16511:21;;;16568:2;16548:18;;;16541:30;-1:-1:-1;;;16602:2:1;16587:18;;16580:46;16658:2;16643:18;;16501:166::o;16672:414::-;16874:2;16856:21;;;16913:2;16893:18;;;16886:30;16952:34;16947:2;16932:18;;16925:62;-1:-1:-1;;;17018:2:1;17003:18;;16996:48;17076:3;17061:19;;16846:240::o;17091:352::-;17293:2;17275:21;;;17332:2;17312:18;;;17305:30;17371;17366:2;17351:18;;17344:58;17434:2;17419:18;;17265:178::o;17448:400::-;17650:2;17632:21;;;17689:2;17669:18;;;17662:30;17728:34;17723:2;17708:18;;17701:62;-1:-1:-1;;;17794:2:1;17779:18;;17772:34;17838:3;17823:19;;17622:226::o;17853:349::-;18055:2;18037:21;;;18094:2;18074:18;;;18067:30;18133:27;18128:2;18113:18;;18106:55;18193:2;18178:18;;18027:175::o;18207:408::-;18409:2;18391:21;;;18448:2;18428:18;;;18421:30;18487:34;18482:2;18467:18;;18460:62;-1:-1:-1;;;18553:2:1;18538:18;;18531:42;18605:3;18590:19;;18381:234::o;18620:340::-;18822:2;18804:21;;;18861:2;18841:18;;;18834:30;-1:-1:-1;;;18895:2:1;18880:18;;18873:46;18951:2;18936:18;;18794:166::o;18965:420::-;19167:2;19149:21;;;19206:2;19186:18;;;19179:30;19245:34;19240:2;19225:18;;19218:62;19316:26;19311:2;19296:18;;19289:54;19375:3;19360:19;;19139:246::o;19390:406::-;19592:2;19574:21;;;19631:2;19611:18;;;19604:30;19670:34;19665:2;19650:18;;19643:62;-1:-1:-1;;;19736:2:1;19721:18;;19714:40;19786:3;19771:19;;19564:232::o;19801:405::-;20003:2;19985:21;;;20042:2;20022:18;;;20015:30;20081:34;20076:2;20061:18;;20054:62;-1:-1:-1;;;20147:2:1;20132:18;;20125:39;20196:3;20181:19;;19975:231::o;20211:337::-;20413:2;20395:21;;;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20486:2:1;20471:18;;20464:43;20539:2;20524:18;;20385:163::o;20553:403::-;20755:2;20737:21;;;20794:2;20774:18;;;20767:30;20833:34;20828:2;20813:18;;20806:62;-1:-1:-1;;;20899:2:1;20884:18;;20877:37;20946:3;20931:19;;20727:229::o;20961:356::-;21163:2;21145:21;;;21182:18;;;21175:30;21241:34;21236:2;21221:18;;21214:62;21308:2;21293:18;;21135:182::o;21322:408::-;21524:2;21506:21;;;21563:2;21543:18;;;21536:30;21602:34;21597:2;21582:18;;21575:62;-1:-1:-1;;;21668:2:1;21653:18;;21646:42;21720:3;21705:19;;21496:234::o;21735:405::-;21937:2;21919:21;;;21976:2;21956:18;;;21949:30;22015:34;22010:2;21995:18;;21988:62;-1:-1:-1;;;22081:2:1;22066:18;;22059:39;22130:3;22115:19;;21909:231::o;22145:403::-;22347:2;22329:21;;;22386:2;22366:18;;;22359:30;22425:34;22420:2;22405:18;;22398:62;-1:-1:-1;;;22491:2:1;22476:18;;22469:37;22538:3;22523:19;;22319:229::o;22553:352::-;22755:2;22737:21;;;22794:2;22774:18;;;22767:30;22833;22828:2;22813:18;;22806:58;22896:2;22881:18;;22727:178::o;22910:397::-;23112:2;23094:21;;;23151:2;23131:18;;;23124:30;23190:34;23185:2;23170:18;;23163:62;-1:-1:-1;;;23256:2:1;23241:18;;23234:31;23297:3;23282:19;;23084:223::o;23312:413::-;23514:2;23496:21;;;23553:2;23533:18;;;23526:30;23592:34;23587:2;23572:18;;23565:62;-1:-1:-1;;;23658:2:1;23643:18;;23636:47;23715:3;23700:19;;23486:239::o;23730:349::-;23932:2;23914:21;;;23971:2;23951:18;;;23944:30;24010:27;24005:2;23990:18;;23983:55;24070:2;24055:18;;23904:175::o;24084:338::-;24286:2;24268:21;;;24325:2;24305:18;;;24298:30;-1:-1:-1;;;24359:2:1;24344:18;;24337:44;24413:2;24398:18;;24258:164::o;24427:353::-;24629:2;24611:21;;;24668:2;24648:18;;;24641:30;24707:31;24702:2;24687:18;;24680:59;24771:2;24756:18;;24601:179::o;24785:177::-;24931:25;;;24919:2;24904:18;;24886:76::o;24967:292::-;;25144:6;25133:9;25126:25;25187:2;25182;25171:9;25167:18;25160:30;25207:46;25249:2;25238:9;25234:18;25226:6;25207:46;:::i;25264:275::-;25335:2;25329:9;25400:2;25381:13;;-1:-1:-1;;25377:27:1;25365:40;;25435:18;25420:34;;25456:22;;;25417:62;25414:2;;;25482:18;;:::i;:::-;25518:2;25511:22;25309:230;;-1:-1:-1;25309:230:1:o;25544:192::-;;25643:18;25635:6;25632:30;25629:2;;;25665:18;;:::i;:::-;-1:-1:-1;25725:4:1;25706:17;;;25702:28;;25619:117::o;25741:128::-;;25812:1;25808:6;25805:1;25802:13;25799:2;;;25818:18;;:::i;:::-;-1:-1:-1;25854:9:1;;25789:80::o;25874:120::-;;25940:1;25930:2;;25945:18;;:::i;:::-;-1:-1:-1;25979:9:1;;25920:74::o;25999:125::-;;26067:1;26064;26061:8;26058:2;;;26072:18;;:::i;:::-;-1:-1:-1;26109:9:1;;26048:76::o;26129:258::-;26201:1;26211:113;26225:6;26222:1;26219:13;26211:113;;;26301:11;;;26295:18;26282:11;;;26275:39;26247:2;26240:10;26211:113;;;26342:6;26339:1;26336:13;26333:2;;;-1:-1:-1;;26377:1:1;26359:16;;26352:27;26182:205::o;26392:380::-;26477:1;26467:12;;26524:1;26514:12;;;26535:2;;26589:4;26581:6;26577:17;26567:27;;26535:2;26642;26634:6;26631:14;26611:18;26608:38;26605:2;;;26688:10;26683:3;26679:20;26676:1;26669:31;26723:4;26720:1;26713:15;26751:4;26748:1;26741:15;26605:2;;26447:325;;;:::o;26777:135::-;;-1:-1:-1;;26837:17:1;;26834:2;;;26857:18;;:::i;:::-;-1:-1:-1;26904:1:1;26893:13;;26824:88::o;26917:175::-;;26998:4;26991:5;26987:16;27027:4;27018:7;27015:17;27012:2;;;27035:18;;:::i;:::-;27084:1;27071:15;;26962:130;-1:-1:-1;;26962:130:1:o;27097:112::-;;27155:1;27145:2;;27160:18;;:::i;:::-;-1:-1:-1;27194:9:1;;27135:74::o;27214:127::-;27275:10;27270:3;27266:20;27263:1;27256:31;27306:4;27303:1;27296:15;27330:4;27327:1;27320:15;27346:127;27407:10;27402:3;27398:20;27395:1;27388:31;27438:4;27435:1;27428:15;27462:4;27459:1;27452:15;27478:127;27539:10;27534:3;27530:20;27527:1;27520:31;27570:4;27567:1;27560:15;27594:4;27591:1;27584:15;27610:133;-1:-1:-1;;;;;27687:31:1;;27677:42;;27667:2;;27733:1;27730;27723:12;27748:133;-1:-1:-1;;;;;;27824:32:1;;27814:43;;27804:2;;27871:1;27868;27861:12
Swarm Source
ipfs://022d020cb5204d0962c1ff20facac625db2f5b9644620eef6e7d0d3c47255225
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.