Token
Oland Card (OCard)
ERC-1155
Overview
Max Total Supply
0 OCard
Holders
4
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
OlandCard
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at mumbai.polygonscan.com on 2022-04-28 */ // File: work/oland/olandCard.sol 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) { return msg.data; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success,) = recipient.call{value : amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements:* * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value : value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { } function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } } /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } contract OlandCard is ERC1155Burnable,ERC1155Supply,Ownable { struct Card{ uint256 cardId; uint256 length; string name; uint256 priceOff; } string private _name; string private _symbol; uint256 [] private cardIds; Card[] private cards; mapping(uint256 =>Card) private cardIdToCard; constructor() ERC1155("https://metadata.oland.info/card/data/{id}.json") { _name="Oland Card"; _symbol="OCard"; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function mint( uint256 cardId, uint256 length, string calldata cardName, uint256 priceOff, uint256 amount ) public onlyOwner returns(uint256){ require(!exists(cardId),"The token already exists"); cardIds.push(cardId); Card memory card = Card(cardId,length,cardName,priceOff); cards.push(card); cardIdToCard[cardId] = card; _mint(msg.sender,cardId, amount, ""); return cardId; } function increaseBalance( uint256 tokenId, uint256 amount ) public onlyOwner{ _mint(msg.sender,tokenId, amount, ""); } function getCard(uint256 cardId)external view returns(Card memory){ return cardIdToCard[cardId]; } function getCards()public view returns(Card[] memory){ return cards; } function getCardIds()public view returns(uint256[] memory){ return cardIds; } function setUri(string memory uri) public onlyOwner { _setURI(uri); } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override(ERC1155,ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"getCard","outputs":[{"components":[{"internalType":"uint256","name":"cardId","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"priceOff","type":"uint256"}],"internalType":"struct OlandCard.Card","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCardIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCards","outputs":[{"components":[{"internalType":"uint256","name":"cardId","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"priceOff","type":"uint256"}],"internalType":"struct OlandCard.Card[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"string","name":"cardName","type":"string"},{"internalType":"uint256","name":"priceOff","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"uri","type":"string"}],"name":"setUri","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060600160405280602f8152602001620027eb602f91396200003781620000ac565b506200004333620000c5565b60408051808201909152600a8082526913db185b990810d85c9960b21b6020909201918252620000769160059162000117565b506040805180820190915260058082526413d0d85c9960da1b6020909201918252620000a59160069162000117565b50620001fa565b8051620000c190600290602084019062000117565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012590620001bd565b90600052602060002090601f01602090048101928262000149576000855562000194565b82601f106200016457805160ff191683800117855562000194565b8280016001018555821562000194579182015b828111156200019457825182559160200191906001019062000177565b50620001a2929150620001a6565b5090565b5b80821115620001a25760008155600101620001a7565b600181811c90821680620001d257607f821691505b60208210811415620001f457634e487b7160e01b600052602260045260246000fd5b50919050565b6125e1806200020a6000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c80639188d312116100c3578063bd85b0391161007c578063bd85b039146102cd578063e985e9c5146102ed578063f242432a14610329578063f2fde38b1461033c578063f479d3771461034f578063f5298aca1461036257600080fd5b80639188d31214610257578063947abdd31461027757806395d89b411461028a5780639b642de114610292578063a22cb465146102a5578063b0df9e53146102b857600080fd5b806348dcd10c1161011557806348dcd10c146101d75780634e1273f4146101ec5780634f558e79146101ff5780636b20c45414610221578063715018a6146102345780638da5cb5b1461023c57600080fd5b8062fdd58e1461015157806301ffc9a71461017757806306fdde031461019a5780630e89341c146101af5780632eb2c2d6146101c2575b600080fd5b61016461015f366004611cfc565b610375565b6040519081526020015b60405180910390f35b61018a610185366004611e2a565b61040c565b604051901515815260200161016e565b6101a261045e565b60405161016e919061218d565b6101a26101bd366004611eb5565b6104f0565b6101d56101d0366004611b3d565b610584565b005b6101df61061b565b60405161016e919061214c565b6101df6101fa366004611d59565b610672565b61018a61020d366004611eb5565b600090815260036020526040902054151590565b6101d561022f366004611c4c565b61079c565b6101d56107e4565b6004546040516001600160a01b03909116815260200161016e565b61026a610265366004611eb5565b61081a565b60405161016e91906123c4565b610164610285366004611ef0565b61091a565b6101a2610b45565b6101d56102a0366004611e64565b610b54565b6101d56102b3366004611cc0565b610b8a565b6102c0610c61565b60405161016e91906120ea565b6101646102db366004611eb5565b60009081526003602052604090205490565b61018a6102fb366004611b0a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101d5610337366004611be7565b610d70565b6101d561034a366004611aef565b610db5565b6101d561035d366004611ece565b610e4d565b6101d5610370366004611d26565b610e96565b60006001600160a01b0383166103e65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061043d57506001600160e01b031982166303a24d0760e21b145b8061045857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606005805461046d9061242a565b80601f01602080910402602001604051908101604052809291908181526020018280546104999061242a565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b5050505050905090565b6060600280546104ff9061242a565b80601f016020809104026020016040519081016040528092919081815260200182805461052b9061242a565b80156105785780601f1061054d57610100808354040283529160200191610578565b820191906000526020600020905b81548152906001019060200180831161055b57829003601f168201915b50505050509050919050565b6001600160a01b0385163314806105a057506105a085336102fb565b6106075760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016103dd565b6106148585858585610ed9565b5050505050565b606060078054806020026020016040519081016040528092919081815260200182805480156104e657602002820191906000526020600020905b815481526020019060010190808311610655575050505050905090565b606081518351146106d75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103dd565b6000835167ffffffffffffffff8111156106f3576106f36124d9565b60405190808252806020026020018201604052801561071c578160200160208202803683370190505b50905060005b845181101561079457610767858281518110610740576107406124c3565b602002602001015185838151811061075a5761075a6124c3565b6020026020010151610375565b828281518110610779576107796124c3565b602090810291909101015261078d81612492565b9050610722565b509392505050565b6001600160a01b0383163314806107b857506107b883336102fb565b6107d45760405162461bcd60e51b81526004016103dd9061222c565b6107df838383611083565b505050565b6004546001600160a01b0316331461080e5760405162461bcd60e51b81526004016103dd90612347565b6108186000611211565b565b6108456040518060800160405280600081526020016000815260200160608152602001600081525090565b6009600083815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820180546108879061242a565b80601f01602080910402602001604051908101604052809291908181526020018280546108b39061242a565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b505050505081526020016003820154815250509050919050565b6004546000906001600160a01b031633146109475760405162461bcd60e51b81526004016103dd90612347565b600087815260036020526040902054156109a35760405162461bcd60e51b815260206004820152601860248201527f54686520746f6b656e20616c726561647920657869737473000000000000000060448201526064016103dd565b6007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018890556040805160808101825289815260208181018a90528251601f8901829004820281018201845288815291928301919089908990819084018382808284376000920182905250938552505050602091820187905260088054600181018255915282517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee36004909202918201908155838301517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48301556040840151805194955085949193610ac9937ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5019291019061193e565b506060919091015160039091015560008881526009602090815260409182902083518155818401516001820155918301518051849392610b1092600285019291019061193e565b5060608201518160030155905050610b3933898560405180602001604052806000815250611263565b50959695505050505050565b60606006805461046d9061242a565b6004546001600160a01b03163314610b7e5760405162461bcd60e51b81526004016103dd90612347565b610b8781611373565b50565b336001600160a01b0383161415610bf55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103dd565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015610d6757838290600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282018054610ccc9061242a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf89061242a565b8015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b5050505050815260200160038201548152505081526020019060010190610c85565b50505050905090565b6001600160a01b038516331480610d8c5750610d8c85336102fb565b610da85760405162461bcd60e51b81526004016103dd9061222c565b6106148585858585611386565b6004546001600160a01b03163314610ddf5760405162461bcd60e51b81526004016103dd90612347565b6001600160a01b038116610e445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103dd565b610b8781611211565b6004546001600160a01b03163314610e775760405162461bcd60e51b81526004016103dd90612347565b610e9233838360405180602001604052806000815250611263565b5050565b6001600160a01b038316331480610eb25750610eb283336102fb565b610ece5760405162461bcd60e51b81526004016103dd9061222c565b6107df8383836114a3565b8151835114610efa5760405162461bcd60e51b81526004016103dd9061237c565b6001600160a01b038416610f205760405162461bcd60e51b81526004016103dd90612275565b33610f2f8187878787876115a4565b60005b8451811015611015576000858281518110610f4f57610f4f6124c3565b602002602001015190506000858381518110610f6d57610f6d6124c3565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fbd5760405162461bcd60e51b81526004016103dd906122fd565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610ffa9084906123fb565b925050819055505050508061100e90612492565b9050610f32565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161106592919061215f565b60405180910390a461107b8187878787876115b2565b505050505050565b6001600160a01b0383166110a95760405162461bcd60e51b81526004016103dd906122ba565b80518251146110ca5760405162461bcd60e51b81526004016103dd9061237c565b60003390506110ed818560008686604051806020016040528060008152506115a4565b60005b83518110156111b257600084828151811061110d5761110d6124c3565b60200260200101519050600084838151811061112b5761112b6124c3565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561117b5760405162461bcd60e51b81526004016103dd906121e8565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806111aa81612492565b9150506110f0565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161120392919061215f565b60405180910390a450505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166112c35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103dd565b336112e3816000876112d48861171d565b6112dd8861171d565b876115a4565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906113139084906123fb565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461061481600087878787611768565b8051610e9290600290602084019061193e565b6001600160a01b0384166113ac5760405162461bcd60e51b81526004016103dd90612275565b336113bc8187876112d48861171d565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113fd5760405162461bcd60e51b81526004016103dd906122fd565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061143a9084906123fb565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461149a828888888888611768565b50505050505050565b6001600160a01b0383166114c95760405162461bcd60e51b81526004016103dd906122ba565b336114f8818560006114da8761171d565b6114e38761171d565b604051806020016040528060008152506115a4565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156115395760405162461bcd60e51b81526004016103dd906121e8565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b61107b868686868686611832565b6001600160a01b0384163b1561107b5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906115f69089908990889088908890600401612047565b602060405180830381600087803b15801561161057600080fd5b505af1925050508015611640575060408051601f3d908101601f1916820190925261163d91810190611e47565b60015b6116ed5761164c6124ef565b806308c379a01415611686575061166161250b565b8061166c5750611688565b8060405162461bcd60e51b81526004016103dd919061218d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103dd565b6001600160e01b0319811663bc197c8160e01b1461149a5760405162461bcd60e51b81526004016103dd906121a0565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611757576117576124c3565b602090810291909101015292915050565b6001600160a01b0384163b1561107b5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906117ac90899089908890889088906004016120a5565b602060405180830381600087803b1580156117c657600080fd5b505af19250505080156117f6575060408051601f3d908101601f191682019092526117f391810190611e47565b60015b6118025761164c6124ef565b6001600160e01b0319811663f23a6e6160e01b1461149a5760405162461bcd60e51b81526004016103dd906121a0565b6001600160a01b0385166118b95760005b83518110156118b75782818151811061185e5761185e6124c3565b60200260200101516003600086848151811061187c5761187c6124c3565b6020026020010151815260200190815260200160002060008282546118a191906123fb565b909155506118b0905081612492565b9050611843565b505b6001600160a01b03841661107b5760005b835181101561149a578281815181106118e5576118e56124c3565b602002602001015160036000868481518110611903576119036124c3565b6020026020010151815260200190815260200160002060008282546119289190612413565b90915550611937905081612492565b90506118ca565b82805461194a9061242a565b90600052602060002090601f01602090048101928261196c57600085556119b2565b82601f1061198557805160ff19168380011785556119b2565b828001600101855582156119b2579182015b828111156119b2578251825591602001919060010190611997565b506119be9291506119c2565b5090565b5b808211156119be57600081556001016119c3565b600067ffffffffffffffff8311156119f1576119f16124d9565b604051611a08601f8501601f191660200182612465565b809150838152848484011115611a1d57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114611a4c57600080fd5b919050565b600082601f830112611a6257600080fd5b81356020611a6f826123d7565b604051611a7c8282612465565b8381528281019150858301600585901b87018401881015611a9c57600080fd5b60005b85811015611abb57813584529284019290840190600101611a9f565b5090979650505050505050565b600082601f830112611ad957600080fd5b611ae8838335602085016119d7565b9392505050565b600060208284031215611b0157600080fd5b611ae882611a35565b60008060408385031215611b1d57600080fd5b611b2683611a35565b9150611b3460208401611a35565b90509250929050565b600080600080600060a08688031215611b5557600080fd5b611b5e86611a35565b9450611b6c60208701611a35565b9350604086013567ffffffffffffffff80821115611b8957600080fd5b611b9589838a01611a51565b94506060880135915080821115611bab57600080fd5b611bb789838a01611a51565b93506080880135915080821115611bcd57600080fd5b50611bda88828901611ac8565b9150509295509295909350565b600080600080600060a08688031215611bff57600080fd5b611c0886611a35565b9450611c1660208701611a35565b93506040860135925060608601359150608086013567ffffffffffffffff811115611c4057600080fd5b611bda88828901611ac8565b600080600060608486031215611c6157600080fd5b611c6a84611a35565b9250602084013567ffffffffffffffff80821115611c8757600080fd5b611c9387838801611a51565b93506040860135915080821115611ca957600080fd5b50611cb686828701611a51565b9150509250925092565b60008060408385031215611cd357600080fd5b611cdc83611a35565b915060208301358015158114611cf157600080fd5b809150509250929050565b60008060408385031215611d0f57600080fd5b611d1883611a35565b946020939093013593505050565b600080600060608486031215611d3b57600080fd5b611d4484611a35565b95602085013595506040909401359392505050565b60008060408385031215611d6c57600080fd5b823567ffffffffffffffff80821115611d8457600080fd5b818501915085601f830112611d9857600080fd5b81356020611da5826123d7565b604051611db28282612465565b8381528281019150858301600585901b870184018b1015611dd257600080fd5b600096505b84871015611dfc57611de881611a35565b835260019690960195918301918301611dd7565b5096505086013592505080821115611e1357600080fd5b50611e2085828601611a51565b9150509250929050565b600060208284031215611e3c57600080fd5b8135611ae881612595565b600060208284031215611e5957600080fd5b8151611ae881612595565b600060208284031215611e7657600080fd5b813567ffffffffffffffff811115611e8d57600080fd5b8201601f81018413611e9e57600080fd5b611ead848235602084016119d7565b949350505050565b600060208284031215611ec757600080fd5b5035919050565b60008060408385031215611ee157600080fd5b50508035926020909101359150565b60008060008060008060a08789031215611f0957600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115611f2f57600080fd5b818901915089601f830112611f4357600080fd5b813581811115611f5257600080fd5b8a6020828501011115611f6457600080fd5b979a9699505060200196606081013595608090910135945092505050565b600081518084526020808501945080840160005b83811015611fb257815187529582019590820190600101611f96565b509495945050505050565b6000815180845260005b81811015611fe357602081850181015186830182015201611fc7565b81811115611ff5576000602083870101525b50601f01601f19169290920160200192915050565b805182526020810151602083015260006040820151608060408501526120336080850182611fbd565b606093840151949093019390935250919050565b6001600160a01b0386811682528516602082015260a06040820181905260009061207390830186611f82565b82810360608401526120858186611f82565b905082810360808401526120998185611fbd565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906120df90830184611fbd565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561213f57603f1988860301845261212d85835161200a565b94509285019290850190600101612111565b5092979650505050505050565b602081526000611ae86020830184611f82565b6040815260006121726040830185611f82565b82810360208401526121848185611f82565b95945050505050565b602081526000611ae86020830184611fbd565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b602081526000611ae8602083018461200a565b600067ffffffffffffffff8211156123f1576123f16124d9565b5060051b60200190565b6000821982111561240e5761240e6124ad565b500190565b600082821015612425576124256124ad565b500390565b600181811c9082168061243e57607f821691505b6020821081141561245f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561248b5761248b6124d9565b6040525050565b60006000198214156124a6576124a66124ad565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156125085760046000803e5060005160e01c5b90565b600060443d10156125195790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561254957505050505090565b82850191508151818111156125615750505050505090565b843d870101602082850101111561257b5750505050505090565b61258a60208286010187612465565b509095945050505050565b6001600160e01b031981168114610b8757600080fdfea26469706673582212208b863d2cb84e7f5d2f7a38ff5ea0b7d6527f7b4146ecbfc8af1fae59f49380db64736f6c6343000807003368747470733a2f2f6d657461646174612e6f6c616e642e696e666f2f636172642f646174612f7b69647d2e6a736f6e
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014c5760003560e01c80639188d312116100c3578063bd85b0391161007c578063bd85b039146102cd578063e985e9c5146102ed578063f242432a14610329578063f2fde38b1461033c578063f479d3771461034f578063f5298aca1461036257600080fd5b80639188d31214610257578063947abdd31461027757806395d89b411461028a5780639b642de114610292578063a22cb465146102a5578063b0df9e53146102b857600080fd5b806348dcd10c1161011557806348dcd10c146101d75780634e1273f4146101ec5780634f558e79146101ff5780636b20c45414610221578063715018a6146102345780638da5cb5b1461023c57600080fd5b8062fdd58e1461015157806301ffc9a71461017757806306fdde031461019a5780630e89341c146101af5780632eb2c2d6146101c2575b600080fd5b61016461015f366004611cfc565b610375565b6040519081526020015b60405180910390f35b61018a610185366004611e2a565b61040c565b604051901515815260200161016e565b6101a261045e565b60405161016e919061218d565b6101a26101bd366004611eb5565b6104f0565b6101d56101d0366004611b3d565b610584565b005b6101df61061b565b60405161016e919061214c565b6101df6101fa366004611d59565b610672565b61018a61020d366004611eb5565b600090815260036020526040902054151590565b6101d561022f366004611c4c565b61079c565b6101d56107e4565b6004546040516001600160a01b03909116815260200161016e565b61026a610265366004611eb5565b61081a565b60405161016e91906123c4565b610164610285366004611ef0565b61091a565b6101a2610b45565b6101d56102a0366004611e64565b610b54565b6101d56102b3366004611cc0565b610b8a565b6102c0610c61565b60405161016e91906120ea565b6101646102db366004611eb5565b60009081526003602052604090205490565b61018a6102fb366004611b0a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101d5610337366004611be7565b610d70565b6101d561034a366004611aef565b610db5565b6101d561035d366004611ece565b610e4d565b6101d5610370366004611d26565b610e96565b60006001600160a01b0383166103e65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061043d57506001600160e01b031982166303a24d0760e21b145b8061045857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606005805461046d9061242a565b80601f01602080910402602001604051908101604052809291908181526020018280546104999061242a565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b5050505050905090565b6060600280546104ff9061242a565b80601f016020809104026020016040519081016040528092919081815260200182805461052b9061242a565b80156105785780601f1061054d57610100808354040283529160200191610578565b820191906000526020600020905b81548152906001019060200180831161055b57829003601f168201915b50505050509050919050565b6001600160a01b0385163314806105a057506105a085336102fb565b6106075760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016103dd565b6106148585858585610ed9565b5050505050565b606060078054806020026020016040519081016040528092919081815260200182805480156104e657602002820191906000526020600020905b815481526020019060010190808311610655575050505050905090565b606081518351146106d75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103dd565b6000835167ffffffffffffffff8111156106f3576106f36124d9565b60405190808252806020026020018201604052801561071c578160200160208202803683370190505b50905060005b845181101561079457610767858281518110610740576107406124c3565b602002602001015185838151811061075a5761075a6124c3565b6020026020010151610375565b828281518110610779576107796124c3565b602090810291909101015261078d81612492565b9050610722565b509392505050565b6001600160a01b0383163314806107b857506107b883336102fb565b6107d45760405162461bcd60e51b81526004016103dd9061222c565b6107df838383611083565b505050565b6004546001600160a01b0316331461080e5760405162461bcd60e51b81526004016103dd90612347565b6108186000611211565b565b6108456040518060800160405280600081526020016000815260200160608152602001600081525090565b6009600083815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820180546108879061242a565b80601f01602080910402602001604051908101604052809291908181526020018280546108b39061242a565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b505050505081526020016003820154815250509050919050565b6004546000906001600160a01b031633146109475760405162461bcd60e51b81526004016103dd90612347565b600087815260036020526040902054156109a35760405162461bcd60e51b815260206004820152601860248201527f54686520746f6b656e20616c726561647920657869737473000000000000000060448201526064016103dd565b6007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018890556040805160808101825289815260208181018a90528251601f8901829004820281018201845288815291928301919089908990819084018382808284376000920182905250938552505050602091820187905260088054600181018255915282517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee36004909202918201908155838301517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48301556040840151805194955085949193610ac9937ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5019291019061193e565b506060919091015160039091015560008881526009602090815260409182902083518155818401516001820155918301518051849392610b1092600285019291019061193e565b5060608201518160030155905050610b3933898560405180602001604052806000815250611263565b50959695505050505050565b60606006805461046d9061242a565b6004546001600160a01b03163314610b7e5760405162461bcd60e51b81526004016103dd90612347565b610b8781611373565b50565b336001600160a01b0383161415610bf55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103dd565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015610d6757838290600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282018054610ccc9061242a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf89061242a565b8015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b5050505050815260200160038201548152505081526020019060010190610c85565b50505050905090565b6001600160a01b038516331480610d8c5750610d8c85336102fb565b610da85760405162461bcd60e51b81526004016103dd9061222c565b6106148585858585611386565b6004546001600160a01b03163314610ddf5760405162461bcd60e51b81526004016103dd90612347565b6001600160a01b038116610e445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103dd565b610b8781611211565b6004546001600160a01b03163314610e775760405162461bcd60e51b81526004016103dd90612347565b610e9233838360405180602001604052806000815250611263565b5050565b6001600160a01b038316331480610eb25750610eb283336102fb565b610ece5760405162461bcd60e51b81526004016103dd9061222c565b6107df8383836114a3565b8151835114610efa5760405162461bcd60e51b81526004016103dd9061237c565b6001600160a01b038416610f205760405162461bcd60e51b81526004016103dd90612275565b33610f2f8187878787876115a4565b60005b8451811015611015576000858281518110610f4f57610f4f6124c3565b602002602001015190506000858381518110610f6d57610f6d6124c3565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fbd5760405162461bcd60e51b81526004016103dd906122fd565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610ffa9084906123fb565b925050819055505050508061100e90612492565b9050610f32565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161106592919061215f565b60405180910390a461107b8187878787876115b2565b505050505050565b6001600160a01b0383166110a95760405162461bcd60e51b81526004016103dd906122ba565b80518251146110ca5760405162461bcd60e51b81526004016103dd9061237c565b60003390506110ed818560008686604051806020016040528060008152506115a4565b60005b83518110156111b257600084828151811061110d5761110d6124c3565b60200260200101519050600084838151811061112b5761112b6124c3565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561117b5760405162461bcd60e51b81526004016103dd906121e8565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806111aa81612492565b9150506110f0565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161120392919061215f565b60405180910390a450505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166112c35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103dd565b336112e3816000876112d48861171d565b6112dd8861171d565b876115a4565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906113139084906123fb565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461061481600087878787611768565b8051610e9290600290602084019061193e565b6001600160a01b0384166113ac5760405162461bcd60e51b81526004016103dd90612275565b336113bc8187876112d48861171d565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113fd5760405162461bcd60e51b81526004016103dd906122fd565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061143a9084906123fb565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461149a828888888888611768565b50505050505050565b6001600160a01b0383166114c95760405162461bcd60e51b81526004016103dd906122ba565b336114f8818560006114da8761171d565b6114e38761171d565b604051806020016040528060008152506115a4565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156115395760405162461bcd60e51b81526004016103dd906121e8565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b61107b868686868686611832565b6001600160a01b0384163b1561107b5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906115f69089908990889088908890600401612047565b602060405180830381600087803b15801561161057600080fd5b505af1925050508015611640575060408051601f3d908101601f1916820190925261163d91810190611e47565b60015b6116ed5761164c6124ef565b806308c379a01415611686575061166161250b565b8061166c5750611688565b8060405162461bcd60e51b81526004016103dd919061218d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103dd565b6001600160e01b0319811663bc197c8160e01b1461149a5760405162461bcd60e51b81526004016103dd906121a0565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611757576117576124c3565b602090810291909101015292915050565b6001600160a01b0384163b1561107b5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906117ac90899089908890889088906004016120a5565b602060405180830381600087803b1580156117c657600080fd5b505af19250505080156117f6575060408051601f3d908101601f191682019092526117f391810190611e47565b60015b6118025761164c6124ef565b6001600160e01b0319811663f23a6e6160e01b1461149a5760405162461bcd60e51b81526004016103dd906121a0565b6001600160a01b0385166118b95760005b83518110156118b75782818151811061185e5761185e6124c3565b60200260200101516003600086848151811061187c5761187c6124c3565b6020026020010151815260200190815260200160002060008282546118a191906123fb565b909155506118b0905081612492565b9050611843565b505b6001600160a01b03841661107b5760005b835181101561149a578281815181106118e5576118e56124c3565b602002602001015160036000868481518110611903576119036124c3565b6020026020010151815260200190815260200160002060008282546119289190612413565b90915550611937905081612492565b90506118ca565b82805461194a9061242a565b90600052602060002090601f01602090048101928261196c57600085556119b2565b82601f1061198557805160ff19168380011785556119b2565b828001600101855582156119b2579182015b828111156119b2578251825591602001919060010190611997565b506119be9291506119c2565b5090565b5b808211156119be57600081556001016119c3565b600067ffffffffffffffff8311156119f1576119f16124d9565b604051611a08601f8501601f191660200182612465565b809150838152848484011115611a1d57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114611a4c57600080fd5b919050565b600082601f830112611a6257600080fd5b81356020611a6f826123d7565b604051611a7c8282612465565b8381528281019150858301600585901b87018401881015611a9c57600080fd5b60005b85811015611abb57813584529284019290840190600101611a9f565b5090979650505050505050565b600082601f830112611ad957600080fd5b611ae8838335602085016119d7565b9392505050565b600060208284031215611b0157600080fd5b611ae882611a35565b60008060408385031215611b1d57600080fd5b611b2683611a35565b9150611b3460208401611a35565b90509250929050565b600080600080600060a08688031215611b5557600080fd5b611b5e86611a35565b9450611b6c60208701611a35565b9350604086013567ffffffffffffffff80821115611b8957600080fd5b611b9589838a01611a51565b94506060880135915080821115611bab57600080fd5b611bb789838a01611a51565b93506080880135915080821115611bcd57600080fd5b50611bda88828901611ac8565b9150509295509295909350565b600080600080600060a08688031215611bff57600080fd5b611c0886611a35565b9450611c1660208701611a35565b93506040860135925060608601359150608086013567ffffffffffffffff811115611c4057600080fd5b611bda88828901611ac8565b600080600060608486031215611c6157600080fd5b611c6a84611a35565b9250602084013567ffffffffffffffff80821115611c8757600080fd5b611c9387838801611a51565b93506040860135915080821115611ca957600080fd5b50611cb686828701611a51565b9150509250925092565b60008060408385031215611cd357600080fd5b611cdc83611a35565b915060208301358015158114611cf157600080fd5b809150509250929050565b60008060408385031215611d0f57600080fd5b611d1883611a35565b946020939093013593505050565b600080600060608486031215611d3b57600080fd5b611d4484611a35565b95602085013595506040909401359392505050565b60008060408385031215611d6c57600080fd5b823567ffffffffffffffff80821115611d8457600080fd5b818501915085601f830112611d9857600080fd5b81356020611da5826123d7565b604051611db28282612465565b8381528281019150858301600585901b870184018b1015611dd257600080fd5b600096505b84871015611dfc57611de881611a35565b835260019690960195918301918301611dd7565b5096505086013592505080821115611e1357600080fd5b50611e2085828601611a51565b9150509250929050565b600060208284031215611e3c57600080fd5b8135611ae881612595565b600060208284031215611e5957600080fd5b8151611ae881612595565b600060208284031215611e7657600080fd5b813567ffffffffffffffff811115611e8d57600080fd5b8201601f81018413611e9e57600080fd5b611ead848235602084016119d7565b949350505050565b600060208284031215611ec757600080fd5b5035919050565b60008060408385031215611ee157600080fd5b50508035926020909101359150565b60008060008060008060a08789031215611f0957600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115611f2f57600080fd5b818901915089601f830112611f4357600080fd5b813581811115611f5257600080fd5b8a6020828501011115611f6457600080fd5b979a9699505060200196606081013595608090910135945092505050565b600081518084526020808501945080840160005b83811015611fb257815187529582019590820190600101611f96565b509495945050505050565b6000815180845260005b81811015611fe357602081850181015186830182015201611fc7565b81811115611ff5576000602083870101525b50601f01601f19169290920160200192915050565b805182526020810151602083015260006040820151608060408501526120336080850182611fbd565b606093840151949093019390935250919050565b6001600160a01b0386811682528516602082015260a06040820181905260009061207390830186611f82565b82810360608401526120858186611f82565b905082810360808401526120998185611fbd565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906120df90830184611fbd565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561213f57603f1988860301845261212d85835161200a565b94509285019290850190600101612111565b5092979650505050505050565b602081526000611ae86020830184611f82565b6040815260006121726040830185611f82565b82810360208401526121848185611f82565b95945050505050565b602081526000611ae86020830184611fbd565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b602081526000611ae8602083018461200a565b600067ffffffffffffffff8211156123f1576123f16124d9565b5060051b60200190565b6000821982111561240e5761240e6124ad565b500190565b600082821015612425576124256124ad565b500390565b600181811c9082168061243e57607f821691505b6020821081141561245f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561248b5761248b6124d9565b6040525050565b60006000198214156124a6576124a66124ad565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156125085760046000803e5060005160e01c5b90565b600060443d10156125195790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561254957505050505090565b82850191508151818111156125615750505050505090565b843d870101602082850101111561257b5750505050505090565b61258a60208286010187612465565b509095945050505050565b6001600160e01b031981168114610b8757600080fdfea26469706673582212208b863d2cb84e7f5d2f7a38ff5ea0b7d6527f7b4146ecbfc8af1fae59f49380db64736f6c63430008070033
Deployed Bytecode Sourcemap
38253:2176:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21156:231;;;;;;:::i;:::-;;:::i;:::-;;;20496:25:1;;;20484:2;20469:18;21156:231:0;;;;;;;;20191:298;;;;;;:::i;:::-;;:::i;:::-;;;13396:14:1;;13389:22;13371:41;;13359:2;13344:18;20191:298:0;13231:187:1;38761:83:0;;;:::i;:::-;;;;;;;:::i;20900:105::-;;;;;;:::i;:::-;;:::i;23231:442::-;;;;;;:::i;:::-;;:::i;:::-;;39833:91;;;:::i;:::-;;;;;;;:::i;21553:504::-;;;;;;:::i;:::-;;:::i;36068:122::-;;;;;;:::i;:::-;36125:4;35946:16;;;:12;:16;;;;;;-1:-1:-1;;;36068:122:0;34963:353;;;;;;:::i;:::-;;:::i;10175:94::-;;;:::i;9524:87::-;9597:6;;9524:87;;-1:-1:-1;;;;;9597:6:0;;;10200:51:1;;10188:2;10173:18;9524:87:0;10054:203:1;39620:113:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38948:496::-;;;;;;:::i;:::-;;:::i;38852:87::-;;;:::i;39932:83::-;;;;;;:::i;:::-;;:::i;22130:311::-;;;;;;:::i;:::-;;:::i;39741:84::-;;;:::i;:::-;;;;;;;:::i;35857:113::-;;;;;;:::i;:::-;35919:7;35946:16;;;:12;:16;;;;;;;35857:113;22513:168;;;;;;:::i;:::-;-1:-1:-1;;;;;22636:27:0;;;22612:4;22636:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;22513:168;22753:401;;;;;;:::i;:::-;;:::i;10424:192::-;;;;;;:::i;:::-;;:::i;39452:156::-;;;;;;:::i;:::-;;:::i;34634:321::-;;;;;;:::i;:::-;;:::i;21156:231::-;21242:7;-1:-1:-1;;;;;21270:21:0;;21262:77;;;;-1:-1:-1;;;21262:77:0;;14679:2:1;21262:77:0;;;14661:21:1;14718:2;14698:18;;;14691:30;14757:34;14737:18;;;14730:62;-1:-1:-1;;;14808:18:1;;;14801:41;14859:19;;21262:77:0;;;;;;;;;-1:-1:-1;21357:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21357:22:0;;;;;;;;;;;;21156:231::o;20191:298::-;20293:4;-1:-1:-1;;;;;;20326:41:0;;-1:-1:-1;;;20326:41:0;;:106;;-1:-1:-1;;;;;;;20380:52:0;;-1:-1:-1;;;20380:52:0;20326:106;:155;;;-1:-1:-1;;;;;;;;;;16366:40:0;;;20445:36;20310:171;20191:298;-1:-1:-1;;20191:298:0:o;38761:83::-;38798:13;38831:5;38824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38761:83;:::o;20900:105::-;20960:13;20993:4;20986:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20900:105;;;:::o;23231:442::-;-1:-1:-1;;;;;23464:20:0;;687:10;23464:20;;:60;;-1:-1:-1;23488:36:0;23505:4;687:10;22513:168;:::i;23488:36::-;23442:160;;;;-1:-1:-1;;;23442:160:0;;16719:2:1;23442:160:0;;;16701:21:1;16758:2;16738:18;;;16731:30;16797:34;16777:18;;;16770:62;-1:-1:-1;;;16848:18:1;;;16841:48;16906:19;;23442:160:0;16517:414:1;23442:160:0;23613:52;23636:4;23642:2;23646:3;23651:7;23660:4;23613:22;:52::i;:::-;23231:442;;;;;:::o;39833:91::-;39874:16;39909:7;39902:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39833:91;:::o;21553:504::-;21689:16;21750:3;:10;21731:8;:15;:29;21723:83;;;;-1:-1:-1;;;21723:83:0;;19077:2:1;21723:83:0;;;19059:21:1;19116:2;19096:18;;;19089:30;19155:34;19135:18;;;19128:62;-1:-1:-1;;;19206:18:1;;;19199:39;19255:19;;21723:83:0;18875:405:1;21723:83:0;21819:30;21866:8;:15;21852:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21852:30:0;;21819:63;;21900:9;21895:122;21919:8;:15;21915:1;:19;21895:122;;;21975:30;21985:8;21994:1;21985:11;;;;;;;;:::i;:::-;;;;;;;21998:3;22002:1;21998:6;;;;;;;;:::i;:::-;;;;;;;21975:9;:30::i;:::-;21956:13;21970:1;21956:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;21936:3;;;:::i;:::-;;;21895:122;;;-1:-1:-1;22036:13:0;21553:504;-1:-1:-1;;;21553:504:0:o;34963:353::-;-1:-1:-1;;;;;35128:23:0;;687:10;35128:23;;:66;;-1:-1:-1;35155:39:0;35172:7;687:10;22513:168;:::i;35155:39::-;35106:157;;;;-1:-1:-1;;;35106:157:0;;;;;;;:::i;:::-;35276:32;35287:7;35296:3;35301:6;35276:10;:32::i;:::-;34963:353;;;:::o;10175:94::-;9597:6;;-1:-1:-1;;;;;9597:6:0;687:10;9744:23;9736:68;;;;-1:-1:-1;;;9736:68:0;;;;;;;:::i;:::-;10240:21:::1;10258:1;10240:9;:21::i;:::-;10175:94::o:0;39620:113::-;39674:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39674:11:0;39705:12;:20;39718:6;39705:20;;;;;;;;;;;39697:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39620:113;;;:::o;38948:496::-;9597:6;;39131:7;;-1:-1:-1;;;;;9597:6:0;687:10;9744:23;9736:68;;;;-1:-1:-1;;;9736:68:0;;;;;;;:::i;:::-;36125:4;35946:16;;;:12;:16;;;;;;-1:-1:-1;39150:51:0::1;;;::::0;-1:-1:-1;;;39150:51:0;;18314:2:1;39150:51:0::1;::::0;::::1;18296:21:1::0;18353:2;18333:18;;;18326:30;18392:26;18372:18;;;18365:54;18436:18;;39150:51:0::1;18112:348:1::0;39150:51:0::1;39212:7;:20:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;39212:20:0;;;;::::1;::::0;;;39263:37:::1;::::0;;::::1;::::0;::::1;::::0;;;;;39212:20:::1;39263:37:::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;39282:8;;;;;;39263:37;::::1;39282:8:::0;;;;39263:37;::::1;;::::0;::::1;::::0;;;-1:-1:-1;39263:37:0;;;-1:-1:-1;;;39263:37:0::1;::::0;;::::1;::::0;;;39311:5:::1;:16:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;39311:16:0;;;;::::1;::::0;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;39311:16:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;39338:20:::1;::::0;;;:12:::1;:20;::::0;;;;;;;;:27;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;39361:4;;39338:20;:27:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;39376:36;39382:10;39393:6;39401;39376:36;;;;;;;;;;;::::0;:5:::1;:36::i;:::-;-1:-1:-1::0;39430:6:0;;38948:496;-1:-1:-1;;;;;;38948:496:0:o;38852:87::-;38891:13;38924:7;38917:14;;;;;:::i;39932:83::-;9597:6;;-1:-1:-1;;;;;9597:6:0;687:10;9744:23;9736:68;;;;-1:-1:-1;;;9736:68:0;;;;;;;:::i;:::-;39995:12:::1;40003:3;39995:7;:12::i;:::-;39932:83:::0;:::o;22130:311::-;687:10;-1:-1:-1;;;;;22233:24:0;;;;22225:78;;;;-1:-1:-1;;;22225:78:0;;18667:2:1;22225:78:0;;;18649:21:1;18706:2;18686:18;;;18679:30;18745:34;18725:18;;;18718:62;-1:-1:-1;;;18796:18:1;;;18789:39;18845:19;;22225:78:0;18465:405:1;22225:78:0;687:10;22316:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22316:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22316:53:0;;;;;;;;;;22385:48;;13371:41:1;;;22316:42:0;;687:10;22385:48;;13344:18:1;22385:48:0;;;;;;;22130:311;;:::o;39741:84::-;39780:13;39812:5;39805:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39741:84;:::o;22753:401::-;-1:-1:-1;;;;;22961:20:0;;687:10;22961:20;;:60;;-1:-1:-1;22985:36:0;23002:4;687:10;22513:168;:::i;22985:36::-;22939:151;;;;-1:-1:-1;;;22939:151:0;;;;;;;:::i;:::-;23101:45;23119:4;23125:2;23129;23133:6;23141:4;23101:17;:45::i;10424:192::-;9597:6;;-1:-1:-1;;;;;9597:6:0;687:10;9744:23;9736:68;;;;-1:-1:-1;;;9736:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10513:22:0;::::1;10505:73;;;::::0;-1:-1:-1;;;10505:73:0;;15091:2:1;10505:73:0::1;::::0;::::1;15073:21:1::0;15130:2;15110:18;;;15103:30;15169:34;15149:18;;;15142:62;-1:-1:-1;;;15220:18:1;;;15213:36;15266:19;;10505:73:0::1;14889:402:1::0;10505:73:0::1;10589:19;10599:8;10589:9;:19::i;39452:156::-:0;9597:6;;-1:-1:-1;;;;;9597:6:0;687:10;9744:23;9736:68;;;;-1:-1:-1;;;9736:68:0;;;;;;;:::i;:::-;39563:37:::1;39569:10;39580:7;39589:6;39563:37;;;;;;;;;;;::::0;:5:::1;:37::i;:::-;39452:156:::0;;:::o;34634:321::-;-1:-1:-1;;;;;34774:23:0;;687:10;34774:23;;:66;;-1:-1:-1;34801:39:0;34818:7;687:10;22513:168;:::i;34801:39::-;34752:157;;;;-1:-1:-1;;;34752:157:0;;;;;;;:::i;:::-;34922:25;34928:7;34937:2;34941:5;34922;:25::i;25303:1062::-;25530:7;:14;25516:3;:10;:28;25508:81;;;;-1:-1:-1;;;25508:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25608:16:0;;25600:66;;;;-1:-1:-1;;;25600:66:0;;;;;;;:::i;:::-;687:10;25723:60;687:10;25754:4;25760:2;25764:3;25769:7;25778:4;25723:20;:60::i;:::-;25801:9;25796:409;25820:3;:10;25816:1;:14;25796:409;;;25852:10;25865:3;25869:1;25865:6;;;;;;;;:::i;:::-;;;;;;;25852:19;;25886:14;25903:7;25911:1;25903:10;;;;;;;;:::i;:::-;;;;;;;;;;;;25930:19;25952:13;;;;;;;;;;-1:-1:-1;;;;;25952:19:0;;;;;;;;;;;;25903:10;;-1:-1:-1;25994:21:0;;;;25986:76;;;;-1:-1:-1;;;25986:76:0;;;;;;;:::i;:::-;26098:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26098:19:0;;;;;;;;;;26120:20;;;26098:42;;26166:17;;;;;;;:27;;26120:20;;26098:9;26166:27;;26120:20;;26166:27;:::i;:::-;;;;;;;;25837:368;;;25832:3;;;;:::i;:::-;;;25796:409;;;;26252:2;-1:-1:-1;;;;;26222:47:0;26246:4;-1:-1:-1;;;;;26222:47:0;26236:8;-1:-1:-1;;;;;26222:47:0;;26256:3;26261:7;26222:47;;;;;;;:::i;:::-;;;;;;;;26282:75;26318:8;26328:4;26334:2;26338:3;26343:7;26352:4;26282:35;:75::i;:::-;25497:868;25303:1062;;;;;:::o;30513:906::-;-1:-1:-1;;;;;30668:21:0;;30660:69;;;;-1:-1:-1;;;30660:69:0;;;;;;;:::i;:::-;30762:7;:14;30748:3;:10;:28;30740:81;;;;-1:-1:-1;;;30740:81:0;;;;;;;:::i;:::-;30834:16;687:10;30834:31;;30878:69;30899:8;30909:7;30926:1;30930:3;30935:7;30878:69;;;;;;;;;;;;:20;:69::i;:::-;30965:9;30960:376;30984:3;:10;30980:1;:14;30960:376;;;31016:10;31029:3;31033:1;31029:6;;;;;;;;:::i;:::-;;;;;;;31016:19;;31050:14;31067:7;31075:1;31067:10;;;;;;;;:::i;:::-;;;;;;;;;;;;31094:22;31119:13;;;;;;;;;;-1:-1:-1;;;;;31119:22:0;;;;;;;;;;;;31067:10;;-1:-1:-1;31164:24:0;;;;31156:73;;;;-1:-1:-1;;;31156:73:0;;;;;;;:::i;:::-;31265:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31265:22:0;;;;;;;;;;31290:23;;31265:48;;30996:3;;;;:::i;:::-;;;;30960:376;;;;31394:1;-1:-1:-1;;;;;31353:58:0;31377:7;-1:-1:-1;;;;;31353:58:0;31367:8;-1:-1:-1;;;;;31353:58:0;;31398:3;31403:7;31353:58;;;;;;;:::i;:::-;;;;;;;;30649:770;30513:906;;;:::o;10624:173::-;10699:6;;;-1:-1:-1;;;;;10716:17:0;;;-1:-1:-1;;;;;;10716:17:0;;;;;;;10749:40;;10699:6;;;10716:17;10699:6;;10749:40;;10680:16;;10749:40;10669:128;10624:173;:::o;27698:599::-;-1:-1:-1;;;;;27856:21:0;;27848:67;;;;-1:-1:-1;;;27848:67:0;;19896:2:1;27848:67:0;;;19878:21:1;19935:2;19915:18;;;19908:30;19974:34;19954:18;;;19947:62;-1:-1:-1;;;20025:18:1;;;20018:31;20066:19;;27848:67:0;19694:397:1;27848:67:0;687:10;27972:107;687:10;27928:16;28015:7;28024:21;28042:2;28024:17;:21::i;:::-;28047:25;28065:6;28047:17;:25::i;:::-;28074:4;27972:20;:107::i;:::-;28092:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28092:22:0;;;;;;;;;:32;;28118:6;;28092:9;:32;;28118:6;;28092:32;:::i;:::-;;;;-1:-1:-1;;28140:57:0;;;20706:25:1;;;20762:2;20747:18;;20740:34;;;-1:-1:-1;;;;;28140:57:0;;;;28173:1;;28140:57;;;;;;20679:18:1;28140:57:0;;;;;;;28210:79;28241:8;28259:1;28263:7;28272:2;28276:6;28284:4;28210:30;:79::i;27209:88::-;27276:13;;;;:4;;:13;;;;;:::i;24137:808::-;-1:-1:-1;;;;;24325:16:0;;24317:66;;;;-1:-1:-1;;;24317:66:0;;;;;;;:::i;:::-;687:10;24440:96;687:10;24471:4;24477:2;24481:21;24499:2;24481:17;:21::i;24440:96::-;24549:19;24571:13;;;;;;;;;;;-1:-1:-1;;;;;24571:19:0;;;;;;;;;;24609:21;;;;24601:76;;;;-1:-1:-1;;;24601:76:0;;;;;;;:::i;:::-;24705:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24705:19:0;;;;;;;;;;24727:20;;;24705:42;;24765:17;;;;;;;:27;;24727:20;;24705:9;24765:27;;24727:20;;24765:27;:::i;:::-;;;;-1:-1:-1;;24810:46:0;;;20706:25:1;;;20762:2;20747:18;;20740:34;;;-1:-1:-1;;;;;24810:46:0;;;;;;;;;;;;;;20679:18:1;24810:46:0;;;;;;;24869:68;24900:8;24910:4;24916:2;24920;24924:6;24932:4;24869:30;:68::i;:::-;24306:639;;24137:808;;;;;:::o;29647:663::-;-1:-1:-1;;;;;29777:21:0;;29769:69;;;;-1:-1:-1;;;29769:69:0;;;;;;;:::i;:::-;687:10;29895:105;687:10;29926:7;29851:16;29947:21;29965:2;29947:17;:21::i;:::-;29970:25;29988:6;29970:17;:25::i;:::-;29895:105;;;;;;;;;;;;:20;:105::i;:::-;30013:22;30038:13;;;;;;;;;;;-1:-1:-1;;;;;30038:22:0;;;;;;;;;;30079:24;;;;30071:73;;;;-1:-1:-1;;;30071:73:0;;;;;;;:::i;:::-;30172:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30172:22:0;;;;;;;;;;;;30197:23;;;30172:48;;30245:57;;20706:25:1;;;20747:18;;;20740:34;;;30172:22:0;;30245:57;;;;;;20679:18:1;30245:57:0;;;;;;;29758:552;;29647:663;;;:::o;40090:336::-;40352:66;40379:8;40389:4;40395:2;40399:3;40404:7;40413:4;40352:26;:66::i;33368:817::-;-1:-1:-1;;;;;33608:13:0;;1827:20;1875:8;33604:574;;33644:79;;-1:-1:-1;;;33644:79:0;;-1:-1:-1;;;;;33644:43:0;;;;;:79;;33688:8;;33698:4;;33704:3;;33709:7;;33718:4;;33644:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33644:79:0;;;;;;;;-1:-1:-1;;33644:79:0;;;;;;;;;;;;:::i;:::-;;;33640:527;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;34040:6;34033:14;;-1:-1:-1;;;34033:14:0;;;;;;;;:::i;33640:527::-;;;34089:62;;-1:-1:-1;;;34089:62:0;;13849:2:1;34089:62:0;;;13831:21:1;13888:2;13868:18;;;13861:30;13927:34;13907:18;;;13900:62;-1:-1:-1;;;13978:18:1;;;13971:50;14038:19;;34089:62:0;13647:416:1;33640:527:0;-1:-1:-1;;;;;;33805:64:0;;-1:-1:-1;;;33805:64:0;33801:163;;33894:50;;-1:-1:-1;;;33894:50:0;;;;;;;:::i;34193:198::-;34313:16;;;34327:1;34313:16;;;;;;;;;34259;;34288:22;;34313:16;;;;;;;;;;;;-1:-1:-1;34313:16:0;34288:41;;34351:7;34340:5;34346:1;34340:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;34378:5;34193:198;-1:-1:-1;;34193:198:0:o;32612:748::-;-1:-1:-1;;;;;32827:13:0;;1827:20;1875:8;32823:530;;32863:72;;-1:-1:-1;;;32863:72:0;;-1:-1:-1;;;;;32863:38:0;;;;;:72;;32902:8;;32912:4;;32918:2;;32922:6;;32930:4;;32863:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32863:72:0;;;;;;;;-1:-1:-1;;32863:72:0;;;;;;;;;;;;:::i;:::-;;;32859:483;;;;:::i;:::-;-1:-1:-1;;;;;;32985:59:0;;-1:-1:-1;;;32985:59:0;32981:158;;33069:50;;-1:-1:-1;;;33069:50:0;;;;;;;:::i;36265:655::-;-1:-1:-1;;;;;36587:18:0;;36583:160;;36627:9;36622:110;36646:3;:10;36642:1;:14;36622:110;;;36706:7;36714:1;36706:10;;;;;;;;:::i;:::-;;;;;;;36682:12;:20;36695:3;36699:1;36695:6;;;;;;;;:::i;:::-;;;;;;;36682:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;36658:3:0;;-1:-1:-1;36658:3:0;;:::i;:::-;;;36622:110;;;;36583:160;-1:-1:-1;;;;;36759:16:0;;36755:158;;36797:9;36792:110;36816:3;:10;36812:1;:14;36792:110;;;36876:7;36884:1;36876:10;;;;;;;;:::i;:::-;;;;;;;36852:12;:20;36865:3;36869:1;36865:6;;;;;;;;:::i;:::-;;;;;;;36852:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;36828:3:0;;-1:-1:-1;36828:3:0;;:::i;:::-;;;36792:110;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:1;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:1;;;1175:1;1172;1165:12;1118:61;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:1;;665:735;-1:-1:-1;;;;;;;665:735:1:o;1405:220::-;1447:5;1500:3;1493:4;1485:6;1481:17;1477:27;1467:55;;1518:1;1515;1508:12;1467:55;1540:79;1615:3;1606:6;1593:20;1586:4;1578:6;1574:17;1540:79;:::i;:::-;1531:88;1405:220;-1:-1:-1;;;1405:220:1:o;1630:186::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;1781:29;1800:9;1781:29;:::i;1821:260::-;1889:6;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:52;;;1966:1;1963;1956:12;1918:52;1989:29;2008:9;1989:29;:::i;:::-;1979:39;;2037:38;2071:2;2060:9;2056:18;2037:38;:::i;:::-;2027:48;;1821:260;;;;;:::o;2086:943::-;2240:6;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2502:2;2491:9;2487:18;2474:32;2525:18;2566:2;2558:6;2555:14;2552:34;;;2582:1;2579;2572:12;2552:34;2605:61;2658:7;2649:6;2638:9;2634:22;2605:61;:::i;:::-;2595:71;;2719:2;2708:9;2704:18;2691:32;2675:48;;2748:2;2738:8;2735:16;2732:36;;;2764:1;2761;2754:12;2732:36;2787:63;2842:7;2831:8;2820:9;2816:24;2787:63;:::i;:::-;2777:73;;2903:3;2892:9;2888:19;2875:33;2859:49;;2933:2;2923:8;2920:16;2917:36;;;2949:1;2946;2939:12;2917:36;;2972:51;3015:7;3004:8;2993:9;2989:24;2972:51;:::i;:::-;2962:61;;;2086:943;;;;;;;;:::o;3034:606::-;3138:6;3146;3154;3162;3170;3223:3;3211:9;3202:7;3198:23;3194:33;3191:53;;;3240:1;3237;3230:12;3191:53;3263:29;3282:9;3263:29;:::i;:::-;3253:39;;3311:38;3345:2;3334:9;3330:18;3311:38;:::i;:::-;3301:48;;3396:2;3385:9;3381:18;3368:32;3358:42;;3447:2;3436:9;3432:18;3419:32;3409:42;;3502:3;3491:9;3487:19;3474:33;3530:18;3522:6;3519:30;3516:50;;;3562:1;3559;3552:12;3516:50;3585:49;3626:7;3617:6;3606:9;3602:22;3585:49;:::i;3645:669::-;3772:6;3780;3788;3841:2;3829:9;3820:7;3816:23;3812:32;3809:52;;;3857:1;3854;3847:12;3809:52;3880:29;3899:9;3880:29;:::i;:::-;3870:39;;3960:2;3949:9;3945:18;3932:32;3983:18;4024:2;4016:6;4013:14;4010:34;;;4040:1;4037;4030:12;4010:34;4063:61;4116:7;4107:6;4096:9;4092:22;4063:61;:::i;:::-;4053:71;;4177:2;4166:9;4162:18;4149:32;4133:48;;4206:2;4196:8;4193:16;4190:36;;;4222:1;4219;4212:12;4190:36;;4245:63;4300:7;4289:8;4278:9;4274:24;4245:63;:::i;:::-;4235:73;;;3645:669;;;;;:::o;4319:347::-;4384:6;4392;4445:2;4433:9;4424:7;4420:23;4416:32;4413:52;;;4461:1;4458;4451:12;4413:52;4484:29;4503:9;4484:29;:::i;:::-;4474:39;;4563:2;4552:9;4548:18;4535:32;4610:5;4603:13;4596:21;4589:5;4586:32;4576:60;;4632:1;4629;4622:12;4576:60;4655:5;4645:15;;;4319:347;;;;;:::o;4671:254::-;4739:6;4747;4800:2;4788:9;4779:7;4775:23;4771:32;4768:52;;;4816:1;4813;4806:12;4768:52;4839:29;4858:9;4839:29;:::i;:::-;4829:39;4915:2;4900:18;;;;4887:32;;-1:-1:-1;;;4671:254:1:o;4930:322::-;5007:6;5015;5023;5076:2;5064:9;5055:7;5051:23;5047:32;5044:52;;;5092:1;5089;5082:12;5044:52;5115:29;5134:9;5115:29;:::i;:::-;5105:39;5191:2;5176:18;;5163:32;;-1:-1:-1;5242:2:1;5227:18;;;5214:32;;4930:322;-1:-1:-1;;;4930:322:1:o;5257:1219::-;5375:6;5383;5436:2;5424:9;5415:7;5411:23;5407:32;5404:52;;;5452:1;5449;5442:12;5404:52;5492:9;5479:23;5521:18;5562:2;5554:6;5551:14;5548:34;;;5578:1;5575;5568:12;5548:34;5616:6;5605:9;5601:22;5591:32;;5661:7;5654:4;5650:2;5646:13;5642:27;5632:55;;5683:1;5680;5673:12;5632:55;5719:2;5706:16;5741:4;5764:43;5804:2;5764:43;:::i;:::-;5836:2;5830:9;5848:31;5876:2;5868:6;5848:31;:::i;:::-;5914:18;;;5948:15;;;;-1:-1:-1;5983:11:1;;;6025:1;6021:10;;;6013:19;;6009:28;;6006:41;-1:-1:-1;6003:61:1;;;6060:1;6057;6050:12;6003:61;6082:1;6073:10;;6092:169;6106:2;6103:1;6100:9;6092:169;;;6163:23;6182:3;6163:23;:::i;:::-;6151:36;;6124:1;6117:9;;;;;6207:12;;;;6239;;6092:169;;;-1:-1:-1;6280:6:1;-1:-1:-1;;6324:18:1;;6311:32;;-1:-1:-1;;6355:16:1;;;6352:36;;;6384:1;6381;6374:12;6352:36;;6407:63;6462:7;6451:8;6440:9;6436:24;6407:63;:::i;:::-;6397:73;;;5257:1219;;;;;:::o;6481:245::-;6539:6;6592:2;6580:9;6571:7;6567:23;6563:32;6560:52;;;6608:1;6605;6598:12;6560:52;6647:9;6634:23;6666:30;6690:5;6666:30;:::i;6731:249::-;6800:6;6853:2;6841:9;6832:7;6828:23;6824:32;6821:52;;;6869:1;6866;6859:12;6821:52;6901:9;6895:16;6920:30;6944:5;6920:30;:::i;6985:450::-;7054:6;7107:2;7095:9;7086:7;7082:23;7078:32;7075:52;;;7123:1;7120;7113:12;7075:52;7163:9;7150:23;7196:18;7188:6;7185:30;7182:50;;;7228:1;7225;7218:12;7182:50;7251:22;;7304:4;7296:13;;7292:27;-1:-1:-1;7282:55:1;;7333:1;7330;7323:12;7282:55;7356:73;7421:7;7416:2;7403:16;7398:2;7394;7390:11;7356:73;:::i;:::-;7346:83;6985:450;-1:-1:-1;;;;6985:450:1:o;7440:180::-;7499:6;7552:2;7540:9;7531:7;7527:23;7523:32;7520:52;;;7568:1;7565;7558:12;7520:52;-1:-1:-1;7591:23:1;;7440:180;-1:-1:-1;7440:180:1:o;7625:248::-;7693:6;7701;7754:2;7742:9;7733:7;7729:23;7725:32;7722:52;;;7770:1;7767;7760:12;7722:52;-1:-1:-1;;7793:23:1;;;7863:2;7848:18;;;7835:32;;-1:-1:-1;7625:248:1:o;7878:866::-;7985:6;7993;8001;8009;8017;8025;8078:3;8066:9;8057:7;8053:23;8049:33;8046:53;;;8095:1;8092;8085:12;8046:53;8131:9;8118:23;8108:33;;8188:2;8177:9;8173:18;8160:32;8150:42;;8243:2;8232:9;8228:18;8215:32;8266:18;8307:2;8299:6;8296:14;8293:34;;;8323:1;8320;8313:12;8293:34;8361:6;8350:9;8346:22;8336:32;;8406:7;8399:4;8395:2;8391:13;8387:27;8377:55;;8428:1;8425;8418:12;8377:55;8468:2;8455:16;8494:2;8486:6;8483:14;8480:34;;;8510:1;8507;8500:12;8480:34;8555:7;8550:2;8541:6;8537:2;8533:15;8529:24;8526:37;8523:57;;;8576:1;8573;8566:12;8523:57;7878:866;;;;-1:-1:-1;;8607:2:1;8599:11;;8682:2;8667:18;;8654:32;;8733:3;8718:19;;;8705:33;;-1:-1:-1;7878:866:1;-1:-1:-1;;;7878:866:1:o;8749:435::-;8802:3;8840:5;8834:12;8867:6;8862:3;8855:19;8893:4;8922:2;8917:3;8913:12;8906:19;;8959:2;8952:5;8948:14;8980:1;8990:169;9004:6;9001:1;8998:13;8990:169;;;9065:13;;9053:26;;9099:12;;;;9134:15;;;;9026:1;9019:9;8990:169;;;-1:-1:-1;9175:3:1;;8749:435;-1:-1:-1;;;;;8749:435:1:o;9189:471::-;9230:3;9268:5;9262:12;9295:6;9290:3;9283:19;9320:1;9330:162;9344:6;9341:1;9338:13;9330:162;;;9406:4;9462:13;;;9458:22;;9452:29;9434:11;;;9430:20;;9423:59;9359:12;9330:162;;;9510:6;9507:1;9504:13;9501:87;;;9576:1;9569:4;9560:6;9555:3;9551:16;9547:27;9540:38;9501:87;-1:-1:-1;9642:2:1;9621:15;-1:-1:-1;;9617:29:1;9608:39;;;;9649:4;9604:50;;9189:471;-1:-1:-1;;9189:471:1:o;9665:384::-;9748:5;9742:12;9737:3;9730:25;9804:4;9797:5;9793:16;9787:23;9780:4;9775:3;9771:14;9764:47;9712:3;9857:4;9850:5;9846:16;9840:23;9895:4;9888;9883:3;9879:14;9872:28;9921:46;9961:4;9956:3;9952:14;9938:12;9921:46;:::i;:::-;10016:4;10005:16;;;9999:23;9983:14;;;;9976:47;;;;-1:-1:-1;9909:58:1;9665:384;-1:-1:-1;9665:384:1:o;10262:826::-;-1:-1:-1;;;;;10659:15:1;;;10641:34;;10711:15;;10706:2;10691:18;;10684:43;10621:3;10758:2;10743:18;;10736:31;;;10584:4;;10790:57;;10827:19;;10819:6;10790:57;:::i;:::-;10895:9;10887:6;10883:22;10878:2;10867:9;10863:18;10856:50;10929:44;10966:6;10958;10929:44;:::i;:::-;10915:58;;11022:9;11014:6;11010:22;11004:3;10993:9;10989:19;10982:51;11050:32;11075:6;11067;11050:32;:::i;:::-;11042:40;10262:826;-1:-1:-1;;;;;;;;10262:826:1:o;11093:560::-;-1:-1:-1;;;;;11390:15:1;;;11372:34;;11442:15;;11437:2;11422:18;;11415:43;11489:2;11474:18;;11467:34;;;11532:2;11517:18;;11510:34;;;11352:3;11575;11560:19;;11553:32;;;11315:4;;11602:45;;11627:19;;11619:6;11602:45;:::i;:::-;11594:53;11093:560;-1:-1:-1;;;;;;;11093:560:1:o;11658:832::-;11844:4;11873:2;11913;11902:9;11898:18;11943:2;11932:9;11925:21;11966:6;12001;11995:13;12032:6;12024;12017:22;12070:2;12059:9;12055:18;12048:25;;12132:2;12122:6;12119:1;12115:14;12104:9;12100:30;12096:39;12082:53;;12170:2;12162:6;12158:15;12191:1;12201:260;12215:6;12212:1;12209:13;12201:260;;;12308:2;12304:7;12292:9;12284:6;12280:22;12276:36;12271:3;12264:49;12336:45;12374:6;12365;12359:13;12336:45;:::i;:::-;12326:55;-1:-1:-1;12439:12:1;;;;12404:15;;;;12237:1;12230:9;12201:260;;;-1:-1:-1;12478:6:1;;11658:832;-1:-1:-1;;;;;;;11658:832:1:o;12495:261::-;12674:2;12663:9;12656:21;12637:4;12694:56;12746:2;12735:9;12731:18;12723:6;12694:56;:::i;12761:465::-;13018:2;13007:9;13000:21;12981:4;13044:56;13096:2;13085:9;13081:18;13073:6;13044:56;:::i;:::-;13148:9;13140:6;13136:22;13131:2;13120:9;13116:18;13109:50;13176:44;13213:6;13205;13176:44;:::i;:::-;13168:52;12761:465;-1:-1:-1;;;;;12761:465:1:o;13423:219::-;13572:2;13561:9;13554:21;13535:4;13592:44;13632:2;13621:9;13617:18;13609:6;13592:44;:::i;14068:404::-;14270:2;14252:21;;;14309:2;14289:18;;;14282:30;14348:34;14343:2;14328:18;;14321:62;-1:-1:-1;;;14414:2:1;14399:18;;14392:38;14462:3;14447:19;;14068:404::o;15296:400::-;15498:2;15480:21;;;15537:2;15517:18;;;15510:30;15576:34;15571:2;15556:18;;15549:62;-1:-1:-1;;;15642:2:1;15627:18;;15620:34;15686:3;15671:19;;15296:400::o;15701:405::-;15903:2;15885:21;;;15942:2;15922:18;;;15915:30;15981:34;15976:2;15961:18;;15954:62;-1:-1:-1;;;16047:2:1;16032:18;;16025:39;16096:3;16081:19;;15701:405::o;16111:401::-;16313:2;16295:21;;;16352:2;16332:18;;;16325:30;16391:34;16386:2;16371:18;;16364:62;-1:-1:-1;;;16457:2:1;16442:18;;16435:35;16502:3;16487:19;;16111:401::o;16936:399::-;17138:2;17120:21;;;17177:2;17157:18;;;17150:30;17216:34;17211:2;17196:18;;17189:62;-1:-1:-1;;;17282:2:1;17267:18;;17260:33;17325:3;17310:19;;16936:399::o;17340:406::-;17542:2;17524:21;;;17581:2;17561:18;;;17554:30;17620:34;17615:2;17600:18;;17593:62;-1:-1:-1;;;17686:2:1;17671:18;;17664:40;17736:3;17721:19;;17340:406::o;17751:356::-;17953:2;17935:21;;;17972:18;;;17965:30;18031:34;18026:2;18011:18;;18004:62;18098:2;18083:18;;17751:356::o;19285:404::-;19487:2;19469:21;;;19526:2;19506:18;;;19499:30;19565:34;19560:2;19545:18;;19538:62;-1:-1:-1;;;19631:2:1;19616:18;;19609:38;19679:3;19664:19;;19285:404::o;20096:249::-;20269:2;20258:9;20251:21;20232:4;20289:50;20335:2;20324:9;20320:18;20312:6;20289:50;:::i;20785:183::-;20845:4;20878:18;20870:6;20867:30;20864:56;;;20900:18;;:::i;:::-;-1:-1:-1;20945:1:1;20941:14;20957:4;20937:25;;20785:183::o;20973:128::-;21013:3;21044:1;21040:6;21037:1;21034:13;21031:39;;;21050:18;;:::i;:::-;-1:-1:-1;21086:9:1;;20973:128::o;21106:125::-;21146:4;21174:1;21171;21168:8;21165:34;;;21179:18;;:::i;:::-;-1:-1:-1;21216:9:1;;21106:125::o;21236:380::-;21315:1;21311:12;;;;21358;;;21379:61;;21433:4;21425:6;21421:17;21411:27;;21379:61;21486:2;21478:6;21475:14;21455:18;21452:38;21449:161;;;21532:10;21527:3;21523:20;21520:1;21513:31;21567:4;21564:1;21557:15;21595:4;21592:1;21585:15;21449:161;;21236:380;;;:::o;21621:249::-;21731:2;21712:13;;-1:-1:-1;;21708:27:1;21696:40;;21766:18;21751:34;;21787:22;;;21748:62;21745:88;;;21813:18;;:::i;:::-;21849:2;21842:22;-1:-1:-1;;21621:249:1:o;21875:135::-;21914:3;-1:-1:-1;;21935:17:1;;21932:43;;;21955:18;;:::i;:::-;-1:-1:-1;22002:1:1;21991:13;;21875:135::o;22015:127::-;22076:10;22071:3;22067:20;22064:1;22057:31;22107:4;22104:1;22097:15;22131:4;22128:1;22121:15;22147:127;22208:10;22203:3;22199:20;22196:1;22189:31;22239:4;22236:1;22229:15;22263:4;22260:1;22253:15;22279:127;22340:10;22335:3;22331:20;22328:1;22321:31;22371:4;22368:1;22361:15;22395:4;22392:1;22385:15;22411:179;22446:3;22488:1;22470:16;22467:23;22464:120;;;22534:1;22531;22528;22513:23;-1:-1:-1;22571:1:1;22565:8;22560:3;22556:18;22464:120;22411:179;:::o;22595:671::-;22634:3;22676:4;22658:16;22655:26;22652:39;;;22595:671;:::o;22652:39::-;22718:2;22712:9;-1:-1:-1;;22783:16:1;22779:25;;22776:1;22712:9;22755:50;22834:4;22828:11;22858:16;22893:18;22964:2;22957:4;22949:6;22945:17;22942:25;22937:2;22929:6;22926:14;22923:45;22920:58;;;22971:5;;;;;22595:671;:::o;22920:58::-;23008:6;23002:4;22998:17;22987:28;;23044:3;23038:10;23071:2;23063:6;23060:14;23057:27;;;23077:5;;;;;;22595:671;:::o;23057:27::-;23161:2;23142:16;23136:4;23132:27;23128:36;23121:4;23112:6;23107:3;23103:16;23099:27;23096:69;23093:82;;;23168:5;;;;;;22595:671;:::o;23093:82::-;23184:57;23235:4;23226:6;23218;23214:19;23210:30;23204:4;23184:57;:::i;:::-;-1:-1:-1;23257:3:1;;22595:671;-1:-1:-1;;;;;22595:671:1:o;23271:131::-;-1:-1:-1;;;;;;23345:32:1;;23335:43;;23325:71;;23392:1;23389;23382:12
Swarm Source
ipfs://8b863d2cb84e7f5d2f7a38ff5ea0b7d6527f7b4146ecbfc8af1fae59f49380db
[ 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.