ERC-1155
Overview
Max Total Supply
0 BBG
Holders
48
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT_Marketplace
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-31 */ // SPDX-License-Identifier: MIT // File: contracts/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: contracts/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); /* function ownerOf(uint256 id) external view returns (address); */ /** * @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: contracts/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. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: contracts/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. */ /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); function uri(uint256 id) external view returns (string memory); } // File: contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/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: contracts/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: contracts/token/ERC1155/ERC1155.sol pragma solidity ^0.8.0; /* import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; */ /** * @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; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to minter mapping(uint256 => address) internal _tokenMinter; // Mapping from token ID to creator mapping(uint256 => address) internal _tokenCreator; // 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 {_setURI}. */ constructor(string memory uri_,string memory name_, string memory symbol_) { _setURI(uri_); _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {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; } function minterOf(uint256 id) public view virtual returns (address) { address tokenMinter = _tokenMinter[id]; require(tokenMinter != address(0), "ERC1155: owner query for nonexistent token"); return tokenMinter; } /* function ownerOf(uint256 id) public view virtual returns (address) { address tokenOwner = _tokenMinter[id]; require(tokenOwner != address(0), "ERC1155: owner query for nonexistent token"); return tokenOwner; } */ function creatorOf(uint256 id) public view virtual returns (address) { address creator = _tokenCreator[id]; require(creator != address(0), "ERC1155: creator query for nonexistent token"); return creator; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function setApproval(address account,address operator, bool approved) internal { require(account != operator, "ERC1155: setting approval status for self"); _operatorApprovals[account][operator] = approved; emit ApprovalForAll(account, 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-transferFrom}. */ /* function transferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public { require(isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _transferFrom(from, to, id, amount, data); } */ /** * @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); } /* function _transferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } */ /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); _tokenMinter[id] = account; _tokenCreator[id] = account; } /* function _mint( uint256 mint_type, address creator, address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); if(mint_type==2){ _beforeTokenTransfer(operator, creator, account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, creator, account, id, amount); _doSafeTransferAcceptanceCheck(operator, creator, account, id, amount, data); _tokenMinter[id] = creator; }else if(mint_type==1){ _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); _tokenMinter[id] = creator; }else{ _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); _tokenMinter[id] = account; } } */ function setCreator(address creator,address account,uint256 id) internal { require(account == _tokenMinter[id], "ERC1155: not token owner"); _tokenCreator[id] = creator; } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.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; } /* function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } */ } // File: contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/token/ERC20/utils/SafeERC20.sol pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/NFT_Marketplace.sol pragma solidity ^0.8.0; contract NFT_Marketplace is ERC1155{ using SafeMath for uint256; using SafeERC20 for IERC20; address ContractOwner; // 컨트랙트 소유자 constructor() ERC1155("","BLUEBAY GALLERY","BBG") { ContractOwner = msg.sender; setting["main"] = adminSetting(0x34E366278EEfe4FEf648AC826528E38717FF900d,0,0x8C661806f716652B637728355cC4e2620D428F99); //플랫폼 지갑 주소, 수수료율,ERC20 주소 } modifier onlyowner { require(ContractOwner == msg.sender); _; } struct NFTAsset { string metadata; address owner; uint id; uint amount; uint price; uint flag; uint currency; //0-ETH 1-ERC20 } struct adminSetting { address platformAddr; uint feeRate; address tokenAddr; } mapping (string => adminSetting) setting; mapping(address=> mapping(uint => NFTAsset)) public ownedNFT; NFTAsset[] public nft_asset; function getContractOwner() public view returns (address) { return ContractOwner; } function transferOwnership(address newOwner) public onlyowner() { require(newOwner != address(0), "Ownable: new owner is the zero address"); ContractOwner = newOwner; } function setChangeFee(uint256 _feeRate) public onlyowner() { setting["main"].feeRate = _feeRate; } function setChangeAddr(address _platformAddr) public onlyowner() { setting["main"].platformAddr = _platformAddr; } function setChangeTokenAddr(address _tokenAddr) public onlyowner() { setting["main"].tokenAddr = _tokenAddr; } function setOwnedNFTFlag(address _owner,uint256 _tokenId,uint256 _flag) public onlyowner(){ require(_owner == ownedNFT[_owner][_tokenId].owner); ownedNFT[_owner][_tokenId].flag = _flag; } function getFeeRate() public view returns(uint256){ return (setting["main"].feeRate); } function getPlatformAddr() public view returns(address){ return (setting["main"].platformAddr); } function getTokenAddr() public view returns(address){ return (setting["main"].tokenAddr); } function getOwnedNFTPrice(address _owner,uint256 _tokenId) public view returns(uint256){ require(_owner == ownedNFT[_owner][_tokenId].owner); return (ownedNFT[_owner][_tokenId].price); } function getOwnedNFTCurrency(address _owner,uint256 _tokenId) public view returns(uint256){ require(_owner == ownedNFT[_owner][_tokenId].owner); return (ownedNFT[_owner][_tokenId].currency); } function getPriceFeeIncluded(address _owner,uint256 _tokenId, uint256 _fee) public view returns(uint256){ require(_owner == ownedNFT[_owner][_tokenId].owner); return (ownedNFT[_owner][_tokenId].price.add(_fee)); } function getOwnedNFTFlag(address _owner,uint256 _tokenId) public view returns(uint256){ require(_owner == ownedNFT[_owner][_tokenId].owner); return (ownedNFT[_owner][_tokenId].flag); } function getOwnedNFTMetadata(address _owner,uint256 _tokenId) public view returns(string memory){ require(_owner == nft_asset[_tokenId].owner,"No NFT owner"); return (nft_asset[_tokenId].metadata); } //ERC20 function getERC20Balance() public view returns (uint256){ uint256 balance = IERC20(getTokenAddr()).balanceOf(msg.sender); return balance; } function getERC20Total() public view returns (uint256){ uint256 supply = IERC20(getTokenAddr()).totalSupply(); return supply; } //ERC20 //발행 function mint(string memory _metadata, uint256 _amount, uint256 _price, uint256 _currency) public {//이용자 발행 require(_currency < 2,"currency::Check"); uint256 assetId = nft_asset.length; // 유일한 작품 ID nft_asset.push(NFTAsset(_metadata,msg.sender,assetId,_amount,_price,0,_currency)); ownedNFT[msg.sender][assetId]= NFTAsset(_metadata,msg.sender,assetId,_amount,_price,0,_currency); _mint(msg.sender, assetId, _amount, ""); //ERC1155 등록 } //이용자 경매 발행 추가 로열티 발행자로 등록 function mintTrade(string memory _metadata, uint256 _price, uint256 _currency) public payable {//관리자 발행 경매 구매, 개수 1개로 고정 require(_currency < 2,"currency::Check"); if(_currency==0){//ETH 구매 require(msg.value > 0); require(msg.value >= _price); uint256 assetId = nft_asset.length; // 유일한 작품 ID nft_asset.push(NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency)); ownedNFT[msg.sender][assetId]= NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency); _mint(msg.sender, assetId, 1, ""); //유저 NFT 소유권 setCreator(getPlatformAddr(),msg.sender,assetId);//로열티 발행자 플랫폼 if (msg.value > 0) { payable(getPlatformAddr()).transfer(msg.value);//판매 비용 전액 플랫폼 지갑으로 } }else if(_currency==1){//ERC20 구매 require(_price > 0); uint256 assetId = nft_asset.length; // 유일한 작품 ID nft_asset.push(NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency)); ownedNFT[msg.sender][assetId]= NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency); _mint(msg.sender, assetId, 1, ""); //유저 NFT 소유권 setCreator(getPlatformAddr(),msg.sender,assetId);//로열티 발행자 플랫폼 IERC20(getTokenAddr()).transferFrom(msg.sender,getPlatformAddr(), _price); //판매 비용 전액 플랫폼 지갑으로 } } function mintAuction(address payable _owner,string memory _metadata, uint256 _fee, uint256 _price, uint256 _currency) public payable {//이용자 발행 경매 구매,개수 1개로 고정 require(_currency < 2,"currency::Check"); if(_currency==0){//ETH 구매 require(msg.value > 0); require(msg.value >= _price); uint256 assetId = nft_asset.length; // 유일한 작품 ID nft_asset.push(NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency)); ownedNFT[msg.sender][assetId]= NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency); _mint(msg.sender, assetId, 1, ""); //유저 NFT 소유권 setCreator(_owner,msg.sender,assetId);//로열티 발행자 이용자 if (msg.value > 0) { platformFeeBuyer(_fee);//구매 수수료 platformFeeSeller(_owner,_fee);//판매 수수료 } }else if(_currency==1){//ERC20 구매 require(_price > 0); uint256 assetId = nft_asset.length; // 유일한 작품 ID nft_asset.push(NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency)); ownedNFT[msg.sender][assetId]= NFTAsset(_metadata,msg.sender,assetId,1,_price,1,_currency); _mint(msg.sender, assetId, 1, ""); //유저 NFT 소유권 setCreator(_owner,msg.sender,assetId);//로열티 발행자 이용자 platformFeeBuyerToken(_fee);//구매 수수료 platformFeeSellerToken(_owner,_fee,_price);//판매 수수료 } } function mintCreator(string memory _metadata, uint256 _amount, uint256 _price, uint256 _currency) public {//관리자 발행 1차 판매 require(_currency < 2,"currency::Check"); uint256 assetId = nft_asset.length; // 유일한 작품 ID nft_asset.push(NFTAsset(_metadata,msg.sender,assetId,_amount,_price,0,_currency)); ownedNFT[msg.sender][assetId]= NFTAsset(_metadata,msg.sender,assetId,_amount,_price,0,_currency); _mint(msg.sender, assetId, _amount, ""); //유저 NFT 소유권 setCreator(getPlatformAddr(),msg.sender,assetId); //로열티 발행자 플랫폼 } //발행 function priceChange(uint256 _tokenId, uint256 _amount, uint256 _price) public {//2차 판매 가격 변경 require(msg.sender == ownedNFT[msg.sender][_tokenId].owner); require(ownedNFT[msg.sender][_tokenId].amount >= _amount); require(ownedNFT[msg.sender][_tokenId].flag == 0); ownedNFT[msg.sender][_tokenId].price = _price; } //구매 function buyNFT(address payable _owner,uint256 _tokenId, uint256 _amount,uint256 _fee, uint256 _price, uint256 _currency) public payable { //NFT 구매 require(_owner!=msg.sender); require(getOwnedNFTFlag(_owner,_tokenId) == 0,"buy::Not for sale"); require(getOwnedNFTCurrency(_owner,_tokenId) == _currency,"buy::Currency does not match"); if(_currency==0){//ETH 구매 require(getPriceFeeIncluded(_owner, _tokenId, _fee).mul(_amount) <= msg.value, "buy::Must purchase the token for the correct price" ); setApproval(_owner,msg.sender, true); platformFeeBuyer(_fee);//구매 수수료 platformFeeSeller(_owner,_fee);//판매 수수료 safeTransferFrom(_owner,msg.sender,_tokenId,_amount,"0x0");//소유권 이전 ownedNFT[msg.sender][_tokenId]= NFTAsset(getOwnedNFTMetadata(minterCheck(_tokenId),_tokenId),msg.sender,_tokenId,_amount,msg.value,1,_currency); setApproval(_owner,msg.sender, false); }else if(_currency==1){//ERC20 구매 require(getPriceFeeIncluded(_owner, _tokenId, _fee).mul(_amount) <= _price, "buy::Must purchase the token for the correct price" ); setApproval(_owner,msg.sender, true); platformFeeBuyerToken(_fee);//구매 수수료 platformFeeSellerToken(_owner,_fee,_price);//판매 수수료 safeTransferFrom(_owner,msg.sender,_tokenId,_amount,"0x0");//소유권 이전 ownedNFT[msg.sender][_tokenId]= NFTAsset(getOwnedNFTMetadata(minterCheck(_tokenId),_tokenId),msg.sender,_tokenId,_amount,_price,1,_currency); setApproval(_owner,msg.sender, false); } } //구매 //ETH 결제 function platformFeeBuyer(uint256 _fee) public payable { //구매자 지급 수수료 if (msg.value > 0 && getFeeRate()>0) { payable(getPlatformAddr()).transfer(_fee); //추가된 구매 수수료만 지급 } } function platformFeeSeller(address payable _owner,uint256 _fee) public payable { //판매자 수수료 if (msg.value > 0 && getFeeRate()>0) { uint256 platformFeeSeller =(msg.value.sub(_fee)).mul(getFeeRate()).div(10000); payable(getPlatformAddr()).transfer(platformFeeSeller); paymentArtwork(_owner,calculateTotalFee(platformFeeSeller,_fee));//판매대금 지급 }else if(msg.value > 0 && getFeeRate()==0){ //수수료 제로 paymentArtwork(_owner,0);//판매대금 지급 } } function paymentArtwork(address payable _from,uint256 _totalFee) public payable { //판매대금 판매자 지급 if (msg.value > 0) { _from.transfer(msg.value.sub(_totalFee)); } } //ETH 결제 function calculateTotalFee(uint256 _sellerFee,uint256 _buyerFee) public view returns(uint256) { return (_sellerFee.add(_buyerFee)); } //ERC20 결제 function platformFeeBuyerToken(uint256 _fee) public payable { //구매자 지급 수수료 if (getFeeRate()>0) { IERC20(getTokenAddr()).transferFrom(msg.sender,getPlatformAddr(), _fee); } } function platformFeeSellerToken(address payable _owner,uint256 _fee, uint256 _price) public payable { //판매자 수수료 if (getFeeRate()>0) { uint256 platformFeeSeller =(_price.sub(_fee)).mul(getFeeRate()).div(10000); IERC20(getTokenAddr()).transferFrom(msg.sender,getPlatformAddr(), platformFeeSeller); paymentArtworkToken(_owner,calculateTotalFee(platformFeeSeller,_fee),_price);//판매대금 지급 }else if(getFeeRate()==0){ //수수료 제로 paymentArtworkToken(_owner,0,_price);//판매대금 지급 } } function paymentArtworkToken(address payable _from,uint256 _totalFee, uint256 _price) public payable { //판매대금 판매자 지급 if (getFeeRate()>0) { IERC20(getTokenAddr()).transferFrom(msg.sender,_from, _price.sub(_totalFee)); }else if(getFeeRate()==0){ //수수료 제로 IERC20(getTokenAddr()).transferFrom(msg.sender,_from, _price); } } //ERC20 결제 function burn(uint256 _tokenId, uint256 _amount) public { require(msg.sender == creatorCheck(_tokenId)); _burn(msg.sender, _tokenId, _amount); //ERC1155 삭제 } //RESELL 2차 구매 function reSellMint(uint256 _tokenId, uint256 _amount, uint256 _price) public {//client -> listing(2차판매) require(msg.sender == ownedNFT[msg.sender][_tokenId].owner); require(ownedNFT[msg.sender][_tokenId].amount >= _amount); if(getOwnedNFTPrice(msg.sender, _tokenId)>_price){ ownedNFT[msg.sender][_tokenId].price = _price; } ownedNFT[msg.sender][_tokenId].flag = 2; } function reSellPriceChange(uint256 _tokenId, uint256 _amount, uint256 _price) public {//2차 판매 가격 변경 require(msg.sender == ownedNFT[msg.sender][_tokenId].owner); require(ownedNFT[msg.sender][_tokenId].amount >= _amount); require(ownedNFT[msg.sender][_tokenId].flag == 2); ownedNFT[msg.sender][_tokenId].price = _price; } function reSellDelist(uint256 _tokenId) public { require(msg.sender == ownedNFT[msg.sender][_tokenId].owner); require(ownedNFT[msg.sender][_tokenId].flag != 0); ownedNFT[msg.sender][_tokenId].flag = 1; } function reSellBuyNFT(address payable _owner,uint256 _tokenId, uint256 _amount, uint256 _royalRate,uint256 _fee,uint256 _price) public payable { //NFT 재판매 후 구매 require(_owner!=msg.sender); require(msg.sender!=creatorOf(_tokenId),"resell::Cannot buy my NFT"); require(getOwnedNFTFlag(_owner,_tokenId) == 2,"resell::Not for sale"); require(_royalRate <= 1000,"resell::Royalty Check"); //최대 10% require(ownedNFT[_owner][_tokenId].amount >= _amount ,"resell::Amount Check"); //추가 require(_amount == 1,"resell::Amount Check"); //추가 if(getFeeRate()==0){//추가 require(_fee==0,"resell::Fee Check"); //추가 } if(getOwnedNFTCurrency(_owner,_tokenId)==0){//ETH 구매 require(getPriceFeeIncluded(_owner, _tokenId, _fee).mul(_amount) <= msg.value, "resell::Must purchase the token for the correct price" ); setApproval(_owner,msg.sender, true); platformFeeBuyer(_fee);//구매 수수료 uint256 ownerRoyalty = (msg.value.sub(_fee)).mul(_royalRate).div(10000); royalties(ownerRoyalty,_tokenId);//발행자 로열티 uint256 sellerCost = (msg.value - platformFeeReSeller(_fee)- ownerRoyalty); reSellpayment(_owner,sellerCost);//판매 대금 ownedNFT[msg.sender][_tokenId]= NFTAsset(getOwnedNFTMetadata(minterCheck(_tokenId),_tokenId),msg.sender,_tokenId,_amount,msg.value,1,0); safeTransferFrom(_owner,msg.sender,_tokenId,_amount,"0x0"); ownedNFT[_owner][_tokenId].amount = ownedNFT[_owner][_tokenId].amount.sub(_amount); setApproval(_owner,msg.sender, false); }else if(getOwnedNFTCurrency(_owner,_tokenId)==1){//ERC 구매 require(getPriceFeeIncluded(_owner, _tokenId, _fee).mul(_amount) <= _price, "resell::Must purchase the token for the correct price" ); setApproval(_owner,msg.sender, true); platformFeeBuyerToken(_fee);//구매 수수료 uint256 ownerRoyalty = (_price.sub(_fee)).mul(_royalRate).div(10000); royaltiesToken(ownerRoyalty,_tokenId);//발행자 로열티 uint256 sellerCost = (_price - platformFeeReSellerToken(_fee,_price)- ownerRoyalty); reSellpaymentToken(_owner,sellerCost);//판매 대금 ownedNFT[msg.sender][_tokenId]= NFTAsset(getOwnedNFTMetadata(minterCheck(_tokenId),_tokenId),msg.sender,_tokenId,_amount,_price,1,1); safeTransferFrom(_owner,msg.sender,_tokenId,_amount,"0x0"); ownedNFT[_owner][_tokenId].amount = ownedNFT[_owner][_tokenId].amount.sub(_amount); setApproval(_owner,msg.sender, false); } } function royaltiesToken(uint256 _royalty,uint256 _tokenId) public payable { //발행자 로열티 if (_royalty > 0) { address creator = creatorOf(_tokenId); IERC20(getTokenAddr()).transferFrom(msg.sender,creator, _royalty); } } function platformFeeReSellerToken(uint256 _fee,uint256 _price) public payable returns(uint256) { //판매자 수수료 if(getFeeRate()>0){ uint256 platformFeeSeller =(_price.sub(_fee)).mul(getFeeRate()).div(10000); IERC20(getTokenAddr()).transferFrom(msg.sender,getPlatformAddr(), platformFeeSeller); return(calculateTotalFee(platformFeeSeller,_fee)); }else if(getFeeRate()==0){ return(0); } } function reSellpaymentToken(address payable _from,uint256 _cost) public payable { //비용 지불 if (_cost > 0) { IERC20(getTokenAddr()).transferFrom(msg.sender,_from, _cost); } } function royalties(uint256 _royalty,uint256 _tokenId) public payable { //발행자 로열티 if (_royalty > 0) { address creator = creatorOf(_tokenId); payable(creator).transfer(_royalty); } } function platformFeeReSeller(uint256 _fee) public payable returns(uint256) { //판매자 수수료 if (msg.value > 0) { uint256 platformFeeSeller =(msg.value.sub(_fee)).mul(getFeeRate()).div(10000); payable(getPlatformAddr()).transfer(platformFeeSeller); return(calculateTotalFee(platformFeeSeller,_fee)); } } function reSellpayment(address payable _from,uint256 _cost) public payable { //비용 지불 if (_cost > 0) { _from.transfer(_cost); } } //RESELL 2차 구매 function minterCheck(uint256 _tokenId) public view returns (address){ //minter 확인 return minterOf(_tokenId); } function creatorCheck(uint256 _tokenId) public view returns (address){ //creator 확인 로열티 받을 사람 return creatorOf(_tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"}],"name":"buyNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellerFee","type":"uint256"},{"internalType":"uint256","name":"_buyerFee","type":"uint256"}],"name":"calculateTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"creatorCheck","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"creatorOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getERC20Balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getERC20Total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOwnedNFTCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOwnedNFTFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOwnedNFTMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOwnedNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"getPriceFeeIncluded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"string","name":"_metadata","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"string","name":"_metadata","type":"string"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"}],"name":"mintAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadata","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"}],"name":"mintCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadata","type":"string"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"}],"name":"mintTrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"minterCheck","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"minterOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nft_asset","outputs":[{"internalType":"string","name":"metadata","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFT","outputs":[{"internalType":"string","name":"metadata","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"uint256","name":"_totalFee","type":"uint256"}],"name":"paymentArtwork","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"uint256","name":"_totalFee","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"paymentArtworkToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"platformFeeBuyer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"platformFeeBuyerToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"platformFeeReSeller","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"platformFeeReSellerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"platformFeeSeller","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"platformFeeSellerToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"priceChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_royalRate","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"reSellBuyNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reSellDelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"reSellMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"reSellPriceChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"reSellpayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"reSellpaymentToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"royalties","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"royaltiesToken","outputs":[],"stateMutability":"payable","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":"address","name":"_platformAddr","type":"address"}],"name":"setChangeAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"setChangeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"setChangeTokenAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_flag","type":"uint256"}],"name":"setOwnedNFTFlag","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051806020016040528060008152506040518060400160405280600f81526020016e424c55454241592047414c4c45525960881b8152506040518060400160405280600381526020016242424760e81b81525062000077836200015e60201b60201c565b81516200008c90600090602085019062000177565b508051620000a290600190602084019062000177565b5050600780546001600160a01b031916331790555050604080516060810182527334e366278eefe4fef648ac826528e38717ff900d815260006020820152738c661806f716652b637728355cc4e2620d428f9981830152905160089062000109906200021d565b90815260408051918290036020908101909220835181546001600160a01b039182166001600160a01b03199182161783559385015160018301559390910151600290910180549190931691161790556200026a565b80516200017390600690602084019062000177565b5050565b82805462000185906200022d565b90600052602060002090601f016020900481019282620001a95760008555620001f4565b82601f10620001c457805160ff1916838001178555620001f4565b82800160010185558215620001f4579182015b82811115620001f4578251825591602001919060010190620001d7565b506200020292915062000206565b5090565b5b8082111562000202576000815560010162000207565b6336b0b4b760e11b815260040190565b6002810460018216806200024257607f821691505b602082108114156200026457634e487b7160e01b600052602260045260246000fd5b50919050565b614f00806200027a6000396000f3fe60806040526004361061036a5760003560e01c806384e5eed0116101c6578063c4c60e0a116100f7578063e985e9c511610095578063f4474c061161006f578063f4474c0614610926578063f79bb3de14610946578063fb48fa8114610966578063fcff53a7146109865761036a565b8063e985e9c5146108c6578063f242432a146108e6578063f2fde38b146109065761036a565b8063d1e20a67116100d1578063d1e20a6714610860578063d465cbf214610873578063e014981f14610893578063e2d7681d146108a65761036a565b8063c4c60e0a1461080d578063c51a74d31461082d578063ccec45b0146108405761036a565b80639e942ace11610164578063b390c0ab1161013e578063b390c0ab14610798578063b48ca364146107b8578063c108adab146107d8578063c3736fe6146107f85761036a565b80639e942ace14610745578063a22cb46514610765578063aeae6af6146107855761036a565b806389698adc116101a057806389698adc146106ea5780638edb8b7c146106fd57806395d89b4114610710578063973cfaaf146107255761036a565b806384e5eed0146106a257806386344d3b146106b75780638924af74146106d75761036a565b80633dff35e9116102a0578063589a17431161023e5780635f8f470b116102185780635f8f470b1461064757806371cd4425146106675780637c57937d1461067a578063831d5dff1461068f5761036a565b8063589a17431461060157806359669889146106215780635cd1fbaa146106345761036a565b80634d122e531161027a5780634d122e531461058c5780634e1273f4146105ac57806351b26037146105d9578063582b2720146105ec5761036a565b80633dff35e914610544578063442890d5146105645780634c43f05e146105795761036a565b8063107b60191161030d5780631daad894116102e75780631daad894146104be5780631ef7c998146104f1578063213d43aa146105115780632eb2c2d6146105245761036a565b8063107b60191461045c578063118af6c41461047157806318154f711461049e5761036a565b8063038016051161034957806303801605146103f457806306fdde03146104075780630a9e1ac7146104295780630e89341c1461043c5761036a565b8062fdd58e1461036f57806301ffc9a7146103a5578063027a2255146103d2575b600080fd5b34801561037b57600080fd5b5061038f61038a366004613ee8565b6109a6565b60405161039c9190614c71565b60405180910390f35b3480156103b157600080fd5b506103c56103c03660046141f8565b610a02565b60405161039c91906144fb565b3480156103de57600080fd5b506103f26103ed36600461427c565b610a4a565b005b6103f26104023660046142fe565b610c1d565b34801561041357600080fd5b5061041c610cc0565b60405161039c9190614506565b61038f6104373660046142fe565b610d53565b34801561044857600080fd5b5061041c6104573660046142ce565b610e46565b34801561046857600080fd5b5061038f610eda565b34801561047d57600080fd5b5061049161048c3660046142ce565b610f5b565b60405161039c91906143df565b3480156104aa57600080fd5b5061038f6104b9366004613ee8565b610f66565b3480156104ca57600080fd5b506104de6104d9366004613ee8565b610fc7565b60405161039c9796959493929190614519565b3480156104fd57600080fd5b5061049161050c3660046142ce565b6110a1565b6103f261051f366004613f47565b6110ac565b34801561053057600080fd5b506103f261053f366004613fca565b6113ca565b34801561055057600080fd5b506104de61055f3660046142ce565b611421565b34801561057057600080fd5b50610491611454565b6103f2610587366004614230565b611463565b34801561059857600080fd5b506103f26105a7366004614108565b61191c565b3480156105b857600080fd5b506105cc6105c736600461411c565b611991565b60405161039c91906144ba565b6103f26105e73660046142ce565b611ab1565b3480156105f857600080fd5b50610491611b54565b34801561060d57600080fd5b5061049161061c3660046142ce565b611b85565b6103f261062f366004613f13565b611bba565b6103f26106423660046142ce565b611c9f565b34801561065357600080fd5b5061038f610662366004613ee8565b611cfb565b61038f6106753660046142ce565b611d5c565b34801561068657600080fd5b50610491611dd6565b6103f261069d366004613f13565b611e04565b3480156106ae57600080fd5b5061038f611ef0565b3480156106c357600080fd5b5061038f6106d2366004613ee8565b611f17565b6103f26106e53660046142fe565b611f78565b6103f26106f8366004613ee8565b611fc2565b6103f261070b366004613ee8565b611ffe565b34801561071c57600080fd5b5061041c61208d565b34801561073157600080fd5b506103f261074036600461431f565b61209c565b34801561075157600080fd5b506104916107603660046142ce565b612147565b34801561077157600080fd5b506103f26107803660046140db565b61217c565b6103f2610793366004613ee8565b61224a565b3480156107a457600080fd5b506103f26107b33660046142fe565b61228f565b3480156107c457600080fd5b5061041c6107d3366004613ee8565b6122c0565b3480156107e457600080fd5b506103f26107f33660046142ce565b6123e4565b34801561080457600080fd5b5061038f612420565b34801561081957600080fd5b506103f261082836600461431f565b61246e565b6103f261083b366004613e7f565b6124f1565b34801561084c57600080fd5b506103f261085b366004613e63565b6128f3565b6103f261086e366004613f47565b61294e565b34801561087f57600080fd5b506103f261088e36600461427c565b612e9a565b6103f26108a1366004613ee8565b613071565b3480156108b257600080fd5b506103f26108c136600461431f565b613126565b3480156108d257600080fd5b506103c56108e1366004613f92565b6131d8565b3480156108f257600080fd5b506103f2610901366004614074565b613206565b34801561091257600080fd5b506103f2610921366004613e63565b61325d565b34801561093257600080fd5b5061038f610941366004614108565b6132bc565b34801561095257600080fd5b506103f26109613660046142ce565b61332a565b34801561097257600080fd5b506103f2610981366004613e63565b6133a5565b34801561099257600080fd5b5061038f6109a13660046142fe565b6133fd565b60006001600160a01b0383166109d75760405162461bcd60e51b81526004016109ce9061462d565b60405180910390fd5b5060008181526004602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610a3357506001600160e01b03198216634ed638af60e11b145b80610a425750610a4282613410565b90505b919050565b60028110610a6a5760405162461bcd60e51b81526004016109ce90614af6565b600a80546040805160e081018252878152336020808301919091529181018390526060810187905260808101869052600060a0820181905260c08201869052600184018555939093528251805192939260078502600080516020614eab8339815191520192610add928492910190613cf3565b506020828101516001830180546001600160a01b0319166001600160a01b0390921691909117905560408084015160028401556060808501516003850155608080860151600486015560a080870151600587015560c096870151600690960195909555825160e0810184528b8152338186018190528185018990529281018b905290810189905260009481018590529485018790528352600982528083208584528252909120825180519192610b9892849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050610c1633828660405180602001604052806000815250613429565b5050505050565b8115610cbc576000610c2e82611b85565b9050610c38611b54565b6001600160a01b03166323b872dd3383866040518463ffffffff1660e01b8152600401610c67939291906143f3565b602060405180830381600087803b158015610c8157600080fd5b505af1158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb991906141dc565b50505b5050565b606060008054610ccf90614d44565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfb90614d44565b8015610d485780601f10610d1d57610100808354040283529160200191610d48565b820191906000526020600020905b815481529060010190602001808311610d2b57829003601f168201915b505050505090505b90565b600080610d5e611ef0565b1115610e32576000610d8d612710610d87610d77611ef0565b610d81878961355e565b9061356a565b90613576565b9050610d97611b54565b6001600160a01b03166323b872dd33610dae611dd6565b846040518463ffffffff1660e01b8152600401610dcd939291906143f3565b602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f91906141dc565b50610e2a81856133fd565b9150506109fc565b610e3a611ef0565b6109fc575060006109fc565b606060068054610e5590614d44565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8190614d44565b8015610ece5780601f10610ea357610100808354040283529160200191610ece565b820191906000526020600020905b815481529060010190602001808311610eb157829003601f168201915b50505050509050919050565b600080610ee5611b54565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f1d57600080fd5b505afa158015610f31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5591906142e6565b91505090565b6000610a4282612147565b6001600160a01b03808316600081815260096020908152604080832086845290915281206001015490921614610f9b57600080fd5b506001600160a01b03919091166000908152600960209081526040808320938352929052206005015490565b6009602090815260009283526040808420909152908252902080548190610fed90614d44565b80601f016020809104026020016040519081016040528092919081815260200182805461101990614d44565b80156110665780601f1061103b57610100808354040283529160200191611066565b820191906000526020600020905b81548152906001019060200180831161104957829003601f168201915b5050506001840154600285015460038601546004870154600588015460069098015496976001600160a01b0390941696929550909350919087565b6000610a4282611b85565b6001600160a01b0386163314156110c257600080fd5b6110cc8686610f66565b156110e95760405162461bcd60e51b81526004016109ce906145ba565b806110f48787611cfb565b146111115760405162461bcd60e51b81526004016109ce90614c3a565b8061126c573461112685610d818989886132bc565b11156111445760405162461bcd60e51b81526004016109ce9061472d565b61115086336001613582565b61115983611c9f565b6111638684613071565b61118b863387876040518060400160405280600381526020016203078360ec1b815250613206565b6040518060e001604052806111a86111a288610f5b565b886122c0565b815233602080830182905260408084018a905260608401899052346080850152600160a085015260c0909301859052600091825260098152828220898352815291902082518051919261120092849290910190613cf3565b5060208201516001820180546001600160a01b0319166001600160a01b0390921691909117905560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c09091015160069091015561126786336000613582565b6113c2565b80600114156113c2578161128585610d818989886132bc565b11156112a35760405162461bcd60e51b81526004016109ce9061472d565b6112af86336001613582565b6112b883611ab1565b6112c3868484611e04565b6112eb863387876040518060400160405280600381526020016203078360ec1b815250613206565b6040518060e001604052806113026111a288610f5b565b815233602080830182905260408084018a90526060840189905260808401879052600160a085015260c0909301859052600091825260098152828220898352815291902082518051919261135b92849290910190613cf3565b5060208201516001820180546001600160a01b0319166001600160a01b0390921691909117905560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0909101516006909101556113c286336000613582565b505050505050565b6113d2613625565b6001600160a01b0316856001600160a01b031614806113f857506113f8856108e1613625565b6114145760405162461bcd60e51b81526004016109ce90614966565b610c168585858585613629565b600a818154811061143157600080fd5b9060005260206000209060070201600091509050806000018054610fed90614d44565b6007546001600160a01b031690565b600281106114835760405162461bcd60e51b81526004016109ce90614af6565b806116b4576000341161149557600080fd5b813410156114a257600080fd5b600a80546040805160e081018252868152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab8339815191520192611515928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528b8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926115d59284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506116543382600160405180602001604052806000815250613429565b61166661165f611dd6565b33836137f5565b34156116ae57611674611dd6565b6001600160a01b03166108fc349081150290604051600060405180830381858888f193505050501580156116ac573d6000803e3d6000fd5b505b50611917565b806001141561191757600082116116ca57600080fd5b600a80546040805160e081018252868152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab833981519152019261173d928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528b8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926117fd9284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505061187c3382600160405180602001604052806000815250613429565b61188761165f611dd6565b61188f611b54565b6001600160a01b03166323b872dd336118a6611dd6565b866040518463ffffffff1660e01b81526004016118c5939291906143f3565b602060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1691906141dc565b505050565b6007546001600160a01b0316331461193357600080fd5b6001600160a01b0380841660008181526009602090815260408083208784529091529020600101549091161461196857600080fd5b6001600160a01b0390921660009081526009602090815260408083209383529290522060050155565b606081518351146119b45760405162461bcd60e51b81526004016109ce90614b68565b6000835167ffffffffffffffff8111156119de57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a07578160200160208202803683370190505b50905060005b8451811015611aa957611a6e858281518110611a3957634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110611a6157634e487b7160e01b600052603260045260246000fd5b60200260200101516109a6565b828281518110611a8e57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611aa281614d7f565b9050611a0d565b509392505050565b6000611abb611ef0565b1115611b5157611ac9611b54565b6001600160a01b03166323b872dd33611ae0611dd6565b846040518463ffffffff1660e01b8152600401611aff939291906143f3565b602060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc91906141dc565b50565b60006008604051611b64906143cf565b908152604051908190036020019020600201546001600160a01b0316905090565b6000818152600360205260408120546001600160a01b031680610a425760405162461bcd60e51b81526004016109ce90614aaa565b6000611bc4611ef0565b1115611c5c57611bd2611b54565b6001600160a01b03166323b872dd3385611bec858761355e565b6040518463ffffffff1660e01b8152600401611c0a939291906143f3565b602060405180830381600087803b158015611c2457600080fd5b505af1158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ae91906141dc565b611c64611ef0565b61191757611c70611b54565b6001600160a01b03166323b872dd3385846040518463ffffffff1660e01b8152600401610c67939291906143f3565b600034118015611cb657506000611cb4611ef0565b115b15611b5157611cc3611dd6565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610cbc573d6000803e3d6000fd5b6001600160a01b03808316600081815260096020908152604080832086845290915281206001015490921614611d3057600080fd5b506001600160a01b03919091166000908152600960209081526040808320938352929052206006015490565b60003415610a45576000611d81612710610d87611d77611ef0565b610d81348861355e565b9050611d8b611dd6565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015611dc3573d6000803e3d6000fd5b50611dce81846133fd565b915050610a45565b60006008604051611de6906143cf565b908152604051908190036020019020546001600160a01b0316905090565b6000611e0e611ef0565b1115611ed8576000611e31612710610d87611e27611ef0565b610d81868861355e565b9050611e3b611b54565b6001600160a01b03166323b872dd33611e52611dd6565b846040518463ffffffff1660e01b8152600401611e71939291906143f3565b602060405180830381600087803b158015611e8b57600080fd5b505af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec391906141dc565b506116ae84611ed283866133fd565b84611bba565b611ee0611ef0565b6119175761191783600083611bba565b60006008604051611f00906143cf565b908152602001604051809103902060010154905090565b6001600160a01b03808316600081815260096020908152604080832086845290915281206001015490921614611f4c57600080fd5b506001600160a01b03919091166000908152600960209081526040808320938352929052206004015490565b8115610cbc576000611f8982611b85565b6040519091506001600160a01b0382169084156108fc029085906000818181858888f19350505050158015610cb9573d6000803e3d6000fd5b8015610cbc576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611917573d6000803e3d6000fd5b8015610cbc5761200c611b54565b6001600160a01b03166323b872dd3384846040518463ffffffff1660e01b815260040161203b939291906143f3565b602060405180830381600087803b15801561205557600080fd5b505af1158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191791906141dc565b606060018054610ccf90614d44565b3360008181526009602090815260408083208784529091529020600101546001600160a01b0316146120cd57600080fd5b3360009081526009602090815260408083208684529091529020600301548211156120f757600080fd5b33600090815260096020908152604080832086845290915290206005015460021461212157600080fd5b336000908152600960209081526040808320958352949052929092206004019190915550565b6000818152600260205260408120546001600160a01b031680610a425760405162461bcd60e51b81526004016109ce9061487a565b816001600160a01b031661218e613625565b6001600160a01b031614156121b55760405162461bcd60e51b81526004016109ce90614b1f565b80600560006121c2613625565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612206613625565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161223e91906144fb565b60405180910390a35050565b3415610cbc576001600160a01b0382166108fc612267348461355e565b6040518115909202916000818181858888f19350505050158015611917573d6000803e3d6000fd5b612298826110a1565b6001600160a01b0316336001600160a01b0316146122b557600080fd5b610cbc33838361385e565b6060600a82815481106122e357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600160079092020101546001600160a01b038481169116146123215760405162461bcd60e51b81526004016109ce906148c4565b600a828154811061234257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060070201600001805461235e90614d44565b80601f016020809104026020016040519081016040528092919081815260200182805461238a90614d44565b80156123d75780601f106123ac576101008083540402835291602001916123d7565b820191906000526020600020905b8154815290600101906020018083116123ba57829003601f168201915b5050505050905092915050565b6007546001600160a01b031633146123fb57600080fd5b80600860405161240a906143cf565b9081526040519081900360200190206001015550565b60008061242b611b54565b6001600160a01b03166370a08231336040518263ffffffff1660e01b815260040161245691906143df565b60206040518083038186803b158015610f1d57600080fd5b3360008181526009602090815260408083208784529091529020600101546001600160a01b03161461249f57600080fd5b3360009081526009602090815260408083208684529091529020600301548211156124c957600080fd5b3360009081526009602090815260408083208684529091529020600501541561212157600080fd5b600281106125115760405162461bcd60e51b81526004016109ce90614af6565b8061270c576000341161252357600080fd5b8134101561253057600080fd5b600a80546040805160e081018252878152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab83398151915201926125a3928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528c8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926126639284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506126e23382600160405180602001604052806000815250613429565b6126ed8633836137f5565b3415612706576126fc84611c9f565b6127068685613071565b50610c16565b8060011415610c16576000821161272257600080fd5b600a80546040805160e081018252878152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab8339815191520192612795928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528c8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926128559284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506128d43382600160405180602001604052806000815250613429565b6128df8633836137f5565b6128e884611ab1565b6113c2868585611e04565b6007546001600160a01b0316331461290a57600080fd5b806008604051612919906143cf565b90815260405190819003602001902060020180546001600160a01b03929092166001600160a01b031990921691909117905550565b6001600160a01b03861633141561296457600080fd5b61296d85611b85565b6001600160a01b0316336001600160a01b0316141561299e5760405162461bcd60e51b81526004016109ce906148ea565b6129a88686610f66565b6002146129c75760405162461bcd60e51b81526004016109ce906149fb565b6103e88311156129e95760405162461bcd60e51b81526004016109ce9061481d565b6001600160a01b0386166000908152600960209081526040808320888452909152902060030154841115612a2f5760405162461bcd60e51b81526004016109ce9061484c565b83600114612a4f5760405162461bcd60e51b81526004016109ce9061484c565b612a57611ef0565b612a79578115612a795760405162461bcd60e51b81526004016109ce90614678565b612a838686611cfb565b612c865734612a9785610d818989876132bc565b1115612ab55760405162461bcd60e51b81526004016109ce9061477f565b612ac186336001613582565b612aca82611c9f565b6000612ae0612710610d8786610d81348861355e565b9050612aec8187611f78565b600081612af885611d5c565b612b029034614d2d565b612b0c9190614d2d565b9050612b188882611fc2565b6040518060e00160405280612b35612b2f8a610f5b565b8a6122c0565b815233602080830182905260408084018c9052606084018b9052346080850152600160a0850152600060c0909401849052918352600981528183208b845281529120825180519192612b8c92849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050612c17883389896040518060400160405280600381526020016203078360ec1b815250613206565b6001600160a01b03881660009081526009602090815260408083208a8452909152902060030154612c48908761355e565b6001600160a01b03891660009081526009602090815260408083208b8452909152812060030191909155612c7f9089903390613582565b50506113c2565b612c908686611cfb565b600114156113c25780612ca885610d818989876132bc565b1115612cc65760405162461bcd60e51b81526004016109ce9061477f565b612cd286336001613582565b612cdb82611ab1565b6000612cf1612710610d8786610d81868861355e565b9050612cfd8187610c1d565b600081612d0a8585610d53565b612d149085614d2d565b612d1e9190614d2d565b9050612d2a8882611ffe565b6040518060e00160405280612d41612b2f8a610f5b565b815233602080830182905260408084018c9052606084018b905260808401889052600160a0850181905260c0909401939093526000918252600981528282208b83528152919020825180519192612d9d92849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050612e28883389896040518060400160405280600381526020016203078360ec1b815250613206565b6001600160a01b03881660009081526009602090815260408083208a8452909152902060030154612e59908761355e565b6001600160a01b03891660009081526009602090815260408083208b8452909152812060030191909155612e909089903390613582565b5050505050505050565b60028110612eba5760405162461bcd60e51b81526004016109ce90614af6565b600a80546040805160e081018252878152336020808301919091529181018390526060810187905260808101869052600060a0820181905260c08201869052600184018555939093528251805192939260078502600080516020614eab8339815191520192612f2d928492910190613cf3565b506020828101516001830180546001600160a01b0319166001600160a01b0390921691909117905560408084015160028401556060808501516003850155608080860151600486015560a080870151600587015560c096870151600690960195909555825160e0810184528b8152338186018190528185018990529281018b905290810189905260009481018590529485018790528352600982528083208584528252909120825180519192612fe892849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505061306633828660405180602001604052806000815250613429565b610c1661165f611dd6565b60003411801561308857506000613086611ef0565b115b156131015760006130aa612710610d876130a0611ef0565b610d81348761355e565b90506130b4611dd6565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156130ec573d6000803e3d6000fd5b506130fb8361079383856133fd565b50610cbc565b6000341180156131165750613114611ef0565b155b15610cbc57610cbc82600061224a565b3360008181526009602090815260408083208784529091529020600101546001600160a01b03161461315757600080fd5b33600090815260096020908152604080832086845290915290206003015482111561318157600080fd5b8061318c3385611f17565b11156131b35733600090815260096020908152604080832086845290915290206004018190555b5050336000908152600960209081526040808320938352929052206002600590910155565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61320e613625565b6001600160a01b0316856001600160a01b031614806132345750613234856108e1613625565b6132505760405162461bcd60e51b81526004016109ce906147d4565b610c168585858585613971565b6007546001600160a01b0316331461327457600080fd5b6001600160a01b03811661329a5760405162461bcd60e51b81526004016109ce906146a3565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038084166000818152600960209081526040808320878452909152812060010154909216146132f157600080fd5b6001600160a01b03841660009081526009602090815260408083208684529091529020600401546133229083613aa9565b949350505050565b3360008181526009602090815260408083208584529091529020600101546001600160a01b03161461335b57600080fd5b33600090815260096020908152604080832084845290915290206005015461338257600080fd5b336000908152600960209081526040808320938352929052206001600590910155565b6007546001600160a01b031633146133bc57600080fd5b8060086040516133cb906143cf565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905550565b60006134098383613aa9565b9392505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b03841661344f5760405162461bcd60e51b81526004016109ce90614bf9565b6000613459613625565b905061347a8160008761346b88613ab5565b61347488613ab5565b876113c2565b60008481526004602090815260408083206001600160a01b0389168452909152812080548592906134ac908490614cd6565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051613503929190614c7a565b60405180910390a461351a81600087878787613b0e565b505050600090815260026020908152604080832080546001600160a01b039095166001600160a01b0319958616811790915560039092529091208054909216179055565b60006134098284614d2d565b60006134098284614d0e565b60006134098284614cee565b816001600160a01b0316836001600160a01b031614156135b45760405162461bcd60e51b81526004016109ce90614b1f565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906136189085906144fb565b60405180910390a3505050565b3390565b815183511461364a5760405162461bcd60e51b81526004016109ce90614bb1565b6001600160a01b0384166136705760405162461bcd60e51b81526004016109ce90614921565b600061367a613625565b905061368a8187878787876113c2565b60005b845181101561378f5760008582815181106136b857634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106136e457634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008481526004835260408082206001600160a01b038e1683529093529190912054909150818110156137355760405162461bcd60e51b81526004016109ce90614a29565b60008381526004602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290613774908490614cd6565b925050819055505050508061378890614d7f565b905061368d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516137df9291906144cd565b60405180910390a46113c2818787878787613c1c565b6000818152600260205260409020546001600160a01b0383811691161461382e5760405162461bcd60e51b81526004016109ce90614a73565b600090815260036020526040902080546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b0383166138845760405162461bcd60e51b81526004016109ce906149b8565b600061388e613625565b90506138be818560006138a087613ab5565b6138a987613ab5565b604051806020016040528060008152506113c2565b60008381526004602090815260408083206001600160a01b0388168452909152902054828110156139015760405162461bcd60e51b81526004016109ce906146e9565b60008481526004602090815260408083206001600160a01b03808a16808652919093528184208786039055905190918516907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906139629089908990614c7a565b60405180910390a45050505050565b6001600160a01b0384166139975760405162461bcd60e51b81526004016109ce90614921565b60006139a1613625565b90506139b281878761346b88613ab5565b60008481526004602090815260408083206001600160a01b038a168452909152902054838110156139f55760405162461bcd60e51b81526004016109ce90614a29565b60008581526004602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290613a34908490614cd6565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613a8a929190614c7a565b60405180910390a4613aa0828888888888613b0e565b50505050505050565b60006134098284614cd6565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613afd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b613b20846001600160a01b0316613ced565b156113c25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613b599089908990889088908890600401614475565b602060405180830381600087803b158015613b7357600080fd5b505af1925050508015613ba3575060408051601f3d908101601f19168201909252613ba091810190614214565b60015b613bec57613baf614dcc565b80613bba5750613bd4565b8060405162461bcd60e51b81526004016109ce9190614506565b60405162461bcd60e51b81526004016109ce90614566565b6001600160e01b0319811663f23a6e6160e01b14613aa05760405162461bcd60e51b81526004016109ce906145e5565b613c2e846001600160a01b0316613ced565b156113c25760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613c679089908990889088908890600401614417565b602060405180830381600087803b158015613c8157600080fd5b505af1925050508015613cb1575060408051601f3d908101601f19168201909252613cae91810190614214565b60015b613cbd57613baf614dcc565b6001600160e01b0319811663bc197c8160e01b14613aa05760405162461bcd60e51b81526004016109ce906145e5565b3b151590565b828054613cff90614d44565b90600052602060002090601f016020900481019282613d215760008555613d67565b82601f10613d3a57805160ff1916838001178555613d67565b82800160010185558215613d67579182015b82811115613d67578251825591602001919060010190613d4c565b50613d73929150613d77565b5090565b5b80821115613d735760008155600101613d78565b600082601f830112613d9c578081fd5b81356020613db1613dac83614cb2565b614c88565b8281528181019085830183850287018401881015613dcd578586fd5b855b85811015613deb57813584529284019290840190600101613dcf565b5090979650505050505050565b600082601f830112613e08578081fd5b813567ffffffffffffffff811115613e2257613e22614db0565b613e35601f8201601f1916602001614c88565b818152846020838601011115613e49578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613e74578081fd5b813561340981614e71565b600080600080600060a08688031215613e96578081fd5b8535613ea181614e71565b9450602086013567ffffffffffffffff811115613ebc578182fd5b613ec888828901613df8565b959895975050505060408401359360608101359360809091013592509050565b60008060408385031215613efa578182fd5b8235613f0581614e71565b946020939093013593505050565b600080600060608486031215613f27578283fd5b8335613f3281614e71565b95602085013595506040909401359392505050565b60008060008060008060c08789031215613f5f578081fd5b8635613f6a81614e71565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008060408385031215613fa4578182fd5b8235613faf81614e71565b91506020830135613fbf81614e71565b809150509250929050565b600080600080600060a08688031215613fe1578283fd5b8535613fec81614e71565b94506020860135613ffc81614e71565b9350604086013567ffffffffffffffff80821115614018578485fd5b61402489838a01613d8c565b94506060880135915080821115614039578283fd5b61404589838a01613d8c565b9350608088013591508082111561405a578283fd5b5061406788828901613df8565b9150509295509295909350565b600080600080600060a0868803121561408b578283fd5b853561409681614e71565b945060208601356140a681614e71565b93506040860135925060608601359150608086013567ffffffffffffffff8111156140cf578182fd5b61406788828901613df8565b600080604083850312156140ed578182fd5b82356140f881614e71565b91506020830135613fbf81614e86565b600080600060608486031215613f27578081fd5b6000806040838503121561412e578182fd5b823567ffffffffffffffff80821115614145578384fd5b818501915085601f830112614158578384fd5b81356020614168613dac83614cb2565b82815281810190858301838502870184018b1015614184578889fd5b8896505b848710156141af57803561419b81614e71565b835260019690960195918301918301614188565b50965050860135925050808211156141c5578283fd5b506141d285828601613d8c565b9150509250929050565b6000602082840312156141ed578081fd5b815161340981614e86565b600060208284031215614209578081fd5b813561340981614e94565b600060208284031215614225578081fd5b815161340981614e94565b600080600060608486031215614244578081fd5b833567ffffffffffffffff81111561425a578182fd5b61426686828701613df8565b9660208601359650604090950135949350505050565b60008060008060808587031215614291578182fd5b843567ffffffffffffffff8111156142a7578283fd5b6142b387828801613df8565b97602087013597506040870135966060013595509350505050565b6000602082840312156142df578081fd5b5035919050565b6000602082840312156142f7578081fd5b5051919050565b60008060408385031215614310578182fd5b50508035926020909101359150565b600080600060608486031215614333578081fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b838110156143795781518752958201959082019060010161435d565b509495945050505050565b60008151808452815b818110156143a95760208185018101518683018201520161438d565b818111156143ba5782602083870101525b50601f01601f19169290920160200192915050565b6336b0b4b760e11b815260040190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0386811682528516602082015260a0604082018190526000906144439083018661434a565b8281036060840152614455818661434a565b905082810360808401526144698185614384565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906144af90830184614384565b979650505050505050565b600060208252613409602083018461434a565b6000604082526144e0604083018561434a565b82810360208401526144f2818561434a565b95945050505050565b901515815260200190565b6000602082526134096020830184614384565b600060e0825261452c60e083018a614384565b6001600160a01b039890981660208301525060408101959095526060850193909352608084019190915260a083015260c090910152919050565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b6020808252601190820152706275793a3a4e6f7420666f722073616c6560781b604082015260600190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b602080825260119082015270726573656c6c3a3a46656520436865636b60781b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526032908201527f6275793a3a4d7573742070757263686173652074686520746f6b656e20666f726040820152712074686520636f727265637420707269636560701b606082015260800190565b60208082526035908201527f726573656c6c3a3a4d7573742070757263686173652074686520746f6b656e20604082015274666f722074686520636f727265637420707269636560581b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b602080825260159082015274726573656c6c3a3a526f79616c747920436865636b60581b604082015260600190565b602080825260149082015273726573656c6c3a3a416d6f756e7420436865636b60601b604082015260600190565b6020808252602a908201527f455243313135353a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252600c908201526b27379027232a1037bbb732b960a11b604082015260600190565b60208082526019908201527f726573656c6c3a3a43616e6e6f7420627579206d79204e465400000000000000604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260149082015273726573656c6c3a3a4e6f7420666f722073616c6560601b604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526018908201527f455243313135353a206e6f7420746f6b656e206f776e65720000000000000000604082015260600190565b6020808252602c908201527f455243313135353a2063726561746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600f908201526e63757272656e63793a3a436865636b60881b604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601c908201527f6275793a3a43757272656e637920646f6573206e6f74206d6174636800000000604082015260600190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614caa57614caa614db0565b604052919050565b600067ffffffffffffffff821115614ccc57614ccc614db0565b5060209081020190565b60008219821115614ce957614ce9614d9a565b500190565b600082614d0957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614d2857614d28614d9a565b500290565b600082821015614d3f57614d3f614d9a565b500390565b600281046001821680614d5857607f821691505b60208210811415614d7957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614d9357614d93614d9a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015614ddc57610d50565b600481823e6308c379a0614df08251614dc6565b14614dfa57610d50565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715614e2a5750505050610d50565b82840192508251915080821115614e445750505050610d50565b503d83016020828401011115614e5c57505050610d50565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114611b5157600080fd5b8015158114611b5157600080fd5b6001600160e01b031981168114611b5157600080fdfec65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8a2646970667358221220a6124cd422264b8adaa1c43f5e60fadac16b956dcce634e582b1df0a9f3778f564736f6c63430008000033
Deployed Bytecode
0x60806040526004361061036a5760003560e01c806384e5eed0116101c6578063c4c60e0a116100f7578063e985e9c511610095578063f4474c061161006f578063f4474c0614610926578063f79bb3de14610946578063fb48fa8114610966578063fcff53a7146109865761036a565b8063e985e9c5146108c6578063f242432a146108e6578063f2fde38b146109065761036a565b8063d1e20a67116100d1578063d1e20a6714610860578063d465cbf214610873578063e014981f14610893578063e2d7681d146108a65761036a565b8063c4c60e0a1461080d578063c51a74d31461082d578063ccec45b0146108405761036a565b80639e942ace11610164578063b390c0ab1161013e578063b390c0ab14610798578063b48ca364146107b8578063c108adab146107d8578063c3736fe6146107f85761036a565b80639e942ace14610745578063a22cb46514610765578063aeae6af6146107855761036a565b806389698adc116101a057806389698adc146106ea5780638edb8b7c146106fd57806395d89b4114610710578063973cfaaf146107255761036a565b806384e5eed0146106a257806386344d3b146106b75780638924af74146106d75761036a565b80633dff35e9116102a0578063589a17431161023e5780635f8f470b116102185780635f8f470b1461064757806371cd4425146106675780637c57937d1461067a578063831d5dff1461068f5761036a565b8063589a17431461060157806359669889146106215780635cd1fbaa146106345761036a565b80634d122e531161027a5780634d122e531461058c5780634e1273f4146105ac57806351b26037146105d9578063582b2720146105ec5761036a565b80633dff35e914610544578063442890d5146105645780634c43f05e146105795761036a565b8063107b60191161030d5780631daad894116102e75780631daad894146104be5780631ef7c998146104f1578063213d43aa146105115780632eb2c2d6146105245761036a565b8063107b60191461045c578063118af6c41461047157806318154f711461049e5761036a565b8063038016051161034957806303801605146103f457806306fdde03146104075780630a9e1ac7146104295780630e89341c1461043c5761036a565b8062fdd58e1461036f57806301ffc9a7146103a5578063027a2255146103d2575b600080fd5b34801561037b57600080fd5b5061038f61038a366004613ee8565b6109a6565b60405161039c9190614c71565b60405180910390f35b3480156103b157600080fd5b506103c56103c03660046141f8565b610a02565b60405161039c91906144fb565b3480156103de57600080fd5b506103f26103ed36600461427c565b610a4a565b005b6103f26104023660046142fe565b610c1d565b34801561041357600080fd5b5061041c610cc0565b60405161039c9190614506565b61038f6104373660046142fe565b610d53565b34801561044857600080fd5b5061041c6104573660046142ce565b610e46565b34801561046857600080fd5b5061038f610eda565b34801561047d57600080fd5b5061049161048c3660046142ce565b610f5b565b60405161039c91906143df565b3480156104aa57600080fd5b5061038f6104b9366004613ee8565b610f66565b3480156104ca57600080fd5b506104de6104d9366004613ee8565b610fc7565b60405161039c9796959493929190614519565b3480156104fd57600080fd5b5061049161050c3660046142ce565b6110a1565b6103f261051f366004613f47565b6110ac565b34801561053057600080fd5b506103f261053f366004613fca565b6113ca565b34801561055057600080fd5b506104de61055f3660046142ce565b611421565b34801561057057600080fd5b50610491611454565b6103f2610587366004614230565b611463565b34801561059857600080fd5b506103f26105a7366004614108565b61191c565b3480156105b857600080fd5b506105cc6105c736600461411c565b611991565b60405161039c91906144ba565b6103f26105e73660046142ce565b611ab1565b3480156105f857600080fd5b50610491611b54565b34801561060d57600080fd5b5061049161061c3660046142ce565b611b85565b6103f261062f366004613f13565b611bba565b6103f26106423660046142ce565b611c9f565b34801561065357600080fd5b5061038f610662366004613ee8565b611cfb565b61038f6106753660046142ce565b611d5c565b34801561068657600080fd5b50610491611dd6565b6103f261069d366004613f13565b611e04565b3480156106ae57600080fd5b5061038f611ef0565b3480156106c357600080fd5b5061038f6106d2366004613ee8565b611f17565b6103f26106e53660046142fe565b611f78565b6103f26106f8366004613ee8565b611fc2565b6103f261070b366004613ee8565b611ffe565b34801561071c57600080fd5b5061041c61208d565b34801561073157600080fd5b506103f261074036600461431f565b61209c565b34801561075157600080fd5b506104916107603660046142ce565b612147565b34801561077157600080fd5b506103f26107803660046140db565b61217c565b6103f2610793366004613ee8565b61224a565b3480156107a457600080fd5b506103f26107b33660046142fe565b61228f565b3480156107c457600080fd5b5061041c6107d3366004613ee8565b6122c0565b3480156107e457600080fd5b506103f26107f33660046142ce565b6123e4565b34801561080457600080fd5b5061038f612420565b34801561081957600080fd5b506103f261082836600461431f565b61246e565b6103f261083b366004613e7f565b6124f1565b34801561084c57600080fd5b506103f261085b366004613e63565b6128f3565b6103f261086e366004613f47565b61294e565b34801561087f57600080fd5b506103f261088e36600461427c565b612e9a565b6103f26108a1366004613ee8565b613071565b3480156108b257600080fd5b506103f26108c136600461431f565b613126565b3480156108d257600080fd5b506103c56108e1366004613f92565b6131d8565b3480156108f257600080fd5b506103f2610901366004614074565b613206565b34801561091257600080fd5b506103f2610921366004613e63565b61325d565b34801561093257600080fd5b5061038f610941366004614108565b6132bc565b34801561095257600080fd5b506103f26109613660046142ce565b61332a565b34801561097257600080fd5b506103f2610981366004613e63565b6133a5565b34801561099257600080fd5b5061038f6109a13660046142fe565b6133fd565b60006001600160a01b0383166109d75760405162461bcd60e51b81526004016109ce9061462d565b60405180910390fd5b5060008181526004602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610a3357506001600160e01b03198216634ed638af60e11b145b80610a425750610a4282613410565b90505b919050565b60028110610a6a5760405162461bcd60e51b81526004016109ce90614af6565b600a80546040805160e081018252878152336020808301919091529181018390526060810187905260808101869052600060a0820181905260c08201869052600184018555939093528251805192939260078502600080516020614eab8339815191520192610add928492910190613cf3565b506020828101516001830180546001600160a01b0319166001600160a01b0390921691909117905560408084015160028401556060808501516003850155608080860151600486015560a080870151600587015560c096870151600690960195909555825160e0810184528b8152338186018190528185018990529281018b905290810189905260009481018590529485018790528352600982528083208584528252909120825180519192610b9892849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050610c1633828660405180602001604052806000815250613429565b5050505050565b8115610cbc576000610c2e82611b85565b9050610c38611b54565b6001600160a01b03166323b872dd3383866040518463ffffffff1660e01b8152600401610c67939291906143f3565b602060405180830381600087803b158015610c8157600080fd5b505af1158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb991906141dc565b50505b5050565b606060008054610ccf90614d44565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfb90614d44565b8015610d485780601f10610d1d57610100808354040283529160200191610d48565b820191906000526020600020905b815481529060010190602001808311610d2b57829003601f168201915b505050505090505b90565b600080610d5e611ef0565b1115610e32576000610d8d612710610d87610d77611ef0565b610d81878961355e565b9061356a565b90613576565b9050610d97611b54565b6001600160a01b03166323b872dd33610dae611dd6565b846040518463ffffffff1660e01b8152600401610dcd939291906143f3565b602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f91906141dc565b50610e2a81856133fd565b9150506109fc565b610e3a611ef0565b6109fc575060006109fc565b606060068054610e5590614d44565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8190614d44565b8015610ece5780601f10610ea357610100808354040283529160200191610ece565b820191906000526020600020905b815481529060010190602001808311610eb157829003601f168201915b50505050509050919050565b600080610ee5611b54565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f1d57600080fd5b505afa158015610f31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5591906142e6565b91505090565b6000610a4282612147565b6001600160a01b03808316600081815260096020908152604080832086845290915281206001015490921614610f9b57600080fd5b506001600160a01b03919091166000908152600960209081526040808320938352929052206005015490565b6009602090815260009283526040808420909152908252902080548190610fed90614d44565b80601f016020809104026020016040519081016040528092919081815260200182805461101990614d44565b80156110665780601f1061103b57610100808354040283529160200191611066565b820191906000526020600020905b81548152906001019060200180831161104957829003601f168201915b5050506001840154600285015460038601546004870154600588015460069098015496976001600160a01b0390941696929550909350919087565b6000610a4282611b85565b6001600160a01b0386163314156110c257600080fd5b6110cc8686610f66565b156110e95760405162461bcd60e51b81526004016109ce906145ba565b806110f48787611cfb565b146111115760405162461bcd60e51b81526004016109ce90614c3a565b8061126c573461112685610d818989886132bc565b11156111445760405162461bcd60e51b81526004016109ce9061472d565b61115086336001613582565b61115983611c9f565b6111638684613071565b61118b863387876040518060400160405280600381526020016203078360ec1b815250613206565b6040518060e001604052806111a86111a288610f5b565b886122c0565b815233602080830182905260408084018a905260608401899052346080850152600160a085015260c0909301859052600091825260098152828220898352815291902082518051919261120092849290910190613cf3565b5060208201516001820180546001600160a01b0319166001600160a01b0390921691909117905560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c09091015160069091015561126786336000613582565b6113c2565b80600114156113c2578161128585610d818989886132bc565b11156112a35760405162461bcd60e51b81526004016109ce9061472d565b6112af86336001613582565b6112b883611ab1565b6112c3868484611e04565b6112eb863387876040518060400160405280600381526020016203078360ec1b815250613206565b6040518060e001604052806113026111a288610f5b565b815233602080830182905260408084018a90526060840189905260808401879052600160a085015260c0909301859052600091825260098152828220898352815291902082518051919261135b92849290910190613cf3565b5060208201516001820180546001600160a01b0319166001600160a01b0390921691909117905560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0909101516006909101556113c286336000613582565b505050505050565b6113d2613625565b6001600160a01b0316856001600160a01b031614806113f857506113f8856108e1613625565b6114145760405162461bcd60e51b81526004016109ce90614966565b610c168585858585613629565b600a818154811061143157600080fd5b9060005260206000209060070201600091509050806000018054610fed90614d44565b6007546001600160a01b031690565b600281106114835760405162461bcd60e51b81526004016109ce90614af6565b806116b4576000341161149557600080fd5b813410156114a257600080fd5b600a80546040805160e081018252868152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab8339815191520192611515928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528b8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926115d59284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506116543382600160405180602001604052806000815250613429565b61166661165f611dd6565b33836137f5565b34156116ae57611674611dd6565b6001600160a01b03166108fc349081150290604051600060405180830381858888f193505050501580156116ac573d6000803e3d6000fd5b505b50611917565b806001141561191757600082116116ca57600080fd5b600a80546040805160e081018252868152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab833981519152019261173d928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528b8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926117fd9284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505061187c3382600160405180602001604052806000815250613429565b61188761165f611dd6565b61188f611b54565b6001600160a01b03166323b872dd336118a6611dd6565b866040518463ffffffff1660e01b81526004016118c5939291906143f3565b602060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1691906141dc565b505050565b6007546001600160a01b0316331461193357600080fd5b6001600160a01b0380841660008181526009602090815260408083208784529091529020600101549091161461196857600080fd5b6001600160a01b0390921660009081526009602090815260408083209383529290522060050155565b606081518351146119b45760405162461bcd60e51b81526004016109ce90614b68565b6000835167ffffffffffffffff8111156119de57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a07578160200160208202803683370190505b50905060005b8451811015611aa957611a6e858281518110611a3957634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110611a6157634e487b7160e01b600052603260045260246000fd5b60200260200101516109a6565b828281518110611a8e57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611aa281614d7f565b9050611a0d565b509392505050565b6000611abb611ef0565b1115611b5157611ac9611b54565b6001600160a01b03166323b872dd33611ae0611dd6565b846040518463ffffffff1660e01b8152600401611aff939291906143f3565b602060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc91906141dc565b50565b60006008604051611b64906143cf565b908152604051908190036020019020600201546001600160a01b0316905090565b6000818152600360205260408120546001600160a01b031680610a425760405162461bcd60e51b81526004016109ce90614aaa565b6000611bc4611ef0565b1115611c5c57611bd2611b54565b6001600160a01b03166323b872dd3385611bec858761355e565b6040518463ffffffff1660e01b8152600401611c0a939291906143f3565b602060405180830381600087803b158015611c2457600080fd5b505af1158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ae91906141dc565b611c64611ef0565b61191757611c70611b54565b6001600160a01b03166323b872dd3385846040518463ffffffff1660e01b8152600401610c67939291906143f3565b600034118015611cb657506000611cb4611ef0565b115b15611b5157611cc3611dd6565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610cbc573d6000803e3d6000fd5b6001600160a01b03808316600081815260096020908152604080832086845290915281206001015490921614611d3057600080fd5b506001600160a01b03919091166000908152600960209081526040808320938352929052206006015490565b60003415610a45576000611d81612710610d87611d77611ef0565b610d81348861355e565b9050611d8b611dd6565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015611dc3573d6000803e3d6000fd5b50611dce81846133fd565b915050610a45565b60006008604051611de6906143cf565b908152604051908190036020019020546001600160a01b0316905090565b6000611e0e611ef0565b1115611ed8576000611e31612710610d87611e27611ef0565b610d81868861355e565b9050611e3b611b54565b6001600160a01b03166323b872dd33611e52611dd6565b846040518463ffffffff1660e01b8152600401611e71939291906143f3565b602060405180830381600087803b158015611e8b57600080fd5b505af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec391906141dc565b506116ae84611ed283866133fd565b84611bba565b611ee0611ef0565b6119175761191783600083611bba565b60006008604051611f00906143cf565b908152602001604051809103902060010154905090565b6001600160a01b03808316600081815260096020908152604080832086845290915281206001015490921614611f4c57600080fd5b506001600160a01b03919091166000908152600960209081526040808320938352929052206004015490565b8115610cbc576000611f8982611b85565b6040519091506001600160a01b0382169084156108fc029085906000818181858888f19350505050158015610cb9573d6000803e3d6000fd5b8015610cbc576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611917573d6000803e3d6000fd5b8015610cbc5761200c611b54565b6001600160a01b03166323b872dd3384846040518463ffffffff1660e01b815260040161203b939291906143f3565b602060405180830381600087803b15801561205557600080fd5b505af1158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191791906141dc565b606060018054610ccf90614d44565b3360008181526009602090815260408083208784529091529020600101546001600160a01b0316146120cd57600080fd5b3360009081526009602090815260408083208684529091529020600301548211156120f757600080fd5b33600090815260096020908152604080832086845290915290206005015460021461212157600080fd5b336000908152600960209081526040808320958352949052929092206004019190915550565b6000818152600260205260408120546001600160a01b031680610a425760405162461bcd60e51b81526004016109ce9061487a565b816001600160a01b031661218e613625565b6001600160a01b031614156121b55760405162461bcd60e51b81526004016109ce90614b1f565b80600560006121c2613625565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612206613625565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161223e91906144fb565b60405180910390a35050565b3415610cbc576001600160a01b0382166108fc612267348461355e565b6040518115909202916000818181858888f19350505050158015611917573d6000803e3d6000fd5b612298826110a1565b6001600160a01b0316336001600160a01b0316146122b557600080fd5b610cbc33838361385e565b6060600a82815481106122e357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600160079092020101546001600160a01b038481169116146123215760405162461bcd60e51b81526004016109ce906148c4565b600a828154811061234257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060070201600001805461235e90614d44565b80601f016020809104026020016040519081016040528092919081815260200182805461238a90614d44565b80156123d75780601f106123ac576101008083540402835291602001916123d7565b820191906000526020600020905b8154815290600101906020018083116123ba57829003601f168201915b5050505050905092915050565b6007546001600160a01b031633146123fb57600080fd5b80600860405161240a906143cf565b9081526040519081900360200190206001015550565b60008061242b611b54565b6001600160a01b03166370a08231336040518263ffffffff1660e01b815260040161245691906143df565b60206040518083038186803b158015610f1d57600080fd5b3360008181526009602090815260408083208784529091529020600101546001600160a01b03161461249f57600080fd5b3360009081526009602090815260408083208684529091529020600301548211156124c957600080fd5b3360009081526009602090815260408083208684529091529020600501541561212157600080fd5b600281106125115760405162461bcd60e51b81526004016109ce90614af6565b8061270c576000341161252357600080fd5b8134101561253057600080fd5b600a80546040805160e081018252878152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab83398151915201926125a3928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528c8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926126639284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506126e23382600160405180602001604052806000815250613429565b6126ed8633836137f5565b3415612706576126fc84611c9f565b6127068685613071565b50610c16565b8060011415610c16576000821161272257600080fd5b600a80546040805160e081018252878152336020808301919091529181018390526001606082018190526080820187905260a0820181905260c08201869052830184556000939093528251805192939260078502600080516020614eab8339815191520192612795928492910190613cf3565b50602082810151600183810180546001600160a01b0319166001600160a01b039093169290921790915560408085015160028501556060808601516003860155608080870151600487015560a080880151600588015560c097880151600690970196909655825160e0810184528c8152338187018190528185018a90529281018590529081018a90529485019290925293830186905260009081526009825283812085825282529290922081518051929391926128559284920190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506128d43382600160405180602001604052806000815250613429565b6128df8633836137f5565b6128e884611ab1565b6113c2868585611e04565b6007546001600160a01b0316331461290a57600080fd5b806008604051612919906143cf565b90815260405190819003602001902060020180546001600160a01b03929092166001600160a01b031990921691909117905550565b6001600160a01b03861633141561296457600080fd5b61296d85611b85565b6001600160a01b0316336001600160a01b0316141561299e5760405162461bcd60e51b81526004016109ce906148ea565b6129a88686610f66565b6002146129c75760405162461bcd60e51b81526004016109ce906149fb565b6103e88311156129e95760405162461bcd60e51b81526004016109ce9061481d565b6001600160a01b0386166000908152600960209081526040808320888452909152902060030154841115612a2f5760405162461bcd60e51b81526004016109ce9061484c565b83600114612a4f5760405162461bcd60e51b81526004016109ce9061484c565b612a57611ef0565b612a79578115612a795760405162461bcd60e51b81526004016109ce90614678565b612a838686611cfb565b612c865734612a9785610d818989876132bc565b1115612ab55760405162461bcd60e51b81526004016109ce9061477f565b612ac186336001613582565b612aca82611c9f565b6000612ae0612710610d8786610d81348861355e565b9050612aec8187611f78565b600081612af885611d5c565b612b029034614d2d565b612b0c9190614d2d565b9050612b188882611fc2565b6040518060e00160405280612b35612b2f8a610f5b565b8a6122c0565b815233602080830182905260408084018c9052606084018b9052346080850152600160a0850152600060c0909401849052918352600981528183208b845281529120825180519192612b8c92849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050612c17883389896040518060400160405280600381526020016203078360ec1b815250613206565b6001600160a01b03881660009081526009602090815260408083208a8452909152902060030154612c48908761355e565b6001600160a01b03891660009081526009602090815260408083208b8452909152812060030191909155612c7f9089903390613582565b50506113c2565b612c908686611cfb565b600114156113c25780612ca885610d818989876132bc565b1115612cc65760405162461bcd60e51b81526004016109ce9061477f565b612cd286336001613582565b612cdb82611ab1565b6000612cf1612710610d8786610d81868861355e565b9050612cfd8187610c1d565b600081612d0a8585610d53565b612d149085614d2d565b612d1e9190614d2d565b9050612d2a8882611ffe565b6040518060e00160405280612d41612b2f8a610f5b565b815233602080830182905260408084018c9052606084018b905260808401889052600160a0850181905260c0909401939093526000918252600981528282208b83528152919020825180519192612d9d92849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050612e28883389896040518060400160405280600381526020016203078360ec1b815250613206565b6001600160a01b03881660009081526009602090815260408083208a8452909152902060030154612e59908761355e565b6001600160a01b03891660009081526009602090815260408083208b8452909152812060030191909155612e909089903390613582565b5050505050505050565b60028110612eba5760405162461bcd60e51b81526004016109ce90614af6565b600a80546040805160e081018252878152336020808301919091529181018390526060810187905260808101869052600060a0820181905260c08201869052600184018555939093528251805192939260078502600080516020614eab8339815191520192612f2d928492910190613cf3565b506020828101516001830180546001600160a01b0319166001600160a01b0390921691909117905560408084015160028401556060808501516003850155608080860151600486015560a080870151600587015560c096870151600690960195909555825160e0810184528b8152338186018190528185018990529281018b905290810189905260009481018590529485018790528352600982528083208584528252909120825180519192612fe892849290910190613cf3565b5060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505061306633828660405180602001604052806000815250613429565b610c1661165f611dd6565b60003411801561308857506000613086611ef0565b115b156131015760006130aa612710610d876130a0611ef0565b610d81348761355e565b90506130b4611dd6565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156130ec573d6000803e3d6000fd5b506130fb8361079383856133fd565b50610cbc565b6000341180156131165750613114611ef0565b155b15610cbc57610cbc82600061224a565b3360008181526009602090815260408083208784529091529020600101546001600160a01b03161461315757600080fd5b33600090815260096020908152604080832086845290915290206003015482111561318157600080fd5b8061318c3385611f17565b11156131b35733600090815260096020908152604080832086845290915290206004018190555b5050336000908152600960209081526040808320938352929052206002600590910155565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61320e613625565b6001600160a01b0316856001600160a01b031614806132345750613234856108e1613625565b6132505760405162461bcd60e51b81526004016109ce906147d4565b610c168585858585613971565b6007546001600160a01b0316331461327457600080fd5b6001600160a01b03811661329a5760405162461bcd60e51b81526004016109ce906146a3565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038084166000818152600960209081526040808320878452909152812060010154909216146132f157600080fd5b6001600160a01b03841660009081526009602090815260408083208684529091529020600401546133229083613aa9565b949350505050565b3360008181526009602090815260408083208584529091529020600101546001600160a01b03161461335b57600080fd5b33600090815260096020908152604080832084845290915290206005015461338257600080fd5b336000908152600960209081526040808320938352929052206001600590910155565b6007546001600160a01b031633146133bc57600080fd5b8060086040516133cb906143cf565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905550565b60006134098383613aa9565b9392505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b03841661344f5760405162461bcd60e51b81526004016109ce90614bf9565b6000613459613625565b905061347a8160008761346b88613ab5565b61347488613ab5565b876113c2565b60008481526004602090815260408083206001600160a01b0389168452909152812080548592906134ac908490614cd6565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051613503929190614c7a565b60405180910390a461351a81600087878787613b0e565b505050600090815260026020908152604080832080546001600160a01b039095166001600160a01b0319958616811790915560039092529091208054909216179055565b60006134098284614d2d565b60006134098284614d0e565b60006134098284614cee565b816001600160a01b0316836001600160a01b031614156135b45760405162461bcd60e51b81526004016109ce90614b1f565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906136189085906144fb565b60405180910390a3505050565b3390565b815183511461364a5760405162461bcd60e51b81526004016109ce90614bb1565b6001600160a01b0384166136705760405162461bcd60e51b81526004016109ce90614921565b600061367a613625565b905061368a8187878787876113c2565b60005b845181101561378f5760008582815181106136b857634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106136e457634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160008481526004835260408082206001600160a01b038e1683529093529190912054909150818110156137355760405162461bcd60e51b81526004016109ce90614a29565b60008381526004602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290613774908490614cd6565b925050819055505050508061378890614d7f565b905061368d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516137df9291906144cd565b60405180910390a46113c2818787878787613c1c565b6000818152600260205260409020546001600160a01b0383811691161461382e5760405162461bcd60e51b81526004016109ce90614a73565b600090815260036020526040902080546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b0383166138845760405162461bcd60e51b81526004016109ce906149b8565b600061388e613625565b90506138be818560006138a087613ab5565b6138a987613ab5565b604051806020016040528060008152506113c2565b60008381526004602090815260408083206001600160a01b0388168452909152902054828110156139015760405162461bcd60e51b81526004016109ce906146e9565b60008481526004602090815260408083206001600160a01b03808a16808652919093528184208786039055905190918516907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906139629089908990614c7a565b60405180910390a45050505050565b6001600160a01b0384166139975760405162461bcd60e51b81526004016109ce90614921565b60006139a1613625565b90506139b281878761346b88613ab5565b60008481526004602090815260408083206001600160a01b038a168452909152902054838110156139f55760405162461bcd60e51b81526004016109ce90614a29565b60008581526004602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290613a34908490614cd6565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613a8a929190614c7a565b60405180910390a4613aa0828888888888613b0e565b50505050505050565b60006134098284614cd6565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613afd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b613b20846001600160a01b0316613ced565b156113c25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613b599089908990889088908890600401614475565b602060405180830381600087803b158015613b7357600080fd5b505af1925050508015613ba3575060408051601f3d908101601f19168201909252613ba091810190614214565b60015b613bec57613baf614dcc565b80613bba5750613bd4565b8060405162461bcd60e51b81526004016109ce9190614506565b60405162461bcd60e51b81526004016109ce90614566565b6001600160e01b0319811663f23a6e6160e01b14613aa05760405162461bcd60e51b81526004016109ce906145e5565b613c2e846001600160a01b0316613ced565b156113c25760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613c679089908990889088908890600401614417565b602060405180830381600087803b158015613c8157600080fd5b505af1925050508015613cb1575060408051601f3d908101601f19168201909252613cae91810190614214565b60015b613cbd57613baf614dcc565b6001600160e01b0319811663bc197c8160e01b14613aa05760405162461bcd60e51b81526004016109ce906145e5565b3b151590565b828054613cff90614d44565b90600052602060002090601f016020900481019282613d215760008555613d67565b82601f10613d3a57805160ff1916838001178555613d67565b82800160010185558215613d67579182015b82811115613d67578251825591602001919060010190613d4c565b50613d73929150613d77565b5090565b5b80821115613d735760008155600101613d78565b600082601f830112613d9c578081fd5b81356020613db1613dac83614cb2565b614c88565b8281528181019085830183850287018401881015613dcd578586fd5b855b85811015613deb57813584529284019290840190600101613dcf565b5090979650505050505050565b600082601f830112613e08578081fd5b813567ffffffffffffffff811115613e2257613e22614db0565b613e35601f8201601f1916602001614c88565b818152846020838601011115613e49578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613e74578081fd5b813561340981614e71565b600080600080600060a08688031215613e96578081fd5b8535613ea181614e71565b9450602086013567ffffffffffffffff811115613ebc578182fd5b613ec888828901613df8565b959895975050505060408401359360608101359360809091013592509050565b60008060408385031215613efa578182fd5b8235613f0581614e71565b946020939093013593505050565b600080600060608486031215613f27578283fd5b8335613f3281614e71565b95602085013595506040909401359392505050565b60008060008060008060c08789031215613f5f578081fd5b8635613f6a81614e71565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008060408385031215613fa4578182fd5b8235613faf81614e71565b91506020830135613fbf81614e71565b809150509250929050565b600080600080600060a08688031215613fe1578283fd5b8535613fec81614e71565b94506020860135613ffc81614e71565b9350604086013567ffffffffffffffff80821115614018578485fd5b61402489838a01613d8c565b94506060880135915080821115614039578283fd5b61404589838a01613d8c565b9350608088013591508082111561405a578283fd5b5061406788828901613df8565b9150509295509295909350565b600080600080600060a0868803121561408b578283fd5b853561409681614e71565b945060208601356140a681614e71565b93506040860135925060608601359150608086013567ffffffffffffffff8111156140cf578182fd5b61406788828901613df8565b600080604083850312156140ed578182fd5b82356140f881614e71565b91506020830135613fbf81614e86565b600080600060608486031215613f27578081fd5b6000806040838503121561412e578182fd5b823567ffffffffffffffff80821115614145578384fd5b818501915085601f830112614158578384fd5b81356020614168613dac83614cb2565b82815281810190858301838502870184018b1015614184578889fd5b8896505b848710156141af57803561419b81614e71565b835260019690960195918301918301614188565b50965050860135925050808211156141c5578283fd5b506141d285828601613d8c565b9150509250929050565b6000602082840312156141ed578081fd5b815161340981614e86565b600060208284031215614209578081fd5b813561340981614e94565b600060208284031215614225578081fd5b815161340981614e94565b600080600060608486031215614244578081fd5b833567ffffffffffffffff81111561425a578182fd5b61426686828701613df8565b9660208601359650604090950135949350505050565b60008060008060808587031215614291578182fd5b843567ffffffffffffffff8111156142a7578283fd5b6142b387828801613df8565b97602087013597506040870135966060013595509350505050565b6000602082840312156142df578081fd5b5035919050565b6000602082840312156142f7578081fd5b5051919050565b60008060408385031215614310578182fd5b50508035926020909101359150565b600080600060608486031215614333578081fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b838110156143795781518752958201959082019060010161435d565b509495945050505050565b60008151808452815b818110156143a95760208185018101518683018201520161438d565b818111156143ba5782602083870101525b50601f01601f19169290920160200192915050565b6336b0b4b760e11b815260040190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0386811682528516602082015260a0604082018190526000906144439083018661434a565b8281036060840152614455818661434a565b905082810360808401526144698185614384565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906144af90830184614384565b979650505050505050565b600060208252613409602083018461434a565b6000604082526144e0604083018561434a565b82810360208401526144f2818561434a565b95945050505050565b901515815260200190565b6000602082526134096020830184614384565b600060e0825261452c60e083018a614384565b6001600160a01b039890981660208301525060408101959095526060850193909352608084019190915260a083015260c090910152919050565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b6020808252601190820152706275793a3a4e6f7420666f722073616c6560781b604082015260600190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b602080825260119082015270726573656c6c3a3a46656520436865636b60781b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526032908201527f6275793a3a4d7573742070757263686173652074686520746f6b656e20666f726040820152712074686520636f727265637420707269636560701b606082015260800190565b60208082526035908201527f726573656c6c3a3a4d7573742070757263686173652074686520746f6b656e20604082015274666f722074686520636f727265637420707269636560581b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b602080825260159082015274726573656c6c3a3a526f79616c747920436865636b60581b604082015260600190565b602080825260149082015273726573656c6c3a3a416d6f756e7420436865636b60601b604082015260600190565b6020808252602a908201527f455243313135353a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252600c908201526b27379027232a1037bbb732b960a11b604082015260600190565b60208082526019908201527f726573656c6c3a3a43616e6e6f7420627579206d79204e465400000000000000604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260149082015273726573656c6c3a3a4e6f7420666f722073616c6560601b604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526018908201527f455243313135353a206e6f7420746f6b656e206f776e65720000000000000000604082015260600190565b6020808252602c908201527f455243313135353a2063726561746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600f908201526e63757272656e63793a3a436865636b60881b604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601c908201527f6275793a3a43757272656e637920646f6573206e6f74206d6174636800000000604082015260600190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715614caa57614caa614db0565b604052919050565b600067ffffffffffffffff821115614ccc57614ccc614db0565b5060209081020190565b60008219821115614ce957614ce9614d9a565b500190565b600082614d0957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614d2857614d28614d9a565b500290565b600082821015614d3f57614d3f614d9a565b500390565b600281046001821680614d5857607f821691505b60208210811415614d7957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614d9357614d93614d9a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015614ddc57610d50565b600481823e6308c379a0614df08251614dc6565b14614dfa57610d50565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715614e2a5750505050610d50565b82840192508251915080821115614e445750505050610d50565b503d83016020828401011115614e5c57505050610d50565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114611b5157600080fd5b8015158114611b5157600080fd5b6001600160e01b031981168114611b5157600080fdfec65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8a2646970667358221220a6124cd422264b8adaa1c43f5e60fadac16b956dcce634e582b1df0a9f3778f564736f6c63430008000033
Deployed Bytecode Sourcemap
52496:18777:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21861:231;;;;;;;;;;-1:-1:-1;21861:231:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20135:310;;;;;;;;;;-1:-1:-1;20135:310:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56169:509::-;;;;;;;;;;-1:-1:-1;56169:509:0;;;;;:::i;:::-;;:::i;:::-;;69124:278;;;;;;:::i;:::-;;:::i;19790:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;69410:485::-;;;;;;:::i;:::-;;:::i;20856:105::-;;;;;;;;;;-1:-1:-1;20856:105:0;;;;;:::i;:::-;;:::i;55988:146::-;;;;;;;;;;;;;:::i;70969:130::-;;;;;;;;;;-1:-1:-1;70969:130:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55378:203::-;;;;;;;;;;-1:-1:-1;55378:203:0;;;;;:::i;:::-;;:::i;53387:60::-;;;;;;;;;;-1:-1:-1;53387:60:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;71107:159::-;;;;;;;;;;-1:-1:-1;71107:159:0;;;;;:::i;:::-;;:::i;60925:1667::-;;;;;;:::i;:::-;;:::i;24660:442::-;;;;;;;;;;-1:-1:-1;24660:442:0;;;;;:::i;:::-;;:::i;53456:27::-;;;;;;;;;;-1:-1:-1;53456:27:0;;;;;:::i;:::-;;:::i;53492:97::-;;;;;;;;;;;;;:::i;56754:1544::-;;;;;;:::i;:::-;;:::i;54171:206::-;;;;;;;;;;-1:-1:-1;54171:206:0;;;;;:::i;:::-;;:::i;22258:524::-;;;;;;;;;;-1:-1:-1;22258:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63828:217::-;;;;;;:::i;:::-;;:::i;54603:103::-;;;;;;;;;;;;;:::i;21469:233::-;;;;;;;;;;-1:-1:-1;21469:233:0;;;;;:::i;:::-;;:::i;64636:391::-;;;;;;:::i;:::-;;:::i;62630:238::-;;;;;;:::i;:::-;;:::i;54923:211::-;;;;;;;;;;-1:-1:-1;54923:211:0;;;;;:::i;:::-;;:::i;70380:367::-;;;;;;:::i;:::-;;:::i;54488:109::-;;;;;;;;;;;;;:::i;64051:579::-;;;;;;:::i;:::-;;:::i;54383:99::-;;;;;;;;;;;;;:::i;54712:205::-;;;;;;;;;;-1:-1:-1;54712:205:0;;;;;:::i;:::-;;:::i;70129:243::-;;;;;;:::i;:::-;;:::i;70755:172::-;;;;;;:::i;:::-;;:::i;69903:216::-;;;;;;:::i;:::-;;:::i;19959:104::-;;;;;;;;;;;;;:::i;65743:388::-;;;;;;;;;;-1:-1:-1;65743:388:0;;;;;:::i;:::-;;:::i;20969:241::-;;;;;;;;;;-1:-1:-1;20969:241:0;;;;;:::i;:::-;;:::i;22855:311::-;;;;;;;;;;-1:-1:-1;22855:311:0;;;;;:::i;:::-;;:::i;63421:208::-;;;;;;:::i;:::-;;:::i;65057:180::-;;;;;;;;;;-1:-1:-1;65057:180:0;;;;;:::i;:::-;;:::i;55587:218::-;;;;;;;;;;-1:-1:-1;55587:218:0;;;;;:::i;:::-;;:::i;53792:111::-;;;;;;;;;;-1:-1:-1;53792:111:0;;;;;:::i;:::-;;:::i;55824:158::-;;;;;;;;;;;;;:::i;60529:372::-;;;;;;;;;;-1:-1:-1;60529:372:0;;;;;:::i;:::-;;:::i;58306:1568::-;;;;;;:::i;:::-;;:::i;54042:123::-;;;;;;;;;;-1:-1:-1;54042:123:0;;;;;:::i;:::-;;:::i;66394:2720::-;;;;;;:::i;:::-;;:::i;59882:625::-;;;;;;;;;;-1:-1:-1;59882:625:0;;;;;:::i;:::-;;:::i;62874:541::-;;;;;;:::i;:::-;;:::i;65285:448::-;;;;;;;;;;-1:-1:-1;65285:448:0;;;;;:::i;:::-;;:::i;23536:168::-;;;;;;;;;;-1:-1:-1;23536:168:0;;;;;:::i;:::-;;:::i;24182:401::-;;;;;;;;;;-1:-1:-1;24182:401:0;;;;;:::i;:::-;;:::i;53595:191::-;;;;;;;;;;-1:-1:-1;53595:191:0;;;;;:::i;:::-;;:::i;55140:232::-;;;;;;;;;;-1:-1:-1;55140:232:0;;;;;:::i;:::-;;:::i;66141:243::-;;;;;;;;;;-1:-1:-1;66141:243:0;;;;;:::i;:::-;;:::i;53909:127::-;;;;;;;;;;-1:-1:-1;53909:127:0;;;;;:::i;:::-;;:::i;63655:145::-;;;;;;;;;;-1:-1:-1;63655:145:0;;;;;:::i;:::-;;:::i;21861:231::-;21947:7;-1:-1:-1;;;;;21975:21:0;;21967:77;;;;-1:-1:-1;;;21967:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;22062:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;22062:22:0;;;;;;;;;;21861:231;;;;;:::o;20135:310::-;20237:4;-1:-1:-1;;;;;;20274:41:0;;-1:-1:-1;;;20274:41:0;;:110;;-1:-1:-1;;;;;;;20332:52:0;;-1:-1:-1;;;20332:52:0;20274:110;:163;;;;20401:36;20425:11;20401:23;:36::i;:::-;20254:183;;20135:310;;;;:::o;56169:509::-;56316:1;56304:9;:13;56296:40;;;;-1:-1:-1;;;56296:40:0;;;;;;;:::i;:::-;56365:9;:16;;56430:65;;;;;;;;;;;56449:10;56430:65;;;;;;;;;;;;;;;;;;;;;;;;;;56347:15;56430:65;;;;;;;;;;;;56415:81;;;;;;;;;;;;;56365:16;;56430:65;56415:81;;;-1:-1:-1;;;;;;;;;;;56415:81:0;;;;;;;;;;:::i;:::-;-1:-1:-1;56415:81:0;;;;;;;;;;-1:-1:-1;;;;;;56415:81:0;-1:-1:-1;;;;;56415:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56538:65;;;;;;;;;;56557:10;56538:65;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56538:65:0;;;;;;;;;;;;56507:20;;:8;:20;;;;;:29;;;;;;;;:96;;;;:29;;:96;;:29;;:96;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;56507:96:0;;;;;-1:-1:-1;;;;;56507:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56614:39;56620:10;56632:7;56641;56614:39;;;;;;;;;;;;:5;:39::i;:::-;56169:509;;;;;:::o;69124:278::-;69235:12;;69231:162;;69264:15;69282:19;69292:8;69282:9;:19::i;:::-;69264:37;;69323:14;:12;:14::i;:::-;-1:-1:-1;;;;;69316:35:0;;69352:10;69363:7;69372:8;69316:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69231:162;;69124:278;;:::o;19790:100::-;19844:13;19877:5;19870:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19790:100;;:::o;69410:485::-;69496:7;69556:1;69543:12;:10;:12::i;:::-;:14;69540:346;;;69573:25;69600:47;69641:5;69600:36;69623:12;:10;:12::i;:::-;69601:16;:6;69612:4;69601:10;:16::i;:::-;69600:22;;:36::i;:::-;:40;;:47::i;:::-;69573:74;;69669:14;:12;:14::i;:::-;-1:-1:-1;;;;;69662:35:0;;69698:10;69709:17;:15;:17::i;:::-;69728;69662:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69768:41;69786:17;69804:4;69768:17;:41::i;:::-;69761:49;;;;;69540:346;69832:12;:10;:12::i;:::-;69829:57;;-1:-1:-1;69870:1:0;69863:9;;20856:105;20916:13;20949:4;20942:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20856:105;;;:::o;55988:146::-;56034:7;56051:14;56075;:12;:14::i;:::-;-1:-1:-1;;;;;56068:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56051:53;-1:-1:-1;;55988:146:0;:::o;70969:130::-;71029:7;71071:18;71080:8;71071;:18::i;55378:203::-;-1:-1:-1;;;;;55491:16:0;;;55456:7;55491:16;;;:8;:16;;;;;;;;:26;;;;;;;;:32;;;55456:7;;55491:32;55481:42;55473:51;;;;;;-1:-1:-1;;;;;;55541:16:0;;;;;;;;:8;:16;;;;;;;;:26;;;;;;;:31;;;;55378:203::o;53387:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53387:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53387:60:0;;;;;;-1:-1:-1;53387:60:0;;-1:-1:-1;53387:60:0;;;:::o;71107:159::-;71168:7;71237:19;71247:8;71237:9;:19::i;60925:1667::-;-1:-1:-1;;;;;61092:18:0;;61100:10;61092:18;;61084:27;;;;;;61128:32;61144:6;61151:8;61128:15;:32::i;:::-;:37;61120:66;;;;-1:-1:-1;;;61120:66:0;;;;;;;:::i;:::-;61243:9;61203:36;61223:6;61230:8;61203:19;:36::i;:::-;:49;61195:89;;;;-1:-1:-1;;;61195:89:0;;;;;;;:::i;:::-;61298:12;61295:1290;;61402:9;61342:56;61390:7;61342:43;61362:6;61370:8;61380:4;61342:19;:43::i;:56::-;:69;;61334:133;;;;-1:-1:-1;;;61334:133:0;;;;;;;:::i;:::-;61480:36;61492:6;61499:10;61511:4;61480:11;:36::i;:::-;61527:22;61544:4;61527:16;:22::i;:::-;61578:30;61596:6;61603:4;61578:17;:30::i;:::-;61637:58;61654:6;61661:10;61672:8;61681:7;61637:58;;;;;;;;;;;;;-1:-1:-1;;;61637:58:0;;;:16;:58::i;:::-;61758:111;;;;;;;;61767:51;61787:21;61799:8;61787:11;:21::i;:::-;61809:8;61767:19;:51::i;:::-;61758:111;;61819:10;61758:111;;;;;;;;;;;;;;;;;;;;61847:9;61758:111;;;;61857:1;61758:111;;;;;;;;;;;-1:-1:-1;61726:20:0;;;:8;:20;;;;;:30;;;;;;;;:143;;;;:30;;:143;;:30;;:143;;;;;:::i;:::-;-1:-1:-1;61726:143:0;;;;;;;;;-1:-1:-1;;;;;;61726:143:0;-1:-1:-1;;;;;61726:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61884:37;61896:6;61903:10;-1:-1:-1;61884:11:0;:37::i;:::-;61295:1290;;;61941:9;61952:1;61941:12;61938:647;;;62047:6;61987:56;62035:7;61987:43;62007:6;62015:8;62025:4;61987:19;:43::i;:56::-;:66;;61979:130;;;;-1:-1:-1;;;61979:130:0;;;;;;;:::i;:::-;62122:36;62134:6;62141:10;62153:4;62122:11;:36::i;:::-;62169:27;62191:4;62169:21;:27::i;:::-;62225:42;62248:6;62255:4;62260:6;62225:22;:42::i;:::-;62296:58;62313:6;62320:10;62331:8;62340:7;62296:58;;;;;;;;;;;;;-1:-1:-1;;;62296:58:0;;;:16;:58::i;:::-;62415:108;;;;;;;;62424:51;62444:21;62456:8;62444:11;:21::i;62424:51::-;62415:108;;62476:10;62415:108;;;;;;;;;;;;;;;;;;;;;;;;;;62511:1;62415:108;;;;;;;;;;;-1:-1:-1;62383:20:0;;;:8;:20;;;;;:30;;;;;;;;:140;;;;:30;;:140;;:30;;:140;;;;;:::i;:::-;-1:-1:-1;62383:140:0;;;;;;;;;-1:-1:-1;;;;;;62383:140:0;-1:-1:-1;;;;;62383:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62538:37;62550:6;62557:10;-1:-1:-1;62538:11:0;:37::i;:::-;60925:1667;;;;;;:::o;24660:442::-;24901:12;:10;:12::i;:::-;-1:-1:-1;;;;;24893:20:0;:4;-1:-1:-1;;;;;24893:20:0;;:60;;;;24917:36;24934:4;24940:12;:10;:12::i;24917:36::-;24871:160;;;;-1:-1:-1;;;24871:160:0;;;;;;;:::i;:::-;25042:52;25065:4;25071:2;25075:3;25080:7;25089:4;25042:22;:52::i;53456:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53492:97::-;53568:13;;-1:-1:-1;;;;;53568:13:0;53492:97;:::o;56754:1544::-;56934:1;56922:9;:13;56914:40;;;;-1:-1:-1;;;56914:40:0;;;;;;;:::i;:::-;56968:12;56965:1326;;57026:1;57014:9;:13;57006:22;;;;;;57062:6;57049:9;:19;;57041:28;;;;;;57100:9;:16;;57167:59;;;;;;;;;;;57186:10;57167:59;;;;;;;;;;;;;;57205:1;57167:59;;;;;;;;;;;;;;;;;;;;;;;;57152:75;;;;57082:15;57152:75;;;;;;;;57100:16;;57167:59;57152:75;;;-1:-1:-1;;;;;;;;;;;57152:75:0;;;;;;;;;;:::i;:::-;-1:-1:-1;57152:75:0;;;;;;;;;;;-1:-1:-1;;;;;;57152:75:0;-1:-1:-1;;;;;57152:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57271:59;;;;;;;;;;57290:10;57271:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57240:20:0;;;:8;:20;;;;;:29;;;;;;;;;:90;;;;57271:59;;57240:29;;:90;;:29;;:90;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;57240:90:0;;;;;-1:-1:-1;;;;;57240:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57343:33;57349:10;57361:7;57370:1;57343:33;;;;;;;;;;;;:5;:33::i;:::-;57412:48;57423:17;:15;:17::i;:::-;57441:10;57452:7;57412:10;:48::i;:::-;57508:9;:13;57504:139;;57546:17;:15;:17::i;:::-;-1:-1:-1;;;;;57538:35:0;:46;57574:9;57538:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57504:139;56965:1326;;;;57662:9;57673:1;57662:12;57659:632;;;57719:1;57710:6;:10;57702:19;;;;;;57752:9;:16;;57819:59;;;;;;;;;;;57838:10;57819:59;;;;;;;;;;;;;;57857:1;57819:59;;;;;;;;;;;;;;;;;;;;;;;;57804:75;;;;57734:15;57804:75;;;;;;;;57752:16;;57819:59;57804:75;;;-1:-1:-1;;;;;;;;;;;57804:75:0;;;;;;;;;;:::i;:::-;-1:-1:-1;57804:75:0;;;;;;;;;;;-1:-1:-1;;;;;;57804:75:0;-1:-1:-1;;;;;57804:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57923:59;;;;;;;;;;57942:10;57923:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57892:20:0;;;:8;:20;;;;;:29;;;;;;;;;:90;;;;57923:59;;57892:29;;:90;;:29;;:90;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;57892:90:0;;;;;-1:-1:-1;;;;;57892:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57995:33;58001:10;58013:7;58022:1;57995:33;;;;;;;;;;;;:5;:33::i;:::-;58064:48;58075:17;:15;:17::i;58064:48::-;58165:14;:12;:14::i;:::-;-1:-1:-1;;;;;58158:35:0;;58194:10;58205:17;:15;:17::i;:::-;58224:6;58158:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57659:632::-;56754:1544;;;:::o;54171:206::-;52983:13;;-1:-1:-1;;;;;52983:13:0;53000:10;52983:27;52975:36;;;;;;-1:-1:-1;;;;;54288:16:0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;:26;;;;;;;;:32:::1;;::::0;;;::::1;54278:42;54270:51;;;::::0;::::1;;-1:-1:-1::0;;;;;54330:16:0;;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;:26;;;;;;;:31:::1;;:39:::0;54171:206::o;22258:524::-;22414:16;22475:3;:10;22456:8;:15;:29;22448:83;;;;-1:-1:-1;;;22448:83:0;;;;;;;:::i;:::-;22544:30;22591:8;:15;22577:30;;;;;;-1:-1:-1;;;22577:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22577:30:0;;22544:63;;22625:9;22620:122;22644:8;:15;22640:1;:19;22620:122;;;22700:30;22710:8;22719:1;22710:11;;;;;;-1:-1:-1;;;22710:11:0;;;;;;;;;;;;;;;22723:3;22727:1;22723:6;;;;;;-1:-1:-1;;;22723:6:0;;;;;;;;;;;;;;;22700:9;:30::i;:::-;22681:13;22695:1;22681:16;;;;;;-1:-1:-1;;;22681:16:0;;;;;;;;;;;;;;;;;;:49;22661:3;;;:::i;:::-;;;22620:122;;;-1:-1:-1;22761:13:0;22258:524;-1:-1:-1;;;22258:524:0:o;63828:217::-;63943:1;63930:12;:10;:12::i;:::-;:14;63926:112;;;63964:14;:12;:14::i;:::-;-1:-1:-1;;;;;63957:35:0;;63993:10;64004:17;:15;:17::i;:::-;64023:4;63957:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;63926:112::-;63828:217;:::o;54603:103::-;54647:7;54672;:15;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;54672:25:0;;-1:-1:-1;54603:103:0;:::o;21469:233::-;21529:7;21565:17;;;:13;:17;;;;;;-1:-1:-1;;;;;21565:17:0;21599:21;21591:78;;;;-1:-1:-1;;;21591:78:0;;;;;;;:::i;64636:391::-;64795:1;64782:12;:10;:12::i;:::-;:14;64778:242;;;64816:14;:12;:14::i;:::-;-1:-1:-1;;;;;64809:35:0;;64845:10;64856:5;64863:21;:6;64874:9;64863:10;:21::i;:::-;64809:76;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64778:242::-;64903:12;:10;:12::i;:::-;64900:120;;64956:14;:12;:14::i;:::-;-1:-1:-1;;;;;64949:35:0;;64985:10;64996:5;65003:6;64949:61;;;;;;;;;;;;;;;;;:::i;62630:238::-;62739:1;62727:9;:13;:31;;;;;62757:1;62744:12;:10;:12::i;:::-;:14;62727:31;62723:138;;;62779:17;:15;:17::i;:::-;-1:-1:-1;;;;;62771:35:0;:41;62807:4;62771:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54923:211;-1:-1:-1;;;;;55040:16:0;;;55005:7;55040:16;;;:8;:16;;;;;;;;:26;;;;;;;;:32;;;55005:7;;55040:32;55030:42;55022:51;;;;;;-1:-1:-1;;;;;;55090:16:0;;;;;;;;:8;:16;;;;;;;;:26;;;;;;;:35;;;;54923:211::o;70380:367::-;70446:7;70492:9;:13;70488:250;;70520:25;70547:50;70591:5;70547:39;70573:12;:10;:12::i;:::-;70548:19;:9;70562:4;70548:13;:19::i;70547:50::-;70520:77;;70618:17;:15;:17::i;:::-;-1:-1:-1;;;;;70610:35:0;:54;70646:17;70610:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70684:41;70702:17;70720:4;70684:17;:41::i;:::-;70677:49;;;;;54488:109;54535:7;54560;:15;;;;;:::i;:::-;;;;;;;;;;;;;;:28;-1:-1:-1;;;;;54560:28:0;;-1:-1:-1;54488:109:0;:::o;64051:579::-;64199:1;64186:12;:10;:12::i;:::-;:14;64182:441;;;64213:25;64240:47;64281:5;64240:36;64263:12;:10;:12::i;:::-;64241:16;:6;64252:4;64241:10;:16::i;64240:47::-;64213:74;;64307:14;:12;:14::i;:::-;-1:-1:-1;;;;;64300:35:0;;64336:10;64347:17;:15;:17::i;:::-;64366;64300:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64395:76;64415:6;64422:41;64440:17;64458:4;64422:17;:41::i;:::-;64464:6;64395:19;:76::i;64182:441::-;64510:12;:10;:12::i;:::-;64507:116;;64556:36;64576:6;64583:1;64585:6;64556:19;:36::i;54383:99::-;54425:7;54450;:15;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;54442:32;;54383:99;:::o;54712:205::-;-1:-1:-1;;;;;54826:16:0;;;54791:7;54826:16;;;:8;:16;;;;;;;;:26;;;;;;;;:32;;;54791:7;;54826:32;54816:42;54808:51;;;;;;-1:-1:-1;;;;;;54876:16:0;;;;;;;;:8;:16;;;;;;;;:26;;;;;;;:32;;;;54712:205::o;70129:243::-;70235:12;;70231:132;;70264:15;70282:19;70292:8;70282:9;:19::i;:::-;70316:35;;70264:37;;-1:-1:-1;;;;;;70316:25:0;;;:35;;;;;70342:8;;70316:35;;;;70342:8;70316:25;:35;;;;;;;;;;;;;;;;;;;70755:172;70861:9;;70857:61;;70885:21;;-1:-1:-1;;;;;70885:14:0;;;:21;;;;;70900:5;;70885:21;;;;70900:5;70885:14;:21;;;;;;;;;;;;;;;;;;;69903:216;70014:9;;70010:100;;70045:14;:12;:14::i;:::-;-1:-1:-1;;;;;70038:35:0;;70074:10;70085:5;70092;70038:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19959:104::-;20015:13;20048:7;20041:14;;;;;:::i;65743:388::-;65899:10;65890:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:36;;;-1:-1:-1;;;;;65890:36:0;65876:50;65868:59;;;;;;65957:10;65948:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:37;;;:48;-1:-1:-1;65948:48:0;65940:57;;;;;;66027:10;66018:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:35;;;66057:1;66018:40;66010:49;;;;;;66083:10;66074:20;;;;:8;:20;;;;;;;;:30;;;;;;;;;;:36;;:45;;;;-1:-1:-1;65743:388:0:o;20969:241::-;21028:7;21068:16;;;:12;:16;;;;;;-1:-1:-1;;;;;21068:16:0;21101:25;21093:80;;;;-1:-1:-1;;;21093:80:0;;;;;;;:::i;22855:311::-;22974:8;-1:-1:-1;;;;;22958:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22958:24:0;;;22950:78;;;;-1:-1:-1;;;22950:78:0;;;;;;;:::i;:::-;23086:8;23041:18;:32;23060:12;:10;:12::i;:::-;-1:-1:-1;;;;;23041:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23041:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23041:53:0;;;;;;;;;;;23125:12;:10;:12::i;:::-;-1:-1:-1;;;;;23110:48:0;;23149:8;23110:48;;;;;;:::i;:::-;;;;;;;;22855:311;;:::o;63421:208::-;63546:9;:13;63542:80;;-1:-1:-1;;;;;63572:14:0;;:40;63587:24;:9;63601;63587:13;:24::i;:::-;63572:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65057:180;65144:22;65157:8;65144:12;:22::i;:::-;-1:-1:-1;;;;;65130:36:0;:10;-1:-1:-1;;;;;65130:36:0;;65122:45;;;;;;65176:36;65182:10;65194:8;65204:7;65176:5;:36::i;55587:218::-;55669:13;55710:9;55720:8;55710:19;;;;;;-1:-1:-1;;;55710:19:0;;;;;;;;;;;;;;;;;:25;:19;;;;;:25;;-1:-1:-1;;;;;55700:35:0;;;55710:25;;55700:35;55692:59;;;;-1:-1:-1;;;55692:59:0;;;;;;;:::i;:::-;55768:9;55778:8;55768:19;;;;;;-1:-1:-1;;;55768:19:0;;;;;;;;;;;;;;;;;;;:28;;55760:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55587:218;;;;:::o;53792:111::-;52983:13;;-1:-1:-1;;;;;52983:13:0;53000:10;52983:27;52975:36;;;;;;53887:8:::1;53861:7;:15;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:23:::1;;:34:::0;-1:-1:-1;53792:111:0:o;55824:158::-;55872:7;55889:15;55914:14;:12;:14::i;:::-;-1:-1:-1;;;;;55907:32:0;;55940:10;55907:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60529:372;60677:10;60668:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:36;;;-1:-1:-1;;;;;60668:36:0;60654:50;60646:59;;;;;;60733:10;60724:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:37;;;:48;-1:-1:-1;60724:48:0;60716:57;;;;;;60801:10;60792:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:35;;;:40;60784:49;;;;;58306:1568;58523:1;58511:9;:13;58503:40;;;;-1:-1:-1;;;58503:40:0;;;;;;;:::i;:::-;58557:12;58554:1313;;58615:1;58603:9;:13;58595:22;;;;;;58651:6;58638:9;:19;;58630:28;;;;;;58689:9;:16;;58756:59;;;;;;;;;;;58775:10;58756:59;;;;;;;;;;;;;;58794:1;58756:59;;;;;;;;;;;;;;;;;;;;;;;;58741:75;;;;58671:15;58741:75;;;;;;;;58689:16;;58756:59;58741:75;;;-1:-1:-1;;;;;;;;;;;58741:75:0;;;;;;;;;;:::i;:::-;-1:-1:-1;58741:75:0;;;;;;;;;;;-1:-1:-1;;;;;;58741:75:0;-1:-1:-1;;;;;58741:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58860:59;;;;;;;;;;58879:10;58860:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58829:20:0;;;:8;:20;;;;;:29;;;;;;;;;:90;;;;58860:59;;58829:29;;:90;;:29;;:90;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;58829:90:0;;;;;-1:-1:-1;;;;;58829:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58932:33;58938:10;58950:7;58959:1;58932:33;;;;;;;;;;;;:5;:33::i;:::-;59001:37;59012:6;59019:10;59030:7;59001:10;:37::i;:::-;59086:9;:13;59082:151;;59116:22;59133:4;59116:16;:22::i;:::-;59171:30;59189:6;59196:4;59171:17;:30::i;:::-;58554:1313;;;;59252:9;59263:1;59252:12;59249:618;;;59309:1;59300:6;:10;59292:19;;;;;;59342:9;:16;;59409:59;;;;;;;;;;;59428:10;59409:59;;;;;;;;;;;;;;59447:1;59409:59;;;;;;;;;;;;;;;;;;;;;;;;59394:75;;;;59324:15;59394:75;;;;;;;;59342:16;;59409:59;59394:75;;;-1:-1:-1;;;;;;;;;;;59394:75:0;;;;;;;;;;:::i;:::-;-1:-1:-1;59394:75:0;;;;;;;;;;;-1:-1:-1;;;;;;59394:75:0;-1:-1:-1;;;;;59394:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59513:59;;;;;;;;;;59532:10;59513:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59482:20:0;;;:8;:20;;;;;:29;;;;;;;;;:90;;;;59513:59;;59482:29;;:90;;:29;;:90;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;59482:90:0;;;;;-1:-1:-1;;;;;59482:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59585:33;59591:10;59603:7;59612:1;59585:33;;;;;;;;;;;;:5;:33::i;:::-;59654:37;59665:6;59672:10;59683:7;59654:10;:37::i;:::-;59737:27;59759:4;59737:21;:27::i;:::-;59795:42;59818:6;59825:4;59830:6;59795:22;:42::i;54042:123::-;52983:13;;-1:-1:-1;;;;;52983:13:0;53000:10;52983:27;52975:36;;;;;;54147:10:::1;54119:7;:15;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:25:::1;;:38:::0;;-1:-1:-1;;;;;54119:38:0;;;::::1;-1:-1:-1::0;;;;;;54119:38:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;54042:123:0:o;66394:2720::-;-1:-1:-1;;;;;66583:18:0;;66591:10;66583:18;;66575:27;;;;;;66633:19;66643:8;66633:9;:19::i;:::-;-1:-1:-1;;;;;66621:31:0;:10;-1:-1:-1;;;;;66621:31:0;;;66613:68;;;;-1:-1:-1;;;66613:68:0;;;;;;;:::i;:::-;66700:32;66716:6;66723:8;66700:15;:32::i;:::-;66736:1;66700:37;66692:69;;;;-1:-1:-1;;;66692:69:0;;;;;;;:::i;:::-;66794:4;66780:10;:18;;66772:51;;;;-1:-1:-1;;;66772:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66855:16:0;;;;;;:8;:16;;;;;;;;:26;;;;;;;;:33;;;:44;-1:-1:-1;66855:44:0;66847:77;;;;-1:-1:-1;;;66847:77:0;;;;;;;:::i;:::-;66952:7;66963:1;66952:12;66944:44;;;;-1:-1:-1;;;66944:44:0;;;;;;;:::i;:::-;67013:12;:10;:12::i;:::-;67010:99;;67060:7;;67052:36;;;;-1:-1:-1;;;67052:36:0;;;;;;;:::i;:::-;67124;67144:6;67151:8;67124:19;:36::i;:::-;67121:1978;;67257:9;67197:56;67245:7;67197:43;67217:6;67225:8;67235:4;67197:19;:43::i;:56::-;:69;;67189:136;;;;-1:-1:-1;;;67189:136:0;;;;;;;:::i;:::-;67338:36;67350:6;67357:10;67369:4;67338:11;:36::i;:::-;67387:22;67404:4;67387:16;:22::i;:::-;67440:20;67463:48;67505:5;67463:37;67489:10;67464:19;:9;67478:4;67464:13;:19::i;67463:48::-;67440:71;;67524:32;67534:12;67547:8;67524:9;:32::i;:::-;67590:18;67651:12;67624:25;67644:4;67624:19;:25::i;:::-;67612:37;;:9;:37;:::i;:::-;:51;;;;:::i;:::-;67590:74;;67677:32;67691:6;67698:10;67677:13;:32::i;:::-;67769:103;;;;;;;;67778:51;67798:21;67810:8;67798:11;:21::i;:::-;67820:8;67778:19;:51::i;:::-;67769:103;;67830:10;67769:103;;;;;;;;;;;;;;;;;;;;67858:9;67769:103;;;;67868:1;67769:103;;;;-1:-1:-1;67769:103:0;;;;;;;67737:20;;;:8;:20;;;;;:30;;;;;;;:135;;;;:30;;:135;;:30;;:135;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;67737:135:0;;;;;-1:-1:-1;;;;;67737:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67885:58;67902:6;67909:10;67920:8;67929:7;67885:58;;;;;;;;;;;;;-1:-1:-1;;;67885:58:0;;;:16;:58::i;:::-;-1:-1:-1;;;;;67992:16:0;;;;;;:8;:16;;;;;;;;:26;;;;;;;;:33;;;:46;;68030:7;67992:37;:46::i;:::-;-1:-1:-1;;;;;67956:16:0;;;;;;:8;:16;;;;;;;;:26;;;;;;;;:33;;:82;;;;68051:37;;67965:6;;68070:10;;68051:11;:37::i;:::-;67121:1978;;;;;68108:36;68128:6;68135:8;68108:19;:36::i;:::-;68146:1;68108:39;68105:994;;;68241:6;68181:56;68229:7;68181:43;68201:6;68209:8;68219:4;68181:19;:43::i;:56::-;:66;;68173:133;;;;-1:-1:-1;;;68173:133:0;;;;;;;:::i;:::-;68319:36;68331:6;68338:10;68350:4;68319:11;:36::i;:::-;68368:27;68390:4;68368:21;:27::i;:::-;68426:20;68449:45;68488:5;68449:34;68472:10;68450:16;:6;68461:4;68450:10;:16::i;68449:45::-;68426:68;;68507:37;68522:12;68535:8;68507:14;:37::i;:::-;68578:18;68648:12;68609:37;68634:4;68639:6;68609:24;:37::i;:::-;68600:46;;:6;:46;:::i;:::-;:60;;;;:::i;:::-;68578:83;;68674:37;68693:6;68700:10;68674:18;:37::i;:::-;68771:100;;;;;;;;68780:51;68800:21;68812:8;68800:11;:21::i;68780:51::-;68771:100;;68832:10;68771:100;;;;;;;;;;;;;;;;;;;;;;;;;;68867:1;68771:100;;;;;;;;;;;;;;-1:-1:-1;68739:20:0;;;:8;:20;;;;;:30;;;;;;;;:132;;;;:30;;:132;;:30;;:132;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;68739:132:0;;;;;-1:-1:-1;;;;;68739:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68884:58;68901:6;68908:10;68919:8;68928:7;68884:58;;;;;;;;;;;;;-1:-1:-1;;;68884:58:0;;;:16;:58::i;:::-;-1:-1:-1;;;;;68991:16:0;;;;;;:8;:16;;;;;;;;:26;;;;;;;;:33;;;:46;;69029:7;68991:37;:46::i;:::-;-1:-1:-1;;;;;68955:16:0;;;;;;:8;:16;;;;;;;;:26;;;;;;;;:33;;:82;;;;69050:37;;68964:6;;69069:10;;69050:11;:37::i;:::-;68105:994;;66394:2720;;;;;;:::o;59882:625::-;60048:1;60036:9;:13;60028:40;;;;-1:-1:-1;;;60028:40:0;;;;;;;:::i;:::-;60097:9;:16;;60162:65;;;;;;;;;;;60181:10;60162:65;;;;;;;;;;;;;;;;;;;;;;;;;;60079:15;60162:65;;;;;;;;;;;;60147:81;;;;;;;;;;;;;60097:16;;60162:65;60147:81;;;-1:-1:-1;;;;;;;;;;;60147:81:0;;;;;;;;;;:::i;:::-;-1:-1:-1;60147:81:0;;;;;;;;;;-1:-1:-1;;;;;;60147:81:0;-1:-1:-1;;;;;60147:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60270:65;;;;;;;;;;60289:10;60270:65;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60270:65:0;;;;;;;;;;;;60239:20;;:8;:20;;;;;:29;;;;;;;;:96;;;;:29;;:96;;:29;;:96;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;60239:96:0;;;;;-1:-1:-1;;;;;60239:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60346:39;60352:10;60364:7;60373;60346:39;;;;;;;;;;;;:5;:39::i;:::-;60419:48;60430:17;:15;:17::i;62874:541::-;63000:1;62988:9;:13;:31;;;;;63018:1;63005:12;:10;:12::i;:::-;:14;62988:31;62984:424;;;63034:25;63061:50;63105:5;63061:39;63087:12;:10;:12::i;:::-;63062:19;:9;63076:4;63062:13;:19::i;63061:50::-;63034:77;;63130:17;:15;:17::i;:::-;-1:-1:-1;;;;;63122:35:0;:54;63158:17;63122:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63187:64;63202:6;63209:41;63227:17;63245:4;63209:17;:41::i;63187:64::-;62984:424;;;;63302:1;63290:9;:13;:32;;;;;63307:12;:10;:12::i;:::-;:15;63290:32;63287:121;;;63353:24;63368:6;63375:1;63353:14;:24::i;65285:448::-;65438:10;65429:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:36;;;-1:-1:-1;;;;;65429:36:0;65415:50;65407:59;;;;;;65496:10;65487:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:37;;;:48;-1:-1:-1;65487:48:0;65479:57;;;;;;65591:6;65552:38;65569:10;65581:8;65552:16;:38::i;:::-;:45;65549:123;;;65622:10;65613:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:36;;:45;;;65549:123;-1:-1:-1;;65693:10:0;65684:20;;;;:8;:20;;;;;;;;:30;;;;;;;65722:1;65684:35;;;;:39;65285:448::o;23536:168::-;-1:-1:-1;;;;;23659:27:0;;;23635:4;23659:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23536:168::o;24182:401::-;24398:12;:10;:12::i;:::-;-1:-1:-1;;;;;24390:20:0;:4;-1:-1:-1;;;;;24390:20:0;;:60;;;;24414:36;24431:4;24437:12;:10;:12::i;24414:36::-;24368:151;;;;-1:-1:-1;;;24368:151:0;;;;;;;:::i;:::-;24530:45;24548:4;24554:2;24558;24562:6;24570:4;24530:17;:45::i;53595:191::-;52983:13;;-1:-1:-1;;;;;52983:13:0;53000:10;52983:27;52975:36;;;;;;-1:-1:-1;;;;;53678:22:0;::::1;53670:73;;;;-1:-1:-1::0;;;53670:73:0::1;;;;;;;:::i;:::-;53754:13;:24:::0;;-1:-1:-1;;;;;;53754:24:0::1;-1:-1:-1::0;;;;;53754:24:0;;;::::1;::::0;;;::::1;::::0;;53595:191::o;55140:232::-;-1:-1:-1;;;;;55271:16:0;;;55236:7;55271:16;;;:8;:16;;;;;;;;:26;;;;;;;;:32;;;55236:7;;55271:32;55261:42;55253:51;;;;;;-1:-1:-1;;;;;55321:16:0;;;;;;:8;:16;;;;;;;;:26;;;;;;;;:32;;;:42;;55358:4;55321:36;:42::i;:::-;55313:51;55140:232;-1:-1:-1;;;;55140:232:0:o;66141:243::-;66232:10;66223:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:36;;;-1:-1:-1;;;;;66223:36:0;66209:50;66201:59;;;;;;66290:10;66281:20;;;;:8;:20;;;;;;;;:30;;;;;;;;:35;;;66273:49;;;;;;66344:10;66335:20;;;;:8;:20;;;;;;;;:30;;;;;;;66373:1;66335:35;;;;:39;66141:243::o;53909:127::-;52983:13;;-1:-1:-1;;;;;52983:13:0;53000:10;52983:27;52975:36;;;;;;54015:13:::1;53984:7;:15;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:44;;-1:-1:-1;;;;;53984:44:0;;;::::1;-1:-1:-1::0;;;;;;53984:44:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;53909:127:0:o;63655:145::-;63740:7;63766:25;:10;63781:9;63766:14;:25::i;:::-;63758:34;63655:145;-1:-1:-1;;;63655:145:0:o;18044:157::-;-1:-1:-1;;;;;;18153:40:0;;-1:-1:-1;;;18153:40:0;18044:157;;;:::o;29981:672::-;-1:-1:-1;;;;;30139:21:0;;30131:67;;;;-1:-1:-1;;;30131:67:0;;;;;;;:::i;:::-;30209:16;30228:12;:10;:12::i;:::-;30209:31;;30253:107;30274:8;30292:1;30296:7;30305:21;30323:2;30305:17;:21::i;:::-;30328:25;30346:6;30328:17;:25::i;:::-;30355:4;30253:20;:107::i;:::-;30373:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30373:22:0;;;;;;;;;:32;;30399:6;;30373:13;:32;;30399:6;;30373:32;:::i;:::-;;;;;;;;30458:7;-1:-1:-1;;;;;30421:57:0;30454:1;-1:-1:-1;;;;;30421:57:0;30436:8;-1:-1:-1;;;;;30421:57:0;;30467:2;30471:6;30421:57;;;;;;;:::i;:::-;;;;;;;;30491:79;30522:8;30540:1;30544:7;30553:2;30557:6;30565:4;30491:30;:79::i;:::-;-1:-1:-1;;;30581:16:0;;;;:12;:16;;;;;;;;:26;;-1:-1:-1;;;;;30581:26:0;;;-1:-1:-1;;;;;;30581:26:0;;;;;;;;30618:13;:17;;;;;;:27;;;;;;;;29981:672::o;41913:98::-;41971:7;41998:5;42002:1;41998;:5;:::i;42270:98::-;42328:7;42355:5;42359:1;42355;:5;:::i;42669:98::-;42727:7;42754:5;42758:1;42754;:5;:::i;23175:287::-;23283:8;-1:-1:-1;;;;;23272:19:0;:7;-1:-1:-1;;;;;23272:19:0;;;23264:73;;;;-1:-1:-1;;;23264:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23349:27:0;;;;;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;:48;;-1:-1:-1;;23349:48:0;;;;;;;23412:43;;;;;23349:48;;23412:43;:::i;:::-;;;;;;;;23175:287;;;:::o;17048:98::-;17128:10;17048:98;:::o;27574:1074::-;27801:7;:14;27787:3;:10;:28;27779:81;;;;-1:-1:-1;;;27779:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27879:16:0;;27871:66;;;;-1:-1:-1;;;27871:66:0;;;;;;;:::i;:::-;27950:16;27969:12;:10;:12::i;:::-;27950:31;;27994:60;28015:8;28025:4;28031:2;28035:3;28040:7;28049:4;27994:20;:60::i;:::-;28072:9;28067:421;28091:3;:10;28087:1;:14;28067:421;;;28123:10;28136:3;28140:1;28136:6;;;;;;-1:-1:-1;;;28136:6:0;;;;;;;;;;;;;;;28123:19;;28157:14;28174:7;28182:1;28174:10;;;;;;-1:-1:-1;;;28174:10:0;;;;;;;;;;;;;;;;;;;;28201:19;28223:13;;;:9;:13;;;;;;-1:-1:-1;;;;;28223:19:0;;;;;;;;;;;;28174:10;;-1:-1:-1;28265:21:0;;;;28257:76;;;;-1:-1:-1;;;28257:76:0;;;;;;;:::i;:::-;28377:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28377:19:0;;;;;;;;;;28399:20;;;28377:42;;28449:17;;;;;;;:27;;28399:20;;28377:13;28449:27;;28399:20;;28449:27;:::i;:::-;;;;;;;;28067:421;;;28103:3;;;;:::i;:::-;;;28067:421;;;;28535:2;-1:-1:-1;;;;;28505:47:0;28529:4;-1:-1:-1;;;;;28505:47:0;28519:8;-1:-1:-1;;;;;28505:47:0;;28539:3;28544:7;28505:47;;;;;;;:::i;:::-;;;;;;;;28565:75;28601:8;28611:4;28617:2;28621:3;28626:7;28635:4;28565:35;:75::i;32189:194::-;32292:16;;;;:12;:16;;;;;;-1:-1:-1;;;;;32281:27:0;;;32292:16;;32281:27;32273:64;;;;-1:-1:-1;;;32273:64:0;;;;;;;:::i;:::-;32348:17;;;;:13;:17;;;;;:27;;-1:-1:-1;;;;;;32348:27:0;-1:-1:-1;;;;;32348:27:0;;;;;;;;;;;-1:-1:-1;32189:194:0:o;33737:675::-;-1:-1:-1;;;;;33867:21:0;;33859:69;;;;-1:-1:-1;;;33859:69:0;;;;;;;:::i;:::-;33941:16;33960:12;:10;:12::i;:::-;33941:31;;33985:105;34006:8;34016:7;34033:1;34037:21;34055:2;34037:17;:21::i;:::-;34060:25;34078:6;34060:17;:25::i;:::-;33985:105;;;;;;;;;;;;:20;:105::i;:::-;34103:22;34128:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34128:22:0;;;;;;;;;;34169:24;;;;34161:73;;;;-1:-1:-1;;;34161:73:0;;;;;;;:::i;:::-;34270:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34270:22:0;;;;;;;;;;;;;34295:23;;;34270:48;;34347:57;;34270:22;;34347:57;;;;;;;34280:2;;34312:6;;34347:57;:::i;:::-;;;;;;;;33737:675;;;;;:::o;26396:820::-;-1:-1:-1;;;;;26584:16:0;;26576:66;;;;-1:-1:-1;;;26576:66:0;;;;;;;:::i;:::-;26655:16;26674:12;:10;:12::i;:::-;26655:31;;26699:96;26720:8;26730:4;26736:2;26740:21;26758:2;26740:17;:21::i;26699:96::-;26808:19;26830:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26830:19:0;;;;;;;;;;26868:21;;;;26860:76;;;;-1:-1:-1;;;26860:76:0;;;;;;;:::i;:::-;26972:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26972:19:0;;;;;;;;;;26994:20;;;26972:42;;27036:17;;;;;;;:27;;26994:20;;26972:13;27036:27;;26994:20;;27036:27;:::i;:::-;;;;;;;;27112:2;-1:-1:-1;;;;;27081:46:0;27106:4;-1:-1:-1;;;;;27081:46:0;27096:8;-1:-1:-1;;;;;27081:46:0;;27116:2;27120:6;27081:46;;;;;;;:::i;:::-;;;;;;;;27140:68;27171:8;27181:4;27187:2;27191;27195:6;27203:4;27140:30;:68::i;:::-;26396:820;;;;;;;:::o;41532:98::-;41590:7;41617:5;41621:1;41617;:5;:::i;38291:198::-;38411:16;;;38425:1;38411:16;;;;;;;;;38357;;38386:22;;38411:16;;;;;;;;;;;;-1:-1:-1;38411:16:0;38386:41;;38449:7;38438:5;38444:1;38438:8;;;;;;-1:-1:-1;;;38438:8:0;;;;;;;;;;;;;;;;;;:18;38476:5;38291:198;-1:-1:-1;;38291:198:0:o;36718:744::-;36933:15;:2;-1:-1:-1;;;;;36933:13:0;;:15::i;:::-;36929:526;;;36969:72;;-1:-1:-1;;;36969:72:0;;-1:-1:-1;;;;;36969:38:0;;;;;:72;;37008:8;;37018:4;;37024:2;;37028:6;;37036:4;;36969:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36969:72:0;;;;;;;;-1:-1:-1;;36969:72:0;;;;;;;;;;;;:::i;:::-;;;36965:479;;;;:::i;:::-;;;;;;;;37317:6;37310:14;;-1:-1:-1;;;37310:14:0;;;;;;;;:::i;36965:479::-;37366:62;;-1:-1:-1;;;37366:62:0;;;;;;;:::i;36965:479::-;-1:-1:-1;;;;;;37091:55:0;;-1:-1:-1;;;37091:55:0;37087:154;;37171:50;;-1:-1:-1;;;37171:50:0;;;;;;;:::i;37470:813::-;37710:15;:2;-1:-1:-1;;;;;37710:13:0;;:15::i;:::-;37706:570;;;37746:79;;-1:-1:-1;;;37746:79:0;;-1:-1:-1;;;;;37746:43:0;;;;;:79;;37790:8;;37800:4;;37806:3;;37811:7;;37820:4;;37746:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37746:79:0;;;;;;;;-1:-1:-1;;37746:79:0;;;;;;;;;;;;:::i;:::-;;;37742:523;;;;:::i;:::-;-1:-1:-1;;;;;;37907:60:0;;-1:-1:-1;;;37907:60:0;37903:159;;37992:50;;-1:-1:-1;;;37992:50:0;;;;;;;:::i;9106:387::-;9429:20;9477:8;;;9106:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:705:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:65;254:49;300:2;254:49;:::i;:::-;239:65;:::i;:::-;338:15;;;369:12;;;;401:15;;;447:11;;;435:24;;431:33;;428:42;-1:-1:-1;425:2:1;;;487:5;480;473:20;425:2;513:5;527:163;541:2;538:1;535:9;527:163;;;598:17;;586:30;;636:12;;;;668;;;;559:1;552:9;527:163;;;-1:-1:-1;708:5:1;;84:635;-1:-1:-1;;;;;;;84:635:1:o;724:551::-;;821:3;814:4;806:6;802:17;798:27;788:2;;843:5;836;829:20;788:2;883:6;870:20;909:18;905:2;902:26;899:2;;;931:18;;:::i;:::-;975:54;1017:2;998:13;;-1:-1:-1;;994:27:1;1023:4;990:38;975:54;:::i;:::-;1054:2;1045:7;1038:19;1100:3;1093:4;1088:2;1080:6;1076:15;1072:26;1069:35;1066:2;;;1121:5;1114;1107:20;1066:2;1190;1183:4;1175:6;1171:17;1164:4;1155:7;1151:18;1138:55;1213:16;;;1231:4;1209:27;1202:42;;;;1217:7;778:497;-1:-1:-1;;778:497:1:o;1280:259::-;;1392:2;1380:9;1371:7;1367:23;1363:32;1360:2;;;1413:6;1405;1398:22;1360:2;1457:9;1444:23;1476:33;1503:5;1476:33;:::i;1544:694::-;;;;;;1742:3;1730:9;1721:7;1717:23;1713:33;1710:2;;;1764:6;1756;1749:22;1710:2;1808:9;1795:23;1827:33;1854:5;1827:33;:::i;:::-;1879:5;-1:-1:-1;1935:2:1;1920:18;;1907:32;1962:18;1951:30;;1948:2;;;1999:6;1991;1984:22;1948:2;2027:51;2070:7;2061:6;2050:9;2046:22;2027:51;:::i;:::-;1700:538;;2017:61;;-1:-1:-1;;;;2125:2:1;2110:18;;2097:32;;2176:2;2161:18;;2148:32;;2227:3;2212:19;;;2199:33;;-1:-1:-1;1700:538:1;-1:-1:-1;1700:538:1:o;2243:335::-;;;2380:2;2368:9;2359:7;2355:23;2351:32;2348:2;;;2401:6;2393;2386:22;2348:2;2445:9;2432:23;2464:33;2491:5;2464:33;:::i;:::-;2516:5;2568:2;2553:18;;;;2540:32;;-1:-1:-1;;;2338:240:1:o;2583:403::-;;;;2737:2;2725:9;2716:7;2712:23;2708:32;2705:2;;;2758:6;2750;2743:22;2705:2;2802:9;2789:23;2821:33;2848:5;2821:33;:::i;:::-;2873:5;2925:2;2910:18;;2897:32;;-1:-1:-1;2976:2:1;2961:18;;;2948:32;;2695:291;-1:-1:-1;;;2695:291:1:o;2991:610::-;;;;;;;3196:3;3184:9;3175:7;3171:23;3167:33;3164:2;;;3218:6;3210;3203:22;3164:2;3262:9;3249:23;3281:33;3308:5;3281:33;:::i;:::-;3333:5;3385:2;3370:18;;3357:32;;-1:-1:-1;3436:2:1;3421:18;;3408:32;;3487:2;3472:18;;3459:32;;-1:-1:-1;3538:3:1;3523:19;;3510:33;;-1:-1:-1;3590:3:1;3575:19;3562:33;;-1:-1:-1;3154:447:1;-1:-1:-1;;;3154:447:1:o;3606:402::-;;;3735:2;3723:9;3714:7;3710:23;3706:32;3703:2;;;3756:6;3748;3741:22;3703:2;3800:9;3787:23;3819:33;3846:5;3819:33;:::i;:::-;3871:5;-1:-1:-1;3928:2:1;3913:18;;3900:32;3941:35;3900:32;3941:35;:::i;:::-;3995:7;3985:17;;;3693:315;;;;;:::o;4013:1129::-;;;;;;4252:3;4240:9;4231:7;4227:23;4223:33;4220:2;;;4274:6;4266;4259:22;4220:2;4318:9;4305:23;4337:33;4364:5;4337:33;:::i;:::-;4389:5;-1:-1:-1;4446:2:1;4431:18;;4418:32;4459:35;4418:32;4459:35;:::i;:::-;4513:7;-1:-1:-1;4571:2:1;4556:18;;4543:32;4594:18;4624:14;;;4621:2;;;4656:6;4648;4641:22;4621:2;4684:67;4743:7;4734:6;4723:9;4719:22;4684:67;:::i;:::-;4674:77;;4804:2;4793:9;4789:18;4776:32;4760:48;;4833:2;4823:8;4820:16;4817:2;;;4854:6;4846;4839:22;4817:2;4882:69;4943:7;4932:8;4921:9;4917:24;4882:69;:::i;:::-;4872:79;;5004:3;4993:9;4989:19;4976:33;4960:49;;5034:2;5024:8;5021:16;5018:2;;;5055:6;5047;5040:22;5018:2;;5083:53;5128:7;5117:8;5106:9;5102:24;5083:53;:::i;:::-;5073:63;;;4210:932;;;;;;;;:::o;5147:760::-;;;;;;5336:3;5324:9;5315:7;5311:23;5307:33;5304:2;;;5358:6;5350;5343:22;5304:2;5402:9;5389:23;5421:33;5448:5;5421:33;:::i;:::-;5473:5;-1:-1:-1;5530:2:1;5515:18;;5502:32;5543:35;5502:32;5543:35;:::i;:::-;5597:7;-1:-1:-1;5651:2:1;5636:18;;5623:32;;-1:-1:-1;5702:2:1;5687:18;;5674:32;;-1:-1:-1;5757:3:1;5742:19;;5729:33;5785:18;5774:30;;5771:2;;;5822:6;5814;5807:22;5771:2;5850:51;5893:7;5884:6;5873:9;5869:22;5850:51;:::i;5912:396::-;;;6038:2;6026:9;6017:7;6013:23;6009:32;6006:2;;;6059:6;6051;6044:22;6006:2;6103:9;6090:23;6122:33;6149:5;6122:33;:::i;:::-;6174:5;-1:-1:-1;6231:2:1;6216:18;;6203:32;6244;6203;6244;:::i;6645:395::-;;;;6791:2;6779:9;6770:7;6766:23;6762:32;6759:2;;;6812:6;6804;6797:22;7045:1295;;;7224:2;7212:9;7203:7;7199:23;7195:32;7192:2;;;7245:6;7237;7230:22;7192:2;7290:9;7277:23;7319:18;7360:2;7352:6;7349:14;7346:2;;;7381:6;7373;7366:22;7346:2;7424:6;7413:9;7409:22;7399:32;;7469:7;7462:4;7458:2;7454:13;7450:27;7440:2;;7496:6;7488;7481:22;7440:2;7537;7524:16;7559:4;7583:65;7598:49;7644:2;7598:49;:::i;7583:65::-;7682:15;;;7713:12;;;;7745:11;;;7783;;;7775:20;;7771:29;;7768:42;-1:-1:-1;7765:2:1;;;7828:6;7820;7813:22;7765:2;7855:6;7846:15;;7870:240;7884:2;7881:1;7878:9;7870:240;;;7955:3;7942:17;7972:33;7999:5;7972:33;:::i;:::-;8018:18;;7902:1;7895:9;;;;;8056:12;;;;8088;;7870:240;;;-1:-1:-1;8129:5:1;-1:-1:-1;;8172:18:1;;8159:32;;-1:-1:-1;;8203:16:1;;;8200:2;;;8237:6;8229;8222:22;8200:2;;8265:69;8326:7;8315:8;8304:9;8300:24;8265:69;:::i;:::-;8255:79;;;7182:1158;;;;;:::o;8345:257::-;;8465:2;8453:9;8444:7;8440:23;8436:32;8433:2;;;8486:6;8478;8471:22;8433:2;8523:9;8517:16;8542:30;8566:5;8542:30;:::i;8607:257::-;;8718:2;8706:9;8697:7;8693:23;8689:32;8686:2;;;8739:6;8731;8724:22;8686:2;8783:9;8770:23;8802:32;8828:5;8802:32;:::i;8869:261::-;;8991:2;8979:9;8970:7;8966:23;8962:32;8959:2;;;9012:6;9004;8997:22;8959:2;9049:9;9043:16;9068:32;9094:5;9068:32;:::i;9135:479::-;;;;9291:2;9279:9;9270:7;9266:23;9262:32;9259:2;;;9312:6;9304;9297:22;9259:2;9357:9;9344:23;9390:18;9382:6;9379:30;9376:2;;;9427:6;9419;9412:22;9376:2;9455:51;9498:7;9489:6;9478:9;9474:22;9455:51;:::i;:::-;9445:61;9553:2;9538:18;;9525:32;;-1:-1:-1;9604:2:1;9589:18;;;9576:32;;9249:365;-1:-1:-1;;;;9249:365:1:o;9619:548::-;;;;;9792:3;9780:9;9771:7;9767:23;9763:33;9760:2;;;9814:6;9806;9799:22;9760:2;9859:9;9846:23;9892:18;9884:6;9881:30;9878:2;;;9929:6;9921;9914:22;9878:2;9957:51;10000:7;9991:6;9980:9;9976:22;9957:51;:::i;:::-;9947:61;10055:2;10040:18;;10027:32;;-1:-1:-1;10106:2:1;10091:18;;10078:32;;10157:2;10142:18;10129:32;;-1:-1:-1;9750:417:1;-1:-1:-1;;;;9750:417:1:o;10172:190::-;;10284:2;10272:9;10263:7;10259:23;10255:32;10252:2;;;10305:6;10297;10290:22;10252:2;-1:-1:-1;10333:23:1;;10242:120;-1:-1:-1;10242:120:1:o;10367:194::-;;10490:2;10478:9;10469:7;10465:23;10461:32;10458:2;;;10511:6;10503;10496:22;10458:2;-1:-1:-1;10539:16:1;;10448:113;-1:-1:-1;10448:113:1:o;10566:258::-;;;10695:2;10683:9;10674:7;10670:23;10666:32;10663:2;;;10716:6;10708;10701:22;10663:2;-1:-1:-1;;10744:23:1;;;10814:2;10799:18;;;10786:32;;-1:-1:-1;10653:171:1:o;10829:326::-;;;;10975:2;10963:9;10954:7;10950:23;10946:32;10943:2;;;10996:6;10988;10981:22;10943:2;-1:-1:-1;;11024:23:1;;;11094:2;11079:18;;11066:32;;-1:-1:-1;11145:2:1;11130:18;;;11117:32;;10933:222;-1:-1:-1;10933:222:1:o;11160:443::-;;11257:5;11251:12;11284:6;11279:3;11272:19;11310:4;11339:2;11334:3;11330:12;11323:19;;11376:2;11369:5;11365:14;11397:3;11409:169;11423:6;11420:1;11417:13;11409:169;;;11484:13;;11472:26;;11518:12;;;;11553:15;;;;11445:1;11438:9;11409:169;;;-1:-1:-1;11594:3:1;;11227:376;-1:-1:-1;;;;;11227:376:1:o;11608:477::-;;11689:5;11683:12;11716:6;11711:3;11704:19;11741:3;11753:162;11767:6;11764:1;11761:13;11753:162;;;11829:4;11885:13;;;11881:22;;11875:29;11857:11;;;11853:20;;11846:59;11782:12;11753:162;;;11933:6;11930:1;11927:13;11924:2;;;11999:3;11992:4;11983:6;11978:3;11974:16;11970:27;11963:40;11924:2;-1:-1:-1;12067:2:1;12046:15;-1:-1:-1;;12042:29:1;12033:39;;;;12074:4;12029:50;;11659:426;-1:-1:-1;;11659:426:1:o;12090:254::-;-1:-1:-1;;;12292:19:1;;12336:1;12327:11;;12282:62::o;12349:203::-;-1:-1:-1;;;;;12513:32:1;;;;12495:51;;12483:2;12468:18;;12450:102::o;12557:383::-;-1:-1:-1;;;;;12823:15:1;;;12805:34;;12875:15;;;;12870:2;12855:18;;12848:43;12922:2;12907:18;;12900:34;;;;12755:2;12740:18;;12722:218::o;12945:840::-;-1:-1:-1;;;;;13342:15:1;;;13324:34;;13394:15;;13389:2;13374:18;;13367:43;13304:3;13441:2;13426:18;;13419:31;;;12945:840;;13473:63;;13516:19;;13508:6;13473:63;:::i;:::-;13584:9;13576:6;13572:22;13567:2;13556:9;13552:18;13545:50;13618;13661:6;13653;13618:50;:::i;:::-;13604:64;;13717:9;13709:6;13705:22;13699:3;13688:9;13684:19;13677:51;13745:34;13772:6;13764;13745:34;:::i;:::-;13737:42;13276:509;-1:-1:-1;;;;;;;;13276:509:1:o;14170:562::-;-1:-1:-1;;;;;14467:15:1;;;14449:34;;14519:15;;14514:2;14499:18;;14492:43;14566:2;14551:18;;14544:34;;;14609:2;14594:18;;14587:34;;;14429:3;14652;14637:19;;14630:32;;;14170:562;;14679:47;;14706:19;;14698:6;14679:47;:::i;:::-;14671:55;14401:331;-1:-1:-1;;;;;;;14401:331:1:o;14737:267::-;;14916:2;14905:9;14898:21;14936:62;14994:2;14983:9;14979:18;14971:6;14936:62;:::i;15009:477::-;;15266:2;15255:9;15248:21;15292:62;15350:2;15339:9;15335:18;15327:6;15292:62;:::i;:::-;15402:9;15394:6;15390:22;15385:2;15374:9;15370:18;15363:50;15430;15473:6;15465;15430:50;:::i;:::-;15422:58;15238:248;-1:-1:-1;;;;;15238:248:1:o;15491:187::-;15656:14;;15649:22;15631:41;;15619:2;15604:18;;15586:92::o;15683:221::-;;15832:2;15821:9;15814:21;15852:46;15894:2;15883:9;15879:18;15871:6;15852:46;:::i;15909:678::-;;16226:3;16215:9;16208:22;16247:47;16289:3;16278:9;16274:19;16266:6;16247:47;:::i;:::-;-1:-1:-1;;;;;16330:32:1;;;;16325:2;16310:18;;16303:60;-1:-1:-1;16394:2:1;16379:18;;16372:34;;;;16437:2;16422:18;;16415:34;;;;16480:3;16465:19;;16458:35;;;;16350:3;16509:19;;16502:35;16568:3;16553:19;;;16546:35;16239:55;16198:389;-1:-1:-1;16198:389:1:o;16592:416::-;16794:2;16776:21;;;16833:2;16813:18;;;16806:30;16872:34;16867:2;16852:18;;16845:62;-1:-1:-1;;;16938:2:1;16923:18;;16916:50;16998:3;16983:19;;16766:242::o;17013:341::-;17215:2;17197:21;;;17254:2;17234:18;;;17227:30;-1:-1:-1;;;17288:2:1;17273:18;;17266:47;17345:2;17330:18;;17187:167::o;17359:404::-;17561:2;17543:21;;;17600:2;17580:18;;;17573:30;17639:34;17634:2;17619:18;;17612:62;-1:-1:-1;;;17705:2:1;17690:18;;17683:38;17753:3;17738:19;;17533:230::o;17768:407::-;17970:2;17952:21;;;18009:2;17989:18;;;17982:30;18048:34;18043:2;18028:18;;18021:62;-1:-1:-1;;;18114:2:1;18099:18;;18092:41;18165:3;18150:19;;17942:233::o;18180:341::-;18382:2;18364:21;;;18421:2;18401:18;;;18394:30;-1:-1:-1;;;18455:2:1;18440:18;;18433:47;18512:2;18497:18;;18354:167::o;18526:402::-;18728:2;18710:21;;;18767:2;18747:18;;;18740:30;18806:34;18801:2;18786:18;;18779:62;-1:-1:-1;;;18872:2:1;18857:18;;18850:36;18918:3;18903:19;;18700:228::o;18933:400::-;19135:2;19117:21;;;19174:2;19154:18;;;19147:30;19213:34;19208:2;19193:18;;19186:62;-1:-1:-1;;;19279:2:1;19264:18;;19257:34;19323:3;19308:19;;19107:226::o;19338:414::-;19540:2;19522:21;;;19579:2;19559:18;;;19552:30;19618:34;19613:2;19598:18;;19591:62;-1:-1:-1;;;19684:2:1;19669:18;;19662:48;19742:3;19727:19;;19512:240::o;19757:417::-;19959:2;19941:21;;;19998:2;19978:18;;;19971:30;20037:34;20032:2;20017:18;;20010:62;-1:-1:-1;;;20103:2:1;20088:18;;20081:51;20164:3;20149:19;;19931:243::o;20179:405::-;20381:2;20363:21;;;20420:2;20400:18;;;20393:30;20459:34;20454:2;20439:18;;20432:62;-1:-1:-1;;;20525:2:1;20510:18;;20503:39;20574:3;20559:19;;20353:231::o;20589:345::-;20791:2;20773:21;;;20830:2;20810:18;;;20803:30;-1:-1:-1;;;20864:2:1;20849:18;;20842:51;20925:2;20910:18;;20763:171::o;20939:344::-;21141:2;21123:21;;;21180:2;21160:18;;;21153:30;-1:-1:-1;;;21214:2:1;21199:18;;21192:50;21274:2;21259:18;;21113:170::o;21288:406::-;21490:2;21472:21;;;21529:2;21509:18;;;21502:30;21568:34;21563:2;21548:18;;21541:62;-1:-1:-1;;;21634:2:1;21619:18;;21612:40;21684:3;21669:19;;21462:232::o;21699:336::-;21901:2;21883:21;;;21940:2;21920:18;;;21913:30;-1:-1:-1;;;21974:2:1;21959:18;;21952:42;22026:2;22011:18;;21873:162::o;22040:349::-;22242:2;22224:21;;;22281:2;22261:18;;;22254:30;22320:27;22315:2;22300:18;;22293:55;22380:2;22365:18;;22214:175::o;22394:401::-;22596:2;22578:21;;;22635:2;22615:18;;;22608:30;22674:34;22669:2;22654:18;;22647:62;-1:-1:-1;;;22740:2:1;22725:18;;22718:35;22785:3;22770:19;;22568:227::o;22800:414::-;23002:2;22984:21;;;23041:2;23021:18;;;23014:30;23080:34;23075:2;23060:18;;23053:62;-1:-1:-1;;;23146:2:1;23131:18;;23124:48;23204:3;23189:19;;22974:240::o;23219:399::-;23421:2;23403:21;;;23460:2;23440:18;;;23433:30;23499:34;23494:2;23479:18;;23472:62;-1:-1:-1;;;23565:2:1;23550:18;;23543:33;23608:3;23593:19;;23393:225::o;23623:344::-;23825:2;23807:21;;;23864:2;23844:18;;;23837:30;-1:-1:-1;;;23898:2:1;23883:18;;23876:50;23958:2;23943:18;;23797:170::o;23972:406::-;24174:2;24156:21;;;24213:2;24193:18;;;24186:30;24252:34;24247:2;24232:18;;24225:62;-1:-1:-1;;;24318:2:1;24303:18;;24296:40;24368:3;24353:19;;24146:232::o;24383:348::-;24585:2;24567:21;;;24624:2;24604:18;;;24597:30;24663:26;24658:2;24643:18;;24636:54;24722:2;24707:18;;24557:174::o;24736:408::-;24938:2;24920:21;;;24977:2;24957:18;;;24950:30;25016:34;25011:2;24996:18;;24989:62;-1:-1:-1;;;25082:2:1;25067:18;;25060:42;25134:3;25119:19;;24910:234::o;25149:339::-;25351:2;25333:21;;;25390:2;25370:18;;;25363:30;-1:-1:-1;;;25424:2:1;25409:18;;25402:45;25479:2;25464:18;;25323:165::o;25493:405::-;25695:2;25677:21;;;25734:2;25714:18;;;25707:30;25773:34;25768:2;25753:18;;25746:62;-1:-1:-1;;;25839:2:1;25824:18;;25817:39;25888:3;25873:19;;25667:231::o;25903:405::-;26105:2;26087:21;;;26144:2;26124:18;;;26117:30;26183:34;26178:2;26163:18;;26156:62;-1:-1:-1;;;26249:2:1;26234:18;;26227:39;26298:3;26283:19;;26077:231::o;26313:404::-;26515:2;26497:21;;;26554:2;26534:18;;;26527:30;26593:34;26588:2;26573:18;;26566:62;-1:-1:-1;;;26659:2:1;26644:18;;26637:38;26707:3;26692:19;;26487:230::o;26722:397::-;26924:2;26906:21;;;26963:2;26943:18;;;26936:30;27002:34;26997:2;26982:18;;26975:62;-1:-1:-1;;;27068:2:1;27053:18;;27046:31;27109:3;27094:19;;26896:223::o;27124:352::-;27326:2;27308:21;;;27365:2;27345:18;;;27338:30;27404;27399:2;27384:18;;27377:58;27467:2;27452:18;;27298:178::o;27481:177::-;27627:25;;;27615:2;27600:18;;27582:76::o;27663:248::-;27837:25;;;27893:2;27878:18;;27871:34;27825:2;27810:18;;27792:119::o;27916:251::-;27986:2;27980:9;28016:17;;;28063:18;28048:34;;28084:22;;;28045:62;28042:2;;;28110:18;;:::i;:::-;28146:2;28139:22;27960:207;;-1:-1:-1;27960:207:1:o;28172:192::-;;28271:18;28263:6;28260:30;28257:2;;;28293:18;;:::i;:::-;-1:-1:-1;28353:4:1;28334:17;;;28330:28;;28247:117::o;28369:128::-;;28440:1;28436:6;28433:1;28430:13;28427:2;;;28446:18;;:::i;:::-;-1:-1:-1;28482:9:1;;28417:80::o;28502:217::-;;28568:1;28558:2;;-1:-1:-1;;;28593:31:1;;28647:4;28644:1;28637:15;28675:4;28600:1;28665:15;28558:2;-1:-1:-1;28704:9:1;;28548:171::o;28724:168::-;;28830:1;28826;28822:6;28818:14;28815:1;28812:21;28807:1;28800:9;28793:17;28789:45;28786:2;;;28837:18;;:::i;:::-;-1:-1:-1;28877:9:1;;28776:116::o;28897:125::-;;28965:1;28962;28959:8;28956:2;;;28970:18;;:::i;:::-;-1:-1:-1;29007:9:1;;28946:76::o;29027:380::-;29112:1;29102:12;;29159:1;29149:12;;;29170:2;;29224:4;29216:6;29212:17;29202:27;;29170:2;29277;29269:6;29266:14;29246:18;29243:38;29240:2;;;29323:10;29318:3;29314:20;29311:1;29304:31;29358:4;29355:1;29348:15;29386:4;29383:1;29376:15;29240:2;;29082:325;;;:::o;29412:135::-;;-1:-1:-1;;29472:17:1;;29469:2;;;29492:18;;:::i;:::-;-1:-1:-1;29539:1:1;29528:13;;29459:88::o;29552:127::-;29613:10;29608:3;29604:20;29601:1;29594:31;29644:4;29641:1;29634:15;29668:4;29665:1;29658:15;29684:127;29745:10;29740:3;29736:20;29733:1;29726:31;29776:4;29773:1;29766:15;29800:4;29797:1;29790:15;29816:88;29891:3;29887:15;;29873:31::o;29909:764::-;;29990:4;29972:16;29969:26;29966:2;;;29998:5;;29966:2;30039:1;30034:3;30029;30014:27;30101:10;30063:36;30094:3;30088:10;30063:36;:::i;:::-;30060:52;30050:2;;30116:5;;30050:2;30150;30144:9;30190:16;-1:-1:-1;;30186:29:1;30183:1;30144:9;30162:54;30245:4;30239:11;30269:16;30304:18;30375:2;30368:4;30360:6;30356:17;30353:25;30348:2;30340:6;30337:14;30334:45;30331:2;;;30382:5;;;;;;30331:2;30419:6;30413:4;30409:17;30398:28;;30455:3;30449:10;30435:24;;30482:2;30474:6;30471:14;30468:2;;;30488:5;;;;;;30468:2;;30549:16;30543:4;30539:27;30532:4;30523:6;30518:3;30514:16;30510:27;30507:60;30504:2;;;30570:5;;;;;30504:2;30635;30614:15;-1:-1:-1;;30610:29:1;30601:39;;30642:4;30597:50;30593:2;30586:62;30605:3;-1:-1:-1;;29956:717:1;:::o;30678:133::-;-1:-1:-1;;;;;30755:31:1;;30745:42;;30735:2;;30801:1;30798;30791:12;30816:120;30904:5;30897:13;30890:21;30883:5;30880:32;30870:2;;30926:1;30923;30916:12;30941:133;-1:-1:-1;;;;;;31017:32:1;;31007:43;;30997:2;;31064:1;31061;31054:12
Swarm Source
ipfs://a6124cd422264b8adaa1c43f5e60fadac16b956dcce634e582b1df0a9f3778f5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.