Token Davy Jones's Locker
Overview ERC1155
Total Supply:
0 DJLCK
Holders:
47 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x6d7a4c1b4ea2ab91f7a8d17589ee216e9d6da6a9
Contract Name:
ConfigurableERC1155
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-23 */ // Sources flattened with hardhat v2.9.5 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @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; } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @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. * * NOTE: 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. * * NOTE: 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); } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.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; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @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 { _setApprovalForAll(_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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, 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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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 `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck( operator, address(0), to, 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); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); 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: burn amount exceeds balance" ); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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 {} /** * @dev Hook that is called after 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 _afterTokenTransfer( 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.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.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; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @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) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require( supply >= amount, "ERC1155: burn amount exceeds totalSupply" ); unchecked { _totalSupply[id] = supply - amount; } } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC1155 token with storage based token URI management. * Inspired by the ERC721URIStorage extension * * _Available since v4.6._ */ abstract contract ERC1155URIStorage is ERC1155 { using Strings for uint256; // Optional base URI string private _baseURI = ""; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the concatenation of the `_baseURI` * and the token-specific uri if the latter is set * * This enables the following behaviors: * * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` * is empty per default); * * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()` * which in most cases will contain `ERC1155._uri`; * * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a * uri value set, then the result is empty. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { string memory tokenURI = _tokenURIs[tokenId]; // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); } /** * @dev Sets `tokenURI` as the tokenURI of `tokenId`. */ function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { _tokenURIs[tokenId] = tokenURI; emit URI(uri(tokenId), tokenId); } /** * @dev Sets `baseURI` as the `_baseURI` for all tokens */ function _setBaseURI(string memory baseURI) internal virtual { _baseURI = baseURI; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File contracts/ConfigurableERC1155.sol pragma solidity ^0.8.3; contract ConfigurableERC1155 is ERC1155, ERC1155URIStorage, Ownable, ERC1155Supply, ERC2981 { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; uint256 public constant NFT = 0; address public kalao_contract; string public name; string public symbol; constructor( string memory _name, string memory _symbol, uint96 _royalties_rate, address _royalties_recipient, address _kalao_contract ) ERC1155("") { name = _name; symbol = _symbol; kalao_contract = _kalao_contract; // 25 = 2.5% royalties if (_royalties_rate > 0 && _royalties_rate < 1000) { _setDefaultRoyalty(_royalties_recipient, _royalties_rate); } } function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } function mint( address to, uint256 amount, string memory _uri ) public { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _mint(to, tokenId, amount, ""); _setURI(tokenId, _uri); _setApprovalForAll(to, kalao_contract, true); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } function supportsInterface(bytes4 interfaceId) public view override(ERC1155, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function uri(uint256 tokenId) public view override(ERC1155, ERC1155URIStorage) returns (string memory) { return super.uri(tokenId); //string memory tokenURI = _tokenURIs[tokenId]; // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). //return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint96","name":"_royalties_rate","type":"uint96"},{"internalType":"address","name":"_royalties_recipient","type":"address"},{"internalType":"address","name":"_kalao_contract","type":"address"}],"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":[],"name":"NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"kalao_contract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"newuri","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":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b9160039162000269565b503480156200002957600080fd5b5060405162002782380380620027828339810160408190526200004c91620003df565b6040805160208101909152600081526200006681620000f9565b50620000723362000112565b84516200008790600b90602088019062000269565b5083516200009d90600c90602087019062000269565b50600a80546001600160a01b0319166001600160a01b0383161790556001600160601b03831615801590620000dc57506103e8836001600160601b0316105b15620000ee57620000ee828462000164565b5050505050620004df565b80516200010e90600290602084019062000269565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620001d85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620002305760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001cf565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600755565b82805462000277906200048c565b90600052602060002090601f0160209004810192826200029b5760008555620002e6565b82601f10620002b657805160ff1916838001178555620002e6565b82800160010185558215620002e6579182015b82811115620002e6578251825591602001919060010190620002c9565b50620002f4929150620002f8565b5090565b5b80821115620002f45760008155600101620002f9565b80516001600160a01b03811681146200032757600080fd5b919050565b600082601f8301126200033d578081fd5b81516001600160401b03808211156200035a576200035a620004c9565b604051601f8301601f19908116603f01168101908282118183101715620003855762000385620004c9565b81604052838152602092508683858801011115620003a1578485fd5b8491505b83821015620003c45785820183015181830184015290820190620003a5565b83821115620003d557848385830101525b9695505050505050565b600080600080600060a08688031215620003f7578081fd5b85516001600160401b03808211156200040e578283fd5b6200041c89838a016200032c565b9650602088015191508082111562000432578283fd5b5062000441888289016200032c565b604088015190955090506001600160601b038116811462000460578182fd5b925062000470606087016200030f565b915062000480608087016200030f565b90509295509295909350565b600181811c90821680620004a157607f821691505b60208210811415620004c357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61229380620004ef6000396000f3fe608060405234801561001057600080fd5b506004361061016b5760003560e01c80637c0b8de2116100cd578063bd85b03911610081578063e985e9c511610066578063e985e9c51461030e578063f242432a1461034a578063f2fde38b1461035d5761016b565b8063bd85b039146102db578063d3fc9864146102fb5761016b565b806395d89b41116100b257806395d89b41146102ad578063a22cb465146102b5578063bad03aef146102c85761016b565b80637c0b8de2146102855780638da5cb5b1461028d5761016b565b80632a55205a116101245780634e1273f4116101095780634e1273f41461023b5780634f558e791461025b578063715018a61461027d5761016b565b80632a55205a146101f65780632eb2c2d6146102285761016b565b806302fe53051161015557806302fe5305146101b957806306fdde03146101ce5780630e89341c146101e35761016b565b8062fdd58e1461017057806301ffc9a714610196575b600080fd5b61018361017e366004611c3f565b610370565b6040519081526020015b60405180910390f35b6101a96101a4366004611d88565b610419565b604051901515815260200161018d565b6101cc6101c7366004611dc0565b61042c565b005b6101d6610497565b60405161018d9190612035565b6101d66101f1366004611dfb565b610525565b610209610204366004611e13565b610530565b604080516001600160a01b03909316835260208301919091520161018d565b6101cc610236366004611afc565b6105eb565b61024e610249366004611cbd565b61068d565b60405161018d9190611ffd565b6101a9610269366004611dfb565b600090815260066020526040902054151590565b6101cc610803565b610183600081565b61029561086e565b6040516001600160a01b03909116815260200161018d565b6101d661087e565b6101cc6102c3366004611c05565b61088b565b600a54610295906001600160a01b031681565b6101836102e9366004611dfb565b60009081526006602052604090205490565b6101cc610309366004611c68565b61089a565b6101a961031c366004611aca565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101cc610358366004611ba2565b6108f9565b6101cc61036b366004611ab0565b610994565b60006001600160a01b0383166103f35760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b600061042482610a78565b90505b919050565b3361043561086e565b6001600160a01b03161461048b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ea565b61049481610ab6565b50565b600b80546104a4906120ef565b80601f01602080910402602001604051908101604052809291908181526020018280546104d0906120ef565b801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b505050505081565b606061042482610ac9565b60008281526008602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916105af5750604080518082019091526007546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b6020810151600090612710906105d3906bffffffffffffffffffffffff16876120a4565b6105dd9190612084565b915196919550909350505050565b6001600160a01b0385163314806106075750610607853361031c565b6106795760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016103ea565b6106868585858585610ba9565b5050505050565b606081518351146107065760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016103ea565b6000835167ffffffffffffffff81111561073057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610759578160200160208202803683370190505b50905060005b84518110156107fb576107c085828151811061078b57634e487b7160e01b600052603260045260246000fd5b60200260200101518583815181106107b357634e487b7160e01b600052603260045260246000fd5b6020026020010151610370565b8282815181106107e057634e487b7160e01b600052603260045260246000fd5b60209081029190910101526107f481612157565b905061075f565b509392505050565b3361080c61086e565b6001600160a01b0316146108625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ea565b61086c6000610e46565b565b6005546001600160a01b03165b90565b600c80546104a4906120ef565b610896338383610eb0565b5050565b60006108a560095490565b90506108b5600980546001019055565b6108d084828560405180602001604052806000815250610fa5565b6108da81836110e4565b600a546108f39085906001600160a01b03166001610eb0565b50505050565b6001600160a01b0385163314806109155750610915853361031c565b6109875760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016103ea565b6106868585858585611148565b3361099d61086e565b6001600160a01b0316146109f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ea565b6001600160a01b038116610a6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103ea565b61049481610e46565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610424575061042482611301565b805161089690600290602084019061191d565b600081815260046020526040812080546060929190610ae7906120ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610b13906120ef565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505090506000815111610b7e57610b798361139c565b610ba2565b600381604051602001610b92929190611eb6565b6040516020818303038152906040525b9392505050565b8151835114610c205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d6174636800000000000000000000000000000000000000000000000060648201526084016103ea565b6001600160a01b038416610c845760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016103ea565b33610c93818787878787611430565b60005b8451811015610dd8576000858281518110610cc157634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610ced57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610d805760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016103ea565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610dbd90849061206c565b9250508190555050505080610dd190612157565b9050610c96565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610e28929190612010565b60405180910390a4610e3e81878787878761143e565b505050505050565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415610f385760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016103ea565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166110215760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016103ea565b33600061102d856115f3565b9050600061103a856115f3565b905061104b83600089858589611430565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061107b90849061206c565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46110db8360008989898961164c565b50505050505050565b600082815260046020908152604090912082516111039284019061191d565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61112f84610525565b60405161113c9190612035565b60405180910390a25050565b6001600160a01b0384166111ac5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016103ea565b3360006111b8856115f3565b905060006111c5856115f3565b90506111d5838989858589611430565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156112595760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016103ea565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061129690849061206c565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46112f6848a8a8a8a8a61164c565b505050505050505050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061136457506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061042457507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610424565b6060600280546113ab906120ef565b80601f01602080910402602001604051908101604052809291908181526020018280546113d7906120ef565b80156114245780601f106113f957610100808354040283529160200191611424565b820191906000526020600020905b81548152906001019060200180831161140757829003601f168201915b50505050509050919050565b610e3e868686868686611757565b6001600160a01b0384163b15610e3e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906114829089908990889088908890600401611f5c565b602060405180830381600087803b15801561149c57600080fd5b505af19250505080156114cc575060408051601f3d908101601f191682019092526114c991810190611da4565b60015b611582576114d861219e565b806308c379a0141561151257506114ed6121b5565b806114f85750611514565b8060405162461bcd60e51b81526004016103ea9190612035565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016103ea565b6001600160e01b0319811663bc197c8160e01b146110db5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016103ea565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061163b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b15610e3e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906116909089908990889088908890600401611fba565b602060405180830381600087803b1580156116aa57600080fd5b505af19250505080156116da575060408051601f3d908101601f191682019092526116d791810190611da4565b60015b6116e6576114d861219e565b6001600160e01b0319811663f23a6e6160e01b146110db5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016103ea565b6001600160a01b0385166117fa5760005b83518110156117f85782818151811061179157634e487b7160e01b600052603260045260246000fd5b6020026020010151600660008684815181106117bd57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546117e2919061206c565b909155506117f1905081612157565b9050611768565b505b6001600160a01b038416610e3e5760005b83518110156110db57600084828151811061183657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061186257634e487b7160e01b600052603260045260246000fd5b60200260200101519050600060066000848152602001908152602001600020549050818110156118fa5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c7900000000000000000000000000000000000000000000000060648201526084016103ea565b6000928352600660205260409092209103905561191681612157565b905061180b565b828054611929906120ef565b90600052602060002090601f01602090048101928261194b5760008555611991565b82601f1061196457805160ff1916838001178555611991565b82800160010185558215611991579182015b82811115611991578251825591602001919060010190611976565b5061199d9291506119a1565b5090565b5b8082111561199d57600081556001016119a2565b80356001600160a01b038116811461042757600080fd5b600082601f8301126119dd578081fd5b813560206119ea82612048565b6040516119f7828261212a565b8381528281019150858301600585901b87018401881015611a16578586fd5b855b85811015611a3457813584529284019290840190600101611a18565b5090979650505050505050565b600082601f830112611a51578081fd5b813567ffffffffffffffff811115611a6b57611a6b612188565b604051611a82601f8301601f19166020018261212a565b818152846020838601011115611a96578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611ac1578081fd5b610ba2826119b6565b60008060408385031215611adc578081fd5b611ae5836119b6565b9150611af3602084016119b6565b90509250929050565b600080600080600060a08688031215611b13578081fd5b611b1c866119b6565b9450611b2a602087016119b6565b9350604086013567ffffffffffffffff80821115611b46578283fd5b611b5289838a016119cd565b94506060880135915080821115611b67578283fd5b611b7389838a016119cd565b93506080880135915080821115611b88578283fd5b50611b9588828901611a41565b9150509295509295909350565b600080600080600060a08688031215611bb9578081fd5b611bc2866119b6565b9450611bd0602087016119b6565b93506040860135925060608601359150608086013567ffffffffffffffff811115611bf9578182fd5b611b9588828901611a41565b60008060408385031215611c17578182fd5b611c20836119b6565b915060208301358015158114611c34578182fd5b809150509250929050565b60008060408385031215611c51578182fd5b611c5a836119b6565b946020939093013593505050565b600080600060608486031215611c7c578283fd5b611c85846119b6565b925060208401359150604084013567ffffffffffffffff811115611ca7578182fd5b611cb386828701611a41565b9150509250925092565b60008060408385031215611ccf578182fd5b823567ffffffffffffffff80821115611ce6578384fd5b818501915085601f830112611cf9578384fd5b81356020611d0682612048565b604051611d13828261212a565b8381528281019150858301600585901b870184018b1015611d32578889fd5b8896505b84871015611d5b57611d47816119b6565b835260019690960195918301918301611d36565b5096505086013592505080821115611d71578283fd5b50611d7e858286016119cd565b9150509250929050565b600060208284031215611d99578081fd5b8135610ba281612247565b600060208284031215611db5578081fd5b8151610ba281612247565b600060208284031215611dd1578081fd5b813567ffffffffffffffff811115611de7578182fd5b611df384828501611a41565b949350505050565b600060208284031215611e0c578081fd5b5035919050565b60008060408385031215611e25578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015611e6357815187529582019590820190600101611e47565b509495945050505050565b60008151808452611e868160208601602086016120c3565b601f01601f19169290920160200192915050565b60008151611eac8185602086016120c3565b9290920192915050565b600080845482600182811c915080831680611ed257607f831692505b6020808410821415611ef257634e487b7160e01b87526022600452602487fd5b818015611f065760018114611f1757611f43565b60ff19861689528489019650611f43565b60008b815260209020885b86811015611f3b5781548b820152908501908301611f22565b505084890196505b505050505050611f538185611e9a565b95945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152611f8860a0830186611e34565b8281036060840152611f9a8186611e34565b90508281036080840152611fae8185611e6e565b98975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611ff260a0830184611e6e565b979650505050505050565b600060208252610ba26020830184611e34565b6000604082526120236040830185611e34565b8281036020840152611f538185611e34565b600060208252610ba26020830184611e6e565b600067ffffffffffffffff82111561206257612062612188565b5060051b60200190565b6000821982111561207f5761207f612172565b500190565b60008261209f57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156120be576120be612172565b500290565b60005b838110156120de5781810151838201526020016120c6565b838111156108f35750506000910152565b600181811c9082168061210357607f821691505b6020821081141561212457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561215057612150612188565b6040525050565b600060001982141561216b5761216b612172565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561087b57600481823e5160e01c90565b600060443d10156121c55761087b565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156121f757505050505061087b565b82850191508151818111156122115750505050505061087b565b843d870101602082850101111561222d5750505050505061087b565b61223c6020828601018761212a565b509094505050505090565b6001600160e01b03198116811461049457600080fdfea2646970667358221220d0e187685447dbbf4bf1dceea915de87489fc109b3770484203cb0fc2b9a220d64736f6c6343000803003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001f40000000000000000000000009b26f0fabdaaa8370ad586200a1236b9745feb3a000000000000000000000000eff2357c9e40103ac4d268b32de478e4fbbfc4f00000000000000000000000000000000000000000000000000000000000000009486f646c20313135350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000748412d3131353500000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
54113:2344:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21645:318;;;;;;:::i;:::-;;:::i;:::-;;;18489:25:1;;;18477:2;18462:18;21645:318:0;;;;;;;;55788:204;;;;;;:::i;:::-;;:::i;:::-;;;12396:14:1;;12389:22;12371:41;;12359:2;12344:18;55788:204:0;12326:92:1;54944:89:0;;;;;;:::i;:::-;;:::i;:::-;;54405:18;;;:::i;:::-;;;;;;;:::i;56000:454::-;;;;;;:::i;:::-;;:::i;43318:505::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;11385:55:1;;;11367:74;;11472:2;11457:18;;11450:34;;;;11340:18;43318:505:0;11322:168:1;23790:442:0;;;;;;:::i;:::-;;:::i;22129:561::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46972:122::-;;;;;;:::i;:::-;47029:4;46850:16;;;:12;:16;;;;;;-1:-1:-1;;;46972:122:0;39832:103;;;:::i;54329:31::-;;54359:1;54329:31;;39181:87;;;:::i;:::-;;;-1:-1:-1;;;;;9684:55:1;;;9666:74;;9654:2;9639:18;39181:87:0;9621:125:1;54430:20:0;;;:::i;22763:187::-;;;;;;:::i;:::-;;:::i;54369:29::-;;;;;-1:-1:-1;;;;;54369:29:0;;;46761:113;;;;;;:::i;:::-;46823:7;46850:16;;;:12;:16;;;;;;;46761:113;55041:332;;;;;;:::i;:::-;;:::i;23022:218::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23195:27:0;;;23166:4;23195:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23022:218;23312:401;;;;;;:::i;:::-;;:::i;40090:238::-;;;;;;:::i;:::-;;:::i;21645:318::-;21776:7;-1:-1:-1;;;;;21823:21:0;;21801:114;;;;-1:-1:-1;;;21801:114:0;;13679:2:1;21801:114:0;;;13661:21:1;13718:2;13698:18;;;13691:30;13757:34;13737:18;;;13730:62;13828:13;13808:18;;;13801:41;13859:19;;21801:114:0;;;;;;;;;-1:-1:-1;21933:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21933:22:0;;;;;;;;;;;;21645:318::o;55788:204::-;55919:4;55948:36;55972:11;55948:23;:36::i;:::-;55941:43;;55788:204;;;;:::o;54944:89::-;18319:10;39401:7;:5;:7::i;:::-;-1:-1:-1;;;;;39401:23:0;;39393:68;;;;-1:-1:-1;;;39393:68:0;;16144:2:1;39393:68:0;;;16126:21:1;;;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16274:18;;39393:68:0;16116:182:1;39393:68:0;55010:15:::1;55018:6;55010:7;:15::i;:::-;54944:89:::0;:::o;54405:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56000:454::-;56124:13;56162:18;56172:7;56162:9;:18::i;43318:505::-;43460:7;43523:27;;;:17;:27;;;;;;;;43494:56;;;;;;;;;-1:-1:-1;;;;;43494:56:0;;;;;-1:-1:-1;;;43494:56:0;;;;;;;;;;;;43460:7;;43563:92;;-1:-1:-1;43614:29:0;;;;;;;;;43624:19;43614:29;-1:-1:-1;;;;;43614:29:0;;;;-1:-1:-1;;;43614:29:0;;;;;;;;43563:92;43705:23;;;;43667:21;;44189:5;;43692:36;;43691:71;43692:36;:10;:36;:::i;:::-;43691:71;;;;:::i;:::-;43783:16;;;;;-1:-1:-1;43318:505:0;;-1:-1:-1;;;;43318:505:0:o;23790:442::-;-1:-1:-1;;;;;24023:20:0;;18319:10;24023:20;;:60;;-1:-1:-1;24047:36:0;24064:4;18319:10;24070:12;18239:98;24047:36;24001:160;;;;-1:-1:-1;;;24001:160:0;;15314:2:1;24001:160:0;;;15296:21:1;15353:2;15333:18;;;15326:30;15392:34;15372:18;;;15365:62;15463:20;15443:18;;;15436:48;15501:19;;24001:160:0;15286:240:1;24001:160:0;24172:52;24195:4;24201:2;24205:3;24210:7;24219:4;24172:22;:52::i;:::-;23790:442;;;;;:::o;22129:561::-;22285:16;22360:3;:10;22341:8;:15;:29;22319:120;;;;-1:-1:-1;;;22319:120:0;;17324:2:1;22319:120:0;;;17306:21:1;17363:2;17343:18;;;17336:30;17402:34;17382:18;;;17375:62;17473:11;17453:18;;;17446:39;17502:19;;22319:120:0;17296:231:1;22319:120:0;22452:30;22499:8;:15;22485:30;;;;;;-1:-1:-1;;;22485:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22485:30:0;;22452:63;;22533:9;22528:122;22552:8;:15;22548:1;:19;22528:122;;;22608:30;22618:8;22627:1;22618:11;;;;;;-1:-1:-1;;;22618:11:0;;;;;;;;;;;;;;;22631:3;22635:1;22631:6;;;;;;-1:-1:-1;;;22631:6:0;;;;;;;;;;;;;;;22608:9;:30::i;:::-;22589:13;22603:1;22589:16;;;;;;-1:-1:-1;;;22589:16:0;;;;;;;;;;;;;;;;;;:49;22569:3;;;:::i;:::-;;;22528:122;;;-1:-1:-1;22669:13:0;22129:561;-1:-1:-1;;;22129:561:0:o;39832:103::-;18319:10;39401:7;:5;:7::i;:::-;-1:-1:-1;;;;;39401:23:0;;39393:68;;;;-1:-1:-1;;;39393:68:0;;16144:2:1;39393:68:0;;;16126:21:1;;;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16274:18;;39393:68:0;16116:182:1;39393:68:0;39897:30:::1;39924:1;39897:18;:30::i;:::-;39832:103::o:0;39181:87::-;39254:6;;-1:-1:-1;;;;;39254:6:0;39181:87;;:::o;54430:20::-;;;;;;;:::i;22763:187::-;22890:52;18319:10;22923:8;22933;22890:18;:52::i;:::-;22763:187;;:::o;55041:332::-;55155:15;55173:25;:15;53540:14;;53448:114;55173:25;55155:43;;55209:27;:15;53659:19;;53677:1;53659:19;;;53570:127;55209:27;55247:30;55253:2;55257:7;55266:6;55247:30;;;;;;;;;;;;:5;:30::i;:::-;55288:22;55296:7;55305:4;55288:7;:22::i;:::-;55344:14;;55321:44;;55340:2;;-1:-1:-1;;;;;55344:14:0;;55321:18;:44::i;:::-;55041:332;;;;:::o;23312:401::-;-1:-1:-1;;;;;23520:20:0;;18319:10;23520:20;;:60;;-1:-1:-1;23544:36:0;23561:4;18319:10;23567:12;18239:98;23544:36;23498:151;;;;-1:-1:-1;;;23498:151:0;;14498:2:1;23498:151:0;;;14480:21:1;14537:2;14517:18;;;14510:30;14576:34;14556:18;;;14549:62;14647:11;14627:18;;;14620:39;14676:19;;23498:151:0;14470:231:1;23498:151:0;23660:45;23678:4;23684:2;23688;23692:6;23700:4;23660:17;:45::i;40090:238::-;18319:10;39401:7;:5;:7::i;:::-;-1:-1:-1;;;;;39401:23:0;;39393:68;;;;-1:-1:-1;;;39393:68:0;;16144:2:1;39393:68:0;;;16126:21:1;;;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16274:18;;39393:68:0;16116:182:1;39393:68:0;-1:-1:-1;;;;;40193:22:0;::::1;40171:110;;;::::0;-1:-1:-1;;;40171:110:0;;14091:2:1;40171:110:0::1;::::0;::::1;14073:21:1::0;14130:2;14110:18;;;14103:30;14169:34;14149:18;;;14142:62;14240:8;14220:18;;;14213:36;14266:19;;40171:110:0::1;14063:228:1::0;40171:110:0::1;40292:28;40311:8;40292:18;:28::i;42972:291::-:0;43119:4;-1:-1:-1;;;;;;43161:41:0;;43176:26;43161:41;;:94;;;43219:36;43243:11;43219:23;:36::i;28230:88::-;28297:13;;;;:4;;:13;;;;;:::i;51681:448::-;51825:22;51850:19;;;:10;:19;;;;;51825:44;;51794:13;;51825:22;51850:19;51825:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52018:1;51999:8;51993:22;:26;:128;;52103:18;52113:7;52103:9;:18::i;:::-;51993:128;;;52063:8;52073;52046:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51993:128;51973:148;51681:448;-1:-1:-1;;;51681:448:0:o;26065:1321::-;26306:7;:14;26292:3;:10;:28;26270:118;;;;-1:-1:-1;;;26270:118:0;;17734:2:1;26270:118:0;;;17716:21:1;17773:2;17753:18;;;17746:30;17812:34;17792:18;;;17785:62;17883:10;17863:18;;;17856:38;17911:19;;26270:118:0;17706:230:1;26270:118:0;-1:-1:-1;;;;;26407:16:0;;26399:66;;;;-1:-1:-1;;;26399:66:0;;14908:2:1;26399:66:0;;;14890:21:1;14947:2;14927:18;;;14920:30;14986:34;14966:18;;;14959:62;-1:-1:-1;;;15037:18:1;;;15030:35;15082:19;;26399:66:0;14880:227:1;26399:66:0;18319:10;26522:60;18319:10;26553:4;26559:2;26563:3;26568:7;26577:4;26522:20;:60::i;:::-;26600:9;26595:470;26619:3;:10;26615:1;:14;26595:470;;;26651:10;26664:3;26668:1;26664:6;;;;;;-1:-1:-1;;;26664:6:0;;;;;;;;;;;;;;;26651:19;;26685:14;26702:7;26710:1;26702:10;;;;;;-1:-1:-1;;;26702:10:0;;;;;;;;;;;;;;;;;;;;26729:19;26751:13;;;;;;;;;;-1:-1:-1;;;;;26751:19:0;;;;;;;;;;;;26702:10;;-1:-1:-1;26811:21:0;;;;26785:125;;;;-1:-1:-1;;;26785:125:0;;15733:2:1;26785:125:0;;;15715:21:1;15772:2;15752:18;;;15745:30;15811:34;15791:18;;;15784:62;-1:-1:-1;;;15862:18:1;;;15855:40;15912:19;;26785:125:0;15705:232:1;26785:125:0;26954:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26954:19:0;;;;;;;;;;26976:20;;;26954:42;;27026:17;;;;;;;:27;;26976:20;;26954:9;27026:27;;26976:20;;27026:27;:::i;:::-;;;;;;;;26595:470;;;26631:3;;;;:::i;:::-;;;26595:470;;;;27112:2;-1:-1:-1;;;;;27082:47:0;27106:4;-1:-1:-1;;;;;27082:47:0;27096:8;-1:-1:-1;;;;;27082:47:0;;27116:3;27121:7;27082:47;;;;;;;:::i;:::-;;;;;;;;27214:164;27264:8;27287:4;27306:2;27323:3;27341:7;27363:4;27214:35;:164::i;:::-;26065:1321;;;;;;:::o;40488:191::-;40581:6;;;-1:-1:-1;;;;;40598:17:0;;;;;;;;;;;40631:40;;40581:6;;;40598:17;40581:6;;40631:40;;40562:16;;40631:40;40488:191;;:::o;33275:331::-;33430:8;-1:-1:-1;;;;;33421:17:0;:5;-1:-1:-1;;;;;33421:17:0;;;33413:71;;;;-1:-1:-1;;;33413:71:0;;16914:2:1;33413:71:0;;;16896:21:1;16953:2;16933:18;;;16926:30;16992:34;16972:18;;;16965:62;17063:11;17043:18;;;17036:39;17092:19;;33413:71:0;16886:231:1;33413:71:0;-1:-1:-1;;;;;33495:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33495:46:0;;;;;;;;;;33557:41;;12371::1;;;33557::0;;12344:18:1;33557:41:0;;;;;;;33275:331;;;:::o;28704:818::-;-1:-1:-1;;;;;28857:16:0;;28849:62;;;;-1:-1:-1;;;28849:62:0;;18143:2:1;28849:62:0;;;18125:21:1;18182:2;18162:18;;;18155:30;18221:34;18201:18;;;18194:62;18292:3;18272:18;;;18265:31;18313:19;;28849:62:0;18115:223:1;28849:62:0;18319:10;28924:16;28989:21;29007:2;28989:17;:21::i;:::-;28966:44;;29021:24;29048:25;29066:6;29048:17;:25::i;:::-;29021:52;;29086:66;29107:8;29125:1;29129:2;29133:3;29138:7;29147:4;29086:20;:66::i;:::-;29165:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29165:17:0;;;;;;;;;:27;;29186:6;;29165:9;:27;;29186:6;;29165:27;:::i;:::-;;;;-1:-1:-1;;29208:52:0;;;18699:25:1;;;18755:2;18740:18;;18733:34;;;-1:-1:-1;;;;;29208:52:0;;;;29241:1;;29208:52;;;;;;18672:18:1;29208:52:0;;;;;;;29351:163;29396:8;29427:1;29444:2;29461;29478:6;29499:4;29351:30;:163::i;:::-;28704:818;;;;;;;:::o;52214:166::-;52300:19;;;;:10;:19;;;;;;;;:30;;;;;;;;:::i;:::-;;52364:7;52346:26;52350:12;52354:7;52350:3;:12::i;:::-;52346:26;;;;;;:::i;:::-;;;;;;;;52214:166;;:::o;24696:1011::-;-1:-1:-1;;;;;24884:16:0;;24876:66;;;;-1:-1:-1;;;24876:66:0;;14908:2:1;24876:66:0;;;14890:21:1;14947:2;14927:18;;;14920:30;14986:34;14966:18;;;14959:62;-1:-1:-1;;;15037:18:1;;;15030:35;15082:19;;24876:66:0;14880:227:1;24876:66:0;18319:10;24955:16;25020:21;25038:2;25020:17;:21::i;:::-;24997:44;;25052:24;25079:25;25097:6;25079:17;:25::i;:::-;25052:52;;25117:60;25138:8;25148:4;25154:2;25158:3;25163:7;25172:4;25117:20;:60::i;:::-;25190:19;25212:13;;;;;;;;;;;-1:-1:-1;;;;;25212:19:0;;;;;;;;;;25264:21;;;;25242:113;;;;-1:-1:-1;;;25242:113:0;;15733:2:1;25242:113:0;;;15715:21:1;15772:2;15752:18;;;15745:30;15811:34;15791:18;;;15784:62;-1:-1:-1;;;15862:18:1;;;15855:40;15912:19;;25242:113:0;15705:232:1;25242:113:0;25391:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25391:19:0;;;;;;;;;;25413:20;;;25391:42;;25455:17;;;;;;;:27;;25413:20;;25391:9;25455:27;;25413:20;;25455:27;:::i;:::-;;;;-1:-1:-1;;25500:46:0;;;18699:25:1;;;18755:2;18740:18;;18733:34;;;-1:-1:-1;;;;;25500:46:0;;;;;;;;;;;;;;18672:18:1;25500:46:0;;;;;;;25631:68;25662:8;25672:4;25678:2;25682;25686:6;25694:4;25631:30;:68::i;:::-;24696:1011;;;;;;;;;:::o;20618:360::-;20765:4;-1:-1:-1;;;;;;20807:41:0;;20822:26;20807:41;;:110;;-1:-1:-1;;;;;;;20865:52:0;;20880:37;20865:52;20807:110;:163;;;-1:-1:-1;19494:25:0;-1:-1:-1;;;;;;19479:40:0;;;20934:36;19320:207;21389:105;21449:13;21482:4;21475:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21389:105;;;:::o;55451:329::-;55706:66;55733:8;55743:4;55749:2;55753:3;55758:7;55767:4;55706:26;:66::i;36872:975::-;-1:-1:-1;;;;;37112:13:0;;10114:19;:23;37108:732;;37165:203;;-1:-1:-1;;;37165:203:0;;-1:-1:-1;;;;;37165:43:0;;;;;:203;;37231:8;;37262:4;;37289:3;;37315:7;;37345:4;;37165:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37165:203:0;;;;;;;;-1:-1:-1;;37165:203:0;;;;;;;;;;;;:::i;:::-;;;37144:685;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37702:6;37695:14;;-1:-1:-1;;;37695:14:0;;;;;;;;:::i;37144:685::-;;;37751:62;;-1:-1:-1;;;37751:62:0;;12849:2:1;37751:62:0;;;12831:21:1;12888:2;12868:18;;;12861:30;12927:34;12907:18;;;12900:62;12998:22;12978:18;;;12971:50;13038:19;;37751:62:0;12821:242:1;37144:685:0;-1:-1:-1;;;;;;37453:60:0;;-1:-1:-1;;;37453:60:0;37427:199;;37556:50;;-1:-1:-1;;;37556:50:0;;13270:2:1;37556:50:0;;;13252:21:1;13309:2;13289:18;;;13282:30;13348:34;13328:18;;;13321:62;-1:-1:-1;;;13399:18:1;;;13392:38;13447:19;;37556:50:0;13242:230:1;37855::0;38007:16;;;38021:1;38007:16;;;;;;;;;37948;;37982:22;;38007:16;;;;;;;;;;;;-1:-1:-1;38007:16:0;37982:41;;38045:7;38034:5;38040:1;38034:8;;;;;;-1:-1:-1;;;38034:8:0;;;;;;;;;;;;;;;;;;:18;38072:5;37855:230;-1:-1:-1;;37855:230:0:o;35966:898::-;-1:-1:-1;;;;;36181:13:0;;10114:19;:23;36177:680;;36234:196;;-1:-1:-1;;;36234:196:0;;-1:-1:-1;;;;;36234:38:0;;;;;:196;;36295:8;;36326:4;;36353:2;;36378:6;;36407:4;;36234:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36234:196:0;;;;;;;;-1:-1:-1;;36234:196:0;;;;;;;;;;;;:::i;:::-;;;36213:633;;;;:::i;:::-;-1:-1:-1;;;;;;36493:55:0;;-1:-1:-1;;;36493:55:0;36489:154;;36573:50;;-1:-1:-1;;;36573:50:0;;13270:2:1;36573:50:0;;;13252:21:1;13309:2;13289:18;;;13282:30;13348:34;13328:18;;;13321:62;-1:-1:-1;;;13399:18:1;;;13392:38;13447:19;;36573:50:0;13242:230:1;47169:992:0;-1:-1:-1;;;;;47491:18:0;;47487:160;;47531:9;47526:110;47550:3;:10;47546:1;:14;47526:110;;;47610:7;47618:1;47610:10;;;;;;-1:-1:-1;;;47610:10:0;;;;;;;;;;;;;;;47586:12;:20;47599:3;47603:1;47599:6;;;;;;-1:-1:-1;;;47599:6:0;;;;;;;;;;;;;;;47586:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;47562:3:0;;-1:-1:-1;47562:3:0;;:::i;:::-;;;47526:110;;;;47487:160;-1:-1:-1;;;;;47663:16:0;;47659:495;;47701:9;47696:447;47720:3;:10;47716:1;:14;47696:447;;;47756:10;47769:3;47773:1;47769:6;;;;;;-1:-1:-1;;;47769:6:0;;;;;;;;;;;;;;;47756:19;;47794:14;47811:7;47819:1;47811:10;;;;;;-1:-1:-1;;;47811:10:0;;;;;;;;;;;;;;;47794:27;;47840:14;47857:12;:16;47870:2;47857:16;;;;;;;;;;;;47840:33;;47932:6;47922;:16;;47892:130;;;;-1:-1:-1;;;47892:130:0;;16505:2:1;47892:130:0;;;16487:21:1;16544:2;16524:18;;;16517:30;16583:34;16563:18;;;16556:62;16654:10;16634:18;;;16627:38;16682:19;;47892:130:0;16477:230:1;47892:130:0;48074:16;;;;:12;:16;;;;;;48093:15;;48074:34;;47732:3;;;:::i;:::-;;;47696:447;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;215:755;;322:3;315:4;307:6;303:17;299:27;289:2;;344:5;337;330:20;289:2;384:6;371:20;410:4;433:43;473:2;433:43;:::i;:::-;505:2;499:9;517:31;545:2;537:6;517:31;:::i;:::-;583:18;;;617:15;;;;-1:-1:-1;652:15:1;;;702:1;698:10;;;686:23;;682:32;;679:41;-1:-1:-1;676:2:1;;;737:5;730;723:20;676:2;763:5;777:163;791:2;788:1;785:9;777:163;;;848:17;;836:30;;886:12;;;;918;;;;809:1;802:9;777:163;;;-1:-1:-1;958:6:1;;279:691;-1:-1:-1;;;;;;;279:691:1:o;975:575::-;;1070:3;1063:4;1055:6;1051:17;1047:27;1037:2;;1092:5;1085;1078:20;1037:2;1132:6;1119:20;1158:18;1154:2;1151:26;1148:2;;;1180:18;;:::i;:::-;1229:2;1223:9;1241:67;1296:2;1277:13;;-1:-1:-1;;1273:27:1;1302:4;1269:38;1223:9;1241:67;:::i;:::-;1332:2;1324:6;1317:18;1378:3;1371:4;1366:2;1358:6;1354:15;1350:26;1347:35;1344:2;;;1399:5;1392;1385:20;1344:2;1467;1460:4;1452:6;1448:17;1441:4;1433:6;1429:17;1416:54;1490:15;;;1507:4;1486:26;1479:41;;;;1494:6;1027:523;-1:-1:-1;;1027:523:1:o;1555:196::-;;1667:2;1655:9;1646:7;1642:23;1638:32;1635:2;;;1688:6;1680;1673:22;1635:2;1716:29;1735:9;1716:29;:::i;1756:270::-;;;1885:2;1873:9;1864:7;1860:23;1856:32;1853:2;;;1906:6;1898;1891:22;1853:2;1934:29;1953:9;1934:29;:::i;:::-;1924:39;;1982:38;2016:2;2005:9;2001:18;1982:38;:::i;:::-;1972:48;;1843:183;;;;;:::o;2031:983::-;;;;;;2270:3;2258:9;2249:7;2245:23;2241:33;2238:2;;;2292:6;2284;2277:22;2238:2;2320:29;2339:9;2320:29;:::i;:::-;2310:39;;2368:38;2402:2;2391:9;2387:18;2368:38;:::i;:::-;2358:48;;2457:2;2446:9;2442:18;2429:32;2480:18;2521:2;2513:6;2510:14;2507:2;;;2542:6;2534;2527:22;2507:2;2570:61;2623:7;2614:6;2603:9;2599:22;2570:61;:::i;:::-;2560:71;;2684:2;2673:9;2669:18;2656:32;2640:48;;2713:2;2703:8;2700:16;2697:2;;;2734:6;2726;2719:22;2697:2;2762:63;2817:7;2806:8;2795:9;2791:24;2762:63;:::i;:::-;2752:73;;2878:3;2867:9;2863:19;2850:33;2834:49;;2908:2;2898:8;2895:16;2892:2;;;2929:6;2921;2914:22;2892:2;;2957:51;3000:7;2989:8;2978:9;2974:24;2957:51;:::i;:::-;2947:61;;;2228:786;;;;;;;;:::o;3019:626::-;;;;;;3208:3;3196:9;3187:7;3183:23;3179:33;3176:2;;;3230:6;3222;3215:22;3176:2;3258:29;3277:9;3258:29;:::i;:::-;3248:39;;3306:38;3340:2;3329:9;3325:18;3306:38;:::i;:::-;3296:48;;3391:2;3380:9;3376:18;3363:32;3353:42;;3442:2;3431:9;3427:18;3414:32;3404:42;;3497:3;3486:9;3482:19;3469:33;3525:18;3517:6;3514:30;3511:2;;;3562:6;3554;3547:22;3511:2;3590:49;3631:7;3622:6;3611:9;3607:22;3590:49;:::i;3650:367::-;;;3776:2;3764:9;3755:7;3751:23;3747:32;3744:2;;;3797:6;3789;3782:22;3744:2;3825:29;3844:9;3825:29;:::i;:::-;3815:39;;3904:2;3893:9;3889:18;3876:32;3951:5;3944:13;3937:21;3930:5;3927:32;3917:2;;3978:6;3970;3963:22;3917:2;4006:5;3996:15;;;3734:283;;;;;:::o;4022:264::-;;;4151:2;4139:9;4130:7;4126:23;4122:32;4119:2;;;4172:6;4164;4157:22;4119:2;4200:29;4219:9;4200:29;:::i;:::-;4190:39;4276:2;4261:18;;;;4248:32;;-1:-1:-1;;;4109:177:1:o;4291:483::-;;;;4447:2;4435:9;4426:7;4422:23;4418:32;4415:2;;;4468:6;4460;4453:22;4415:2;4496:29;4515:9;4496:29;:::i;:::-;4486:39;;4572:2;4561:9;4557:18;4544:32;4534:42;;4627:2;4616:9;4612:18;4599:32;4654:18;4646:6;4643:30;4640:2;;;4691:6;4683;4676:22;4640:2;4719:49;4760:7;4751:6;4740:9;4736:22;4719:49;:::i;:::-;4709:59;;;4405:369;;;;;:::o;4779:1274::-;;;4958:2;4946:9;4937:7;4933:23;4929:32;4926:2;;;4979:6;4971;4964:22;4926:2;5024:9;5011:23;5053:18;5094:2;5086:6;5083:14;5080:2;;;5115:6;5107;5100:22;5080:2;5158:6;5147:9;5143:22;5133:32;;5203:7;5196:4;5192:2;5188:13;5184:27;5174:2;;5230:6;5222;5215:22;5174:2;5271;5258:16;5293:4;5316:43;5356:2;5316:43;:::i;:::-;5388:2;5382:9;5400:31;5428:2;5420:6;5400:31;:::i;:::-;5466:18;;;5500:15;;;;-1:-1:-1;5535:11:1;;;5577:1;5573:10;;;5565:19;;5561:28;;5558:41;-1:-1:-1;5555:2:1;;;5617:6;5609;5602:22;5555:2;5644:6;5635:15;;5659:169;5673:2;5670:1;5667:9;5659:169;;;5730:23;5749:3;5730:23;:::i;:::-;5718:36;;5691:1;5684:9;;;;;5774:12;;;;5806;;5659:169;;;-1:-1:-1;5847:6:1;-1:-1:-1;;5891:18:1;;5878:32;;-1:-1:-1;;5922:16:1;;;5919:2;;;5956:6;5948;5941:22;5919:2;;5984:63;6039:7;6028:8;6017:9;6013:24;5984:63;:::i;:::-;5974:73;;;4916:1137;;;;;:::o;6058:255::-;;6169:2;6157:9;6148:7;6144:23;6140:32;6137:2;;;6190:6;6182;6175:22;6137:2;6234:9;6221:23;6253:30;6277:5;6253:30;:::i;6318:259::-;;6440:2;6428:9;6419:7;6415:23;6411:32;6408:2;;;6461:6;6453;6446:22;6408:2;6498:9;6492:16;6517:30;6541:5;6517:30;:::i;6582:341::-;;6704:2;6692:9;6683:7;6679:23;6675:32;6672:2;;;6725:6;6717;6710:22;6672:2;6770:9;6757:23;6803:18;6795:6;6792:30;6789:2;;;6840:6;6832;6825:22;6789:2;6868:49;6909:7;6900:6;6889:9;6885:22;6868:49;:::i;:::-;6858:59;6662:261;-1:-1:-1;;;;6662:261:1:o;6928:190::-;;7040:2;7028:9;7019:7;7015:23;7011:32;7008:2;;;7061:6;7053;7046:22;7008:2;-1:-1:-1;7089:23:1;;6998:120;-1:-1:-1;6998:120:1:o;7123:258::-;;;7252:2;7240:9;7231:7;7227:23;7223:32;7220:2;;;7273:6;7265;7258:22;7220:2;-1:-1:-1;;7301:23:1;;;7371:2;7356:18;;;7343:32;;-1:-1:-1;7210:171:1:o;7386:437::-;;7477:5;7471:12;7504:6;7499:3;7492:19;7530:4;7559:2;7554:3;7550:12;7543:19;;7596:2;7589:5;7585:14;7617:3;7629:169;7643:6;7640:1;7637:13;7629:169;;;7704:13;;7692:26;;7738:12;;;;7773:15;;;;7665:1;7658:9;7629:169;;;-1:-1:-1;7814:3:1;;7447:376;-1:-1:-1;;;;;7447:376:1:o;7828:257::-;;7907:5;7901:12;7934:6;7929:3;7922:19;7950:63;8006:6;7999:4;7994:3;7990:14;7983:4;7976:5;7972:16;7950:63;:::i;:::-;8067:2;8046:15;-1:-1:-1;;8042:29:1;8033:39;;;;8074:4;8029:50;;7877:208;-1:-1:-1;;7877:208:1:o;8090:185::-;;8170:5;8164:12;8185:52;8230:6;8225:3;8218:4;8211:5;8207:16;8185:52;:::i;:::-;8253:16;;;;;8140:135;-1:-1:-1;;8140:135:1:o;8280:1235::-;;8485:3;8520:6;8514:13;8550:3;8572:1;8600:9;8596:2;8592:18;8582:28;;8660:2;8649:9;8645:18;8682;8672:2;;8726:4;8718:6;8714:17;8704:27;;8672:2;8752;8800;8792:6;8789:14;8769:18;8766:38;8763:2;;;-1:-1:-1;;;8834:3:1;8827:90;8940:4;8937:1;8930:15;8970:4;8965:3;8958:17;8763:2;9001:18;9028:104;;;;9146:1;9141:322;;;;8994:469;;9028:104;-1:-1:-1;;9061:24:1;;9049:37;;9106:16;;;;-1:-1:-1;9028:104:1;;9141:322;18966:127;19032:17;;;19082:4;19066:21;;9236:3;9252:165;9266:6;9263:1;9260:13;9252:165;;;9344:14;;9331:11;;;9324:35;9387:16;;;;9281:10;;9252:165;;;9256:3;;9446:6;9441:3;9437:16;9430:23;;8994:469;;;;;;;9479:30;9505:3;9497:6;9479:30;:::i;:::-;9472:37;8464:1051;-1:-1:-1;;;;;8464:1051:1:o;9751:849::-;;-1:-1:-1;;;;;10183:2:1;10175:6;10171:15;10160:9;10153:34;10235:2;10227:6;10223:15;10218:2;10207:9;10203:18;10196:43;;10275:3;10270:2;10259:9;10255:18;10248:31;10302:57;10354:3;10343:9;10339:19;10331:6;10302:57;:::i;:::-;10407:9;10399:6;10395:22;10390:2;10379:9;10375:18;10368:50;10441:44;10478:6;10470;10441:44;:::i;:::-;10427:58;;10534:9;10526:6;10522:22;10516:3;10505:9;10501:19;10494:51;10562:32;10587:6;10579;10562:32;:::i;:::-;10554:40;10082:518;-1:-1:-1;;;;;;;;10082:518:1:o;10605:583::-;;-1:-1:-1;;;;;10937:2:1;10929:6;10925:15;10914:9;10907:34;10989:2;10981:6;10977:15;10972:2;10961:9;10957:18;10950:43;;11029:6;11024:2;11013:9;11009:18;11002:34;11072:6;11067:2;11056:9;11052:18;11045:34;11116:3;11110;11099:9;11095:19;11088:32;11137:45;11177:3;11166:9;11162:19;11154:6;11137:45;:::i;:::-;11129:53;10836:352;-1:-1:-1;;;;;;;10836:352:1:o;11495:261::-;;11674:2;11663:9;11656:21;11694:56;11746:2;11735:9;11731:18;11723:6;11694:56;:::i;11761:465::-;;12018:2;12007:9;12000:21;12044:56;12096:2;12085:9;12081:18;12073:6;12044:56;:::i;:::-;12148:9;12140:6;12136:22;12131:2;12120:9;12116:18;12109:50;12176:44;12213:6;12205;12176:44;:::i;12423:219::-;;12572:2;12561:9;12554:21;12592:44;12632:2;12621:9;12617:18;12609:6;12592:44;:::i;18778:183::-;;18871:18;18863:6;18860:30;18857:2;;;18893:18;;:::i;:::-;-1:-1:-1;18938:1:1;18934:14;18950:4;18930:25;;18847:114::o;19098:128::-;;19169:1;19165:6;19162:1;19159:13;19156:2;;;19175:18;;:::i;:::-;-1:-1:-1;19211:9:1;;19146:80::o;19231:274::-;;19297:1;19287:2;;-1:-1:-1;;;19329:1:1;19322:88;19433:4;19430:1;19423:15;19461:4;19458:1;19451:15;19287:2;-1:-1:-1;19490:9:1;;19277:228::o;19510:168::-;;19616:1;19612;19608:6;19604:14;19601:1;19598:21;19593:1;19586:9;19579:17;19575:45;19572:2;;;19623:18;;:::i;:::-;-1:-1:-1;19663:9:1;;19562:116::o;19683:258::-;19755:1;19765:113;19779:6;19776:1;19773:13;19765:113;;;19855:11;;;19849:18;19836:11;;;19829:39;19801:2;19794:10;19765:113;;;19896:6;19893:1;19890:13;19887:2;;;-1:-1:-1;;19931:1:1;19913:16;;19906:27;19736:205::o;19946:437::-;20025:1;20021:12;;;;20068;;;20089:2;;20143:4;20135:6;20131:17;20121:27;;20089:2;20196;20188:6;20185:14;20165:18;20162:38;20159:2;;;-1:-1:-1;;;20230:1:1;20223:88;20334:4;20331:1;20324:15;20362:4;20359:1;20352:15;20159:2;;20001:382;;;:::o;20388:249::-;20498:2;20479:13;;-1:-1:-1;;20475:27:1;20463:40;;20533:18;20518:34;;20554:22;;;20515:62;20512:2;;;20580:18;;:::i;:::-;20616:2;20609:22;-1:-1:-1;;20435:202:1:o;20642:135::-;;-1:-1:-1;;20702:17:1;;20699:2;;;20722:18;;:::i;:::-;-1:-1:-1;20769:1:1;20758:13;;20689:88::o;20782:184::-;-1:-1:-1;;;20831:1:1;20824:88;20931:4;20928:1;20921:15;20955:4;20952:1;20945:15;20971:184;-1:-1:-1;;;21020:1:1;21013:88;21120:4;21117:1;21110:15;21144:4;21141:1;21134:15;21160:185;;21237:1;21219:16;21216:23;21213:2;;;21287:1;21282:3;21277;21262:27;21318:10;21313:3;21309:20;21203:142;:::o;21350:671::-;;21431:4;21413:16;21410:26;21407:2;;;21439:5;;21407:2;21473;21467:9;-1:-1:-1;;21538:16:1;21534:25;;21531:1;21467:9;21510:50;21589:4;21583:11;21613:16;21648:18;21719:2;21712:4;21704:6;21700:17;21697:25;21692:2;21684:6;21681:14;21678:45;21675:2;;;21726:5;;;;;;;21675:2;21763:6;21757:4;21753:17;21742:28;;21799:3;21793:10;21826:2;21818:6;21815:14;21812:2;;;21832:5;;;;;;;;21812:2;21916;21897:16;21891:4;21887:27;21883:36;21876:4;21867:6;21862:3;21858:16;21854:27;21851:69;21848:2;;;21923:5;;;;;;;;21848:2;21939:57;21990:4;21981:6;21973;21969:19;21965:30;21959:4;21939:57;:::i;:::-;-1:-1:-1;22012:3:1;;-1:-1:-1;;;;;21397:624:1;:::o;22026:177::-;-1:-1:-1;;;;;;22104:5:1;22100:78;22093:5;22090:89;22080:2;;22193:1;22190;22183:12
Swarm Source
ipfs://d0e187685447dbbf4bf1dceea915de87489fc109b3770484203cb0fc2b9a220d