ERC-1155
Overview
Max Total Supply
491 BDART
Holders
291
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:
BabyDoodleArt
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-08 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.4; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol /** * @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: @openzeppelin/contracts/token/ERC1155/IERC1155.sol /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.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; // 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() { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.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; } } /** * @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; } } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } contract BabyDoodleArt is ERC1155, Ownable { string public constant name = "Baby Doodle Art"; string public constant symbol = "BDART"; using SafeMath for uint256; using Strings for uint256; uint256 public totalSupply = 0; string private baseURI; string private blindURI; uint256 public constant BUY_LIMIT_PER_TX = 15; uint256 public constant MAX_NFT_PUBLIC = 8799; uint256 private constant MAX_NFT = 8999; uint256 public constant maxGiveaway=200; uint256 public NFTPrice = 80000000000000000; // 0.08 ETH bool public reveal; bool public isActive; bool public isPresaleActive; bytes32 public root; uint256 public constant WHITELIST_MAX_MINT = 15; mapping(address => uint256) private whiteListClaimed; uint256 public giveawayCount; /* * Function to reveal all NFTs */ function revealNow() external onlyOwner { reveal = true; } /* * Function to mint NFTs */ function mint(address to, uint32 count) internal { if (count > 1) { uint256[] memory ids = new uint256[](uint256(count)); uint256[] memory amounts = new uint256[](uint256(count)); for (uint32 i = 0; i < count; i++) { ids[i] = totalSupply + i; amounts[i] = 1; } _mintBatch(to, ids, amounts, ""); } else { _mint(to, totalSupply, 1, ""); } totalSupply += count; } /* * Function setIsActive to activate/desactivate the smart contract */ function setIsActive( bool _isActive ) external onlyOwner { isActive = _isActive; } /* * Function setPresaleActive to activate/desactivate the presale */ function setPresaleActive( bool _isActive ) external onlyOwner { if(_isActive==true){ NFTPrice=80000000000000000; // 0.08 ETH }else{ NFTPrice=100000000000000000; // 0.1 ETH } isPresaleActive = _isActive; } /* * Function to set Base and Blind URI */ function setURIs( string memory _blindURI, string memory _URI ) external onlyOwner { blindURI = _blindURI; baseURI = _URI; } /* * Function to withdraw collected amount during minting by the owner */ function withdraw( ) public onlyOwner { address[3] memory addresses = [ 0xE9E7d48F3a373c00844B5412951F7fd9D9605eE6, 0xfbc7A660e4820DE480Cfdf65CfEaE6dE317aD0ca, 0xBF3227FdE241CF0cff652f8c4BfC99724140e7b6 ]; uint32[3] memory shares = [ uint32(4750), uint32(4750), uint32(500) ]; uint256 balance = address(this).balance; for (uint32 i = 0; i < addresses.length; i++) { uint256 amount = i == addresses.length - 1 ? address(this).balance : balance * shares[i] / 10000; payable(addresses[i]).transfer(amount); } } /* * Function to withdraw collected amount during minting by the owner */ function emergencyWithdraw( address _to ) public onlyOwner { uint balance = address(this).balance; require(balance > 0, "Balance should be more then zero"); payable(_to).transfer(balance); } /* * Function to mint new NFTs during the public sale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFT( uint32 _numOfTokens ) public payable { require(isActive, 'Contract is not active'); require(!isPresaleActive, 'Presale still active'); require(_numOfTokens <= BUY_LIMIT_PER_TX, "Cannot mint above limit"); require(totalSupply.add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, "Purchase would exceed max public supply of NFTs"); require( msg.value >= NFTPrice.mul(_numOfTokens), "Ether value sent is not correct"); mint(msg.sender,_numOfTokens); } /* * Function to mint new NFTs during the presale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFTDuringPresale( uint32 _numOfTokens, bytes32[] memory _proof ) public payable { require(isActive, 'Contract is not active'); require(isPresaleActive, 'Presale not active'); require(verify(_proof, bytes32(uint256(uint160(msg.sender)))), "Not whitelisted"); require(totalSupply.sub(giveawayCount) < MAX_NFT_PUBLIC, 'All public tokens have been minted'); require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens'); require(totalSupply.add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs'); require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed'); require( msg.value >= NFTPrice.mul(_numOfTokens), "Ether value sent is not correct"); mint(msg.sender,_numOfTokens); whiteListClaimed[msg.sender] += _numOfTokens; } /* * Function to mint all NFTs for giveaway and partnerships */ function mintByOwner( address _to ) public onlyOwner { require(giveawayCount.add(1)<=maxGiveaway,"Cannot do more giveaway"); require(totalSupply.add(1) < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); mint(_to,1); giveawayCount=giveawayCount.add(1); } /* * Function to mint all NFTs for giveaway and partnerships */ function mintMultipleByOwner( address[] memory _to ) public onlyOwner { require(totalSupply.add(_to.length) < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); require(giveawayCount.add(_to.length)<=maxGiveaway,"Cannot do that much giveaway"); for(uint256 i = 0; i < _to.length; i++){ mint(_to[i],1); } giveawayCount=giveawayCount.add(_to.length); } /* * Function to get token URI of given token ID * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC */ function uri( uint256 _tokenId ) public view virtual override returns (string memory) { require(_tokenId<totalSupply, "ERC1155Metadata: URI query for nonexistent token"); if (!reveal) { return string(abi.encodePacked(blindURI)); } else { return string(abi.encodePacked(baseURI, _tokenId.toString())); } } /* * Function to set the merkle root */ function setRoot(uint256 _root) onlyOwner() public { root = bytes32(_root); } /* * Function to verify the proof */ function verify(bytes32[] memory proof, bytes32 leaf) public view returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = sha256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = sha256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_numOfTokens","type":"uint32"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_numOfTokens","type":"uint32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060045567011c37937e08000060075534801561002157600080fd5b5061002b33610030565b610082565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612fe880620000926000396000f3fe60806040526004361061020e5760003560e01c8063715018a611610118578063d1d80f30116100a0578063e9be0f3f1161006f578063e9be0f3f146105f9578063ebf0c7171461060f578063f242432a14610625578063f2f5a7e514610645578063f2fde38b1461066557600080fd5b8063d1d80f301461057a578063e748e07c14610545578063e825417414610590578063e985e9c5146105b057600080fd5b8063a22cb465116100e7578063a22cb465146104f5578063a38bffda14610515578063a475b5dd1461052b578063aeb1676814610545578063b533731d1461055a57600080fd5b8063715018a6146104675780638da5cb5b1461047c57806395d89b41146104a4578063972a2a62146104d557600080fd5b80633f8121a21161019b5780634e1273f41161016a5780634e1273f4146103d2578063560b2608146103ff5780635f0f45b21461041257806360d938dc146104275780636ff1c9bc1461044757600080fd5b80633f8121a21461036a57806341de0e521461038a578063459ba3ae1461039d5780634cdb4400146103b257600080fd5b806318160ddd116101e257806318160ddd146102de57806322f3e2d4146102f45780632750fc78146103135780632eb2c2d6146103355780633ccfd60b1461035557600080fd5b8062fdd58e1461021357806301ffc9a71461024657806306fdde03146102765780630e89341c146102be575b600080fd5b34801561021f57600080fd5b5061023361022e36600461269b565b610685565b6040519081526020015b60405180910390f35b34801561025257600080fd5b506102666102613660046127ca565b61071c565b604051901515815260200161023d565b34801561028257600080fd5b506102b16040518060400160405280600f81526020016e1098589e48111bdbd91b1948105c9d608a1b81525081565b60405161023d9190612afa565b3480156102ca57600080fd5b506102b16102d9366004612858565b61076e565b3480156102ea57600080fd5b5061023360045481565b34801561030057600080fd5b5060085461026690610100900460ff1681565b34801561031f57600080fd5b5061033361032e366004612798565b61082d565b005b34801561034157600080fd5b5061033361035036600461256b565b610871565b34801561036157600080fd5b50610333610908565b34801561037657600080fd5b50610333610385366004612798565b610aa3565b610333610398366004612870565b610b12565b3480156103a957600080fd5b5061023360c881565b3480156103be57600080fd5b506103336103cd3660046126c4565b610cc3565b3480156103de57600080fd5b506103f26103ed3660046126f6565b610dee565b60405161023d9190612ab9565b61033361040d36600461288a565b610f4f565b34801561041e57600080fd5b50610333611250565b34801561043357600080fd5b506008546102669062010000900460ff1681565b34801561045357600080fd5b5061033361046236600461251f565b611289565b34801561047357600080fd5b5061033361133c565b34801561048857600080fd5b506003546040516001600160a01b03909116815260200161023d565b3480156104b057600080fd5b506102b160405180604001604052806005815260200164109110549560da1b81525081565b3480156104e157600080fd5b506102666104f0366004612756565b611372565b34801561050157600080fd5b50610333610510366004612672565b6114be565b34801561052157600080fd5b5061023360075481565b34801561053757600080fd5b506008546102669060ff1681565b34801561055157600080fd5b50610233600f81565b34801561056657600080fd5b5061033361057536600461251f565b611595565b34801561058657600080fd5b5061023361225f81565b34801561059c57600080fd5b506103336105ab366004612802565b611666565b3480156105bc57600080fd5b506102666105cb366004612539565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561060557600080fd5b50610233600b5481565b34801561061b57600080fd5b5061023360095481565b34801561063157600080fd5b50610333610640366004612610565b6116b7565b34801561065157600080fd5b50610333610660366004612858565b61173e565b34801561067157600080fd5b5061033361068036600461251f565b61176d565b60006001600160a01b0383166106f65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061074d57506001600160e01b031982166303a24d0760e21b145b8061076857506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060045482106107da5760405162461bcd60e51b815260206004820152603060248201527f455243313135354d657461646174613a2055524920717565727920666f72206e60448201526f37b732bc34b9ba32b73a103a37b5b2b760811b60648201526084016106ed565b60085460ff1661080c5760066040516020016107f691906129e5565b6040516020818303038152906040529050919050565b600561081783611805565b6040516020016107f69291906129f1565b919050565b6003546001600160a01b031633146108575760405162461bcd60e51b81526004016106ed90612c41565b600880549115156101000261ff0019909216919091179055565b6001600160a01b03851633148061088d575061088d85336105cb565b6108f45760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016106ed565b6109018585858585611926565b5050505050565b6003546001600160a01b031633146109325760405162461bcd60e51b81526004016106ed90612c41565b604080516060808201835273e9e7d48f3a373c00844b5412951f7fd9d9605ee6825273fbc7a660e4820de480cfdf65cfeae6de317ad0ca60208084019190915273bf3227fde241cf0cff652f8c4bfc99724140e7b6838501528351918201845261128e808352908201526101f492810192909252904760005b60038163ffffffff161015610a9d5760006109c860016003612dbc565b8263ffffffff1614610a2157612710848363ffffffff16600381106109fd57634e487b7160e01b600052603260045260246000fd5b6020020151610a129063ffffffff1685612d9d565b610a1c9190612d89565b610a23565b475b9050848263ffffffff1660038110610a4b57634e487b7160e01b600052603260045260246000fd5b60200201516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610a88573d6000803e3d6000fd5b50508080610a9590612e81565b9150506109ab565b50505050565b6003546001600160a01b03163314610acd5760405162461bcd60e51b81526004016106ed90612c41565b60018115151415610ae95767011c37937e080000600755610af6565b67016345785d8a00006007555b60088054911515620100000262ff000019909216919091179055565b600854610100900460ff16610b625760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016106ed565b60085462010000900460ff1615610bb25760405162461bcd60e51b815260206004820152601460248201527350726573616c65207374696c6c2061637469766560601b60448201526064016106ed565b600f8163ffffffff161115610c095760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d697400000000000000000060448201526064016106ed565b61225f610c33600b54610c2d8463ffffffff16600454611ade90919063ffffffff16565b90611af1565b1115610c515760405162461bcd60e51b81526004016106ed90612c76565b600754610c679063ffffffff80841690611afd16565b341015610cb65760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016106ed565b610cc03382611b09565b50565b6003546001600160a01b03163314610ced5760405162461bcd60e51b81526004016106ed90612c41565b612327610d068251600454611ade90919063ffffffff16565b10610d235760405162461bcd60e51b81526004016106ed90612b9a565b60c8610d3b8251600b54611ade90919063ffffffff16565b1115610d895760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420646f2074686174206d7563682067697665617761790000000060448201526064016106ed565b60005b8151811015610dd957610dc7828281518110610db857634e487b7160e01b600052603260045260246000fd5b60200260200101516001611b09565b80610dd181612e66565b915050610d8c565b508051600b54610de891611ade565b600b5550565b60608151835114610e535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106ed565b600083516001600160401b03811115610e7c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610ea5578160200160208202803683370190505b50905060005b8451811015610f4757610f0c858281518110610ed757634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610eff57634e487b7160e01b600052603260045260246000fd5b6020026020010151610685565b828281518110610f2c57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610f4081612e66565b9050610eab565b509392505050565b600854610100900460ff16610f9f5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016106ed565b60085462010000900460ff16610fec5760405162461bcd60e51b815260206004820152601260248201527150726573616c65206e6f742061637469766560701b60448201526064016106ed565b610ff68133611372565b6110345760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b60448201526064016106ed565b61225f61104e600b54600454611af190919063ffffffff16565b106110a65760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b60648201526084016106ed565b600f8263ffffffff1611156110fd5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360448201526064016106ed565b61225f611121600b54610c2d8563ffffffff16600454611ade90919063ffffffff16565b111561113f5760405162461bcd60e51b81526004016106ed90612c76565b336000908152600a6020526040902054600f906111659063ffffffff80861690611ade16565b11156111b35760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d617820776869746565640000000060448201526064016106ed565b6007546111c99063ffffffff80851690611afd16565b3410156112185760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016106ed565b6112223383611b09565b336000908152600a60205260408120805463ffffffff85169290611247908490612d71565b90915550505050565b6003546001600160a01b0316331461127a5760405162461bcd60e51b81526004016106ed90612c41565b6008805460ff19166001179055565b6003546001600160a01b031633146112b35760405162461bcd60e51b81526004016106ed90612c41565b47806113015760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f60448201526064016106ed565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611337573d6000803e3d6000fd5b505050565b6003546001600160a01b031633146113665760405162461bcd60e51b81526004016106ed90612c41565b6113706000611cc7565b565b600081815b84518110156114b25760008582815181106113a257634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161142b57604080516020810185905290810182905260029060600160408051601f19818403018152908290526113e4916129c9565b602060405180830381855afa158015611401573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061142491906127b2565b925061149f565b604080516020810183905290810184905260029060600160408051601f198184030181529082905261145c916129c9565b602060405180830381855afa158015611479573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061149c91906127b2565b92505b50806114aa81612e66565b915050611377565b50600954149392505050565b336001600160a01b03831614156115295760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106ed565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146115bf5760405162461bcd60e51b81526004016106ed90612c41565b600b5460c8906115d0906001611ade565b111561161e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420646f206d6f726520676976656177617900000000000000000060448201526064016106ed565b60045461232790611630906001611ade565b1061164d5760405162461bcd60e51b81526004016106ed90612b9a565b611658816001611b09565b600b54610de8906001611ade565b6003546001600160a01b031633146116905760405162461bcd60e51b81526004016106ed90612c41565b81516116a39060069060208501906122fb565b5080516113379060059060208401906122fb565b6001600160a01b0385163314806116d357506116d385336105cb565b6117315760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016106ed565b6109018585858585611d19565b6003546001600160a01b031633146117685760405162461bcd60e51b81526004016106ed90612c41565b600955565b6003546001600160a01b031633146117975760405162461bcd60e51b81526004016106ed90612c41565b6001600160a01b0381166117fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ed565b610cc081611cc7565b6060816118295750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611853578061183d81612e66565b915061184c9050600a83612d89565b915061182d565b6000816001600160401b0381111561187b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118a5576020820181803683370190505b5090505b841561191e576118ba600183612dbc565b91506118c7600a86612ea5565b6118d2906030612d71565b60f81b8183815181106118f557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611917600a86612d89565b94506118a9565b949350505050565b81518351146119475760405162461bcd60e51b81526004016106ed90612cc5565b6001600160a01b03841661196d5760405162461bcd60e51b81526004016106ed90612b55565b3360005b8451811015611a7057600085828151811061199c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106119c857634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611a185760405162461bcd60e51b81526004016106ed90612bf7565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611a55908490612d71565b9250508190555050505080611a6990612e66565b9050611971565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ac0929190612acc565b60405180910390a4611ad6818787878787611e3f565b505050505050565b6000611aea8284612d71565b9392505050565b6000611aea8284612dbc565b6000611aea8284612d9d565b60018163ffffffff161115611c915760008163ffffffff166001600160401b03811115611b4657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b6f578160200160208202803683370190505b50905060008263ffffffff166001600160401b03811115611ba057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611bc9578160200160208202803683370190505b50905060005b8363ffffffff168163ffffffff161015611c6e578063ffffffff16600454611bf79190612d71565b838263ffffffff1681518110611c1d57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506001828263ffffffff1681518110611c5157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611c6681612e81565b915050611bcf565b50611c8a84838360405180602001604052806000815250611faa565b5050611caf565b611caf82600454600160405180602001604052806000815250612111565b8063ffffffff16600460008282546112479190612d71565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611d3f5760405162461bcd60e51b81526004016106ed90612b55565b33611d58818787611d4f886121d8565b610901886121d8565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611d995760405162461bcd60e51b81526004016106ed90612bf7565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611dd6908490612d71565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e36828888888888612231565b50505050505050565b6001600160a01b0384163b15611ad65760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e839089908990889088908890600401612a16565b602060405180830381600087803b158015611e9d57600080fd5b505af1925050508015611ecd575060408051601f3d908101601f19168201909252611eca918101906127e6565b60015b611f7a57611ed9612efb565b806308c379a01415611f135750611eee612f13565b80611ef95750611f15565b8060405162461bcd60e51b81526004016106ed9190612afa565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106ed565b6001600160e01b0319811663bc197c8160e01b14611e365760405162461bcd60e51b81526004016106ed90612b0d565b6001600160a01b038416611fd05760405162461bcd60e51b81526004016106ed90612d0d565b8151835114611ff15760405162461bcd60e51b81526004016106ed90612cc5565b3360005b84518110156120a95783818151811061201e57634e487b7160e01b600052603260045260246000fd5b602002602001015160008087848151811061204957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546120919190612d71565b909155508190506120a181612e66565b915050611ff5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516120fa929190612acc565b60405180910390a461090181600087878787611e3f565b6001600160a01b0384166121375760405162461bcd60e51b81526004016106ed90612d0d565b3361214881600087611d4f886121d8565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612178908490612d71565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461090181600087878787612231565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061222057634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b15611ad65760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906122759089908990889088908890600401612a74565b602060405180830381600087803b15801561228f57600080fd5b505af19250505080156122bf575060408051601f3d908101601f191682019092526122bc918101906127e6565b60015b6122cb57611ed9612efb565b6001600160e01b0319811663f23a6e6160e01b14611e365760405162461bcd60e51b81526004016106ed90612b0d565b82805461230790612dff565b90600052602060002090601f016020900481019282612329576000855561236f565b82601f1061234257805160ff191683800117855561236f565b8280016001018555821561236f579182015b8281111561236f578251825591602001919060010190612354565b5061237b92915061237f565b5090565b5b8082111561237b5760008155600101612380565b80356001600160a01b038116811461082857600080fd5b600082601f8301126123bb578081fd5b813560206123c882612d4e565b6040516123d58282612e3a565b8381528281019150858301600585901b870184018810156123f4578586fd5b855b858110156124195761240782612394565b845292840192908401906001016123f6565b5090979650505050505050565b600082601f830112612436578081fd5b8135602061244382612d4e565b6040516124508282612e3a565b8381528281019150858301600585901b8701840188101561246f578586fd5b855b8581101561241957813584529284019290840190600101612471565b8035801515811461082857600080fd5b600082601f8301126124ad578081fd5b81356001600160401b038111156124c6576124c6612ee5565b6040516124dd601f8301601f191660200182612e3a565b8181528460208386010111156124f1578283fd5b816020850160208301379081016020019190915292915050565b803563ffffffff8116811461082857600080fd5b600060208284031215612530578081fd5b611aea82612394565b6000806040838503121561254b578081fd5b61255483612394565b915061256260208401612394565b90509250929050565b600080600080600060a08688031215612582578081fd5b61258b86612394565b945061259960208701612394565b935060408601356001600160401b03808211156125b4578283fd5b6125c089838a01612426565b945060608801359150808211156125d5578283fd5b6125e189838a01612426565b935060808801359150808211156125f6578283fd5b506126038882890161249d565b9150509295509295909350565b600080600080600060a08688031215612627578081fd5b61263086612394565b945061263e60208701612394565b9350604086013592506060860135915060808601356001600160401b03811115612666578182fd5b6126038882890161249d565b60008060408385031215612684578081fd5b61268d83612394565b91506125626020840161248d565b600080604083850312156126ad578182fd5b6126b683612394565b946020939093013593505050565b6000602082840312156126d5578081fd5b81356001600160401b038111156126ea578182fd5b61191e848285016123ab565b60008060408385031215612708578182fd5b82356001600160401b038082111561271e578384fd5b61272a868387016123ab565b9350602085013591508082111561273f578283fd5b5061274c85828601612426565b9150509250929050565b60008060408385031215612768578182fd5b82356001600160401b0381111561277d578283fd5b61278985828601612426565b95602094909401359450505050565b6000602082840312156127a9578081fd5b611aea8261248d565b6000602082840312156127c3578081fd5b5051919050565b6000602082840312156127db578081fd5b8135611aea81612f9c565b6000602082840312156127f7578081fd5b8151611aea81612f9c565b60008060408385031215612814578182fd5b82356001600160401b038082111561282a578384fd5b6128368683870161249d565b9350602085013591508082111561284b578283fd5b5061274c8582860161249d565b600060208284031215612869578081fd5b5035919050565b600060208284031215612881578081fd5b611aea8261250b565b6000806040838503121561289c578182fd5b6128a58361250b565b915060208301356001600160401b038111156128bf578182fd5b61274c85828601612426565b6000815180845260208085019450808401835b838110156128fa578151875295820195908201906001016128de565b509495945050505050565b6000815180845261291d816020860160208601612dd3565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061294b57607f831692505b602080841082141561296b57634e487b7160e01b86526022600452602486fd5b81801561297f5760018114612990576129bd565b60ff198616895284890196506129bd565b60008881526020902060005b868110156129b55781548b82015290850190830161299c565b505084890196505b50505050505092915050565b600082516129db818460208701612dd3565b9190910192915050565b6000611aea8284612931565b60006129fd8285612931565b8351612a0d818360208801612dd3565b01949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612a42908301866128cb565b8281036060840152612a5481866128cb565b90508281036080840152612a688185612905565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612aae90830184612905565b979650505050505050565b602081526000611aea60208301846128cb565b604081526000612adf60408301856128cb565b8281036020840152612af181856128cb565b95945050505050565b602081526000611aea6020830184612905565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526038908201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360408201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60006001600160401b03821115612d6757612d67612ee5565b5060051b60200190565b60008219821115612d8457612d84612eb9565b500190565b600082612d9857612d98612ecf565b500490565b6000816000190483118215151615612db757612db7612eb9565b500290565b600082821015612dce57612dce612eb9565b500390565b60005b83811015612dee578181015183820152602001612dd6565b83811115610a9d5750506000910152565b600181811c90821680612e1357607f821691505b60208210811415612e3457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612e5f57612e5f612ee5565b6040525050565b6000600019821415612e7a57612e7a612eb9565b5060010190565b600063ffffffff80831681811415612e9b57612e9b612eb9565b6001019392505050565b600082612eb457612eb4612ecf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612f1057600481823e5160e01c5b90565b600060443d1015612f215790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612f5057505050505090565b8285019150815181811115612f685750505050505090565b843d8701016020828501011115612f825750505050505090565b612f9160208286010187612e3a565b509095945050505050565b6001600160e01b031981168114610cc057600080fdfea264697066735822122066089886b3e4332272fb093a2f9c323316684ac46dab82f350ad9cb04c470a4364736f6c63430008040033
Deployed Bytecode
0x60806040526004361061020e5760003560e01c8063715018a611610118578063d1d80f30116100a0578063e9be0f3f1161006f578063e9be0f3f146105f9578063ebf0c7171461060f578063f242432a14610625578063f2f5a7e514610645578063f2fde38b1461066557600080fd5b8063d1d80f301461057a578063e748e07c14610545578063e825417414610590578063e985e9c5146105b057600080fd5b8063a22cb465116100e7578063a22cb465146104f5578063a38bffda14610515578063a475b5dd1461052b578063aeb1676814610545578063b533731d1461055a57600080fd5b8063715018a6146104675780638da5cb5b1461047c57806395d89b41146104a4578063972a2a62146104d557600080fd5b80633f8121a21161019b5780634e1273f41161016a5780634e1273f4146103d2578063560b2608146103ff5780635f0f45b21461041257806360d938dc146104275780636ff1c9bc1461044757600080fd5b80633f8121a21461036a57806341de0e521461038a578063459ba3ae1461039d5780634cdb4400146103b257600080fd5b806318160ddd116101e257806318160ddd146102de57806322f3e2d4146102f45780632750fc78146103135780632eb2c2d6146103355780633ccfd60b1461035557600080fd5b8062fdd58e1461021357806301ffc9a71461024657806306fdde03146102765780630e89341c146102be575b600080fd5b34801561021f57600080fd5b5061023361022e36600461269b565b610685565b6040519081526020015b60405180910390f35b34801561025257600080fd5b506102666102613660046127ca565b61071c565b604051901515815260200161023d565b34801561028257600080fd5b506102b16040518060400160405280600f81526020016e1098589e48111bdbd91b1948105c9d608a1b81525081565b60405161023d9190612afa565b3480156102ca57600080fd5b506102b16102d9366004612858565b61076e565b3480156102ea57600080fd5b5061023360045481565b34801561030057600080fd5b5060085461026690610100900460ff1681565b34801561031f57600080fd5b5061033361032e366004612798565b61082d565b005b34801561034157600080fd5b5061033361035036600461256b565b610871565b34801561036157600080fd5b50610333610908565b34801561037657600080fd5b50610333610385366004612798565b610aa3565b610333610398366004612870565b610b12565b3480156103a957600080fd5b5061023360c881565b3480156103be57600080fd5b506103336103cd3660046126c4565b610cc3565b3480156103de57600080fd5b506103f26103ed3660046126f6565b610dee565b60405161023d9190612ab9565b61033361040d36600461288a565b610f4f565b34801561041e57600080fd5b50610333611250565b34801561043357600080fd5b506008546102669062010000900460ff1681565b34801561045357600080fd5b5061033361046236600461251f565b611289565b34801561047357600080fd5b5061033361133c565b34801561048857600080fd5b506003546040516001600160a01b03909116815260200161023d565b3480156104b057600080fd5b506102b160405180604001604052806005815260200164109110549560da1b81525081565b3480156104e157600080fd5b506102666104f0366004612756565b611372565b34801561050157600080fd5b50610333610510366004612672565b6114be565b34801561052157600080fd5b5061023360075481565b34801561053757600080fd5b506008546102669060ff1681565b34801561055157600080fd5b50610233600f81565b34801561056657600080fd5b5061033361057536600461251f565b611595565b34801561058657600080fd5b5061023361225f81565b34801561059c57600080fd5b506103336105ab366004612802565b611666565b3480156105bc57600080fd5b506102666105cb366004612539565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561060557600080fd5b50610233600b5481565b34801561061b57600080fd5b5061023360095481565b34801561063157600080fd5b50610333610640366004612610565b6116b7565b34801561065157600080fd5b50610333610660366004612858565b61173e565b34801561067157600080fd5b5061033361068036600461251f565b61176d565b60006001600160a01b0383166106f65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061074d57506001600160e01b031982166303a24d0760e21b145b8061076857506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060045482106107da5760405162461bcd60e51b815260206004820152603060248201527f455243313135354d657461646174613a2055524920717565727920666f72206e60448201526f37b732bc34b9ba32b73a103a37b5b2b760811b60648201526084016106ed565b60085460ff1661080c5760066040516020016107f691906129e5565b6040516020818303038152906040529050919050565b600561081783611805565b6040516020016107f69291906129f1565b919050565b6003546001600160a01b031633146108575760405162461bcd60e51b81526004016106ed90612c41565b600880549115156101000261ff0019909216919091179055565b6001600160a01b03851633148061088d575061088d85336105cb565b6108f45760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016106ed565b6109018585858585611926565b5050505050565b6003546001600160a01b031633146109325760405162461bcd60e51b81526004016106ed90612c41565b604080516060808201835273e9e7d48f3a373c00844b5412951f7fd9d9605ee6825273fbc7a660e4820de480cfdf65cfeae6de317ad0ca60208084019190915273bf3227fde241cf0cff652f8c4bfc99724140e7b6838501528351918201845261128e808352908201526101f492810192909252904760005b60038163ffffffff161015610a9d5760006109c860016003612dbc565b8263ffffffff1614610a2157612710848363ffffffff16600381106109fd57634e487b7160e01b600052603260045260246000fd5b6020020151610a129063ffffffff1685612d9d565b610a1c9190612d89565b610a23565b475b9050848263ffffffff1660038110610a4b57634e487b7160e01b600052603260045260246000fd5b60200201516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610a88573d6000803e3d6000fd5b50508080610a9590612e81565b9150506109ab565b50505050565b6003546001600160a01b03163314610acd5760405162461bcd60e51b81526004016106ed90612c41565b60018115151415610ae95767011c37937e080000600755610af6565b67016345785d8a00006007555b60088054911515620100000262ff000019909216919091179055565b600854610100900460ff16610b625760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016106ed565b60085462010000900460ff1615610bb25760405162461bcd60e51b815260206004820152601460248201527350726573616c65207374696c6c2061637469766560601b60448201526064016106ed565b600f8163ffffffff161115610c095760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d697400000000000000000060448201526064016106ed565b61225f610c33600b54610c2d8463ffffffff16600454611ade90919063ffffffff16565b90611af1565b1115610c515760405162461bcd60e51b81526004016106ed90612c76565b600754610c679063ffffffff80841690611afd16565b341015610cb65760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016106ed565b610cc03382611b09565b50565b6003546001600160a01b03163314610ced5760405162461bcd60e51b81526004016106ed90612c41565b612327610d068251600454611ade90919063ffffffff16565b10610d235760405162461bcd60e51b81526004016106ed90612b9a565b60c8610d3b8251600b54611ade90919063ffffffff16565b1115610d895760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420646f2074686174206d7563682067697665617761790000000060448201526064016106ed565b60005b8151811015610dd957610dc7828281518110610db857634e487b7160e01b600052603260045260246000fd5b60200260200101516001611b09565b80610dd181612e66565b915050610d8c565b508051600b54610de891611ade565b600b5550565b60608151835114610e535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106ed565b600083516001600160401b03811115610e7c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610ea5578160200160208202803683370190505b50905060005b8451811015610f4757610f0c858281518110610ed757634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610eff57634e487b7160e01b600052603260045260246000fd5b6020026020010151610685565b828281518110610f2c57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610f4081612e66565b9050610eab565b509392505050565b600854610100900460ff16610f9f5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b60448201526064016106ed565b60085462010000900460ff16610fec5760405162461bcd60e51b815260206004820152601260248201527150726573616c65206e6f742061637469766560701b60448201526064016106ed565b610ff68133611372565b6110345760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b60448201526064016106ed565b61225f61104e600b54600454611af190919063ffffffff16565b106110a65760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b60648201526084016106ed565b600f8263ffffffff1611156110fd5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360448201526064016106ed565b61225f611121600b54610c2d8563ffffffff16600454611ade90919063ffffffff16565b111561113f5760405162461bcd60e51b81526004016106ed90612c76565b336000908152600a6020526040902054600f906111659063ffffffff80861690611ade16565b11156111b35760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d617820776869746565640000000060448201526064016106ed565b6007546111c99063ffffffff80851690611afd16565b3410156112185760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016106ed565b6112223383611b09565b336000908152600a60205260408120805463ffffffff85169290611247908490612d71565b90915550505050565b6003546001600160a01b0316331461127a5760405162461bcd60e51b81526004016106ed90612c41565b6008805460ff19166001179055565b6003546001600160a01b031633146112b35760405162461bcd60e51b81526004016106ed90612c41565b47806113015760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f60448201526064016106ed565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611337573d6000803e3d6000fd5b505050565b6003546001600160a01b031633146113665760405162461bcd60e51b81526004016106ed90612c41565b6113706000611cc7565b565b600081815b84518110156114b25760008582815181106113a257634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161142b57604080516020810185905290810182905260029060600160408051601f19818403018152908290526113e4916129c9565b602060405180830381855afa158015611401573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061142491906127b2565b925061149f565b604080516020810183905290810184905260029060600160408051601f198184030181529082905261145c916129c9565b602060405180830381855afa158015611479573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061149c91906127b2565b92505b50806114aa81612e66565b915050611377565b50600954149392505050565b336001600160a01b03831614156115295760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106ed565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146115bf5760405162461bcd60e51b81526004016106ed90612c41565b600b5460c8906115d0906001611ade565b111561161e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420646f206d6f726520676976656177617900000000000000000060448201526064016106ed565b60045461232790611630906001611ade565b1061164d5760405162461bcd60e51b81526004016106ed90612b9a565b611658816001611b09565b600b54610de8906001611ade565b6003546001600160a01b031633146116905760405162461bcd60e51b81526004016106ed90612c41565b81516116a39060069060208501906122fb565b5080516113379060059060208401906122fb565b6001600160a01b0385163314806116d357506116d385336105cb565b6117315760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016106ed565b6109018585858585611d19565b6003546001600160a01b031633146117685760405162461bcd60e51b81526004016106ed90612c41565b600955565b6003546001600160a01b031633146117975760405162461bcd60e51b81526004016106ed90612c41565b6001600160a01b0381166117fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ed565b610cc081611cc7565b6060816118295750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611853578061183d81612e66565b915061184c9050600a83612d89565b915061182d565b6000816001600160401b0381111561187b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118a5576020820181803683370190505b5090505b841561191e576118ba600183612dbc565b91506118c7600a86612ea5565b6118d2906030612d71565b60f81b8183815181106118f557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611917600a86612d89565b94506118a9565b949350505050565b81518351146119475760405162461bcd60e51b81526004016106ed90612cc5565b6001600160a01b03841661196d5760405162461bcd60e51b81526004016106ed90612b55565b3360005b8451811015611a7057600085828151811061199c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008583815181106119c857634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611a185760405162461bcd60e51b81526004016106ed90612bf7565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611a55908490612d71565b9250508190555050505080611a6990612e66565b9050611971565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ac0929190612acc565b60405180910390a4611ad6818787878787611e3f565b505050505050565b6000611aea8284612d71565b9392505050565b6000611aea8284612dbc565b6000611aea8284612d9d565b60018163ffffffff161115611c915760008163ffffffff166001600160401b03811115611b4657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b6f578160200160208202803683370190505b50905060008263ffffffff166001600160401b03811115611ba057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611bc9578160200160208202803683370190505b50905060005b8363ffffffff168163ffffffff161015611c6e578063ffffffff16600454611bf79190612d71565b838263ffffffff1681518110611c1d57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506001828263ffffffff1681518110611c5157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611c6681612e81565b915050611bcf565b50611c8a84838360405180602001604052806000815250611faa565b5050611caf565b611caf82600454600160405180602001604052806000815250612111565b8063ffffffff16600460008282546112479190612d71565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611d3f5760405162461bcd60e51b81526004016106ed90612b55565b33611d58818787611d4f886121d8565b610901886121d8565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611d995760405162461bcd60e51b81526004016106ed90612bf7565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611dd6908490612d71565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e36828888888888612231565b50505050505050565b6001600160a01b0384163b15611ad65760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e839089908990889088908890600401612a16565b602060405180830381600087803b158015611e9d57600080fd5b505af1925050508015611ecd575060408051601f3d908101601f19168201909252611eca918101906127e6565b60015b611f7a57611ed9612efb565b806308c379a01415611f135750611eee612f13565b80611ef95750611f15565b8060405162461bcd60e51b81526004016106ed9190612afa565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106ed565b6001600160e01b0319811663bc197c8160e01b14611e365760405162461bcd60e51b81526004016106ed90612b0d565b6001600160a01b038416611fd05760405162461bcd60e51b81526004016106ed90612d0d565b8151835114611ff15760405162461bcd60e51b81526004016106ed90612cc5565b3360005b84518110156120a95783818151811061201e57634e487b7160e01b600052603260045260246000fd5b602002602001015160008087848151811061204957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546120919190612d71565b909155508190506120a181612e66565b915050611ff5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516120fa929190612acc565b60405180910390a461090181600087878787611e3f565b6001600160a01b0384166121375760405162461bcd60e51b81526004016106ed90612d0d565b3361214881600087611d4f886121d8565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612178908490612d71565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461090181600087878787612231565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061222057634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b15611ad65760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906122759089908990889088908890600401612a74565b602060405180830381600087803b15801561228f57600080fd5b505af19250505080156122bf575060408051601f3d908101601f191682019092526122bc918101906127e6565b60015b6122cb57611ed9612efb565b6001600160e01b0319811663f23a6e6160e01b14611e365760405162461bcd60e51b81526004016106ed90612b0d565b82805461230790612dff565b90600052602060002090601f016020900481019282612329576000855561236f565b82601f1061234257805160ff191683800117855561236f565b8280016001018555821561236f579182015b8281111561236f578251825591602001919060010190612354565b5061237b92915061237f565b5090565b5b8082111561237b5760008155600101612380565b80356001600160a01b038116811461082857600080fd5b600082601f8301126123bb578081fd5b813560206123c882612d4e565b6040516123d58282612e3a565b8381528281019150858301600585901b870184018810156123f4578586fd5b855b858110156124195761240782612394565b845292840192908401906001016123f6565b5090979650505050505050565b600082601f830112612436578081fd5b8135602061244382612d4e565b6040516124508282612e3a565b8381528281019150858301600585901b8701840188101561246f578586fd5b855b8581101561241957813584529284019290840190600101612471565b8035801515811461082857600080fd5b600082601f8301126124ad578081fd5b81356001600160401b038111156124c6576124c6612ee5565b6040516124dd601f8301601f191660200182612e3a565b8181528460208386010111156124f1578283fd5b816020850160208301379081016020019190915292915050565b803563ffffffff8116811461082857600080fd5b600060208284031215612530578081fd5b611aea82612394565b6000806040838503121561254b578081fd5b61255483612394565b915061256260208401612394565b90509250929050565b600080600080600060a08688031215612582578081fd5b61258b86612394565b945061259960208701612394565b935060408601356001600160401b03808211156125b4578283fd5b6125c089838a01612426565b945060608801359150808211156125d5578283fd5b6125e189838a01612426565b935060808801359150808211156125f6578283fd5b506126038882890161249d565b9150509295509295909350565b600080600080600060a08688031215612627578081fd5b61263086612394565b945061263e60208701612394565b9350604086013592506060860135915060808601356001600160401b03811115612666578182fd5b6126038882890161249d565b60008060408385031215612684578081fd5b61268d83612394565b91506125626020840161248d565b600080604083850312156126ad578182fd5b6126b683612394565b946020939093013593505050565b6000602082840312156126d5578081fd5b81356001600160401b038111156126ea578182fd5b61191e848285016123ab565b60008060408385031215612708578182fd5b82356001600160401b038082111561271e578384fd5b61272a868387016123ab565b9350602085013591508082111561273f578283fd5b5061274c85828601612426565b9150509250929050565b60008060408385031215612768578182fd5b82356001600160401b0381111561277d578283fd5b61278985828601612426565b95602094909401359450505050565b6000602082840312156127a9578081fd5b611aea8261248d565b6000602082840312156127c3578081fd5b5051919050565b6000602082840312156127db578081fd5b8135611aea81612f9c565b6000602082840312156127f7578081fd5b8151611aea81612f9c565b60008060408385031215612814578182fd5b82356001600160401b038082111561282a578384fd5b6128368683870161249d565b9350602085013591508082111561284b578283fd5b5061274c8582860161249d565b600060208284031215612869578081fd5b5035919050565b600060208284031215612881578081fd5b611aea8261250b565b6000806040838503121561289c578182fd5b6128a58361250b565b915060208301356001600160401b038111156128bf578182fd5b61274c85828601612426565b6000815180845260208085019450808401835b838110156128fa578151875295820195908201906001016128de565b509495945050505050565b6000815180845261291d816020860160208601612dd3565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061294b57607f831692505b602080841082141561296b57634e487b7160e01b86526022600452602486fd5b81801561297f5760018114612990576129bd565b60ff198616895284890196506129bd565b60008881526020902060005b868110156129b55781548b82015290850190830161299c565b505084890196505b50505050505092915050565b600082516129db818460208701612dd3565b9190910192915050565b6000611aea8284612931565b60006129fd8285612931565b8351612a0d818360208801612dd3565b01949350505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612a42908301866128cb565b8281036060840152612a5481866128cb565b90508281036080840152612a688185612905565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612aae90830184612905565b979650505050505050565b602081526000611aea60208301846128cb565b604081526000612adf60408301856128cb565b8281036020840152612af181856128cb565b95945050505050565b602081526000611aea6020830184612905565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526038908201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360408201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60006001600160401b03821115612d6757612d67612ee5565b5060051b60200190565b60008219821115612d8457612d84612eb9565b500190565b600082612d9857612d98612ecf565b500490565b6000816000190483118215151615612db757612db7612eb9565b500290565b600082821015612dce57612dce612eb9565b500390565b60005b83811015612dee578181015183820152602001612dd6565b83811115610a9d5750506000910152565b600181811c90821680612e1357607f821691505b60208210811415612e3457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612e5f57612e5f612ee5565b6040525050565b6000600019821415612e7a57612e7a612eb9565b5060010190565b600063ffffffff80831681811415612e9b57612e9b612eb9565b6001019392505050565b600082612eb457612eb4612ecf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612f1057600481823e5160e01c5b90565b600060443d1015612f215790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612f5057505050505090565b8285019150815181811115612f685750505050505090565b843d8701016020828501011115612f825750505050505090565b612f9160208286010187612e3a565b509095945050505050565b6001600160e01b031981168114610cc057600080fdfea264697066735822122066089886b3e4332272fb093a2f9c323316684ac46dab82f350ad9cb04c470a4364736f6c63430008040033
Deployed Bytecode Sourcemap
42795:8180:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20809:231;;;;;;;;;;-1:-1:-1;20809:231:0;;;;;:::i;:::-;;:::i;:::-;;;15281:25:1;;;15269:2;15254:18;20809:231:0;;;;;;;;19832:310;;;;;;;;;;-1:-1:-1;19832:310:0;;;;;:::i;:::-;;:::i;:::-;;;15108:14:1;;15101:22;15083:41;;15071:2;15056:18;19832:310:0;15038:92:1;42845:47:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42845:47:0;;;;;;;;;;;;:::i;49521:441::-;;;;;;;;;;-1:-1:-1;49521:441:0;;;;;:::i;:::-;;:::i;43016:30::-;;;;;;;;;;;;;;;;43396:20;;;;;;;;;;-1:-1:-1;43396:20:0;;;;;;;;;;;44458:137;;;;;;;;;;-1:-1:-1;44458:137:0;;;;;:::i;:::-;;:::i;:::-;;22904:442;;;;;;;;;;-1:-1:-1;22904:442:0;;;;;:::i;:::-;;:::i;45380:716::-;;;;;;;;;;;;;:::i;44695:314::-;;;;;;;;;;-1:-1:-1;44695:314:0;;;;;:::i;:::-;;:::i;46621:574::-;;;;;;:::i;:::-;;:::i;43262:39::-;;;;;;;;;;;;43298:3;43262:39;;48902:471;;;;;;;;;;-1:-1:-1;48902:471:0;;;;;:::i;:::-;;:::i;21206:524::-;;;;;;;;;;-1:-1:-1;21206:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47357:1007::-;;;;;;:::i;:::-;;:::i;43683:98::-;;;;;;;;;;;;;:::i;43423:27::-;;;;;;;;;;-1:-1:-1;43423:27:0;;;;;;;;;;;46194:262;;;;;;;;;;-1:-1:-1;46194:262:0;;;;;:::i;:::-;;:::i;1362:94::-;;;;;;;;;;;;;:::i;711:87::-;;;;;;;;;;-1:-1:-1;784:6:0;;711:87;;-1:-1:-1;;;;;784:6:0;;;12749:51:1;;12737:2;12722:18;711:87:0;12704:102:1;42899:39:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42899:39:0;;;;;50186:786;;;;;;;;;;-1:-1:-1;50186:786:0;;;;;:::i;:::-;;:::i;21803:311::-;;;;;;;;;;-1:-1:-1;21803:311:0;;;;;:::i;:::-;;:::i;43308:43::-;;;;;;;;;;;;;;;;43371:18;;;;;;;;;;-1:-1:-1;43371:18:0;;;;;;;;43483:47;;;;;;;;;;;;43528:2;43483:47;;48456:354;;;;;;;;;;-1:-1:-1;48456:354:0;;;;;:::i;:::-;;:::i;43164:45::-;;;;;;;;;;;;43205:4;43164:45;;45081:197;;;;;;;;;;-1:-1:-1;45081:197:0;;;;;:::i;:::-;;:::i;22186:168::-;;;;;;;;;;-1:-1:-1;22186:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;22309:27:0;;;22285:4;22309:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;22186:168;43596:28;;;;;;;;;;;;;;;;43457:19;;;;;;;;;;;;;;;;22426:401;;;;;;;;;;-1:-1:-1;22426:401:0;;;;;:::i;:::-;;:::i;50030:91::-;;;;;;;;;;-1:-1:-1;50030:91:0;;;;;:::i;:::-;;:::i;1611:192::-;;;;;;;;;;-1:-1:-1;1611:192:0;;;;;:::i;:::-;;:::i;20809:231::-;20895:7;-1:-1:-1;;;;;20923:21:0;;20915:77;;;;-1:-1:-1;;;20915:77:0;;16573:2:1;20915:77:0;;;16555:21:1;16612:2;16592:18;;;16585:30;16651:34;16631:18;;;16624:62;-1:-1:-1;;;16702:18:1;;;16695:41;16753:19;;20915:77:0;;;;;;;;;-1:-1:-1;21010:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21010:22:0;;;;;;;;;;;;20809:231::o;19832:310::-;19934:4;-1:-1:-1;;;;;;19971:41:0;;-1:-1:-1;;;19971:41:0;;:110;;-1:-1:-1;;;;;;;20029:52:0;;-1:-1:-1;;;20029:52:0;19971:110;:163;;;-1:-1:-1;;;;;;;;;;11751:40:0;;;20098:36;19951:183;19832:310;-1:-1:-1;;19832:310:0:o;49521:441::-;49656:13;49705:11;;49696:8;:20;49688:81;;;;-1:-1:-1;;;49688:81:0;;22997:2:1;49688:81:0;;;22979:21:1;23036:2;23016:18;;;23009:30;23075:34;23055:18;;;23048:62;-1:-1:-1;;;23126:18:1;;;23119:46;23182:19;;49688:81:0;22969:238:1;49688:81:0;49785:6;;;;49780:175;;49839:8;49822:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;49808:41;;49521:441;;;:::o;49780:175::-;49913:7;49922:19;:8;:17;:19::i;:::-;49896:46;;;;;;;;;:::i;49780:175::-;49521:441;;;:::o;44458:137::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;44567:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;44567:20:0;;::::1;::::0;;;::::1;::::0;;44458:137::o;22904:442::-;-1:-1:-1;;;;;23137:20:0;;174:10;23137:20;;:60;;-1:-1:-1;23161:36:0;23178:4;174:10;22186:168;:::i;23161:36::-;23115:160;;;;-1:-1:-1;;;23115:160:0;;20686:2:1;23115:160:0;;;20668:21:1;20725:2;20705:18;;;20698:30;20764:34;20744:18;;;20737:62;-1:-1:-1;;;20815:18:1;;;20808:48;20873:19;;23115:160:0;20658:240:1;23115:160:0;23286:52;23309:4;23315:2;23319:3;23324:7;23333:4;23286:22;:52::i;:::-;22904:442;;;;;:::o;45380:716::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;45460:212:::1;::::0;;::::1;::::0;;::::1;::::0;;45505:42:::1;45460:212:::0;;45562:42:::1;45460:212;::::0;;::::1;::::0;;;;45619:42:::1;45460:212:::0;;;;45685:117;;;;::::1;::::0;;45733:4:::1;45685:117:::0;;;;;::::1;::::0;45787:3:::1;45685:117:::0;;;;;;;45460:212;45833:21:::1;45460:27;45867:222;45890:16;45886:1;:20;;;45867:222;;;45928:14;45950:20;45969:1;45950:16;:20;:::i;:::-;45945:1;:25;;;:79;;46019:5;46007:6;46014:1;46007:9;;;;;;;-1:-1:-1::0;;;46007:9:0::1;;;;;;;;;;;;::::0;45997:19:::1;::::0;::::1;;:7:::0;:19:::1;:::i;:::-;:27;;;;:::i;:::-;45945:79;;;45973:21;45945:79;45928:96;;46047:9;46057:1;46047:12;;;;;;;-1:-1:-1::0;;;46047:12:0::1;;;;;;;;;;;;;-1:-1:-1::0;;;;;46039:30:0::1;:38;46070:6;46039:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45867:222;45908:3;;;;;:::i;:::-;;;;45867:222;;;;1002:1;;;45380:716::o:0;44695:314::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;44823:4:::1;44812:15:::0;::::1;;;44809:155;;;44852:17;44843:8;:26:::0;44809:155:::1;;;44922:18;44913:8;:27:::0;44809:155:::1;44974:15;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;44974:27:0;;::::1;::::0;;;::::1;::::0;;44695:314::o;46621:574::-;46741:8;;;;;;;46733:43;;;;-1:-1:-1;;;46733:43:0;;22285:2:1;46733:43:0;;;22267:21:1;22324:2;22304:18;;;22297:30;-1:-1:-1;;;22343:18:1;;;22336:52;22405:18;;46733:43:0;22257:172:1;46733:43:0;46796:15;;;;;;;46795:16;46787:49;;;;-1:-1:-1;;;46787:49:0;;17749:2:1;46787:49:0;;;17731:21:1;17788:2;17768:18;;;17761:30;-1:-1:-1;;;17807:18:1;;;17800:50;17867:18;;46787:49:0;17721:170:1;46787:49:0;43155:2;46855:12;:32;;;;46847:68;;;;-1:-1:-1;;;46847:68:0;;18860:2:1;46847:68:0;;;18842:21:1;18899:2;18879:18;;;18872:30;18938:25;18918:18;;;18911:53;18981:18;;46847:68:0;18832:173:1;46847:68:0;43205:4;46934:48;46968:13;;46934:29;46950:12;46934:29;;:11;;:15;;:29;;;;:::i;:::-;:33;;:48::i;:::-;:66;;46926:126;;;;-1:-1:-1;;;46926:126:0;;;;;;;:::i;:::-;47085:8;;:26;;;;;;;:12;:26;:::i;:::-;47072:9;:39;;47063:84;;;;-1:-1:-1;;;47063:84:0;;19559:2:1;47063:84:0;;;19541:21:1;19598:2;19578:18;;;19571:30;19637:33;19617:18;;;19610:61;19688:18;;47063:84:0;19531:181:1;47063:84:0;47158:29;47163:10;47174:12;47158:4;:29::i;:::-;46621:574;:::o;48902:471::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;43251:4:::1;49030:27;49046:3;:10;49030:11;;:15;;:27;;;;:::i;:::-;:37;49022:106;;;;-1:-1:-1::0;;;49022:106:0::1;;;;;;;:::i;:::-;43298:3;49147:29;49165:3;:10;49147:13;;:17;;:29;;;;:::i;:::-;:42;;49139:82;;;::::0;-1:-1:-1;;;49139:82:0;;25864:2:1;49139:82:0::1;::::0;::::1;25846:21:1::0;25903:2;25883:18;;;25876:30;25942;25922:18;;;25915:58;25990:18;;49139:82:0::1;25836:178:1::0;49139:82:0::1;49236:9;49232:80;49255:3;:10;49251:1;:14;49232:80;;;49286:14;49291:3;49295:1;49291:6;;;;;;-1:-1:-1::0;;;49291:6:0::1;;;;;;;;;;;;;;;49298:1;49286:4;:14::i;:::-;49267:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49232:80;;;-1:-1:-1::0;49354:10:0;;49336:13:::1;::::0;:29:::1;::::0;:17:::1;:29::i;:::-;49322:13;:43:::0;-1:-1:-1;48902:471:0:o;21206:524::-;21362:16;21423:3;:10;21404:8;:15;:29;21396:83;;;;-1:-1:-1;;;21396:83:0;;24240:2:1;21396:83:0;;;24222:21:1;24279:2;24259:18;;;24252:30;24318:34;24298:18;;;24291:62;-1:-1:-1;;;24369:18:1;;;24362:39;24418:19;;21396:83:0;24212:231:1;21396:83:0;21492:30;21539:8;:15;-1:-1:-1;;;;;21525:30:0;;;;;-1:-1:-1;;;21525:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21525:30:0;;21492:63;;21573:9;21568:122;21592:8;:15;21588:1;:19;21568:122;;;21648:30;21658:8;21667:1;21658:11;;;;;;-1:-1:-1;;;21658:11:0;;;;;;;;;;;;;;;21671:3;21675:1;21671:6;;;;;;-1:-1:-1;;;21671:6:0;;;;;;;;;;;;;;;21648:9;:30::i;:::-;21629:13;21643:1;21629:16;;;;;;-1:-1:-1;;;21629:16:0;;;;;;;;;;;;;;;;;;:49;21609:3;;;:::i;:::-;;;21568:122;;;-1:-1:-1;21709:13:0;21206:524;-1:-1:-1;;;21206:524:0:o;47357:1007::-;47517:8;;;;;;;47509:43;;;;-1:-1:-1;;;47509:43:0;;22285:2:1;47509:43:0;;;22267:21:1;22324:2;22304:18;;;22297:30;-1:-1:-1;;;22343:18:1;;;22336:52;22405:18;;47509:43:0;22257:172:1;47509:43:0;47571:15;;;;;;;47563:46;;;;-1:-1:-1;;;47563:46:0;;19212:2:1;47563:46:0;;;19194:21:1;19251:2;19231:18;;;19224:30;-1:-1:-1;;;19270:18:1;;;19263:48;19328:18;;47563:46:0;19184:168:1;47563:46:0;47628:53;47635:6;47667:10;47628:6;:53::i;:::-;47620:81;;;;-1:-1:-1;;;47620:81:0;;21105:2:1;47620:81:0;;;21087:21:1;21144:2;21124:18;;;21117:30;-1:-1:-1;;;21163:18:1;;;21156:45;21218:18;;47620:81:0;21077:165:1;47620:81:0;43205:4;47720:30;47736:13;;47720:11;;:15;;:30;;;;:::i;:::-;:47;47712:94;;;;-1:-1:-1;;;47712:94:0;;24650:2:1;47712:94:0;;;24632:21:1;24689:2;24669:18;;;24662:30;24728:34;24708:18;;;24701:62;-1:-1:-1;;;24779:18:1;;;24772:32;24821:19;;47712:94:0;24622:224:1;47712:94:0;43528:2;47825:12;:34;;;;47817:79;;;;-1:-1:-1;;;47817:79:0;;26221:2:1;47817:79:0;;;26203:21:1;;;26240:18;;;26233:30;26299:34;26279:18;;;26272:62;26351:18;;47817:79:0;26193:182:1;47817:79:0;43205:4;47915:48;47949:13;;47915:29;47931:12;47915:29;;:11;;:15;;:29;;;;:::i;:48::-;:66;;47907:126;;;;-1:-1:-1;;;47907:126:0;;;;;;;:::i;:::-;48069:10;48052:28;;;;:16;:28;;;;;;43528:2;;48052:46;;;;;;;:32;:46;:::i;:::-;:68;;48044:109;;;;-1:-1:-1;;;48044:109:0;;16985:2:1;48044:109:0;;;16967:21:1;17024:2;17004:18;;;16997:30;17063;17043:18;;;17036:58;17111:18;;48044:109:0;16957:178:1;48044:109:0;48186:8;;:26;;;;;;;:12;:26;:::i;:::-;48173:9;:39;;48164:84;;;;-1:-1:-1;;;48164:84:0;;19559:2:1;48164:84:0;;;19541:21:1;19598:2;19578:18;;;19571:30;19637:33;19617:18;;;19610:61;19688:18;;48164:84:0;19531:181:1;48164:84:0;48259:29;48264:10;48275:12;48259:4;:29::i;:::-;48316:10;48299:28;;;;:16;:28;;;;;:44;;;;;;:28;:44;;;;;:::i;:::-;;;;-1:-1:-1;;;;47357:1007:0:o;43683:98::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;43760:6:::1;:13:::0;;-1:-1:-1;;43760:13:0::1;43769:4;43760:13;::::0;;43683:98::o;46194:262::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;46319:21:::1;46359:11:::0;46351:56:::1;;;::::0;-1:-1:-1;;;46351:56:0;;19919:2:1;46351:56:0::1;::::0;::::1;19901:21:1::0;;;19938:18;;;19931:30;19997:34;19977:18;;;19970:62;20049:18;;46351:56:0::1;19891:182:1::0;46351:56:0::1;46418:30;::::0;-1:-1:-1;;;;;46418:21:0;::::1;::::0;:30;::::1;;;::::0;46440:7;;46418:30:::1;::::0;;;46440:7;46418:21;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1002:1;46194:262:::0;:::o;1362:94::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;1427:21:::1;1445:1;1427:9;:21::i;:::-;1362:94::o:0;50186:786::-;50261:4;50301;50261;50318:531;50342:5;:12;50338:1;:16;50318:531;;;50376:20;50399:5;50405:1;50399:8;;;;;;-1:-1:-1;;;50399:8:0;;;;;;;;;;;;;;;50376:31;;50456:12;50440;:28;50436:402;;50590:44;;;;;;11646:19:1;;;11681:12;;;11674:28;;;50583:52:0;;11718:12:1;;50590:44:0;;;-1:-1:-1;;50590:44:0;;;;;;;;;;50583:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50568:67;;50436:402;;;50777:44;;;;;;11646:19:1;;;11681:12;;;11674:28;;;50770:52:0;;11718:12:1;;50777:44:0;;;-1:-1:-1;;50777:44:0;;;;;;;;;;50770:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50755:67;;50436:402;-1:-1:-1;50356:3:0;;;;:::i;:::-;;;;50318:531;;;-1:-1:-1;50960:4:0;;50944:20;;50186:786;-1:-1:-1;;;50186:786:0:o;21803:311::-;174:10;-1:-1:-1;;;;;21906:24:0;;;;21898:78;;;;-1:-1:-1;;;21898:78:0;;23830:2:1;21898:78:0;;;23812:21:1;23869:2;23849:18;;;23842:30;23908:34;23888:18;;;23881:62;-1:-1:-1;;;23959:18:1;;;23952:39;24008:19;;21898:78:0;23802:231:1;21898:78:0;174:10;21989:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;21989:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;21989:53:0;;;;;;;;;;22058:48;;15083:41:1;;;21989:42:0;;174:10;22058:48;;15056:18:1;22058:48:0;;;;;;;21803:311;;:::o;48456:354::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;48567:13:::1;::::0;43298:3:::1;::::0;48567:20:::1;::::0;48585:1:::1;48567:17;:20::i;:::-;:33;;48559:68;;;::::0;-1:-1:-1;;;48559:68:0;;18098:2:1;48559:68:0::1;::::0;::::1;18080:21:1::0;18137:2;18117:18;;;18110:30;18176:25;18156:18;;;18149:53;18219:18;;48559:68:0::1;18070:173:1::0;48559:68:0::1;48646:11;::::0;43251:4:::1;::::0;48646:18:::1;::::0;48662:1:::1;48646:15;:18::i;:::-;:28;48638:97;;;;-1:-1:-1::0;;;48638:97:0::1;;;;;;;:::i;:::-;48746:11;48751:3;48755:1;48746:4;:11::i;:::-;48782:13;::::0;:20:::1;::::0;48800:1:::1;48782:17;:20::i;45081:197::-:0;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;45225:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45256:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;22426:401::-:0;-1:-1:-1;;;;;22634:20:0;;174:10;22634:20;;:60;;-1:-1:-1;22658:36:0;22675:4;174:10;22186:168;:::i;22658:36::-;22612:151;;;;-1:-1:-1;;;22612:151:0;;18450:2:1;22612:151:0;;;18432:21:1;18489:2;18469:18;;;18462:30;18528:34;18508:18;;;18501:62;-1:-1:-1;;;18579:18:1;;;18572:39;18628:19;;22612:151:0;18422:231:1;22612:151:0;22774:45;22792:4;22798:2;22802;22806:6;22814:4;22774:17;:45::i;50030:91::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;50092:4:::1;:21:::0;50030:91::o;1611:192::-;784:6;;-1:-1:-1;;;;;784:6:0;174:10;931:23;923:68;;;;-1:-1:-1;;;923:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1700:22:0;::::1;1692:73;;;::::0;-1:-1:-1;;;1692:73:0;;17342:2:1;1692:73:0::1;::::0;::::1;17324:21:1::0;17381:2;17361:18;;;17354:30;17420:34;17400:18;;;17393:62;-1:-1:-1;;;17471:18:1;;;17464:36;17517:19;;1692:73:0::1;17314:228:1::0;1692:73:0::1;1776:19;1786:8;1776:9;:19::i;41038:723::-:0;41094:13;41315:10;41311:53;;-1:-1:-1;;41342:10:0;;;;;;;;;;;;-1:-1:-1;;;41342:10:0;;;;;41038:723::o;41311:53::-;41389:5;41374:12;41430:78;41437:9;;41430:78;;41463:8;;;;:::i;:::-;;-1:-1:-1;41486:10:0;;-1:-1:-1;41494:2:0;41486:10;;:::i;:::-;;;41430:78;;;41518:19;41550:6;-1:-1:-1;;;;;41540:17:0;;;;;-1:-1:-1;;;41540:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41540:17:0;;41518:39;;41568:154;41575:10;;41568:154;;41602:11;41612:1;41602:11;;:::i;:::-;;-1:-1:-1;41671:10:0;41679:2;41671:5;:10;:::i;:::-;41658:24;;:2;:24;:::i;:::-;41645:39;;41628:6;41635;41628:14;;;;;;-1:-1:-1;;;41628:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;41628:56:0;;;;;;;;-1:-1:-1;41699:11:0;41708:2;41699:11;;:::i;:::-;;;41568:154;;;41746:6;41038:723;-1:-1:-1;;;;41038:723:0:o;24988:1074::-;25215:7;:14;25201:3;:10;:28;25193:81;;;;-1:-1:-1;;;25193:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25293:16:0;;25285:66;;;;-1:-1:-1;;;25285:66:0;;;;;;;:::i;:::-;174:10;25364:16;25481:421;25505:3;:10;25501:1;:14;25481:421;;;25537:10;25550:3;25554:1;25550:6;;;;;;-1:-1:-1;;;25550:6:0;;;;;;;;;;;;;;;25537:19;;25571:14;25588:7;25596:1;25588:10;;;;;;-1:-1:-1;;;25588:10:0;;;;;;;;;;;;;;;;;;;;25615:19;25637:13;;;;;;;;;;-1:-1:-1;;;;;25637:19:0;;;;;;;;;;;;25588:10;;-1:-1:-1;25679:21:0;;;;25671:76;;;;-1:-1:-1;;;25671:76:0;;;;;;;:::i;:::-;25791:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25791:19:0;;;;;;;;;;25813:20;;;25791:42;;25863:17;;;;;;;:27;;25813:20;;25791:9;25863:27;;25813:20;;25863:27;:::i;:::-;;;;;;;;25481:421;;;25517:3;;;;:::i;:::-;;;25481:421;;;;25949:2;-1:-1:-1;;;;;25919:47:0;25943:4;-1:-1:-1;;;;;25919:47:0;25933:8;-1:-1:-1;;;;;25919:47:0;;25953:3;25958:7;25919:47;;;;;;;:::i;:::-;;;;;;;;25979:75;26015:8;26025:4;26031:2;26035:3;26040:7;26049:4;25979:35;:75::i;:::-;24988:1074;;;;;;:::o;36647:98::-;36705:7;36732:5;36736:1;36732;:5;:::i;:::-;36725:12;36647:98;-1:-1:-1;;;36647:98:0:o;37028:::-;37086:7;37113:5;37117:1;37113;:5;:::i;37385:98::-;37443:7;37470:5;37474:1;37470;:5;:::i;43839:519::-;43911:1;43903:5;:9;;;43899:419;;;43929:20;43974:5;43966:14;;-1:-1:-1;;;;;43952:29:0;;;;;-1:-1:-1;;;43952:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43952:29:0;;43929:52;;43996:24;44045:5;44037:14;;-1:-1:-1;;;;;44023:29:0;;;;;-1:-1:-1;;;44023:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44023:29:0;;43996:56;;44074:8;44069:127;44092:5;44088:9;;:1;:9;;;44069:127;;;44146:1;44132:15;;:11;;:15;;;;:::i;:::-;44123:3;44127:1;44123:6;;;;;;;;-1:-1:-1;;;44123:6:0;;;;;;;;;;;;;;:24;;;;;44179:1;44166:7;44174:1;44166:10;;;;;;;;-1:-1:-1;;;44166:10:0;;;;;;;;;;;;;;;;;;:14;44099:3;;;;:::i;:::-;;;;44069:127;;;;44212:32;44223:2;44227:3;44232:7;44212:32;;;;;;;;;;;;:10;:32::i;:::-;43899:419;;;;;44277:29;44283:2;44287:11;;44300:1;44277:29;;;;;;;;;;;;:5;:29::i;:::-;44345:5;44330:20;;:11;;:20;;;;;;;:::i;1811:173::-;1886:6;;;-1:-1:-1;;;;;1903:17:0;;;-1:-1:-1;;;;;;1903:17:0;;;;;;;1936:40;;1886:6;;;1903:17;1886:6;;1936:40;;1867:16;;1936:40;1811:173;;:::o;23810:820::-;-1:-1:-1;;;;;23998:16:0;;23990:66;;;;-1:-1:-1;;;23990:66:0;;;;;;;:::i;:::-;174:10;24113:96;174:10;24144:4;24150:2;24154:21;24172:2;24154:17;:21::i;:::-;24177:25;24195:6;24177:17;:25::i;24113:96::-;24222:19;24244:13;;;;;;;;;;;-1:-1:-1;;;;;24244:19:0;;;;;;;;;;24282:21;;;;24274:76;;;;-1:-1:-1;;;24274:76:0;;;;;;;:::i;:::-;24386:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24386:19:0;;;;;;;;;;24408:20;;;24386:42;;24450:17;;;;;;;:27;;24408:20;;24386:9;24450:27;;24408:20;;24450:27;:::i;:::-;;;;-1:-1:-1;;24495:46:0;;;26736:25:1;;;26792:2;26777:18;;26770:34;;;-1:-1:-1;;;;;24495:46:0;;;;;;;;;;;;;;26709:18:1;24495:46:0;;;;;;;24554:68;24585:8;24595:4;24601:2;24605;24609:6;24617:4;24554:30;:68::i;:::-;23810:820;;;;;;;:::o;33077:813::-;-1:-1:-1;;;;;33317:13:0;;3049:20;3097:8;33313:570;;33353:79;;-1:-1:-1;;;33353:79:0;;-1:-1:-1;;;;;33353:43:0;;;;;:79;;33397:8;;33407:4;;33413:3;;33418:7;;33427:4;;33353:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33353:79:0;;;;;;;;-1:-1:-1;;33353:79:0;;;;;;;;;;;;:::i;:::-;;;33349:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33745:6;33738:14;;-1:-1:-1;;;33738:14:0;;;;;;;;:::i;33349:523::-;;;33794:62;;-1:-1:-1;;;33794:62:0;;15743:2:1;33794:62:0;;;15725:21:1;15782:2;15762:18;;;15755:30;15821:34;15801:18;;;15794:62;-1:-1:-1;;;15872:18:1;;;15865:50;15932:19;;33794:62:0;15715:242:1;33349:523:0;-1:-1:-1;;;;;;33514:60:0;;-1:-1:-1;;;33514:60:0;33510:159;;33599:50;;-1:-1:-1;;;33599:50:0;;;;;;;:::i;28350:735::-;-1:-1:-1;;;;;28528:16:0;;28520:62;;;;-1:-1:-1;;;28520:62:0;;;;;;;:::i;:::-;28615:7;:14;28601:3;:10;:28;28593:81;;;;-1:-1:-1;;;28593:81:0;;;;;;;:::i;:::-;174:10;28687:16;28810:103;28834:3;:10;28830:1;:14;28810:103;;;28891:7;28899:1;28891:10;;;;;;-1:-1:-1;;;28891:10:0;;;;;;;;;;;;;;;28866:9;:17;28876:3;28880:1;28876:6;;;;;;-1:-1:-1;;;28876:6:0;;;;;;;;;;;;;;;28866:17;;;;;;;;;;;:21;28884:2;-1:-1:-1;;;;;28866:21:0;-1:-1:-1;;;;;28866:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;28846:3:0;;-1:-1:-1;28846:3:0;;;:::i;:::-;;;;28810:103;;;;28966:2;-1:-1:-1;;;;;28930:53:0;28962:1;-1:-1:-1;;;;;28930:53:0;28944:8;-1:-1:-1;;;;;28930:53:0;;28970:3;28975:7;28930:53;;;;;;;:::i;:::-;;;;;;;;28996:81;29032:8;29050:1;29054:2;29058:3;29063:7;29072:4;28996:35;:81::i;27395:599::-;-1:-1:-1;;;;;27553:21:0;;27545:67;;;;-1:-1:-1;;;27545:67:0;;;;;;;:::i;:::-;174:10;27669:107;174:10;27625:16;27712:7;27721:21;27739:2;27721:17;:21::i;27669:107::-;27789:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27789:22:0;;;;;;;;;:32;;27815:6;;27789:9;:32;;27815:6;;27789:32;:::i;:::-;;;;-1:-1:-1;;27837:57:0;;;26736:25:1;;;26792:2;26777:18;;26770:34;;;-1:-1:-1;;;;;27837:57:0;;;;27870:1;;27837:57;;;;;;26709:18:1;27837:57:0;;;;;;;27907:79;27938:8;27956:1;27960:7;27969:2;27973:6;27981:4;27907:30;:79::i;33898:198::-;34018:16;;;34032:1;34018:16;;;;;;;;;33964;;33993:22;;34018:16;;;;;;;;;;;;-1:-1:-1;34018:16:0;33993:41;;34056:7;34045:5;34051:1;34045:8;;;;;;-1:-1:-1;;;34045:8:0;;;;;;;;;;;;;;;;;;:18;34083:5;33898:198;-1:-1:-1;;33898:198:0:o;32325:744::-;-1:-1:-1;;;;;32540:13:0;;3049:20;3097:8;32536:526;;32576:72;;-1:-1:-1;;;32576:72:0;;-1:-1:-1;;;;;32576:38:0;;;;;:72;;32615:8;;32625:4;;32631:2;;32635:6;;32643:4;;32576:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32576:72:0;;;;;;;;-1:-1:-1;;32576:72:0;;;;;;;;;;;;:::i;:::-;;;32572:479;;;;:::i;:::-;-1:-1:-1;;;;;;32698:55:0;;-1:-1:-1;;;32698:55:0;32694:154;;32778:50;;-1:-1:-1;;;32778:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:761;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;321:5;314;307:20;266:2;361:6;348:20;387:4;410:43;450:2;410:43;:::i;:::-;482:2;476:9;494:31;522:2;514:6;494:31;:::i;:::-;560:18;;;594:15;;;;-1:-1:-1;629:15:1;;;679:1;675:10;;;663:23;;659:32;;656:41;-1:-1:-1;653:2:1;;;714:5;707;700:20;653:2;740:5;754:169;768:2;765:1;762:9;754:169;;;825:23;844:3;825:23;:::i;:::-;813:36;;869:12;;;;901;;;;786:1;779:9;754:169;;;-1:-1:-1;941:6:1;;256:697;-1:-1:-1;;;;;;;256:697:1:o;958:755::-;1012:5;1065:3;1058:4;1050:6;1046:17;1042:27;1032:2;;1087:5;1080;1073:20;1032:2;1127:6;1114:20;1153:4;1176:43;1216:2;1176:43;:::i;:::-;1248:2;1242:9;1260:31;1288:2;1280:6;1260:31;:::i;:::-;1326:18;;;1360:15;;;;-1:-1:-1;1395:15:1;;;1445:1;1441:10;;;1429:23;;1425:32;;1422:41;-1:-1:-1;1419:2:1;;;1480:5;1473;1466:20;1419:2;1506:5;1520:163;1534:2;1531:1;1528:9;1520:163;;;1591:17;;1579:30;;1629:12;;;;1661;;;;1552:1;1545:9;1520:163;;2478:160;2543:20;;2599:13;;2592:21;2582:32;;2572:2;;2628:1;2625;2618:12;2643:575;2685:5;2738:3;2731:4;2723:6;2719:17;2715:27;2705:2;;2760:5;2753;2746:20;2705:2;2800:6;2787:20;-1:-1:-1;;;;;2822:2:1;2819:26;2816:2;;;2848:18;;:::i;:::-;2897:2;2891:9;2909:67;2964:2;2945:13;;-1:-1:-1;;2941:27:1;2970:4;2937:38;2891:9;2909:67;:::i;:::-;3000:2;2992:6;2985:18;3046:3;3039:4;3034:2;3026:6;3022:15;3018:26;3015:35;3012:2;;;3067:5;3060;3053:20;3012:2;3135;3128:4;3120:6;3116:17;3109:4;3101:6;3097:17;3084:54;3158:15;;;3175:4;3154:26;3147:41;;;;3162:6;2695:523;-1:-1:-1;;2695:523:1:o;3223:163::-;3290:20;;3350:10;3339:22;;3329:33;;3319:2;;3376:1;3373;3366:12;3391:196;3450:6;3503:2;3491:9;3482:7;3478:23;3474:32;3471:2;;;3524:6;3516;3509:22;3471:2;3552:29;3571:9;3552:29;:::i;3592:270::-;3660:6;3668;3721:2;3709:9;3700:7;3696:23;3692:32;3689:2;;;3742:6;3734;3727:22;3689:2;3770:29;3789:9;3770:29;:::i;:::-;3760:39;;3818:38;3852:2;3841:9;3837:18;3818:38;:::i;:::-;3808:48;;3679:183;;;;;:::o;3867:983::-;4021:6;4029;4037;4045;4053;4106:3;4094:9;4085:7;4081:23;4077:33;4074:2;;;4128:6;4120;4113:22;4074:2;4156:29;4175:9;4156:29;:::i;:::-;4146:39;;4204:38;4238:2;4227:9;4223:18;4204:38;:::i;:::-;4194:48;;4293:2;4282:9;4278:18;4265:32;-1:-1:-1;;;;;4357:2:1;4349:6;4346:14;4343:2;;;4378:6;4370;4363:22;4343:2;4406:61;4459:7;4450:6;4439:9;4435:22;4406:61;:::i;:::-;4396:71;;4520:2;4509:9;4505:18;4492:32;4476:48;;4549:2;4539:8;4536:16;4533:2;;;4570:6;4562;4555:22;4533:2;4598:63;4653:7;4642:8;4631:9;4627:24;4598:63;:::i;:::-;4588:73;;4714:3;4703:9;4699:19;4686:33;4670:49;;4744:2;4734:8;4731:16;4728:2;;;4765:6;4757;4750:22;4728:2;;4793:51;4836:7;4825:8;4814:9;4810:24;4793:51;:::i;:::-;4783:61;;;4064:786;;;;;;;;:::o;4855:626::-;4959:6;4967;4975;4983;4991;5044:3;5032:9;5023:7;5019:23;5015:33;5012:2;;;5066:6;5058;5051:22;5012:2;5094:29;5113:9;5094:29;:::i;:::-;5084:39;;5142:38;5176:2;5165:9;5161:18;5142:38;:::i;:::-;5132:48;;5227:2;5216:9;5212:18;5199:32;5189:42;;5278:2;5267:9;5263:18;5250:32;5240:42;;5333:3;5322:9;5318:19;5305:33;-1:-1:-1;;;;;5353:6:1;5350:30;5347:2;;;5398:6;5390;5383:22;5347:2;5426:49;5467:7;5458:6;5447:9;5443:22;5426:49;:::i;5486:264::-;5551:6;5559;5612:2;5600:9;5591:7;5587:23;5583:32;5580:2;;;5633:6;5625;5618:22;5580:2;5661:29;5680:9;5661:29;:::i;:::-;5651:39;;5709:35;5740:2;5729:9;5725:18;5709:35;:::i;5755:264::-;5823:6;5831;5884:2;5872:9;5863:7;5859:23;5855:32;5852:2;;;5905:6;5897;5890:22;5852:2;5933:29;5952:9;5933:29;:::i;:::-;5923:39;6009:2;5994:18;;;;5981:32;;-1:-1:-1;;;5842:177:1:o;6024:368::-;6108:6;6161:2;6149:9;6140:7;6136:23;6132:32;6129:2;;;6182:6;6174;6167:22;6129:2;6227:9;6214:23;-1:-1:-1;;;;;6252:6:1;6249:30;6246:2;;;6297:6;6289;6282:22;6246:2;6325:61;6378:7;6369:6;6358:9;6354:22;6325:61;:::i;6397:625::-;6515:6;6523;6576:2;6564:9;6555:7;6551:23;6547:32;6544:2;;;6597:6;6589;6582:22;6544:2;6642:9;6629:23;-1:-1:-1;;;;;6712:2:1;6704:6;6701:14;6698:2;;;6733:6;6725;6718:22;6698:2;6761:61;6814:7;6805:6;6794:9;6790:22;6761:61;:::i;:::-;6751:71;;6875:2;6864:9;6860:18;6847:32;6831:48;;6904:2;6894:8;6891:16;6888:2;;;6925:6;6917;6910:22;6888:2;;6953:63;7008:7;6997:8;6986:9;6982:24;6953:63;:::i;:::-;6943:73;;;6534:488;;;;;:::o;7027:436::-;7120:6;7128;7181:2;7169:9;7160:7;7156:23;7152:32;7149:2;;;7202:6;7194;7187:22;7149:2;7247:9;7234:23;-1:-1:-1;;;;;7272:6:1;7269:30;7266:2;;;7317:6;7309;7302:22;7266:2;7345:61;7398:7;7389:6;7378:9;7374:22;7345:61;:::i;:::-;7335:71;7453:2;7438:18;;;;7425:32;;-1:-1:-1;;;;7139:324:1:o;7468:190::-;7524:6;7577:2;7565:9;7556:7;7552:23;7548:32;7545:2;;;7598:6;7590;7583:22;7545:2;7626:26;7642:9;7626:26;:::i;7663:194::-;7733:6;7786:2;7774:9;7765:7;7761:23;7757:32;7754:2;;;7807:6;7799;7792:22;7754:2;-1:-1:-1;7835:16:1;;7744:113;-1:-1:-1;7744:113:1:o;7862:255::-;7920:6;7973:2;7961:9;7952:7;7948:23;7944:32;7941:2;;;7994:6;7986;7979:22;7941:2;8038:9;8025:23;8057:30;8081:5;8057:30;:::i;8122:259::-;8191:6;8244:2;8232:9;8223:7;8219:23;8215:32;8212:2;;;8265:6;8257;8250:22;8212:2;8302:9;8296:16;8321:30;8345:5;8321:30;:::i;8386:571::-;8474:6;8482;8535:2;8523:9;8514:7;8510:23;8506:32;8503:2;;;8556:6;8548;8541:22;8503:2;8601:9;8588:23;-1:-1:-1;;;;;8671:2:1;8663:6;8660:14;8657:2;;;8692:6;8684;8677:22;8657:2;8720:49;8761:7;8752:6;8741:9;8737:22;8720:49;:::i;:::-;8710:59;;8822:2;8811:9;8807:18;8794:32;8778:48;;8851:2;8841:8;8838:16;8835:2;;;8872:6;8864;8857:22;8835:2;;8900:51;8943:7;8932:8;8921:9;8917:24;8900:51;:::i;8962:190::-;9021:6;9074:2;9062:9;9053:7;9049:23;9045:32;9042:2;;;9095:6;9087;9080:22;9042:2;-1:-1:-1;9123:23:1;;9032:120;-1:-1:-1;9032:120:1:o;9157:194::-;9215:6;9268:2;9256:9;9247:7;9243:23;9239:32;9236:2;;;9289:6;9281;9274:22;9236:2;9317:28;9335:9;9317:28;:::i;9356:440::-;9448:6;9456;9509:2;9497:9;9488:7;9484:23;9480:32;9477:2;;;9530:6;9522;9515:22;9477:2;9558:28;9576:9;9558:28;:::i;:::-;9548:38;;9637:2;9626:9;9622:18;9609:32;-1:-1:-1;;;;;9656:6:1;9653:30;9650:2;;;9701:6;9693;9686:22;9650:2;9729:61;9782:7;9773:6;9762:9;9758:22;9729:61;:::i;9801:437::-;9854:3;9892:5;9886:12;9919:6;9914:3;9907:19;9945:4;9974:2;9969:3;9965:12;9958:19;;10011:2;10004:5;10000:14;10032:3;10044:169;10058:6;10055:1;10052:13;10044:169;;;10119:13;;10107:26;;10153:12;;;;10188:15;;;;10080:1;10073:9;10044:169;;;-1:-1:-1;10229:3:1;;9862:376;-1:-1:-1;;;;;9862:376:1:o;10243:257::-;10284:3;10322:5;10316:12;10349:6;10344:3;10337:19;10365:63;10421:6;10414:4;10409:3;10405:14;10398:4;10391:5;10387:16;10365:63;:::i;:::-;10482:2;10461:15;-1:-1:-1;;10457:29:1;10448:39;;;;10489:4;10444:50;;10292:208;-1:-1:-1;;10292:208:1:o;10505:979::-;10590:12;;10555:3;;10647:1;10667:18;;;;10720;;;;10747:2;;10801:4;10793:6;10789:17;10779:27;;10747:2;10827;10875;10867:6;10864:14;10844:18;10841:38;10838:2;;;-1:-1:-1;;;10902:33:1;;10958:4;10955:1;10948:15;10988:4;10909:3;10976:17;10838:2;11019:18;11046:104;;;;11164:1;11159:319;;;;11012:466;;11046:104;-1:-1:-1;;11079:24:1;;11067:37;;11124:16;;;;-1:-1:-1;11046:104:1;;11159:319;27050:4;27069:17;;;27119:4;27103:21;;11253:1;11267:165;11281:6;11278:1;11275:13;11267:165;;;11359:14;;11346:11;;;11339:35;11402:16;;;;11296:10;;11267:165;;;11271:3;;11461:6;11456:3;11452:16;11445:23;;11012:466;;;;;;;10563:921;;;;:::o;11741:274::-;11870:3;11908:6;11902:13;11924:53;11970:6;11965:3;11958:4;11950:6;11946:17;11924:53;:::i;:::-;11993:16;;;;;11878:137;-1:-1:-1;;11878:137:1:o;12020:197::-;12148:3;12173:38;12207:3;12199:6;12173:38;:::i;12222:376::-;12398:3;12426:38;12460:3;12452:6;12426:38;:::i;:::-;12493:6;12487:13;12509:52;12554:6;12550:2;12543:4;12535:6;12531:17;12509:52;:::i;:::-;12577:15;;12406:192;-1:-1:-1;;;;12406:192:1:o;12811:826::-;-1:-1:-1;;;;;13208:15:1;;;13190:34;;13260:15;;13255:2;13240:18;;13233:43;13170:3;13307:2;13292:18;;13285:31;;;13133:4;;13339:57;;13376:19;;13368:6;13339:57;:::i;:::-;13444:9;13436:6;13432:22;13427:2;13416:9;13412:18;13405:50;13478:44;13515:6;13507;13478:44;:::i;:::-;13464:58;;13571:9;13563:6;13559:22;13553:3;13542:9;13538:19;13531:51;13599:32;13624:6;13616;13599:32;:::i;:::-;13591:40;13142:495;-1:-1:-1;;;;;;;;13142:495:1:o;13642:560::-;-1:-1:-1;;;;;13939:15:1;;;13921:34;;13991:15;;13986:2;13971:18;;13964:43;14038:2;14023:18;;14016:34;;;14081:2;14066:18;;14059:34;;;13901:3;14124;14109:19;;14102:32;;;13864:4;;14151:45;;14176:19;;14168:6;14151:45;:::i;:::-;14143:53;13873:329;-1:-1:-1;;;;;;;13873:329:1:o;14207:261::-;14386:2;14375:9;14368:21;14349:4;14406:56;14458:2;14447:9;14443:18;14435:6;14406:56;:::i;14473:465::-;14730:2;14719:9;14712:21;14693:4;14756:56;14808:2;14797:9;14793:18;14785:6;14756:56;:::i;:::-;14860:9;14852:6;14848:22;14843:2;14832:9;14828:18;14821:50;14888:44;14925:6;14917;14888:44;:::i;:::-;14880:52;14702:236;-1:-1:-1;;;;;14702:236:1:o;15317:219::-;15466:2;15455:9;15448:21;15429:4;15486:44;15526:2;15515:9;15511:18;15503:6;15486:44;:::i;15962:404::-;16164:2;16146:21;;;16203:2;16183:18;;;16176:30;16242:34;16237:2;16222:18;;16215:62;-1:-1:-1;;;16308:2:1;16293:18;;16286:38;16356:3;16341:19;;16136:230::o;20078:401::-;20280:2;20262:21;;;20319:2;20299:18;;;20292:30;20358:34;20353:2;20338:18;;20331:62;-1:-1:-1;;;20424:2:1;20409:18;;20402:35;20469:3;20454:19;;20252:227::o;21247:420::-;21449:2;21431:21;;;21488:2;21468:18;;;21461:30;21527:34;21522:2;21507:18;;21500:62;21598:26;21593:2;21578:18;;21571:54;21657:3;21642:19;;21421:246::o;21672:406::-;21874:2;21856:21;;;21913:2;21893:18;;;21886:30;21952:34;21947:2;21932:18;;21925:62;-1:-1:-1;;;22018:2:1;22003:18;;21996:40;22068:3;22053:19;;21846:232::o;22434:356::-;22636:2;22618:21;;;22655:18;;;22648:30;22714:34;22709:2;22694:18;;22687:62;22781:2;22766:18;;22608:182::o;23212:411::-;23414:2;23396:21;;;23453:2;23433:18;;;23426:30;23492:34;23487:2;23472:18;;23465:62;-1:-1:-1;;;23558:2:1;23543:18;;23536:45;23613:3;23598:19;;23386:237::o;24851:404::-;25053:2;25035:21;;;25092:2;25072:18;;;25065:30;25131:34;25126:2;25111:18;;25104:62;-1:-1:-1;;;25197:2:1;25182:18;;25175:38;25245:3;25230:19;;25025:230::o;25260:397::-;25462:2;25444:21;;;25501:2;25481:18;;;25474:30;25540:34;25535:2;25520:18;;25513:62;-1:-1:-1;;;25606:2:1;25591:18;;25584:31;25647:3;25632:19;;25434:223::o;26815:183::-;26875:4;-1:-1:-1;;;;;26900:6:1;26897:30;26894:2;;;26930:18;;:::i;:::-;-1:-1:-1;26975:1:1;26971:14;26987:4;26967:25;;26884:114::o;27135:128::-;27175:3;27206:1;27202:6;27199:1;27196:13;27193:2;;;27212:18;;:::i;:::-;-1:-1:-1;27248:9:1;;27183:80::o;27268:120::-;27308:1;27334;27324:2;;27339:18;;:::i;:::-;-1:-1:-1;27373:9:1;;27314:74::o;27393:168::-;27433:7;27499:1;27495;27491:6;27487:14;27484:1;27481:21;27476:1;27469:9;27462:17;27458:45;27455:2;;;27506:18;;:::i;:::-;-1:-1:-1;27546:9:1;;27445:116::o;27566:125::-;27606:4;27634:1;27631;27628:8;27625:2;;;27639:18;;:::i;:::-;-1:-1:-1;27676:9:1;;27615:76::o;27696:258::-;27768:1;27778:113;27792:6;27789:1;27786:13;27778:113;;;27868:11;;;27862:18;27849:11;;;27842:39;27814:2;27807:10;27778:113;;;27909:6;27906:1;27903:13;27900:2;;;-1:-1:-1;;27944:1:1;27926:16;;27919:27;27749:205::o;27959:380::-;28038:1;28034:12;;;;28081;;;28102:2;;28156:4;28148:6;28144:17;28134:27;;28102:2;28209;28201:6;28198:14;28178:18;28175:38;28172:2;;;28255:10;28250:3;28246:20;28243:1;28236:31;28290:4;28287:1;28280:15;28318:4;28315:1;28308:15;28172:2;;28014:325;;;:::o;28344:249::-;28454:2;28435:13;;-1:-1:-1;;28431:27:1;28419:40;;-1:-1:-1;;;;;28474:34:1;;28510:22;;;28471:62;28468:2;;;28536:18;;:::i;:::-;28572:2;28565:22;-1:-1:-1;;28391:202:1:o;28598:135::-;28637:3;-1:-1:-1;;28658:17:1;;28655:2;;;28678:18;;:::i;:::-;-1:-1:-1;28725:1:1;28714:13;;28645:88::o;28738:201::-;28776:3;28804:10;28849:2;28842:5;28838:14;28876:2;28867:7;28864:15;28861:2;;;28882:18;;:::i;:::-;28931:1;28918:15;;28784:155;-1:-1:-1;;;28784:155:1:o;28944:112::-;28976:1;29002;28992:2;;29007:18;;:::i;:::-;-1:-1:-1;29041:9:1;;28982:74::o;29061:127::-;29122:10;29117:3;29113:20;29110:1;29103:31;29153:4;29150:1;29143:15;29177:4;29174:1;29167:15;29193:127;29254:10;29249:3;29245:20;29242:1;29235:31;29285:4;29282:1;29275:15;29309:4;29306:1;29299:15;29325:127;29386:10;29381:3;29377:20;29374:1;29367:31;29417:4;29414:1;29407:15;29441:4;29438:1;29431:15;29457:185;29492:3;29534:1;29516:16;29513:23;29510:2;;;29584:1;29579:3;29574;29559:27;29615:10;29610:3;29606:20;29510:2;29500:142;:::o;29647:671::-;29686:3;29728:4;29710:16;29707:26;29704:2;;;29694:624;:::o;29704:2::-;29770;29764:9;-1:-1:-1;;29835:16:1;29831:25;;29828:1;29764:9;29807:50;29886:4;29880:11;29910:16;-1:-1:-1;;;;;30016:2:1;30009:4;30001:6;29997:17;29994:25;29989:2;29981:6;29978:14;29975:45;29972:2;;;30023:5;;;;;29694:624;:::o;29972:2::-;30060:6;30054:4;30050:17;30039:28;;30096:3;30090:10;30123:2;30115:6;30112:14;30109:2;;;30129:5;;;;;;29694:624;:::o;30109:2::-;30213;30194:16;30188:4;30184:27;30180:36;30173:4;30164:6;30159:3;30155:16;30151:27;30148:69;30145:2;;;30220:5;;;;;;29694:624;:::o;30145:2::-;30236:57;30287:4;30278:6;30270;30266:19;30262:30;30256:4;30236:57;:::i;:::-;-1:-1:-1;30309:3:1;;29694:624;-1:-1:-1;;;;;29694:624:1:o;30323:131::-;-1:-1:-1;;;;;;30397:32:1;;30387:43;;30377:2;;30444:1;30441;30434:12
Swarm Source
ipfs://66089886b3e4332272fb093a2f9c323316684ac46dab82f350ad9cb04c470a43
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.