ERC-1155
Overview
Max Total Supply
200
Holders
155
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:
StarSiblings
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./ERC1155.sol"; import "./ERC721.sol"; import "./ReentrancyGuard.sol"; import "./AdminPrivileges.sol"; interface AvatarInterface { function burn(uint256 tokenId) external; } contract StarSiblings is ERC1155, ReentrancyGuard, AdminPrivileges { event TokenBurnt(address account, uint256 tokenId); event TokenMinted(address account, uint256 tokenId, uint256 amount); address public burnContractERC721; uint256 public currChapter; struct Chapter { string description; string uri; address[] starSiblings; uint256 burnThreshold; uint256 entryLimit; uint256 tokenId; bool transferable; bool unique; bool active; bool locked; } mapping(uint256 => Chapter) public chapters; mapping(address => mapping(uint256 => uint256)) public entries; constructor() ERC1155("") { burnContractERC721 = 0x49aC61f2202f6A2f108D59E77535337Ea41F6540; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) { return ERC1155.supportsInterface(interfaceId) || super.supportsInterface(interfaceId); } function updateChapter( string memory _description, string memory _uri, address[] memory _starSiblings, uint256 _burnThreshold, uint256 _entryLimit, uint256 _tokenId, bool _transferable, bool _unique, bool _active, bool _isCurrChapter ) external onlyAdmins { require(!chapters[_tokenId].locked, "You must unlock chapter to overwrite"); Chapter storage chapter = chapters[_tokenId]; chapter.description = _description; chapter.uri = _uri; chapter.starSiblings = _starSiblings; chapter.burnThreshold = _burnThreshold; chapter.entryLimit = _entryLimit; chapter.tokenId = _tokenId; chapter.transferable = _transferable; chapter.unique = _unique; chapter.active = _active; chapter.locked = true; if (_isCurrChapter) { currChapter = _tokenId; } if (_starSiblings.length > 0) { mint(_starSiblings, 1, _tokenId); } } function burnAvatar(uint256[] calldata tokenIds) external nonReentrant { Chapter memory chapter = chapters[currChapter]; require(chapter.active, "This chapter is not active"); require(tokenIds.length > 0, "TokenIds can not be empty"); if (chapter.unique) { require( entries[msg.sender][currChapter] == 0, "This chapter is only accepting unique addresses" ); if (chapter.burnThreshold > 0) { require( tokenIds.length == chapter.burnThreshold, "You may only burn the threshold amount for unique address lists" ); } } bool ovenHungee; uint256 amount; if (chapter.burnThreshold == 0) { require( chapter.starSiblings.length + 1 <= chapter.entryLimit, "Burn limit surpassed" ); ovenHungee = false; amount = 1; } else { require( tokenIds.length % chapter.burnThreshold == 0, "Token(s) amount is not a multiple of threshold" ); require( chapter.starSiblings.length + (tokenIds.length / chapter.burnThreshold) <= chapter.entryLimit, "Burn limit surpassed" ); ovenHungee = true; amount = tokenIds.length / chapter.burnThreshold; } address[] memory accounts = new address[](1); accounts[0] = msg.sender; burn(tokenIds, msg.sender, ovenHungee); mint(accounts, amount, chapter.tokenId); } function awardSiblings(address[] memory accounts, uint256 amount, uint256 _tokenId) external onlyAdmins { mint(accounts, amount, _tokenId); } /** * @dev Toggles between 4 bool options within a specified chapter. * option == 1: Permission for the NFT to be transfered, * option == 2: Criteria if addresses must be unique to become a StarSibling, * option == 3: Allows Avatars to be burned and become a StarSibling, * option == 4: Unlocks chapter to overwrite entire chapter (Not recommended) * @param _tokenId can also be thought of as index * @param option of which bool to toggle */ function toggleOption(uint256 _tokenId, uint256 option) external onlyAdmins { Chapter storage chapter = chapters[_tokenId]; if (option == 1) { chapter.transferable = !chapter.transferable; } else if (option == 2) { chapter.unique = !chapter.unique; } else if (option == 3) { chapter.active = !chapter.active; } else if (option == 4) { chapter.locked = !chapter.locked; } } function updateCurrentChapter(uint256 _tokenId) external onlyAdmins { currChapter = _tokenId; } function updateThresholds(uint256 _tokenId, uint256 _burnThreshold, uint256 _entryLimit) external onlyAdmins { Chapter storage chapter = chapters[_tokenId]; chapter.burnThreshold = _burnThreshold; chapter.entryLimit = _entryLimit; } function updateBurnContract(address _burnContractERC721) external onlyAdmins { burnContractERC721 = _burnContractERC721; } function updateURI(uint256 _tokenId, string memory _uri) external onlyAdmins { Chapter storage chapter = chapters[_tokenId]; chapter.uri = _uri; } function uri(uint256 _tokenId) public view virtual override returns (string memory) { return chapters[_tokenId].uri; } function getStars(uint256 _tokenId) public view returns(address[] memory, uint256) { Chapter memory chapter = chapters[_tokenId]; return(chapter.starSiblings, chapter.starSiblings.length); } /** * @dev Returns an array of random addresses and associating indices from starSiblings * @param quantity is the amount of addresses to be pulled from siblingStar * @param chainlinkSeed the chainlink randomly generated number on the polygon network */ function getRandomStars(uint256 _tokenId, uint256 quantity, uint256 chainlinkSeed) public view returns ( address[] memory addresses, uint256[] memory indices ) { Chapter memory chapter = chapters[_tokenId]; indices = new uint256[](quantity); addresses = new address[](quantity); for (uint256 i = 0; i < quantity; i++) { uint256 index = uint256(keccak256(abi.encode(chainlinkSeed, i))) % chapter.starSiblings.length; addresses[i] = chapter.starSiblings[index]; indices[i] = index; } return (addresses, indices); } /** * @dev See {IERC1155-safeTransferFrom}. * If transferable == false then no token can be transfered or sold */ 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" ); // Locks NFT from being transfered or sold require(chapters[id].transferable, "Transfers locked by contract"); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeTransferFrom}. * If transferable == false then no token can be transfered or sold */ 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" ); // Locks NFT(s) from being transfered or sold for (uint256 i; i < ids.length; i++) { require(chapters[ids[i]].transferable, "Transfers locked by contract"); } _safeBatchTransferFrom(from, to, ids, amounts, data); } function burn( uint256[] calldata tokenIds, address _account, bool ovenHungee ) internal { for (uint256 i; i < tokenIds.length; i++) { require( _account == IERC721(burnContractERC721).ownerOf(tokenIds[i]), "Must be token owner and tokens must be unique" ); if (ovenHungee) { try AvatarInterface(burnContractERC721).burn(tokenIds[i]) { } catch (bytes memory) { revert("Burn failure, check if setApprovalForAll is true"); } emit TokenBurnt(_account, tokenIds[i]); } } } function mint( address[] memory accounts, uint256 amount, uint256 _tokenId ) internal { for (uint256 i; i < accounts.length; i++) { _mint(accounts[i], _tokenId, amount, ""); entries[accounts[i]][_tokenId] += amount; for (uint256 j; j < amount; j++) { chapters[_tokenId].starSiblings.push(accounts[i]); } emit TokenMinted(accounts[i], _tokenId, amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract AdminPrivileges { address public _owner; mapping(address => bool) public admins; constructor() { _owner = msg.sender; } modifier onlyAdmins() { require(_owner == msg.sender || admins[msg.sender], "AdminPrivileges: caller is not an admin"); _; } function toggleAdmin(address account) external onlyAdmins { if (admins[account]) { delete admins[account]; } else { admins[account] = true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.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(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _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 `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "./IERC165.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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "./IERC1155.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.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. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenMinted","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":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"awardSiblings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnAvatar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnContractERC721","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chapters","outputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"burnThreshold","type":"uint256"},{"internalType":"uint256","name":"entryLimit","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"transferable","type":"bool"},{"internalType":"bool","name":"unique","type":"bool"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"locked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currChapter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entries","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"chainlinkSeed","type":"uint256"}],"name":"getRandomStars","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"indices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStars","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"toggleAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"option","type":"uint256"}],"name":"toggleOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnContractERC721","type":"address"}],"name":"updateBurnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_description","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address[]","name":"_starSiblings","type":"address[]"},{"internalType":"uint256","name":"_burnThreshold","type":"uint256"},{"internalType":"uint256","name":"_entryLimit","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_transferable","type":"bool"},{"internalType":"bool","name":"_unique","type":"bool"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"bool","name":"_isCurrChapter","type":"bool"}],"name":"updateChapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateCurrentChapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_burnThreshold","type":"uint256"},{"internalType":"uint256","name":"_entryLimit","type":"uint256"}],"name":"updateThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051806020016040528060008152506200003381620000d860201b60201c565b50600160038190555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507349ac61f2202f6a2f108d59e77535337ea41f6540600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000209565b8060029080519060200190620000f0929190620000f4565b5050565b8280546200010290620001a4565b90600052602060002090601f01602090048101928262000126576000855562000172565b82601f106200014157805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017157825182559160200191906001019062000154565b5b50905062000181919062000185565b5090565b5b80821115620001a057600081600090555060010162000186565b5090565b60006002820490506001821680620001bd57607f821691505b60208210811415620001d457620001d3620001da565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61599b80620002196000396000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c80636b41d390116100de578063d561f5f211610097578063ecbc822311610071578063ecbc82231461046a578063f242432a1461049b578063f40adb12146104b7578063fd19e10c146104ef57610172565b8063d561f5f214610400578063dd06048e1461041e578063e985e9c51461043a57610172565b80636b41d39014610341578063a22cb4651461035d578063adf04f2014610379578063b2bdfa7b146103aa578063bdc05bfe146103c8578063d3b86141146103e457610172565b80632eb2c2d6116101305780632eb2c2d61461025d5780632fb39cc61461027957806331d41c6914610295578063429b62e5146102b15780634e1273f4146102e157806353b65d401461031157610172565b8062fdd58e1461017757806301ffc9a7146101a7578063021f9c3f146101d75780630638689d146101f35780630e89341c1461020f5780632c1830391461023f575b600080fd5b610191600480360381019061018c9190613e48565b61050b565b60405161019e9190614ce8565b60405180910390f35b6101c160048036038101906101bc9190613fbc565b6105d4565b6040516101ce9190614930565b60405180910390f35b6101f160048036038101906101ec9190613f00565b6105f6565b005b61020d60048036038101906102089190614149565b6106ea565b005b61022960048036038101906102249190614149565b6107d8565b604051610236919061494b565b60405180910390f35b610247610880565b6040516102549190614733565b60405180910390f35b61027760048036038101906102729190613ca2565b6108a6565b005b610293600480360381019061028e9190614016565b6109e4565b005b6102af60048036038101906102aa9190614176565b610c4c565b005b6102cb60048036038101906102c69190613c08565b610d65565b6040516102d89190614930565b60405180910390f35b6102fb60048036038101906102f69190613e88565b610d85565b60405161030891906148d7565b60405180910390f35b61032b60048036038101906103269190613e48565b610e9e565b6040516103389190614ce8565b60405180910390f35b61035b600480360381019061035691906141d2565b610ec3565b005b61037760048036038101906103729190613e08565b6110b2565b005b610393600480360381019061038e9190614149565b6110c8565b6040516103a19291906148a7565b60405180910390f35b6103b261133f565b6040516103bf9190614733565b60405180910390f35b6103e260048036038101906103dd9190613c08565b611365565b005b6103fe60048036038101906103f99190613c08565b61148d565b005b610408611673565b6040516104159190614ce8565b60405180910390f35b61043860048036038101906104339190613f6f565b611679565b005b610454600480360381019061044f9190613c62565b611cbf565b6040516104619190614930565b60405180910390f35b610484600480360381019061047f9190614212565b611d53565b604051610492929190614870565b60405180910390f35b6104b560048036038101906104b09190613d71565b612140565b005b6104d160048036038101906104cc9190614149565b612244565b6040516104e69998979695949392919061496d565b60405180910390f35b61050960048036038101906105049190614212565b6123d6565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561057c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057390614a48565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006105df826124e9565b806105ef57506105ee826124e9565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061069b5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d190614a88565b60405180910390fd5b6106e58383836125cb565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061078f5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c590614a88565b60405180910390fd5b8060078190555050565b60606008600083815260200190815260200160002060010180546107fb90614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461082790614ff2565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b50505050509050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108ae6127ab565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108f457506108f3856108ee6127ab565b611cbf565b5b610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614b48565b60405180910390fd5b60005b83518110156109cf57600860008583815181106109565761095561515c565b5b6020026020010151815260200190815260200160002060060160009054906101000a900460ff166109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390614a68565b60405180910390fd5b80806109c790615055565b915050610936565b506109dd85858585856127b3565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610a895750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90614a88565b60405180910390fd5b6008600086815260200190815260200160002060060160039054906101000a900460ff1615610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2390614b88565b60405180910390fd5b60006008600087815260200190815260200160002090508a816000019080519060200190610b5b9291906137eb565b5089816001019080519060200190610b749291906137eb565b5088816002019080519060200190610b8d929190613871565b50878160030181905550868160040181905550858160050181905550848160060160006101000a81548160ff021916908315150217905550838160060160016101000a81548160ff021916908315150217905550828160060160026101000a81548160ff02191690831515021790555060018160060160036101000a81548160ff0219169083151502179055508115610c2857856007819055505b600089511115610c3f57610c3e896001886125cb565b5b5050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610cf15750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790614a88565b60405180910390fd5b600060086000848152602001908152602001600020905081816001019080519060200190610d5f9291906137eb565b50505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60608151835114610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290614c28565b60405180910390fd5b6000835167ffffffffffffffff811115610de857610de761518b565b5b604051908082528060200260200182016040528015610e165781602001602082028036833780820191505090505b50905060005b8451811015610e9357610e63858281518110610e3b57610e3a61515c565b5b6020026020010151858381518110610e5657610e5561515c565b5b602002602001015161050b565b828281518110610e7657610e7561515c565b5b60200260200101818152505080610e8c90615055565b9050610e1c565b508091505092915050565b6009602052816000526040600020602052806000526040600020600091509150505481565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610f685750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614a88565b60405180910390fd5b60006008600084815260200190815260200160002090506001821415610ffa578060060160009054906101000a900460ff16158160060160006101000a81548160ff0219169083151502179055506110ad565b6002821415611036578060060160019054906101000a900460ff16158160060160016101000a81548160ff0219169083151502179055506110ac565b6003821415611072578060060160029054906101000a900460ff16158160060160026101000a81548160ff0219169083151502179055506110ab565b60048214156110aa578060060160039054906101000a900460ff16158160060160036101000a81548160ff0219169083151502179055505b5b5b5b505050565b6110c46110bd6127ab565b8383612ac7565b5050565b606060008060086000858152602001908152602001600020604051806101400160405290816000820180546110fc90614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461112890614ff2565b80156111755780601f1061114a57610100808354040283529160200191611175565b820191906000526020600020905b81548152906001019060200180831161115857829003601f168201915b5050505050815260200160018201805461118e90614ff2565b80601f01602080910402602001604051908101604052809291908181526020018280546111ba90614ff2565b80156112075780601f106111dc57610100808354040283529160200191611207565b820191906000526020600020905b8154815290600101906020018083116111ea57829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561129557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161124b575b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff161515151581526020016006820160019054906101000a900460ff161515151581526020016006820160029054906101000a900460ff161515151581526020016006820160039054906101000a900460ff161515151581525050905080604001518160400151519250925050915091565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061140a5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144090614a88565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806115325750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890614a88565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561161757600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055611670565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b60075481565b600260035414156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690614ca8565b60405180910390fd5b60026003819055506000600860006007548152602001908152602001600020604051806101400160405290816000820180546116fa90614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461172690614ff2565b80156117735780601f1061174857610100808354040283529160200191611773565b820191906000526020600020905b81548152906001019060200180831161175657829003601f168201915b5050505050815260200160018201805461178c90614ff2565b80601f01602080910402602001604051908101604052809291908181526020018280546117b890614ff2565b80156118055780601f106117da57610100808354040283529160200191611805565b820191906000526020600020905b8154815290600101906020018083116117e857829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561189357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611849575b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff161515151581526020016006820160019054906101000a900460ff161515151581526020016006820160029054906101000a900460ff161515151581526020016006820160039054906101000a900460ff161515151581525050905080610100015161196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490614ba8565b60405180910390fd5b600083839050116119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa90614c48565b60405180910390fd5b8060e0015115611aaa576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060075481526020019081526020016000205414611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990614aa8565b60405180910390fd5b600081606001511115611aa95780606001518383905014611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614be8565b60405180910390fd5b5b5b600080600083606001511415611b1f5782608001516001846040015151611ad19190614eb5565b1115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614b08565b60405180910390fd5b6000915060019050611bf7565b6000836060015186869050611b34919061509e565b14611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90614b68565b60405180910390fd5b8260800151836060015186869050611b8c9190614f0b565b846040015151611b9c9190614eb5565b1115611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490614b08565b60405180910390fd5b60019150826060015185859050611bf49190614f0b565b90505b6000600167ffffffffffffffff811115611c1457611c1361518b565b5b604051908082528060200260200182016040528015611c425781602001602082028036833780820191505090505b5090503381600081518110611c5a57611c5961515c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611ca086863386612c34565b611caf81838660a001516125cb565b5050505060016003819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60608060006008600087815260200190815260200160002060405180610140016040529081600082018054611d8790614ff2565b80601f0160208091040260200160405190810160405280929190818152602001828054611db390614ff2565b8015611e005780601f10611dd557610100808354040283529160200191611e00565b820191906000526020600020905b815481529060010190602001808311611de357829003601f168201915b50505050508152602001600182018054611e1990614ff2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4590614ff2565b8015611e925780601f10611e6757610100808354040283529160200191611e92565b820191906000526020600020905b815481529060010190602001808311611e7557829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611f2057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611ed6575b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff161515151581526020016006820160019054906101000a900460ff161515151581526020016006820160029054906101000a900460ff161515151581526020016006820160039054906101000a900460ff16151515158152505090508467ffffffffffffffff811115611fcf57611fce61518b565b5b604051908082528060200260200182016040528015611ffd5781602001602082028036833780820191505090505b5091508467ffffffffffffffff81111561201a5761201961518b565b5b6040519080825280602002602001820160405280156120485781602001602082028036833780820191505090505b50925060005b858110156121365760008260400151518683604051602001612071929190614d03565b6040516020818303038152906040528051906020012060001c612094919061509e565b9050826040015181815181106120ad576120ac61515c565b5b60200260200101518583815181106120c8576120c761515c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808483815181106121165761211561515c565b5b60200260200101818152505050808061212e90615055565b91505061204e565b5050935093915050565b6121486127ab565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061218e575061218d856121886127ab565b611cbf565b5b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614ac8565b60405180910390fd5b6008600084815260200190815260200160002060060160009054906101000a900460ff16612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790614a68565b60405180910390fd5b61223d8585858585612ef6565b5050505050565b600860205280600052604060002060009150905080600001805461226790614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461229390614ff2565b80156122e05780601f106122b5576101008083540402835291602001916122e0565b820191906000526020600020905b8154815290600101906020018083116122c357829003601f168201915b5050505050908060010180546122f590614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461232190614ff2565b801561236e5780601f106123435761010080835404028352916020019161236e565b820191906000526020600020905b81548152906001019060200180831161235157829003601f168201915b5050505050908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060060160029054906101000a900460ff16908060060160039054906101000a900460ff16905089565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061247b5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b190614a88565b60405180910390fd5b600060086000858152602001908152602001600020905082816003018190555081816004018190555050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125b457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125c457506125c382613178565b5b9050919050565b60005b83518110156127a55761260c8482815181106125ed576125ec61515c565b5b60200260200101518385604051806020016040528060008152506131e2565b82600960008684815181106126245761262361515c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060008282546126869190614eb5565b9250508190555060005b8381101561273c57600860008481526020019081526020016000206002018583815181106126c1576126c061515c565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061273490615055565b915050612690565b507f96234cb3d6c373a1aaa06497a540bc166d4b0359243a088eaf95e21d7253d0be8482815181106127715761277061515c565b5b6020026020010151838560405161278a93929190614839565b60405180910390a1808061279d90615055565b9150506125ce565b50505050565b600033905090565b81518351146127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e90614b28565b60405180910390fd5b60006128716127ab565b9050612881818787878787613378565b60005b8451811015612a325760008582815181106128a2576128a161515c565b5b6020026020010151905060008583815181106128c1576128c061515c565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295990614bc8565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a179190614eb5565b9250508190555050505080612a2b90615055565b9050612884565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612aa99291906148f9565b60405180910390a4612abf818787878787613380565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614c08565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c279190614930565b60405180910390a3505050565b60005b84849050811015612eef57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868684818110612c9357612c9261515c565b5b905060200201356040518263ffffffff1660e01b8152600401612cb69190614ce8565b60206040518083038186803b158015612cce57600080fd5b505afa158015612ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d069190613c35565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6a90614ae8565b60405180910390fd5b8115612edc57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68868684818110612dca57612dc961515c565b5b905060200201356040518263ffffffff1660e01b8152600401612ded9190614ce8565b600060405180830381600087803b158015612e0757600080fd5b505af1925050508015612e18575060015b612e89573d8060008114612e48576040519150601f19603f3d011682016040523d82523d6000602084013e612e4d565b606091505b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8090614cc8565b60405180910390fd5b7f1011952107dd9857c3fc7ee54aaef4f9565140a58923d80c6e15162f7d40a41583868684818110612ebe57612ebd61515c565b5b90506020020135604051612ed3929190614810565b60405180910390a15b8080612ee790615055565b915050612c37565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614b28565b60405180910390fd5b6000612f706127ab565b9050612f90818787612f8188613567565b612f8a88613567565b87613378565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90614bc8565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130dc9190614eb5565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613159929190614d03565b60405180910390a461316f8288888888886135e1565b50505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324990614c88565b60405180910390fd5b600061325c6127ab565b905061327d8160008761326e88613567565b61327788613567565b87613378565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132dc9190614eb5565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161335a929190614d03565b60405180910390a4613371816000878787876135e1565b5050505050565b505050505050565b61339f8473ffffffffffffffffffffffffffffffffffffffff166137c8565b1561355f578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133e595949392919061474e565b602060405180830381600087803b1580156133ff57600080fd5b505af192505050801561343057506040513d601f19601f8201168201806040525081019061342d9190613fe9565b60015b6134d65761343c6151ba565b806308c379a014156134995750613451615873565b8061345c575061349b565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613490919061494b565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cd90614a08565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461355d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355490614a28565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156135865761358561518b565b5b6040519080825280602002602001820160405280156135b45781602001602082028036833780820191505090505b50905082816000815181106135cc576135cb61515c565b5b60200260200101818152505080915050919050565b6136008473ffffffffffffffffffffffffffffffffffffffff166137c8565b156137c0578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016136469594939291906147b6565b602060405180830381600087803b15801561366057600080fd5b505af192505050801561369157506040513d601f19601f8201168201806040525081019061368e9190613fe9565b60015b6137375761369d6151ba565b806308c379a014156136fa57506136b2615873565b806136bd57506136fc565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f1919061494b565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372e90614a08565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614a28565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546137f790614ff2565b90600052602060002090601f0160209004810192826138195760008555613860565b82601f1061383257805160ff1916838001178555613860565b82800160010185558215613860579182015b8281111561385f578251825591602001919060010190613844565b5b50905061386d91906138fb565b5090565b8280548282559060005260206000209081019282156138ea579160200282015b828111156138e95782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613891565b5b5090506138f791906138fb565b5090565b5b808211156139145760008160009055506001016138fc565b5090565b600061392b61392684614d51565b614d2c565b9050808382526020820190508285602086028201111561394e5761394d6151e6565b5b60005b8581101561397e57816139648882613a7c565b845260208401935060208301925050600181019050613951565b5050509392505050565b600061399b61399684614d7d565b614d2c565b905080838252602082019050828560208602820111156139be576139bd6151e6565b5b60005b858110156139ee57816139d48882613bf3565b8452602084019350602083019250506001810190506139c1565b5050509392505050565b6000613a0b613a0684614da9565b614d2c565b905082815260208101848484011115613a2757613a266151eb565b5b613a32848285614fb0565b509392505050565b6000613a4d613a4884614dda565b614d2c565b905082815260208101848484011115613a6957613a686151eb565b5b613a74848285614fb0565b509392505050565b600081359050613a8b81615909565b92915050565b600081519050613aa081615909565b92915050565b600082601f830112613abb57613aba6151e1565b5b8135613acb848260208601613918565b91505092915050565b60008083601f840112613aea57613ae96151e1565b5b8235905067ffffffffffffffff811115613b0757613b066151dc565b5b602083019150836020820283011115613b2357613b226151e6565b5b9250929050565b600082601f830112613b3f57613b3e6151e1565b5b8135613b4f848260208601613988565b91505092915050565b600081359050613b6781615920565b92915050565b600081359050613b7c81615937565b92915050565b600081519050613b9181615937565b92915050565b600082601f830112613bac57613bab6151e1565b5b8135613bbc8482602086016139f8565b91505092915050565b600082601f830112613bda57613bd96151e1565b5b8135613bea848260208601613a3a565b91505092915050565b600081359050613c028161594e565b92915050565b600060208284031215613c1e57613c1d6151f5565b5b6000613c2c84828501613a7c565b91505092915050565b600060208284031215613c4b57613c4a6151f5565b5b6000613c5984828501613a91565b91505092915050565b60008060408385031215613c7957613c786151f5565b5b6000613c8785828601613a7c565b9250506020613c9885828601613a7c565b9150509250929050565b600080600080600060a08688031215613cbe57613cbd6151f5565b5b6000613ccc88828901613a7c565b9550506020613cdd88828901613a7c565b945050604086013567ffffffffffffffff811115613cfe57613cfd6151f0565b5b613d0a88828901613b2a565b935050606086013567ffffffffffffffff811115613d2b57613d2a6151f0565b5b613d3788828901613b2a565b925050608086013567ffffffffffffffff811115613d5857613d576151f0565b5b613d6488828901613b97565b9150509295509295909350565b600080600080600060a08688031215613d8d57613d8c6151f5565b5b6000613d9b88828901613a7c565b9550506020613dac88828901613a7c565b9450506040613dbd88828901613bf3565b9350506060613dce88828901613bf3565b925050608086013567ffffffffffffffff811115613def57613dee6151f0565b5b613dfb88828901613b97565b9150509295509295909350565b60008060408385031215613e1f57613e1e6151f5565b5b6000613e2d85828601613a7c565b9250506020613e3e85828601613b58565b9150509250929050565b60008060408385031215613e5f57613e5e6151f5565b5b6000613e6d85828601613a7c565b9250506020613e7e85828601613bf3565b9150509250929050565b60008060408385031215613e9f57613e9e6151f5565b5b600083013567ffffffffffffffff811115613ebd57613ebc6151f0565b5b613ec985828601613aa6565b925050602083013567ffffffffffffffff811115613eea57613ee96151f0565b5b613ef685828601613b2a565b9150509250929050565b600080600060608486031215613f1957613f186151f5565b5b600084013567ffffffffffffffff811115613f3757613f366151f0565b5b613f4386828701613aa6565b9350506020613f5486828701613bf3565b9250506040613f6586828701613bf3565b9150509250925092565b60008060208385031215613f8657613f856151f5565b5b600083013567ffffffffffffffff811115613fa457613fa36151f0565b5b613fb085828601613ad4565b92509250509250929050565b600060208284031215613fd257613fd16151f5565b5b6000613fe084828501613b6d565b91505092915050565b600060208284031215613fff57613ffe6151f5565b5b600061400d84828501613b82565b91505092915050565b6000806000806000806000806000806101408b8d03121561403a576140396151f5565b5b60008b013567ffffffffffffffff811115614058576140576151f0565b5b6140648d828e01613bc5565b9a505060208b013567ffffffffffffffff811115614085576140846151f0565b5b6140918d828e01613bc5565b99505060408b013567ffffffffffffffff8111156140b2576140b16151f0565b5b6140be8d828e01613aa6565b98505060606140cf8d828e01613bf3565b97505060806140e08d828e01613bf3565b96505060a06140f18d828e01613bf3565b95505060c06141028d828e01613b58565b94505060e06141138d828e01613b58565b9350506101006141258d828e01613b58565b9250506101206141378d828e01613b58565b9150509295989b9194979a5092959850565b60006020828403121561415f5761415e6151f5565b5b600061416d84828501613bf3565b91505092915050565b6000806040838503121561418d5761418c6151f5565b5b600061419b85828601613bf3565b925050602083013567ffffffffffffffff8111156141bc576141bb6151f0565b5b6141c885828601613bc5565b9150509250929050565b600080604083850312156141e9576141e86151f5565b5b60006141f785828601613bf3565b925050602061420885828601613bf3565b9150509250929050565b60008060006060848603121561422b5761422a6151f5565b5b600061423986828701613bf3565b935050602061424a86828701613bf3565b925050604061425b86828701613bf3565b9150509250925092565b60006142718383614295565b60208301905092915050565b60006142898383614715565b60208301905092915050565b61429e81614f3c565b82525050565b6142ad81614f3c565b82525050565b60006142be82614e2b565b6142c88185614e71565b93506142d383614e0b565b8060005b838110156143045781516142eb8882614265565b97506142f683614e57565b9250506001810190506142d7565b5085935050505092915050565b600061431c82614e36565b6143268185614e82565b935061433183614e1b565b8060005b83811015614362578151614349888261427d565b975061435483614e64565b925050600181019050614335565b5085935050505092915050565b61437881614f4e565b82525050565b600061438982614e41565b6143938185614e93565b93506143a3818560208601614fbf565b6143ac816151fa565b840191505092915050565b60006143c282614e4c565b6143cc8185614ea4565b93506143dc818560208601614fbf565b6143e5816151fa565b840191505092915050565b60006143fd603483614ea4565b915061440882615218565b604082019050919050565b6000614420602883614ea4565b915061442b82615267565b604082019050919050565b6000614443602b83614ea4565b915061444e826152b6565b604082019050919050565b6000614466601c83614ea4565b915061447182615305565b602082019050919050565b6000614489602783614ea4565b91506144948261532e565b604082019050919050565b60006144ac602f83614ea4565b91506144b78261537d565b604082019050919050565b60006144cf602983614ea4565b91506144da826153cc565b604082019050919050565b60006144f2602d83614ea4565b91506144fd8261541b565b604082019050919050565b6000614515601483614ea4565b91506145208261546a565b602082019050919050565b6000614538602583614ea4565b915061454382615493565b604082019050919050565b600061455b603283614ea4565b9150614566826154e2565b604082019050919050565b600061457e602e83614ea4565b915061458982615531565b604082019050919050565b60006145a1602483614ea4565b91506145ac82615580565b604082019050919050565b60006145c4601a83614ea4565b91506145cf826155cf565b602082019050919050565b60006145e7602a83614ea4565b91506145f2826155f8565b604082019050919050565b600061460a603f83614ea4565b915061461582615647565b604082019050919050565b600061462d602983614ea4565b915061463882615696565b604082019050919050565b6000614650602983614ea4565b915061465b826156e5565b604082019050919050565b6000614673601983614ea4565b915061467e82615734565b602082019050919050565b6000614696602883614ea4565b91506146a18261575d565b604082019050919050565b60006146b9602183614ea4565b91506146c4826157ac565b604082019050919050565b60006146dc601f83614ea4565b91506146e7826157fb565b602082019050919050565b60006146ff603083614ea4565b915061470a82615824565b604082019050919050565b61471e81614fa6565b82525050565b61472d81614fa6565b82525050565b600060208201905061474860008301846142a4565b92915050565b600060a08201905061476360008301886142a4565b61477060208301876142a4565b81810360408301526147828186614311565b905081810360608301526147968185614311565b905081810360808301526147aa818461437e565b90509695505050505050565b600060a0820190506147cb60008301886142a4565b6147d860208301876142a4565b6147e56040830186614724565b6147f26060830185614724565b8181036080830152614804818461437e565b90509695505050505050565b600060408201905061482560008301856142a4565b6148326020830184614724565b9392505050565b600060608201905061484e60008301866142a4565b61485b6020830185614724565b6148686040830184614724565b949350505050565b6000604082019050818103600083015261488a81856142b3565b9050818103602083015261489e8184614311565b90509392505050565b600060408201905081810360008301526148c181856142b3565b90506148d06020830184614724565b9392505050565b600060208201905081810360008301526148f18184614311565b905092915050565b600060408201905081810360008301526149138185614311565b905081810360208301526149278184614311565b90509392505050565b6000602082019050614945600083018461436f565b92915050565b6000602082019050818103600083015261496581846143b7565b905092915050565b6000610120820190508181036000830152614988818c6143b7565b9050818103602083015261499c818b6143b7565b90506149ab604083018a614724565b6149b86060830189614724565b6149c56080830188614724565b6149d260a083018761436f565b6149df60c083018661436f565b6149ec60e083018561436f565b6149fa61010083018461436f565b9a9950505050505050505050565b60006020820190508181036000830152614a21816143f0565b9050919050565b60006020820190508181036000830152614a4181614413565b9050919050565b60006020820190508181036000830152614a6181614436565b9050919050565b60006020820190508181036000830152614a8181614459565b9050919050565b60006020820190508181036000830152614aa18161447c565b9050919050565b60006020820190508181036000830152614ac18161449f565b9050919050565b60006020820190508181036000830152614ae1816144c2565b9050919050565b60006020820190508181036000830152614b01816144e5565b9050919050565b60006020820190508181036000830152614b2181614508565b9050919050565b60006020820190508181036000830152614b418161452b565b9050919050565b60006020820190508181036000830152614b618161454e565b9050919050565b60006020820190508181036000830152614b8181614571565b9050919050565b60006020820190508181036000830152614ba181614594565b9050919050565b60006020820190508181036000830152614bc1816145b7565b9050919050565b60006020820190508181036000830152614be1816145da565b9050919050565b60006020820190508181036000830152614c01816145fd565b9050919050565b60006020820190508181036000830152614c2181614620565b9050919050565b60006020820190508181036000830152614c4181614643565b9050919050565b60006020820190508181036000830152614c6181614666565b9050919050565b60006020820190508181036000830152614c8181614689565b9050919050565b60006020820190508181036000830152614ca1816146ac565b9050919050565b60006020820190508181036000830152614cc1816146cf565b9050919050565b60006020820190508181036000830152614ce1816146f2565b9050919050565b6000602082019050614cfd6000830184614724565b92915050565b6000604082019050614d186000830185614724565b614d256020830184614724565b9392505050565b6000614d36614d47565b9050614d428282615024565b919050565b6000604051905090565b600067ffffffffffffffff821115614d6c57614d6b61518b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d9857614d9761518b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614dc457614dc361518b565b5b614dcd826151fa565b9050602081019050919050565b600067ffffffffffffffff821115614df557614df461518b565b5b614dfe826151fa565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614ec082614fa6565b9150614ecb83614fa6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f0057614eff6150cf565b5b828201905092915050565b6000614f1682614fa6565b9150614f2183614fa6565b925082614f3157614f306150fe565b5b828204905092915050565b6000614f4782614f86565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fdd578082015181840152602081019050614fc2565b83811115614fec576000848401525b50505050565b6000600282049050600182168061500a57607f821691505b6020821081141561501e5761501d61512d565b5b50919050565b61502d826151fa565b810181811067ffffffffffffffff8211171561504c5761504b61518b565b5b80604052505050565b600061506082614fa6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615093576150926150cf565b5b600182019050919050565b60006150a982614fa6565b91506150b483614fa6565b9250826150c4576150c36150fe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156151d95760046000803e6151d660005161520b565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f5472616e7366657273206c6f636b656420627920636f6e747261637400000000600082015250565b7f41646d696e50726976696c656765733a2063616c6c6572206973206e6f74206160008201527f6e2061646d696e00000000000000000000000000000000000000000000000000602082015250565b7f546869732063686170746572206973206f6e6c7920616363657074696e67207560008201527f6e69717565206164647265737365730000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f4d75737420626520746f6b656e206f776e657220616e6420746f6b656e73206d60008201527f75737420626520756e6971756500000000000000000000000000000000000000602082015250565b7f4275726e206c696d697420737572706173736564000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f546f6b656e28732920616d6f756e74206973206e6f742061206d756c7469706c60008201527f65206f66207468726573686f6c64000000000000000000000000000000000000602082015250565b7f596f75206d75737420756e6c6f636b206368617074657220746f206f7665727760008201527f7269746500000000000000000000000000000000000000000000000000000000602082015250565b7f546869732063686170746572206973206e6f7420616374697665000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f596f75206d6179206f6e6c79206275726e20746865207468726573686f6c642060008201527f616d6f756e7420666f7220756e697175652061646472657373206c6973747300602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f546f6b656e4964732063616e206e6f7420626520656d70747900000000000000600082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4275726e206661696c7572652c20636865636b20696620736574417070726f7660008201527f616c466f72416c6c206973207472756500000000000000000000000000000000602082015250565b600060443d101561588357615906565b61588b614d47565b60043d036004823e80513d602482011167ffffffffffffffff821117156158b3575050615906565b808201805167ffffffffffffffff8111156158d15750505050615906565b80602083010160043d0385018111156158ee575050505050615906565b6158fd82602001850186615024565b82955050505050505b90565b61591281614f3c565b811461591d57600080fd5b50565b61592981614f4e565b811461593457600080fd5b50565b61594081614f5a565b811461594b57600080fd5b50565b61595781614fa6565b811461596257600080fd5b5056fea2646970667358221220b3db0a4e3e8792025fc589c13da94e487bdcd43106cd05a38c8644137ac87b7664736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101725760003560e01c80636b41d390116100de578063d561f5f211610097578063ecbc822311610071578063ecbc82231461046a578063f242432a1461049b578063f40adb12146104b7578063fd19e10c146104ef57610172565b8063d561f5f214610400578063dd06048e1461041e578063e985e9c51461043a57610172565b80636b41d39014610341578063a22cb4651461035d578063adf04f2014610379578063b2bdfa7b146103aa578063bdc05bfe146103c8578063d3b86141146103e457610172565b80632eb2c2d6116101305780632eb2c2d61461025d5780632fb39cc61461027957806331d41c6914610295578063429b62e5146102b15780634e1273f4146102e157806353b65d401461031157610172565b8062fdd58e1461017757806301ffc9a7146101a7578063021f9c3f146101d75780630638689d146101f35780630e89341c1461020f5780632c1830391461023f575b600080fd5b610191600480360381019061018c9190613e48565b61050b565b60405161019e9190614ce8565b60405180910390f35b6101c160048036038101906101bc9190613fbc565b6105d4565b6040516101ce9190614930565b60405180910390f35b6101f160048036038101906101ec9190613f00565b6105f6565b005b61020d60048036038101906102089190614149565b6106ea565b005b61022960048036038101906102249190614149565b6107d8565b604051610236919061494b565b60405180910390f35b610247610880565b6040516102549190614733565b60405180910390f35b61027760048036038101906102729190613ca2565b6108a6565b005b610293600480360381019061028e9190614016565b6109e4565b005b6102af60048036038101906102aa9190614176565b610c4c565b005b6102cb60048036038101906102c69190613c08565b610d65565b6040516102d89190614930565b60405180910390f35b6102fb60048036038101906102f69190613e88565b610d85565b60405161030891906148d7565b60405180910390f35b61032b60048036038101906103269190613e48565b610e9e565b6040516103389190614ce8565b60405180910390f35b61035b600480360381019061035691906141d2565b610ec3565b005b61037760048036038101906103729190613e08565b6110b2565b005b610393600480360381019061038e9190614149565b6110c8565b6040516103a19291906148a7565b60405180910390f35b6103b261133f565b6040516103bf9190614733565b60405180910390f35b6103e260048036038101906103dd9190613c08565b611365565b005b6103fe60048036038101906103f99190613c08565b61148d565b005b610408611673565b6040516104159190614ce8565b60405180910390f35b61043860048036038101906104339190613f6f565b611679565b005b610454600480360381019061044f9190613c62565b611cbf565b6040516104619190614930565b60405180910390f35b610484600480360381019061047f9190614212565b611d53565b604051610492929190614870565b60405180910390f35b6104b560048036038101906104b09190613d71565b612140565b005b6104d160048036038101906104cc9190614149565b612244565b6040516104e69998979695949392919061496d565b60405180910390f35b61050960048036038101906105049190614212565b6123d6565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561057c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057390614a48565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006105df826124e9565b806105ef57506105ee826124e9565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061069b5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d190614a88565b60405180910390fd5b6106e58383836125cb565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061078f5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c590614a88565b60405180910390fd5b8060078190555050565b60606008600083815260200190815260200160002060010180546107fb90614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461082790614ff2565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b50505050509050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108ae6127ab565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108f457506108f3856108ee6127ab565b611cbf565b5b610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614b48565b60405180910390fd5b60005b83518110156109cf57600860008583815181106109565761095561515c565b5b6020026020010151815260200190815260200160002060060160009054906101000a900460ff166109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390614a68565b60405180910390fd5b80806109c790615055565b915050610936565b506109dd85858585856127b3565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610a895750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90614a88565b60405180910390fd5b6008600086815260200190815260200160002060060160039054906101000a900460ff1615610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2390614b88565b60405180910390fd5b60006008600087815260200190815260200160002090508a816000019080519060200190610b5b9291906137eb565b5089816001019080519060200190610b749291906137eb565b5088816002019080519060200190610b8d929190613871565b50878160030181905550868160040181905550858160050181905550848160060160006101000a81548160ff021916908315150217905550838160060160016101000a81548160ff021916908315150217905550828160060160026101000a81548160ff02191690831515021790555060018160060160036101000a81548160ff0219169083151502179055508115610c2857856007819055505b600089511115610c3f57610c3e896001886125cb565b5b5050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610cf15750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790614a88565b60405180910390fd5b600060086000848152602001908152602001600020905081816001019080519060200190610d5f9291906137eb565b50505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60608151835114610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290614c28565b60405180910390fd5b6000835167ffffffffffffffff811115610de857610de761518b565b5b604051908082528060200260200182016040528015610e165781602001602082028036833780820191505090505b50905060005b8451811015610e9357610e63858281518110610e3b57610e3a61515c565b5b6020026020010151858381518110610e5657610e5561515c565b5b602002602001015161050b565b828281518110610e7657610e7561515c565b5b60200260200101818152505080610e8c90615055565b9050610e1c565b508091505092915050565b6009602052816000526040600020602052806000526040600020600091509150505481565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610f685750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614a88565b60405180910390fd5b60006008600084815260200190815260200160002090506001821415610ffa578060060160009054906101000a900460ff16158160060160006101000a81548160ff0219169083151502179055506110ad565b6002821415611036578060060160019054906101000a900460ff16158160060160016101000a81548160ff0219169083151502179055506110ac565b6003821415611072578060060160029054906101000a900460ff16158160060160026101000a81548160ff0219169083151502179055506110ab565b60048214156110aa578060060160039054906101000a900460ff16158160060160036101000a81548160ff0219169083151502179055505b5b5b5b505050565b6110c46110bd6127ab565b8383612ac7565b5050565b606060008060086000858152602001908152602001600020604051806101400160405290816000820180546110fc90614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461112890614ff2565b80156111755780601f1061114a57610100808354040283529160200191611175565b820191906000526020600020905b81548152906001019060200180831161115857829003601f168201915b5050505050815260200160018201805461118e90614ff2565b80601f01602080910402602001604051908101604052809291908181526020018280546111ba90614ff2565b80156112075780601f106111dc57610100808354040283529160200191611207565b820191906000526020600020905b8154815290600101906020018083116111ea57829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561129557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161124b575b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff161515151581526020016006820160019054906101000a900460ff161515151581526020016006820160029054906101000a900460ff161515151581526020016006820160039054906101000a900460ff161515151581525050905080604001518160400151519250925050915091565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061140a5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144090614a88565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806115325750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890614a88565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561161757600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055611670565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b60075481565b600260035414156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690614ca8565b60405180910390fd5b60026003819055506000600860006007548152602001908152602001600020604051806101400160405290816000820180546116fa90614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461172690614ff2565b80156117735780601f1061174857610100808354040283529160200191611773565b820191906000526020600020905b81548152906001019060200180831161175657829003601f168201915b5050505050815260200160018201805461178c90614ff2565b80601f01602080910402602001604051908101604052809291908181526020018280546117b890614ff2565b80156118055780601f106117da57610100808354040283529160200191611805565b820191906000526020600020905b8154815290600101906020018083116117e857829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561189357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611849575b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff161515151581526020016006820160019054906101000a900460ff161515151581526020016006820160029054906101000a900460ff161515151581526020016006820160039054906101000a900460ff161515151581525050905080610100015161196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490614ba8565b60405180910390fd5b600083839050116119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa90614c48565b60405180910390fd5b8060e0015115611aaa576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060075481526020019081526020016000205414611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990614aa8565b60405180910390fd5b600081606001511115611aa95780606001518383905014611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614be8565b60405180910390fd5b5b5b600080600083606001511415611b1f5782608001516001846040015151611ad19190614eb5565b1115611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614b08565b60405180910390fd5b6000915060019050611bf7565b6000836060015186869050611b34919061509e565b14611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90614b68565b60405180910390fd5b8260800151836060015186869050611b8c9190614f0b565b846040015151611b9c9190614eb5565b1115611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490614b08565b60405180910390fd5b60019150826060015185859050611bf49190614f0b565b90505b6000600167ffffffffffffffff811115611c1457611c1361518b565b5b604051908082528060200260200182016040528015611c425781602001602082028036833780820191505090505b5090503381600081518110611c5a57611c5961515c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611ca086863386612c34565b611caf81838660a001516125cb565b5050505060016003819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60608060006008600087815260200190815260200160002060405180610140016040529081600082018054611d8790614ff2565b80601f0160208091040260200160405190810160405280929190818152602001828054611db390614ff2565b8015611e005780601f10611dd557610100808354040283529160200191611e00565b820191906000526020600020905b815481529060010190602001808311611de357829003601f168201915b50505050508152602001600182018054611e1990614ff2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4590614ff2565b8015611e925780601f10611e6757610100808354040283529160200191611e92565b820191906000526020600020905b815481529060010190602001808311611e7557829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611f2057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611ed6575b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff161515151581526020016006820160019054906101000a900460ff161515151581526020016006820160029054906101000a900460ff161515151581526020016006820160039054906101000a900460ff16151515158152505090508467ffffffffffffffff811115611fcf57611fce61518b565b5b604051908082528060200260200182016040528015611ffd5781602001602082028036833780820191505090505b5091508467ffffffffffffffff81111561201a5761201961518b565b5b6040519080825280602002602001820160405280156120485781602001602082028036833780820191505090505b50925060005b858110156121365760008260400151518683604051602001612071929190614d03565b6040516020818303038152906040528051906020012060001c612094919061509e565b9050826040015181815181106120ad576120ac61515c565b5b60200260200101518583815181106120c8576120c761515c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808483815181106121165761211561515c565b5b60200260200101818152505050808061212e90615055565b91505061204e565b5050935093915050565b6121486127ab565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061218e575061218d856121886127ab565b611cbf565b5b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614ac8565b60405180910390fd5b6008600084815260200190815260200160002060060160009054906101000a900460ff16612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790614a68565b60405180910390fd5b61223d8585858585612ef6565b5050505050565b600860205280600052604060002060009150905080600001805461226790614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461229390614ff2565b80156122e05780601f106122b5576101008083540402835291602001916122e0565b820191906000526020600020905b8154815290600101906020018083116122c357829003601f168201915b5050505050908060010180546122f590614ff2565b80601f016020809104026020016040519081016040528092919081815260200182805461232190614ff2565b801561236e5780601f106123435761010080835404028352916020019161236e565b820191906000526020600020905b81548152906001019060200180831161235157829003601f168201915b5050505050908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060060160029054906101000a900460ff16908060060160039054906101000a900460ff16905089565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061247b5750600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b190614a88565b60405180910390fd5b600060086000858152602001908152602001600020905082816003018190555081816004018190555050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125b457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125c457506125c382613178565b5b9050919050565b60005b83518110156127a55761260c8482815181106125ed576125ec61515c565b5b60200260200101518385604051806020016040528060008152506131e2565b82600960008684815181106126245761262361515c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060008282546126869190614eb5565b9250508190555060005b8381101561273c57600860008481526020019081526020016000206002018583815181106126c1576126c061515c565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061273490615055565b915050612690565b507f96234cb3d6c373a1aaa06497a540bc166d4b0359243a088eaf95e21d7253d0be8482815181106127715761277061515c565b5b6020026020010151838560405161278a93929190614839565b60405180910390a1808061279d90615055565b9150506125ce565b50505050565b600033905090565b81518351146127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e90614b28565b60405180910390fd5b60006128716127ab565b9050612881818787878787613378565b60005b8451811015612a325760008582815181106128a2576128a161515c565b5b6020026020010151905060008583815181106128c1576128c061515c565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295990614bc8565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a179190614eb5565b9250508190555050505080612a2b90615055565b9050612884565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612aa99291906148f9565b60405180910390a4612abf818787878787613380565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90614c08565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c279190614930565b60405180910390a3505050565b60005b84849050811015612eef57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868684818110612c9357612c9261515c565b5b905060200201356040518263ffffffff1660e01b8152600401612cb69190614ce8565b60206040518083038186803b158015612cce57600080fd5b505afa158015612ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d069190613c35565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6a90614ae8565b60405180910390fd5b8115612edc57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68868684818110612dca57612dc961515c565b5b905060200201356040518263ffffffff1660e01b8152600401612ded9190614ce8565b600060405180830381600087803b158015612e0757600080fd5b505af1925050508015612e18575060015b612e89573d8060008114612e48576040519150601f19603f3d011682016040523d82523d6000602084013e612e4d565b606091505b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8090614cc8565b60405180910390fd5b7f1011952107dd9857c3fc7ee54aaef4f9565140a58923d80c6e15162f7d40a41583868684818110612ebe57612ebd61515c565b5b90506020020135604051612ed3929190614810565b60405180910390a15b8080612ee790615055565b915050612c37565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614b28565b60405180910390fd5b6000612f706127ab565b9050612f90818787612f8188613567565b612f8a88613567565b87613378565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90614bc8565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130dc9190614eb5565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613159929190614d03565b60405180910390a461316f8288888888886135e1565b50505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324990614c88565b60405180910390fd5b600061325c6127ab565b905061327d8160008761326e88613567565b61327788613567565b87613378565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132dc9190614eb5565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161335a929190614d03565b60405180910390a4613371816000878787876135e1565b5050505050565b505050505050565b61339f8473ffffffffffffffffffffffffffffffffffffffff166137c8565b1561355f578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133e595949392919061474e565b602060405180830381600087803b1580156133ff57600080fd5b505af192505050801561343057506040513d601f19601f8201168201806040525081019061342d9190613fe9565b60015b6134d65761343c6151ba565b806308c379a014156134995750613451615873565b8061345c575061349b565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613490919061494b565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cd90614a08565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461355d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355490614a28565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156135865761358561518b565b5b6040519080825280602002602001820160405280156135b45781602001602082028036833780820191505090505b50905082816000815181106135cc576135cb61515c565b5b60200260200101818152505080915050919050565b6136008473ffffffffffffffffffffffffffffffffffffffff166137c8565b156137c0578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016136469594939291906147b6565b602060405180830381600087803b15801561366057600080fd5b505af192505050801561369157506040513d601f19601f8201168201806040525081019061368e9190613fe9565b60015b6137375761369d6151ba565b806308c379a014156136fa57506136b2615873565b806136bd57506136fc565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f1919061494b565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372e90614a08565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614a28565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546137f790614ff2565b90600052602060002090601f0160209004810192826138195760008555613860565b82601f1061383257805160ff1916838001178555613860565b82800160010185558215613860579182015b8281111561385f578251825591602001919060010190613844565b5b50905061386d91906138fb565b5090565b8280548282559060005260206000209081019282156138ea579160200282015b828111156138e95782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613891565b5b5090506138f791906138fb565b5090565b5b808211156139145760008160009055506001016138fc565b5090565b600061392b61392684614d51565b614d2c565b9050808382526020820190508285602086028201111561394e5761394d6151e6565b5b60005b8581101561397e57816139648882613a7c565b845260208401935060208301925050600181019050613951565b5050509392505050565b600061399b61399684614d7d565b614d2c565b905080838252602082019050828560208602820111156139be576139bd6151e6565b5b60005b858110156139ee57816139d48882613bf3565b8452602084019350602083019250506001810190506139c1565b5050509392505050565b6000613a0b613a0684614da9565b614d2c565b905082815260208101848484011115613a2757613a266151eb565b5b613a32848285614fb0565b509392505050565b6000613a4d613a4884614dda565b614d2c565b905082815260208101848484011115613a6957613a686151eb565b5b613a74848285614fb0565b509392505050565b600081359050613a8b81615909565b92915050565b600081519050613aa081615909565b92915050565b600082601f830112613abb57613aba6151e1565b5b8135613acb848260208601613918565b91505092915050565b60008083601f840112613aea57613ae96151e1565b5b8235905067ffffffffffffffff811115613b0757613b066151dc565b5b602083019150836020820283011115613b2357613b226151e6565b5b9250929050565b600082601f830112613b3f57613b3e6151e1565b5b8135613b4f848260208601613988565b91505092915050565b600081359050613b6781615920565b92915050565b600081359050613b7c81615937565b92915050565b600081519050613b9181615937565b92915050565b600082601f830112613bac57613bab6151e1565b5b8135613bbc8482602086016139f8565b91505092915050565b600082601f830112613bda57613bd96151e1565b5b8135613bea848260208601613a3a565b91505092915050565b600081359050613c028161594e565b92915050565b600060208284031215613c1e57613c1d6151f5565b5b6000613c2c84828501613a7c565b91505092915050565b600060208284031215613c4b57613c4a6151f5565b5b6000613c5984828501613a91565b91505092915050565b60008060408385031215613c7957613c786151f5565b5b6000613c8785828601613a7c565b9250506020613c9885828601613a7c565b9150509250929050565b600080600080600060a08688031215613cbe57613cbd6151f5565b5b6000613ccc88828901613a7c565b9550506020613cdd88828901613a7c565b945050604086013567ffffffffffffffff811115613cfe57613cfd6151f0565b5b613d0a88828901613b2a565b935050606086013567ffffffffffffffff811115613d2b57613d2a6151f0565b5b613d3788828901613b2a565b925050608086013567ffffffffffffffff811115613d5857613d576151f0565b5b613d6488828901613b97565b9150509295509295909350565b600080600080600060a08688031215613d8d57613d8c6151f5565b5b6000613d9b88828901613a7c565b9550506020613dac88828901613a7c565b9450506040613dbd88828901613bf3565b9350506060613dce88828901613bf3565b925050608086013567ffffffffffffffff811115613def57613dee6151f0565b5b613dfb88828901613b97565b9150509295509295909350565b60008060408385031215613e1f57613e1e6151f5565b5b6000613e2d85828601613a7c565b9250506020613e3e85828601613b58565b9150509250929050565b60008060408385031215613e5f57613e5e6151f5565b5b6000613e6d85828601613a7c565b9250506020613e7e85828601613bf3565b9150509250929050565b60008060408385031215613e9f57613e9e6151f5565b5b600083013567ffffffffffffffff811115613ebd57613ebc6151f0565b5b613ec985828601613aa6565b925050602083013567ffffffffffffffff811115613eea57613ee96151f0565b5b613ef685828601613b2a565b9150509250929050565b600080600060608486031215613f1957613f186151f5565b5b600084013567ffffffffffffffff811115613f3757613f366151f0565b5b613f4386828701613aa6565b9350506020613f5486828701613bf3565b9250506040613f6586828701613bf3565b9150509250925092565b60008060208385031215613f8657613f856151f5565b5b600083013567ffffffffffffffff811115613fa457613fa36151f0565b5b613fb085828601613ad4565b92509250509250929050565b600060208284031215613fd257613fd16151f5565b5b6000613fe084828501613b6d565b91505092915050565b600060208284031215613fff57613ffe6151f5565b5b600061400d84828501613b82565b91505092915050565b6000806000806000806000806000806101408b8d03121561403a576140396151f5565b5b60008b013567ffffffffffffffff811115614058576140576151f0565b5b6140648d828e01613bc5565b9a505060208b013567ffffffffffffffff811115614085576140846151f0565b5b6140918d828e01613bc5565b99505060408b013567ffffffffffffffff8111156140b2576140b16151f0565b5b6140be8d828e01613aa6565b98505060606140cf8d828e01613bf3565b97505060806140e08d828e01613bf3565b96505060a06140f18d828e01613bf3565b95505060c06141028d828e01613b58565b94505060e06141138d828e01613b58565b9350506101006141258d828e01613b58565b9250506101206141378d828e01613b58565b9150509295989b9194979a5092959850565b60006020828403121561415f5761415e6151f5565b5b600061416d84828501613bf3565b91505092915050565b6000806040838503121561418d5761418c6151f5565b5b600061419b85828601613bf3565b925050602083013567ffffffffffffffff8111156141bc576141bb6151f0565b5b6141c885828601613bc5565b9150509250929050565b600080604083850312156141e9576141e86151f5565b5b60006141f785828601613bf3565b925050602061420885828601613bf3565b9150509250929050565b60008060006060848603121561422b5761422a6151f5565b5b600061423986828701613bf3565b935050602061424a86828701613bf3565b925050604061425b86828701613bf3565b9150509250925092565b60006142718383614295565b60208301905092915050565b60006142898383614715565b60208301905092915050565b61429e81614f3c565b82525050565b6142ad81614f3c565b82525050565b60006142be82614e2b565b6142c88185614e71565b93506142d383614e0b565b8060005b838110156143045781516142eb8882614265565b97506142f683614e57565b9250506001810190506142d7565b5085935050505092915050565b600061431c82614e36565b6143268185614e82565b935061433183614e1b565b8060005b83811015614362578151614349888261427d565b975061435483614e64565b925050600181019050614335565b5085935050505092915050565b61437881614f4e565b82525050565b600061438982614e41565b6143938185614e93565b93506143a3818560208601614fbf565b6143ac816151fa565b840191505092915050565b60006143c282614e4c565b6143cc8185614ea4565b93506143dc818560208601614fbf565b6143e5816151fa565b840191505092915050565b60006143fd603483614ea4565b915061440882615218565b604082019050919050565b6000614420602883614ea4565b915061442b82615267565b604082019050919050565b6000614443602b83614ea4565b915061444e826152b6565b604082019050919050565b6000614466601c83614ea4565b915061447182615305565b602082019050919050565b6000614489602783614ea4565b91506144948261532e565b604082019050919050565b60006144ac602f83614ea4565b91506144b78261537d565b604082019050919050565b60006144cf602983614ea4565b91506144da826153cc565b604082019050919050565b60006144f2602d83614ea4565b91506144fd8261541b565b604082019050919050565b6000614515601483614ea4565b91506145208261546a565b602082019050919050565b6000614538602583614ea4565b915061454382615493565b604082019050919050565b600061455b603283614ea4565b9150614566826154e2565b604082019050919050565b600061457e602e83614ea4565b915061458982615531565b604082019050919050565b60006145a1602483614ea4565b91506145ac82615580565b604082019050919050565b60006145c4601a83614ea4565b91506145cf826155cf565b602082019050919050565b60006145e7602a83614ea4565b91506145f2826155f8565b604082019050919050565b600061460a603f83614ea4565b915061461582615647565b604082019050919050565b600061462d602983614ea4565b915061463882615696565b604082019050919050565b6000614650602983614ea4565b915061465b826156e5565b604082019050919050565b6000614673601983614ea4565b915061467e82615734565b602082019050919050565b6000614696602883614ea4565b91506146a18261575d565b604082019050919050565b60006146b9602183614ea4565b91506146c4826157ac565b604082019050919050565b60006146dc601f83614ea4565b91506146e7826157fb565b602082019050919050565b60006146ff603083614ea4565b915061470a82615824565b604082019050919050565b61471e81614fa6565b82525050565b61472d81614fa6565b82525050565b600060208201905061474860008301846142a4565b92915050565b600060a08201905061476360008301886142a4565b61477060208301876142a4565b81810360408301526147828186614311565b905081810360608301526147968185614311565b905081810360808301526147aa818461437e565b90509695505050505050565b600060a0820190506147cb60008301886142a4565b6147d860208301876142a4565b6147e56040830186614724565b6147f26060830185614724565b8181036080830152614804818461437e565b90509695505050505050565b600060408201905061482560008301856142a4565b6148326020830184614724565b9392505050565b600060608201905061484e60008301866142a4565b61485b6020830185614724565b6148686040830184614724565b949350505050565b6000604082019050818103600083015261488a81856142b3565b9050818103602083015261489e8184614311565b90509392505050565b600060408201905081810360008301526148c181856142b3565b90506148d06020830184614724565b9392505050565b600060208201905081810360008301526148f18184614311565b905092915050565b600060408201905081810360008301526149138185614311565b905081810360208301526149278184614311565b90509392505050565b6000602082019050614945600083018461436f565b92915050565b6000602082019050818103600083015261496581846143b7565b905092915050565b6000610120820190508181036000830152614988818c6143b7565b9050818103602083015261499c818b6143b7565b90506149ab604083018a614724565b6149b86060830189614724565b6149c56080830188614724565b6149d260a083018761436f565b6149df60c083018661436f565b6149ec60e083018561436f565b6149fa61010083018461436f565b9a9950505050505050505050565b60006020820190508181036000830152614a21816143f0565b9050919050565b60006020820190508181036000830152614a4181614413565b9050919050565b60006020820190508181036000830152614a6181614436565b9050919050565b60006020820190508181036000830152614a8181614459565b9050919050565b60006020820190508181036000830152614aa18161447c565b9050919050565b60006020820190508181036000830152614ac18161449f565b9050919050565b60006020820190508181036000830152614ae1816144c2565b9050919050565b60006020820190508181036000830152614b01816144e5565b9050919050565b60006020820190508181036000830152614b2181614508565b9050919050565b60006020820190508181036000830152614b418161452b565b9050919050565b60006020820190508181036000830152614b618161454e565b9050919050565b60006020820190508181036000830152614b8181614571565b9050919050565b60006020820190508181036000830152614ba181614594565b9050919050565b60006020820190508181036000830152614bc1816145b7565b9050919050565b60006020820190508181036000830152614be1816145da565b9050919050565b60006020820190508181036000830152614c01816145fd565b9050919050565b60006020820190508181036000830152614c2181614620565b9050919050565b60006020820190508181036000830152614c4181614643565b9050919050565b60006020820190508181036000830152614c6181614666565b9050919050565b60006020820190508181036000830152614c8181614689565b9050919050565b60006020820190508181036000830152614ca1816146ac565b9050919050565b60006020820190508181036000830152614cc1816146cf565b9050919050565b60006020820190508181036000830152614ce1816146f2565b9050919050565b6000602082019050614cfd6000830184614724565b92915050565b6000604082019050614d186000830185614724565b614d256020830184614724565b9392505050565b6000614d36614d47565b9050614d428282615024565b919050565b6000604051905090565b600067ffffffffffffffff821115614d6c57614d6b61518b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d9857614d9761518b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614dc457614dc361518b565b5b614dcd826151fa565b9050602081019050919050565b600067ffffffffffffffff821115614df557614df461518b565b5b614dfe826151fa565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614ec082614fa6565b9150614ecb83614fa6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f0057614eff6150cf565b5b828201905092915050565b6000614f1682614fa6565b9150614f2183614fa6565b925082614f3157614f306150fe565b5b828204905092915050565b6000614f4782614f86565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614fdd578082015181840152602081019050614fc2565b83811115614fec576000848401525b50505050565b6000600282049050600182168061500a57607f821691505b6020821081141561501e5761501d61512d565b5b50919050565b61502d826151fa565b810181811067ffffffffffffffff8211171561504c5761504b61518b565b5b80604052505050565b600061506082614fa6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615093576150926150cf565b5b600182019050919050565b60006150a982614fa6565b91506150b483614fa6565b9250826150c4576150c36150fe565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156151d95760046000803e6151d660005161520b565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f5472616e7366657273206c6f636b656420627920636f6e747261637400000000600082015250565b7f41646d696e50726976696c656765733a2063616c6c6572206973206e6f74206160008201527f6e2061646d696e00000000000000000000000000000000000000000000000000602082015250565b7f546869732063686170746572206973206f6e6c7920616363657074696e67207560008201527f6e69717565206164647265737365730000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f4d75737420626520746f6b656e206f776e657220616e6420746f6b656e73206d60008201527f75737420626520756e6971756500000000000000000000000000000000000000602082015250565b7f4275726e206c696d697420737572706173736564000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f546f6b656e28732920616d6f756e74206973206e6f742061206d756c7469706c60008201527f65206f66207468726573686f6c64000000000000000000000000000000000000602082015250565b7f596f75206d75737420756e6c6f636b206368617074657220746f206f7665727760008201527f7269746500000000000000000000000000000000000000000000000000000000602082015250565b7f546869732063686170746572206973206e6f7420616374697665000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f596f75206d6179206f6e6c79206275726e20746865207468726573686f6c642060008201527f616d6f756e7420666f7220756e697175652061646472657373206c6973747300602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f546f6b656e4964732063616e206e6f7420626520656d70747900000000000000600082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4275726e206661696c7572652c20636865636b20696620736574417070726f7660008201527f616c466f72416c6c206973207472756500000000000000000000000000000000602082015250565b600060443d101561588357615906565b61588b614d47565b60043d036004823e80513d602482011167ffffffffffffffff821117156158b3575050615906565b808201805167ffffffffffffffff8111156158d15750505050615906565b80602083010160043d0385018111156158ee575050505050615906565b6158fd82602001850186615024565b82955050505050505b90565b61591281614f3c565b811461591d57600080fd5b50565b61592981614f4e565b811461593457600080fd5b50565b61594081614f5a565b811461594b57600080fd5b50565b61595781614fa6565b811461596257600080fd5b5056fea2646970667358221220b3db0a4e3e8792025fc589c13da94e487bdcd43106cd05a38c8644137ac87b7664736f6c63430008070033
Deployed Bytecode Sourcemap
257:9890:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2115:228:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1073:287:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4183:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5422:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6146:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;464:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8290:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1372:1089;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5969:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;122:38:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2500:508:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;886:62:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4862:552;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3076:153:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6286:213:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;92:21:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5823:138:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;384:201:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;506:26:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2469:1706;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3296:166:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6788:687:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7618:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;836:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;5525:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2115:228:3;2201:7;2247:1;2228:21;;:7;:21;;;;2220:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2314:9;:13;2324:2;2314:13;;;;;;;;;;;:22;2328:7;2314:22;;;;;;;;;;;;;;;;2307:29;;2115:228;;;;:::o;1073:287:14:-;1216:4;1260:38;1286:11;1260:25;:38::i;:::-;:92;;;;1316:36;1340:11;1316:23;:36::i;:::-;1260:92;1239:113;;1073:287;;;:::o;4183:181::-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;4324:32:14::1;4329:8;4339:6;4347:8;4324:4;:32::i;:::-;4183:181:::0;;;:::o;5422:95::-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;5506:8:14::1;5492:11;:22;;;;5422:95:::0;:::o;6146:132::-;6215:13;6248:8;:18;6257:8;6248:18;;;;;;;;;;;:22;;6241:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6146:132;;;:::o;464:33::-;;;;;;;;;;;;;:::o;8290:641::-;8531:12;:10;:12::i;:::-;8523:20;;:4;:20;;;:60;;;;8547:36;8564:4;8570:12;:10;:12::i;:::-;8547:16;:36::i;:::-;8523:60;8501:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;8732:9;8727:134;8747:3;:10;8743:1;:14;8727:134;;;8787:8;:16;8796:3;8800:1;8796:6;;;;;;;;:::i;:::-;;;;;;;;8787:16;;;;;;;;;;;:29;;;;;;;;;;;;8779:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;8759:3;;;;;:::i;:::-;;;;8727:134;;;;8871:52;8894:4;8900:2;8904:3;8909:7;8918:4;8871:22;:52::i;:::-;8290:641;;;;;:::o;1372:1089::-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;1751:8:14::1;:18;1760:8;1751:18;;;;;;;;;;;:25;;;;;;;;;;;;1750:26;1742:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1828:23;1854:8;:18;1863:8;1854:18;;;;;;;;;;;1828:44;;1905:12;1883:7;:19;;:34;;;;;;;;;;;;:::i;:::-;;1942:4;1928:7;:11;;:18;;;;;;;;;;;;:::i;:::-;;1980:13;1957:7;:20;;:36;;;;;;;;;;;;:::i;:::-;;2028:14;2004:7;:21;;:38;;;;2074:11;2053:7;:18;;:32;;;;2114:8;2096:7;:15;;:26;;;;2156:13;2133:7;:20;;;:36;;;;;;;;;;;;;;;;;;2197:7;2180;:14;;;:24;;;;;;;;;;;;;;;;;;2232:7;2215;:14;;;:24;;;;;;;;;;;;;;;;;;2267:4;2250:7;:14;;;:21;;;;;;;;;;;;;;;;;;2288:14;2284:69;;;2333:8;2319:11;:22;;;;2284:69;2392:1;2369:13;:20;:24;2365:89;;;2410:32;2415:13;2430:1;2433:8;2410:4;:32::i;:::-;2365:89;1731:730;1372:1089:::0;;;;;;;;;;:::o;5969:169::-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;6057:23:14::1;6083:8;:18;6092:8;6083:18;;;;;;;;;;;6057:44;;6126:4;6112:7;:11;;:18;;;;;;;;;;;;:::i;:::-;;6046:92;5969:169:::0;;:::o;122:38:1:-;;;;;;;;;;;;;;;;;;;;;;:::o;2500:508:3:-;2651:16;2710:3;:10;2691:8;:15;:29;2683:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2777:30;2824:8;:15;2810:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2777:63;;2856:9;2851:120;2875:8;:15;2871:1;:19;2851:120;;;2930:30;2940:8;2949:1;2940:11;;;;;;;;:::i;:::-;;;;;;;;2953:3;2957:1;2953:6;;;;;;;;:::i;:::-;;;;;;;;2930:9;:30::i;:::-;2911:13;2925:1;2911:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;2892:3;;;;:::i;:::-;;;2851:120;;;;2988:13;2981:20;;;2500:508;;;;:::o;886:62:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4862:552::-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:23:14::1;4975:8;:18;4984:8;4975:18;;;;;;;;;;;4949:44;;5018:1;5008:6;:11;5004:403;;;5070:7;:20;;;;;;;;;;;;5069:21;5046:7;:20;;;:44;;;;;;;;;;;;;;;;;;5004:403;;;5131:1;5121:6;:11;5117:290;;;5177:7;:14;;;;;;;;;;;;5176:15;5159:7;:14;;;:32;;;;;;;;;;;;;;;;;;5117:290;;;5233:1;5223:6;:11;5219:188;;;5279:7;:14;;;;;;;;;;;;5278:15;5261:7;:14;;;:32;;;;;;;;;;;;;;;;;;5219:188;;;5335:1;5325:6;:11;5321:86;;;5381:7;:14;;;;;;;;;;;;5380:15;5363:7;:14;;;:32;;;;;;;;;;;;;;;;;;5321:86;5219:188;5117:290;5004:403;4938:476;4862:552:::0;;:::o;3076:153:3:-;3170:52;3189:12;:10;:12::i;:::-;3203:8;3213;3170:18;:52::i;:::-;3076:153;;:::o;6286:213:14:-;6342:16;6360:7;6380:22;6405:8;:18;6414:8;6405:18;;;;;;;;;;;6380:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6441:7;:20;;;6463:7;:20;;;:27;6434:57;;;;;6286:213;;;:::o;92:21:1:-;;;;;;;;;;;;;:::o;5823:138:14:-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;5933:19:14::1;5912:18;;:40;;;;;;;;;;;;;;;;;;5823:138:::0;:::o;384:201:1:-;280:10;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;457:6:::1;:15;464:7;457:15;;;;;;;;;;;;;;;;;;;;;;;;;453:125;;;496:6;:15;503:7;496:15;;;;;;;;;;;;;;;;489:22;;;;;;;;;;;453:125;;;562:4;544:6;:15;551:7;544:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;453:125;384:201:::0;:::o;506:26:14:-;;;;:::o;2469:1706::-;1744:1:13;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2551:22:14::1;2576:8;:21;2585:11;;2576:21;;;;;;;;;;;2551:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;2616:7;:14;;;2608:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2698:1;2680:8;;:15;;:19;2672:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2744:7;:14;;;2740:431;;;2842:1;2806:7;:19;2814:10;2806:19;;;;;;;;;;;;;;;:32;2826:11;;2806:32;;;;;;;;;;;;:37;2783:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;2963:1;2939:7;:21;;;:25;2935:225;;;3026:7;:21;;;3007:8;;:15;;:40;2981:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;2935:225;2740:431;3183:15;3209:14:::0;3263:1:::1;3238:7;:21;;;:26;3234:741;;;3351:7;:18;;;3346:1;3316:7;:20;;;:27;:31;;;;:::i;:::-;:53;;3294:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;3452:5;3439:18;;3481:1;3472:10;;3234:741;;;3603:1;3578:7;:21;;;3560:8;;:15;;:39;;;;:::i;:::-;:44;3538:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;3795:7;:18;;;3769:7;:21;;;3751:8;;:15;;:39;;;;:::i;:::-;3720:7;:20;;;:27;:71;;;;:::i;:::-;:93;;3698:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3896:4;3883:17;;3942:7;:21;;;3924:8;;:15;;:39;;;;:::i;:::-;3915:48;;3234:741;3987:25;4029:1;4015:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3987:44;;4056:10;4042:8;4051:1;4042:11;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;::::0;::::1;4079:38;4084:8;;4094:10;4106;4079:4;:38::i;:::-;4128:39;4133:8;4143:6;4151:7;:15;;;4128:4;:39::i;:::-;2540:1635;;;;1701:1:13::0;2628:7;:22;;;;2469:1706:14;;:::o;3296:166:3:-;3395:4;3418:18;:27;3437:7;3418:27;;;;;;;;;;;;;;;:37;3446:8;3418:37;;;;;;;;;;;;;;;;;;;;;;;;;3411:44;;3296:166;;;;:::o;6788:687:14:-;6936:26;6977:24;7034:22;7059:8;:18;7068:8;7059:18;;;;;;;;;;;7034:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7112:8;7098:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7088:33;;7158:8;7144:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7132:35;;7185:9;7180:250;7204:8;7200:1;:12;7180:250;;;7234:13;7301:7;:20;;;:27;7279:13;7294:1;7268:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7258:39;;;;;;7250:48;;:78;;;;:::i;:::-;7234:94;;7358:7;:20;;;7379:5;7358:27;;;;;;;;:::i;:::-;;;;;;;;7343:9;7353:1;7343:12;;;;;;;;:::i;:::-;;;;;;;:42;;;;;;;;;;;7413:5;7400:7;7408:1;7400:10;;;;;;;;:::i;:::-;;;;;;;:18;;;;;7219:211;7214:3;;;;;:::i;:::-;;;;7180:250;;;;7440:27;6788:687;;;;;;:::o;7618:530::-;7834:12;:10;:12::i;:::-;7826:20;;:4;:20;;;:60;;;;7850:36;7867:4;7873:12;:10;:12::i;:::-;7850:16;:36::i;:::-;7826:60;7804:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8026:8;:12;8035:2;8026:12;;;;;;;;;;;:25;;;;;;;;;;;;8018:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8095:45;8113:4;8119:2;8123;8127:6;8135:4;8095:17;:45::i;:::-;7618:530;;;;;:::o;836:43::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5525:290::-;280:10:1;270:20;;:6;;;;;;;;;;;:20;;;:42;;;;294:6;:18;301:10;294:18;;;;;;;;;;;;;;;;;;;;;;;;;270:42;262:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;5671:23:14::1;5697:8;:18;5706:8;5697:18;;;;;;;;;;;5671:44;;5750:14;5726:7;:21;;:38;;;;5796:11;5775:7;:18;;:32;;;;5660:155;5525:290:::0;;;:::o;1166:305:3:-;1268:4;1318:26;1303:41;;;:11;:41;;;;:109;;;;1375:37;1360:52;;;:11;:52;;;;1303:109;:161;;;;1428:36;1452:11;1428:23;:36::i;:::-;1303:161;1284:180;;1166:305;;;:::o;9647:497:14:-;9783:9;9778:359;9798:8;:15;9794:1;:19;9778:359;;;9835:40;9841:8;9850:1;9841:11;;;;;;;;:::i;:::-;;;;;;;;9854:8;9864:6;9835:40;;;;;;;;;;;;:5;:40::i;:::-;9924:6;9890:7;:20;9898:8;9907:1;9898:11;;;;;;;;:::i;:::-;;;;;;;;9890:20;;;;;;;;;;;;;;;:30;9911:8;9890:30;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;9952:9;9947:117;9967:6;9963:1;:10;9947:117;;;9999:8;:18;10008:8;9999:18;;;;;;;;;;;:31;;10036:8;10045:1;10036:11;;;;;;;;:::i;:::-;;;;;;;;9999:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9975:3;;;;;:::i;:::-;;;;9947:117;;;;10083:42;10095:8;10104:1;10095:11;;;;;;;;:::i;:::-;;;;;;;;10108:8;10118:6;10083:42;;;;;;;;:::i;:::-;;;;;;;;9815:3;;;;;:::i;:::-;;;;9778:359;;;;9647:497;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;6013:1045:3:-;6233:7;:14;6219:3;:10;:28;6211:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6324:1;6310:16;;:2;:16;;;;6302:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6379:16;6398:12;:10;:12::i;:::-;6379:31;;6421:60;6442:8;6452:4;6458:2;6462:3;6467:7;6476:4;6421:20;:60::i;:::-;6497:9;6492:411;6516:3;:10;6512:1;:14;6492:411;;;6547:10;6560:3;6564:1;6560:6;;;;;;;;:::i;:::-;;;;;;;;6547:19;;6580:14;6597:7;6605:1;6597:10;;;;;;;;:::i;:::-;;;;;;;;6580:27;;6622:19;6644:9;:13;6654:2;6644:13;;;;;;;;;;;:19;6658:4;6644:19;;;;;;;;;;;;;;;;6622:41;;6700:6;6685:11;:21;;6677:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6831:6;6817:11;:20;6795:9;:13;6805:2;6795:13;;;;;;;;;;;:19;6809:4;6795:19;;;;;;;;;;;;;;;:42;;;;6886:6;6865:9;:13;6875:2;6865:13;;;;;;;;;;;:17;6879:2;6865:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6533:370;;;6528:3;;;;:::i;:::-;;;6492:411;;;;6948:2;6918:47;;6942:4;6918:47;;6932:8;6918:47;;;6952:3;6957:7;6918:47;;;;;;;:::i;:::-;;;;;;;;6976:75;7012:8;7022:4;7028:2;7032:3;7037:7;7046:4;6976:35;:75::i;:::-;6201:857;6013:1045;;;;;:::o;12019:323::-;12169:8;12160:17;;:5;:17;;;;12152:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12271:8;12233:18;:25;12252:5;12233:25;;;;;;;;;;;;;;;:35;12259:8;12233:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;12316:8;12294:41;;12309:5;12294:41;;;12326:8;12294:41;;;;;;:::i;:::-;;;;;;;;12019:323;;;:::o;8939:700:14:-;9078:9;9073:559;9093:8;;:15;;9089:1;:19;9073:559;;;9176:18;;;;;;;;;;;9168:35;;;9204:8;;9213:1;9204:11;;;;;;;:::i;:::-;;;;;;;;9168:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9156:60;;:8;:60;;;9130:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;9317:10;9313:308;;;9368:18;;;;;;;;;;;9352:40;;;9393:8;;9402:1;9393:11;;;;;;;:::i;:::-;;;;;;;;9352:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9348:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9471:58;;;;;;;;;;:::i;:::-;;;;;;;;9348:201;9572:33;9583:8;9593;;9602:1;9593:11;;;;;;;:::i;:::-;;;;;;;;9572:33;;;;;;;:::i;:::-;;;;;;;;9313:308;9110:3;;;;;:::i;:::-;;;;9073:559;;;;8939:700;;;;:::o;4870:797:3:-;5065:1;5051:16;;:2;:16;;;;5043:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5120:16;5139:12;:10;:12::i;:::-;5120:31;;5162:96;5183:8;5193:4;5199:2;5203:21;5221:2;5203:17;:21::i;:::-;5226:25;5244:6;5226:17;:25::i;:::-;5253:4;5162:20;:96::i;:::-;5269:19;5291:9;:13;5301:2;5291:13;;;;;;;;;;;:19;5305:4;5291:19;;;;;;;;;;;;;;;;5269:41;;5343:6;5328:11;:21;;5320:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5466:6;5452:11;:20;5430:9;:13;5440:2;5430:13;;;;;;;;;;;:19;5444:4;5430:19;;;;;;;;;;;;;;;:42;;;;5513:6;5492:9;:13;5502:2;5492:13;;;;;;;;;;;:17;5506:2;5492:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5566:2;5535:46;;5560:4;5535:46;;5550:8;5535:46;;;5570:2;5574:6;5535:46;;;;;;;:::i;:::-;;;;;;;;5592:68;5623:8;5633:4;5639:2;5643;5647:6;5655:4;5592:30;:68::i;:::-;5033:634;;4870:797;;;;;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8340:553:3:-;8501:1;8487:16;;:2;:16;;;;8479:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;8552:16;8571:12;:10;:12::i;:::-;8552:31;;8594:102;8615:8;8633:1;8637:2;8641:21;8659:2;8641:17;:21::i;:::-;8664:25;8682:6;8664:17;:25::i;:::-;8691:4;8594:20;:102::i;:::-;8728:6;8707:9;:13;8717:2;8707:13;;;;;;;;;;;:17;8721:2;8707:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;8786:2;8749:52;;8782:1;8749:52;;8764:8;8749:52;;;8790:2;8794:6;8749:52;;;;;;;:::i;:::-;;;;;;;;8812:74;8843:8;8861:1;8865:2;8869;8873:6;8881:4;8812:30;:74::i;:::-;8469:424;8340:553;;;;:::o;13276:214::-;;;;;;;:::o;14227:792::-;14459:15;:2;:13;;;:15::i;:::-;14455:558;;;14511:2;14494:43;;;14538:8;14548:4;14554:3;14559:7;14568:4;14494:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14490:513;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14879:6;14872:14;;;;;;;;;;;:::i;:::-;;;;;;;;14490:513;;;14926:62;;;;;;;;;;:::i;:::-;;;;;;;;14490:513;14664:48;;;14652:60;;;:8;:60;;;;14648:157;;14736:50;;;;;;;;;;:::i;:::-;;;;;;;;14648:157;14574:245;14455:558;14227:792;;;;;;:::o;15025:193::-;15091:16;15119:22;15158:1;15144:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15119:41;;15181:7;15170:5;15176:1;15170:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;15206:5;15199:12;;;15025:193;;;:::o;13496:725::-;13703:15;:2;:13;;;:15::i;:::-;13699:516;;;13755:2;13738:38;;;13777:8;13787:4;13793:2;13797:6;13805:4;13738:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13734:471;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14081:6;14074:14;;;;;;;;;;;:::i;:::-;;;;;;;;13734:471;;;14128:62;;;;;;;;;;:::i;:::-;;;;;;;;13734:471;13871:43;;;13859:55;;;:8;:55;;;;13855:152;;13938:50;;;;;;;;;;:::i;:::-;;;;;;;;13855:152;13811:210;13699:516;13496:725;;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:16:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:143::-;2533:5;2564:6;2558:13;2549:22;;2580:33;2607:5;2580:33;:::i;:::-;2476:143;;;;:::o;2642:370::-;2713:5;2762:3;2755:4;2747:6;2743:17;2739:27;2729:122;;2770:79;;:::i;:::-;2729:122;2887:6;2874:20;2912:94;3002:3;2994:6;2987:4;2979:6;2975:17;2912:94;:::i;:::-;2903:103;;2719:293;2642:370;;;;:::o;3035:568::-;3108:8;3118:6;3168:3;3161:4;3153:6;3149:17;3145:27;3135:122;;3176:79;;:::i;:::-;3135:122;3289:6;3276:20;3266:30;;3319:18;3311:6;3308:30;3305:117;;;3341:79;;:::i;:::-;3305:117;3455:4;3447:6;3443:17;3431:29;;3509:3;3501:4;3493:6;3489:17;3479:8;3475:32;3472:41;3469:128;;;3516:79;;:::i;:::-;3469:128;3035:568;;;;;:::o;3626:370::-;3697:5;3746:3;3739:4;3731:6;3727:17;3723:27;3713:122;;3754:79;;:::i;:::-;3713:122;3871:6;3858:20;3896:94;3986:3;3978:6;3971:4;3963:6;3959:17;3896:94;:::i;:::-;3887:103;;3703:293;3626:370;;;;:::o;4002:133::-;4045:5;4083:6;4070:20;4061:29;;4099:30;4123:5;4099:30;:::i;:::-;4002:133;;;;:::o;4141:137::-;4186:5;4224:6;4211:20;4202:29;;4240:32;4266:5;4240:32;:::i;:::-;4141:137;;;;:::o;4284:141::-;4340:5;4371:6;4365:13;4356:22;;4387:32;4413:5;4387:32;:::i;:::-;4284:141;;;;:::o;4444:338::-;4499:5;4548:3;4541:4;4533:6;4529:17;4525:27;4515:122;;4556:79;;:::i;:::-;4515:122;4673:6;4660:20;4698:78;4772:3;4764:6;4757:4;4749:6;4745:17;4698:78;:::i;:::-;4689:87;;4505:277;4444:338;;;;:::o;4802:340::-;4858:5;4907:3;4900:4;4892:6;4888:17;4884:27;4874:122;;4915:79;;:::i;:::-;4874:122;5032:6;5019:20;5057:79;5132:3;5124:6;5117:4;5109:6;5105:17;5057:79;:::i;:::-;5048:88;;4864:278;4802:340;;;;:::o;5148:139::-;5194:5;5232:6;5219:20;5210:29;;5248:33;5275:5;5248:33;:::i;:::-;5148:139;;;;:::o;5293:329::-;5352:6;5401:2;5389:9;5380:7;5376:23;5372:32;5369:119;;;5407:79;;:::i;:::-;5369:119;5527:1;5552:53;5597:7;5588:6;5577:9;5573:22;5552:53;:::i;:::-;5542:63;;5498:117;5293:329;;;;:::o;5628:351::-;5698:6;5747:2;5735:9;5726:7;5722:23;5718:32;5715:119;;;5753:79;;:::i;:::-;5715:119;5873:1;5898:64;5954:7;5945:6;5934:9;5930:22;5898:64;:::i;:::-;5888:74;;5844:128;5628:351;;;;:::o;5985:474::-;6053:6;6061;6110:2;6098:9;6089:7;6085:23;6081:32;6078:119;;;6116:79;;:::i;:::-;6078:119;6236:1;6261:53;6306:7;6297:6;6286:9;6282:22;6261:53;:::i;:::-;6251:63;;6207:117;6363:2;6389:53;6434:7;6425:6;6414:9;6410:22;6389:53;:::i;:::-;6379:63;;6334:118;5985:474;;;;;:::o;6465:1509::-;6619:6;6627;6635;6643;6651;6700:3;6688:9;6679:7;6675:23;6671:33;6668:120;;;6707:79;;:::i;:::-;6668:120;6827:1;6852:53;6897:7;6888:6;6877:9;6873:22;6852:53;:::i;:::-;6842:63;;6798:117;6954:2;6980:53;7025:7;7016:6;7005:9;7001:22;6980:53;:::i;:::-;6970:63;;6925:118;7110:2;7099:9;7095:18;7082:32;7141:18;7133:6;7130:30;7127:117;;;7163:79;;:::i;:::-;7127:117;7268:78;7338:7;7329:6;7318:9;7314:22;7268:78;:::i;:::-;7258:88;;7053:303;7423:2;7412:9;7408:18;7395:32;7454:18;7446:6;7443:30;7440:117;;;7476:79;;:::i;:::-;7440:117;7581:78;7651:7;7642:6;7631:9;7627:22;7581:78;:::i;:::-;7571:88;;7366:303;7736:3;7725:9;7721:19;7708:33;7768:18;7760:6;7757:30;7754:117;;;7790:79;;:::i;:::-;7754:117;7895:62;7949:7;7940:6;7929:9;7925:22;7895:62;:::i;:::-;7885:72;;7679:288;6465:1509;;;;;;;;:::o;7980:1089::-;8084:6;8092;8100;8108;8116;8165:3;8153:9;8144:7;8140:23;8136:33;8133:120;;;8172:79;;:::i;:::-;8133:120;8292:1;8317:53;8362:7;8353:6;8342:9;8338:22;8317:53;:::i;:::-;8307:63;;8263:117;8419:2;8445:53;8490:7;8481:6;8470:9;8466:22;8445:53;:::i;:::-;8435:63;;8390:118;8547:2;8573:53;8618:7;8609:6;8598:9;8594:22;8573:53;:::i;:::-;8563:63;;8518:118;8675:2;8701:53;8746:7;8737:6;8726:9;8722:22;8701:53;:::i;:::-;8691:63;;8646:118;8831:3;8820:9;8816:19;8803:33;8863:18;8855:6;8852:30;8849:117;;;8885:79;;:::i;:::-;8849:117;8990:62;9044:7;9035:6;9024:9;9020:22;8990:62;:::i;:::-;8980:72;;8774:288;7980:1089;;;;;;;;:::o;9075:468::-;9140:6;9148;9197:2;9185:9;9176:7;9172:23;9168:32;9165:119;;;9203:79;;:::i;:::-;9165:119;9323:1;9348:53;9393:7;9384:6;9373:9;9369:22;9348:53;:::i;:::-;9338:63;;9294:117;9450:2;9476:50;9518:7;9509:6;9498:9;9494:22;9476:50;:::i;:::-;9466:60;;9421:115;9075:468;;;;;:::o;9549:474::-;9617:6;9625;9674:2;9662:9;9653:7;9649:23;9645:32;9642:119;;;9680:79;;:::i;:::-;9642:119;9800:1;9825:53;9870:7;9861:6;9850:9;9846:22;9825:53;:::i;:::-;9815:63;;9771:117;9927:2;9953:53;9998:7;9989:6;9978:9;9974:22;9953:53;:::i;:::-;9943:63;;9898:118;9549:474;;;;;:::o;10029:894::-;10147:6;10155;10204:2;10192:9;10183:7;10179:23;10175:32;10172:119;;;10210:79;;:::i;:::-;10172:119;10358:1;10347:9;10343:17;10330:31;10388:18;10380:6;10377:30;10374:117;;;10410:79;;:::i;:::-;10374:117;10515:78;10585:7;10576:6;10565:9;10561:22;10515:78;:::i;:::-;10505:88;;10301:302;10670:2;10659:9;10655:18;10642:32;10701:18;10693:6;10690:30;10687:117;;;10723:79;;:::i;:::-;10687:117;10828:78;10898:7;10889:6;10878:9;10874:22;10828:78;:::i;:::-;10818:88;;10613:303;10029:894;;;;;:::o;10929:829::-;11031:6;11039;11047;11096:2;11084:9;11075:7;11071:23;11067:32;11064:119;;;11102:79;;:::i;:::-;11064:119;11250:1;11239:9;11235:17;11222:31;11280:18;11272:6;11269:30;11266:117;;;11302:79;;:::i;:::-;11266:117;11407:78;11477:7;11468:6;11457:9;11453:22;11407:78;:::i;:::-;11397:88;;11193:302;11534:2;11560:53;11605:7;11596:6;11585:9;11581:22;11560:53;:::i;:::-;11550:63;;11505:118;11662:2;11688:53;11733:7;11724:6;11713:9;11709:22;11688:53;:::i;:::-;11678:63;;11633:118;10929:829;;;;;:::o;11764:559::-;11850:6;11858;11907:2;11895:9;11886:7;11882:23;11878:32;11875:119;;;11913:79;;:::i;:::-;11875:119;12061:1;12050:9;12046:17;12033:31;12091:18;12083:6;12080:30;12077:117;;;12113:79;;:::i;:::-;12077:117;12226:80;12298:7;12289:6;12278:9;12274:22;12226:80;:::i;:::-;12208:98;;;;12004:312;11764:559;;;;;:::o;12329:327::-;12387:6;12436:2;12424:9;12415:7;12411:23;12407:32;12404:119;;;12442:79;;:::i;:::-;12404:119;12562:1;12587:52;12631:7;12622:6;12611:9;12607:22;12587:52;:::i;:::-;12577:62;;12533:116;12329:327;;;;:::o;12662:349::-;12731:6;12780:2;12768:9;12759:7;12755:23;12751:32;12748:119;;;12786:79;;:::i;:::-;12748:119;12906:1;12931:63;12986:7;12977:6;12966:9;12962:22;12931:63;:::i;:::-;12921:73;;12877:127;12662:349;;;;:::o;13017:2187::-;13190:6;13198;13206;13214;13222;13230;13238;13246;13254;13262;13311:3;13299:9;13290:7;13286:23;13282:33;13279:120;;;13318:79;;:::i;:::-;13279:120;13466:1;13455:9;13451:17;13438:31;13496:18;13488:6;13485:30;13482:117;;;13518:79;;:::i;:::-;13482:117;13623:63;13678:7;13669:6;13658:9;13654:22;13623:63;:::i;:::-;13613:73;;13409:287;13763:2;13752:9;13748:18;13735:32;13794:18;13786:6;13783:30;13780:117;;;13816:79;;:::i;:::-;13780:117;13921:63;13976:7;13967:6;13956:9;13952:22;13921:63;:::i;:::-;13911:73;;13706:288;14061:2;14050:9;14046:18;14033:32;14092:18;14084:6;14081:30;14078:117;;;14114:79;;:::i;:::-;14078:117;14219:78;14289:7;14280:6;14269:9;14265:22;14219:78;:::i;:::-;14209:88;;14004:303;14346:2;14372:53;14417:7;14408:6;14397:9;14393:22;14372:53;:::i;:::-;14362:63;;14317:118;14474:3;14501:53;14546:7;14537:6;14526:9;14522:22;14501:53;:::i;:::-;14491:63;;14445:119;14603:3;14630:53;14675:7;14666:6;14655:9;14651:22;14630:53;:::i;:::-;14620:63;;14574:119;14732:3;14759:50;14801:7;14792:6;14781:9;14777:22;14759:50;:::i;:::-;14749:60;;14703:116;14858:3;14885:50;14927:7;14918:6;14907:9;14903:22;14885:50;:::i;:::-;14875:60;;14829:116;14984:3;15011:50;15053:7;15044:6;15033:9;15029:22;15011:50;:::i;:::-;15001:60;;14955:116;15110:3;15137:50;15179:7;15170:6;15159:9;15155:22;15137:50;:::i;:::-;15127:60;;15081:116;13017:2187;;;;;;;;;;;;;:::o;15210:329::-;15269:6;15318:2;15306:9;15297:7;15293:23;15289:32;15286:119;;;15324:79;;:::i;:::-;15286:119;15444:1;15469:53;15514:7;15505:6;15494:9;15490:22;15469:53;:::i;:::-;15459:63;;15415:117;15210:329;;;;:::o;15545:654::-;15623:6;15631;15680:2;15668:9;15659:7;15655:23;15651:32;15648:119;;;15686:79;;:::i;:::-;15648:119;15806:1;15831:53;15876:7;15867:6;15856:9;15852:22;15831:53;:::i;:::-;15821:63;;15777:117;15961:2;15950:9;15946:18;15933:32;15992:18;15984:6;15981:30;15978:117;;;16014:79;;:::i;:::-;15978:117;16119:63;16174:7;16165:6;16154:9;16150:22;16119:63;:::i;:::-;16109:73;;15904:288;15545:654;;;;;:::o;16205:474::-;16273:6;16281;16330:2;16318:9;16309:7;16305:23;16301:32;16298:119;;;16336:79;;:::i;:::-;16298:119;16456:1;16481:53;16526:7;16517:6;16506:9;16502:22;16481:53;:::i;:::-;16471:63;;16427:117;16583:2;16609:53;16654:7;16645:6;16634:9;16630:22;16609:53;:::i;:::-;16599:63;;16554:118;16205:474;;;;;:::o;16685:619::-;16762:6;16770;16778;16827:2;16815:9;16806:7;16802:23;16798:32;16795:119;;;16833:79;;:::i;:::-;16795:119;16953:1;16978:53;17023:7;17014:6;17003:9;16999:22;16978:53;:::i;:::-;16968:63;;16924:117;17080:2;17106:53;17151:7;17142:6;17131:9;17127:22;17106:53;:::i;:::-;17096:63;;17051:118;17208:2;17234:53;17279:7;17270:6;17259:9;17255:22;17234:53;:::i;:::-;17224:63;;17179:118;16685:619;;;;;:::o;17310:179::-;17379:10;17400:46;17442:3;17434:6;17400:46;:::i;:::-;17478:4;17473:3;17469:14;17455:28;;17310:179;;;;:::o;17495:::-;17564:10;17585:46;17627:3;17619:6;17585:46;:::i;:::-;17663:4;17658:3;17654:14;17640:28;;17495:179;;;;:::o;17680:108::-;17757:24;17775:5;17757:24;:::i;:::-;17752:3;17745:37;17680:108;;:::o;17794:118::-;17881:24;17899:5;17881:24;:::i;:::-;17876:3;17869:37;17794:118;;:::o;17948:732::-;18067:3;18096:54;18144:5;18096:54;:::i;:::-;18166:86;18245:6;18240:3;18166:86;:::i;:::-;18159:93;;18276:56;18326:5;18276:56;:::i;:::-;18355:7;18386:1;18371:284;18396:6;18393:1;18390:13;18371:284;;;18472:6;18466:13;18499:63;18558:3;18543:13;18499:63;:::i;:::-;18492:70;;18585:60;18638:6;18585:60;:::i;:::-;18575:70;;18431:224;18418:1;18415;18411:9;18406:14;;18371:284;;;18375:14;18671:3;18664:10;;18072:608;;;17948:732;;;;:::o;18716:::-;18835:3;18864:54;18912:5;18864:54;:::i;:::-;18934:86;19013:6;19008:3;18934:86;:::i;:::-;18927:93;;19044:56;19094:5;19044:56;:::i;:::-;19123:7;19154:1;19139:284;19164:6;19161:1;19158:13;19139:284;;;19240:6;19234:13;19267:63;19326:3;19311:13;19267:63;:::i;:::-;19260:70;;19353:60;19406:6;19353:60;:::i;:::-;19343:70;;19199:224;19186:1;19183;19179:9;19174:14;;19139:284;;;19143:14;19439:3;19432:10;;18840:608;;;18716:732;;;;:::o;19454:109::-;19535:21;19550:5;19535:21;:::i;:::-;19530:3;19523:34;19454:109;;:::o;19569:360::-;19655:3;19683:38;19715:5;19683:38;:::i;:::-;19737:70;19800:6;19795:3;19737:70;:::i;:::-;19730:77;;19816:52;19861:6;19856:3;19849:4;19842:5;19838:16;19816:52;:::i;:::-;19893:29;19915:6;19893:29;:::i;:::-;19888:3;19884:39;19877:46;;19659:270;19569:360;;;;:::o;19935:364::-;20023:3;20051:39;20084:5;20051:39;:::i;:::-;20106:71;20170:6;20165:3;20106:71;:::i;:::-;20099:78;;20186:52;20231:6;20226:3;20219:4;20212:5;20208:16;20186:52;:::i;:::-;20263:29;20285:6;20263:29;:::i;:::-;20258:3;20254:39;20247:46;;20027:272;19935:364;;;;:::o;20305:366::-;20447:3;20468:67;20532:2;20527:3;20468:67;:::i;:::-;20461:74;;20544:93;20633:3;20544:93;:::i;:::-;20662:2;20657:3;20653:12;20646:19;;20305:366;;;:::o;20677:::-;20819:3;20840:67;20904:2;20899:3;20840:67;:::i;:::-;20833:74;;20916:93;21005:3;20916:93;:::i;:::-;21034:2;21029:3;21025:12;21018:19;;20677:366;;;:::o;21049:::-;21191:3;21212:67;21276:2;21271:3;21212:67;:::i;:::-;21205:74;;21288:93;21377:3;21288:93;:::i;:::-;21406:2;21401:3;21397:12;21390:19;;21049:366;;;:::o;21421:::-;21563:3;21584:67;21648:2;21643:3;21584:67;:::i;:::-;21577:74;;21660:93;21749:3;21660:93;:::i;:::-;21778:2;21773:3;21769:12;21762:19;;21421:366;;;:::o;21793:::-;21935:3;21956:67;22020:2;22015:3;21956:67;:::i;:::-;21949:74;;22032:93;22121:3;22032:93;:::i;:::-;22150:2;22145:3;22141:12;22134:19;;21793:366;;;:::o;22165:::-;22307:3;22328:67;22392:2;22387:3;22328:67;:::i;:::-;22321:74;;22404:93;22493:3;22404:93;:::i;:::-;22522:2;22517:3;22513:12;22506:19;;22165:366;;;:::o;22537:::-;22679:3;22700:67;22764:2;22759:3;22700:67;:::i;:::-;22693:74;;22776:93;22865:3;22776:93;:::i;:::-;22894:2;22889:3;22885:12;22878:19;;22537:366;;;:::o;22909:::-;23051:3;23072:67;23136:2;23131:3;23072:67;:::i;:::-;23065:74;;23148:93;23237:3;23148:93;:::i;:::-;23266:2;23261:3;23257:12;23250:19;;22909:366;;;:::o;23281:::-;23423:3;23444:67;23508:2;23503:3;23444:67;:::i;:::-;23437:74;;23520:93;23609:3;23520:93;:::i;:::-;23638:2;23633:3;23629:12;23622:19;;23281:366;;;:::o;23653:::-;23795:3;23816:67;23880:2;23875:3;23816:67;:::i;:::-;23809:74;;23892:93;23981:3;23892:93;:::i;:::-;24010:2;24005:3;24001:12;23994:19;;23653:366;;;:::o;24025:::-;24167:3;24188:67;24252:2;24247:3;24188:67;:::i;:::-;24181:74;;24264:93;24353:3;24264:93;:::i;:::-;24382:2;24377:3;24373:12;24366:19;;24025:366;;;:::o;24397:::-;24539:3;24560:67;24624:2;24619:3;24560:67;:::i;:::-;24553:74;;24636:93;24725:3;24636:93;:::i;:::-;24754:2;24749:3;24745:12;24738:19;;24397:366;;;:::o;24769:::-;24911:3;24932:67;24996:2;24991:3;24932:67;:::i;:::-;24925:74;;25008:93;25097:3;25008:93;:::i;:::-;25126:2;25121:3;25117:12;25110:19;;24769:366;;;:::o;25141:::-;25283:3;25304:67;25368:2;25363:3;25304:67;:::i;:::-;25297:74;;25380:93;25469:3;25380:93;:::i;:::-;25498:2;25493:3;25489:12;25482:19;;25141:366;;;:::o;25513:::-;25655:3;25676:67;25740:2;25735:3;25676:67;:::i;:::-;25669:74;;25752:93;25841:3;25752:93;:::i;:::-;25870:2;25865:3;25861:12;25854:19;;25513:366;;;:::o;25885:::-;26027:3;26048:67;26112:2;26107:3;26048:67;:::i;:::-;26041:74;;26124:93;26213:3;26124:93;:::i;:::-;26242:2;26237:3;26233:12;26226:19;;25885:366;;;:::o;26257:::-;26399:3;26420:67;26484:2;26479:3;26420:67;:::i;:::-;26413:74;;26496:93;26585:3;26496:93;:::i;:::-;26614:2;26609:3;26605:12;26598:19;;26257:366;;;:::o;26629:::-;26771:3;26792:67;26856:2;26851:3;26792:67;:::i;:::-;26785:74;;26868:93;26957:3;26868:93;:::i;:::-;26986:2;26981:3;26977:12;26970:19;;26629:366;;;:::o;27001:::-;27143:3;27164:67;27228:2;27223:3;27164:67;:::i;:::-;27157:74;;27240:93;27329:3;27240:93;:::i;:::-;27358:2;27353:3;27349:12;27342:19;;27001:366;;;:::o;27373:::-;27515:3;27536:67;27600:2;27595:3;27536:67;:::i;:::-;27529:74;;27612:93;27701:3;27612:93;:::i;:::-;27730:2;27725:3;27721:12;27714:19;;27373:366;;;:::o;27745:::-;27887:3;27908:67;27972:2;27967:3;27908:67;:::i;:::-;27901:74;;27984:93;28073:3;27984:93;:::i;:::-;28102:2;28097:3;28093:12;28086:19;;27745:366;;;:::o;28117:::-;28259:3;28280:67;28344:2;28339:3;28280:67;:::i;:::-;28273:74;;28356:93;28445:3;28356:93;:::i;:::-;28474:2;28469:3;28465:12;28458:19;;28117:366;;;:::o;28489:::-;28631:3;28652:67;28716:2;28711:3;28652:67;:::i;:::-;28645:74;;28728:93;28817:3;28728:93;:::i;:::-;28846:2;28841:3;28837:12;28830:19;;28489:366;;;:::o;28861:108::-;28938:24;28956:5;28938:24;:::i;:::-;28933:3;28926:37;28861:108;;:::o;28975:118::-;29062:24;29080:5;29062:24;:::i;:::-;29057:3;29050:37;28975:118;;:::o;29099:222::-;29192:4;29230:2;29219:9;29215:18;29207:26;;29243:71;29311:1;29300:9;29296:17;29287:6;29243:71;:::i;:::-;29099:222;;;;:::o;29327:1053::-;29650:4;29688:3;29677:9;29673:19;29665:27;;29702:71;29770:1;29759:9;29755:17;29746:6;29702:71;:::i;:::-;29783:72;29851:2;29840:9;29836:18;29827:6;29783:72;:::i;:::-;29902:9;29896:4;29892:20;29887:2;29876:9;29872:18;29865:48;29930:108;30033:4;30024:6;29930:108;:::i;:::-;29922:116;;30085:9;30079:4;30075:20;30070:2;30059:9;30055:18;30048:48;30113:108;30216:4;30207:6;30113:108;:::i;:::-;30105:116;;30269:9;30263:4;30259:20;30253:3;30242:9;30238:19;30231:49;30297:76;30368:4;30359:6;30297:76;:::i;:::-;30289:84;;29327:1053;;;;;;;;:::o;30386:751::-;30609:4;30647:3;30636:9;30632:19;30624:27;;30661:71;30729:1;30718:9;30714:17;30705:6;30661:71;:::i;:::-;30742:72;30810:2;30799:9;30795:18;30786:6;30742:72;:::i;:::-;30824;30892:2;30881:9;30877:18;30868:6;30824:72;:::i;:::-;30906;30974:2;30963:9;30959:18;30950:6;30906:72;:::i;:::-;31026:9;31020:4;31016:20;31010:3;30999:9;30995:19;30988:49;31054:76;31125:4;31116:6;31054:76;:::i;:::-;31046:84;;30386:751;;;;;;;;:::o;31143:332::-;31264:4;31302:2;31291:9;31287:18;31279:26;;31315:71;31383:1;31372:9;31368:17;31359:6;31315:71;:::i;:::-;31396:72;31464:2;31453:9;31449:18;31440:6;31396:72;:::i;:::-;31143:332;;;;;:::o;31481:442::-;31630:4;31668:2;31657:9;31653:18;31645:26;;31681:71;31749:1;31738:9;31734:17;31725:6;31681:71;:::i;:::-;31762:72;31830:2;31819:9;31815:18;31806:6;31762:72;:::i;:::-;31844;31912:2;31901:9;31897:18;31888:6;31844:72;:::i;:::-;31481:442;;;;;;:::o;31929:634::-;32150:4;32188:2;32177:9;32173:18;32165:26;;32237:9;32231:4;32227:20;32223:1;32212:9;32208:17;32201:47;32265:108;32368:4;32359:6;32265:108;:::i;:::-;32257:116;;32420:9;32414:4;32410:20;32405:2;32394:9;32390:18;32383:48;32448:108;32551:4;32542:6;32448:108;:::i;:::-;32440:116;;31929:634;;;;;:::o;32569:483::-;32740:4;32778:2;32767:9;32763:18;32755:26;;32827:9;32821:4;32817:20;32813:1;32802:9;32798:17;32791:47;32855:108;32958:4;32949:6;32855:108;:::i;:::-;32847:116;;32973:72;33041:2;33030:9;33026:18;33017:6;32973:72;:::i;:::-;32569:483;;;;;:::o;33058:373::-;33201:4;33239:2;33228:9;33224:18;33216:26;;33288:9;33282:4;33278:20;33274:1;33263:9;33259:17;33252:47;33316:108;33419:4;33410:6;33316:108;:::i;:::-;33308:116;;33058:373;;;;:::o;33437:634::-;33658:4;33696:2;33685:9;33681:18;33673:26;;33745:9;33739:4;33735:20;33731:1;33720:9;33716:17;33709:47;33773:108;33876:4;33867:6;33773:108;:::i;:::-;33765:116;;33928:9;33922:4;33918:20;33913:2;33902:9;33898:18;33891:48;33956:108;34059:4;34050:6;33956:108;:::i;:::-;33948:116;;33437:634;;;;;:::o;34077:210::-;34164:4;34202:2;34191:9;34187:18;34179:26;;34215:65;34277:1;34266:9;34262:17;34253:6;34215:65;:::i;:::-;34077:210;;;;:::o;34293:313::-;34406:4;34444:2;34433:9;34429:18;34421:26;;34493:9;34487:4;34483:20;34479:1;34468:9;34464:17;34457:47;34521:78;34594:4;34585:6;34521:78;:::i;:::-;34513:86;;34293:313;;;;:::o;34612:1242::-;34945:4;34983:3;34972:9;34968:19;34960:27;;35033:9;35027:4;35023:20;35019:1;35008:9;35004:17;34997:47;35061:78;35134:4;35125:6;35061:78;:::i;:::-;35053:86;;35186:9;35180:4;35176:20;35171:2;35160:9;35156:18;35149:48;35214:78;35287:4;35278:6;35214:78;:::i;:::-;35206:86;;35302:72;35370:2;35359:9;35355:18;35346:6;35302:72;:::i;:::-;35384;35452:2;35441:9;35437:18;35428:6;35384:72;:::i;:::-;35466:73;35534:3;35523:9;35519:19;35510:6;35466:73;:::i;:::-;35549:67;35611:3;35600:9;35596:19;35587:6;35549:67;:::i;:::-;35626;35688:3;35677:9;35673:19;35664:6;35626:67;:::i;:::-;35703;35765:3;35754:9;35750:19;35741:6;35703:67;:::i;:::-;35780;35842:3;35831:9;35827:19;35818:6;35780:67;:::i;:::-;34612:1242;;;;;;;;;;;;:::o;35860:419::-;36026:4;36064:2;36053:9;36049:18;36041:26;;36113:9;36107:4;36103:20;36099:1;36088:9;36084:17;36077:47;36141:131;36267:4;36141:131;:::i;:::-;36133:139;;35860:419;;;:::o;36285:::-;36451:4;36489:2;36478:9;36474:18;36466:26;;36538:9;36532:4;36528:20;36524:1;36513:9;36509:17;36502:47;36566:131;36692:4;36566:131;:::i;:::-;36558:139;;36285:419;;;:::o;36710:::-;36876:4;36914:2;36903:9;36899:18;36891:26;;36963:9;36957:4;36953:20;36949:1;36938:9;36934:17;36927:47;36991:131;37117:4;36991:131;:::i;:::-;36983:139;;36710:419;;;:::o;37135:::-;37301:4;37339:2;37328:9;37324:18;37316:26;;37388:9;37382:4;37378:20;37374:1;37363:9;37359:17;37352:47;37416:131;37542:4;37416:131;:::i;:::-;37408:139;;37135:419;;;:::o;37560:::-;37726:4;37764:2;37753:9;37749:18;37741:26;;37813:9;37807:4;37803:20;37799:1;37788:9;37784:17;37777:47;37841:131;37967:4;37841:131;:::i;:::-;37833:139;;37560:419;;;:::o;37985:::-;38151:4;38189:2;38178:9;38174:18;38166:26;;38238:9;38232:4;38228:20;38224:1;38213:9;38209:17;38202:47;38266:131;38392:4;38266:131;:::i;:::-;38258:139;;37985:419;;;:::o;38410:::-;38576:4;38614:2;38603:9;38599:18;38591:26;;38663:9;38657:4;38653:20;38649:1;38638:9;38634:17;38627:47;38691:131;38817:4;38691:131;:::i;:::-;38683:139;;38410:419;;;:::o;38835:::-;39001:4;39039:2;39028:9;39024:18;39016:26;;39088:9;39082:4;39078:20;39074:1;39063:9;39059:17;39052:47;39116:131;39242:4;39116:131;:::i;:::-;39108:139;;38835:419;;;:::o;39260:::-;39426:4;39464:2;39453:9;39449:18;39441:26;;39513:9;39507:4;39503:20;39499:1;39488:9;39484:17;39477:47;39541:131;39667:4;39541:131;:::i;:::-;39533:139;;39260:419;;;:::o;39685:::-;39851:4;39889:2;39878:9;39874:18;39866:26;;39938:9;39932:4;39928:20;39924:1;39913:9;39909:17;39902:47;39966:131;40092:4;39966:131;:::i;:::-;39958:139;;39685:419;;;:::o;40110:::-;40276:4;40314:2;40303:9;40299:18;40291:26;;40363:9;40357:4;40353:20;40349:1;40338:9;40334:17;40327:47;40391:131;40517:4;40391:131;:::i;:::-;40383:139;;40110:419;;;:::o;40535:::-;40701:4;40739:2;40728:9;40724:18;40716:26;;40788:9;40782:4;40778:20;40774:1;40763:9;40759:17;40752:47;40816:131;40942:4;40816:131;:::i;:::-;40808:139;;40535:419;;;:::o;40960:::-;41126:4;41164:2;41153:9;41149:18;41141:26;;41213:9;41207:4;41203:20;41199:1;41188:9;41184:17;41177:47;41241:131;41367:4;41241:131;:::i;:::-;41233:139;;40960:419;;;:::o;41385:::-;41551:4;41589:2;41578:9;41574:18;41566:26;;41638:9;41632:4;41628:20;41624:1;41613:9;41609:17;41602:47;41666:131;41792:4;41666:131;:::i;:::-;41658:139;;41385:419;;;:::o;41810:::-;41976:4;42014:2;42003:9;41999:18;41991:26;;42063:9;42057:4;42053:20;42049:1;42038:9;42034:17;42027:47;42091:131;42217:4;42091:131;:::i;:::-;42083:139;;41810:419;;;:::o;42235:::-;42401:4;42439:2;42428:9;42424:18;42416:26;;42488:9;42482:4;42478:20;42474:1;42463:9;42459:17;42452:47;42516:131;42642:4;42516:131;:::i;:::-;42508:139;;42235:419;;;:::o;42660:::-;42826:4;42864:2;42853:9;42849:18;42841:26;;42913:9;42907:4;42903:20;42899:1;42888:9;42884:17;42877:47;42941:131;43067:4;42941:131;:::i;:::-;42933:139;;42660:419;;;:::o;43085:::-;43251:4;43289:2;43278:9;43274:18;43266:26;;43338:9;43332:4;43328:20;43324:1;43313:9;43309:17;43302:47;43366:131;43492:4;43366:131;:::i;:::-;43358:139;;43085:419;;;:::o;43510:::-;43676:4;43714:2;43703:9;43699:18;43691:26;;43763:9;43757:4;43753:20;43749:1;43738:9;43734:17;43727:47;43791:131;43917:4;43791:131;:::i;:::-;43783:139;;43510:419;;;:::o;43935:::-;44101:4;44139:2;44128:9;44124:18;44116:26;;44188:9;44182:4;44178:20;44174:1;44163:9;44159:17;44152:47;44216:131;44342:4;44216:131;:::i;:::-;44208:139;;43935:419;;;:::o;44360:::-;44526:4;44564:2;44553:9;44549:18;44541:26;;44613:9;44607:4;44603:20;44599:1;44588:9;44584:17;44577:47;44641:131;44767:4;44641:131;:::i;:::-;44633:139;;44360:419;;;:::o;44785:::-;44951:4;44989:2;44978:9;44974:18;44966:26;;45038:9;45032:4;45028:20;45024:1;45013:9;45009:17;45002:47;45066:131;45192:4;45066:131;:::i;:::-;45058:139;;44785:419;;;:::o;45210:::-;45376:4;45414:2;45403:9;45399:18;45391:26;;45463:9;45457:4;45453:20;45449:1;45438:9;45434:17;45427:47;45491:131;45617:4;45491:131;:::i;:::-;45483:139;;45210:419;;;:::o;45635:222::-;45728:4;45766:2;45755:9;45751:18;45743:26;;45779:71;45847:1;45836:9;45832:17;45823:6;45779:71;:::i;:::-;45635:222;;;;:::o;45863:332::-;45984:4;46022:2;46011:9;46007:18;45999:26;;46035:71;46103:1;46092:9;46088:17;46079:6;46035:71;:::i;:::-;46116:72;46184:2;46173:9;46169:18;46160:6;46116:72;:::i;:::-;45863:332;;;;;:::o;46201:129::-;46235:6;46262:20;;:::i;:::-;46252:30;;46291:33;46319:4;46311:6;46291:33;:::i;:::-;46201:129;;;:::o;46336:75::-;46369:6;46402:2;46396:9;46386:19;;46336:75;:::o;46417:311::-;46494:4;46584:18;46576:6;46573:30;46570:56;;;46606:18;;:::i;:::-;46570:56;46656:4;46648:6;46644:17;46636:25;;46716:4;46710;46706:15;46698:23;;46417:311;;;:::o;46734:::-;46811:4;46901:18;46893:6;46890:30;46887:56;;;46923:18;;:::i;:::-;46887:56;46973:4;46965:6;46961:17;46953:25;;47033:4;47027;47023:15;47015:23;;46734:311;;;:::o;47051:307::-;47112:4;47202:18;47194:6;47191:30;47188:56;;;47224:18;;:::i;:::-;47188:56;47262:29;47284:6;47262:29;:::i;:::-;47254:37;;47346:4;47340;47336:15;47328:23;;47051:307;;;:::o;47364:308::-;47426:4;47516:18;47508:6;47505:30;47502:56;;;47538:18;;:::i;:::-;47502:56;47576:29;47598:6;47576:29;:::i;:::-;47568:37;;47660:4;47654;47650:15;47642:23;;47364:308;;;:::o;47678:132::-;47745:4;47768:3;47760:11;;47798:4;47793:3;47789:14;47781:22;;47678:132;;;:::o;47816:::-;47883:4;47906:3;47898:11;;47936:4;47931:3;47927:14;47919:22;;47816:132;;;:::o;47954:114::-;48021:6;48055:5;48049:12;48039:22;;47954:114;;;:::o;48074:::-;48141:6;48175:5;48169:12;48159:22;;48074:114;;;:::o;48194:98::-;48245:6;48279:5;48273:12;48263:22;;48194:98;;;:::o;48298:99::-;48350:6;48384:5;48378:12;48368:22;;48298:99;;;:::o;48403:113::-;48473:4;48505;48500:3;48496:14;48488:22;;48403:113;;;:::o;48522:::-;48592:4;48624;48619:3;48615:14;48607:22;;48522:113;;;:::o;48641:184::-;48740:11;48774:6;48769:3;48762:19;48814:4;48809:3;48805:14;48790:29;;48641:184;;;;:::o;48831:::-;48930:11;48964:6;48959:3;48952:19;49004:4;48999:3;48995:14;48980:29;;48831:184;;;;:::o;49021:168::-;49104:11;49138:6;49133:3;49126:19;49178:4;49173:3;49169:14;49154:29;;49021:168;;;;:::o;49195:169::-;49279:11;49313:6;49308:3;49301:19;49353:4;49348:3;49344:14;49329:29;;49195:169;;;;:::o;49370:305::-;49410:3;49429:20;49447:1;49429:20;:::i;:::-;49424:25;;49463:20;49481:1;49463:20;:::i;:::-;49458:25;;49617:1;49549:66;49545:74;49542:1;49539:81;49536:107;;;49623:18;;:::i;:::-;49536:107;49667:1;49664;49660:9;49653:16;;49370:305;;;;:::o;49681:185::-;49721:1;49738:20;49756:1;49738:20;:::i;:::-;49733:25;;49772:20;49790:1;49772:20;:::i;:::-;49767:25;;49811:1;49801:35;;49816:18;;:::i;:::-;49801:35;49858:1;49855;49851:9;49846:14;;49681:185;;;;:::o;49872:96::-;49909:7;49938:24;49956:5;49938:24;:::i;:::-;49927:35;;49872:96;;;:::o;49974:90::-;50008:7;50051:5;50044:13;50037:21;50026:32;;49974:90;;;:::o;50070:149::-;50106:7;50146:66;50139:5;50135:78;50124:89;;50070:149;;;:::o;50225:126::-;50262:7;50302:42;50295:5;50291:54;50280:65;;50225:126;;;:::o;50357:77::-;50394:7;50423:5;50412:16;;50357:77;;;:::o;50440:154::-;50524:6;50519:3;50514;50501:30;50586:1;50577:6;50572:3;50568:16;50561:27;50440:154;;;:::o;50600:307::-;50668:1;50678:113;50692:6;50689:1;50686:13;50678:113;;;50777:1;50772:3;50768:11;50762:18;50758:1;50753:3;50749:11;50742:39;50714:2;50711:1;50707:10;50702:15;;50678:113;;;50809:6;50806:1;50803:13;50800:101;;;50889:1;50880:6;50875:3;50871:16;50864:27;50800:101;50649:258;50600:307;;;:::o;50913:320::-;50957:6;50994:1;50988:4;50984:12;50974:22;;51041:1;51035:4;51031:12;51062:18;51052:81;;51118:4;51110:6;51106:17;51096:27;;51052:81;51180:2;51172:6;51169:14;51149:18;51146:38;51143:84;;;51199:18;;:::i;:::-;51143:84;50964:269;50913:320;;;:::o;51239:281::-;51322:27;51344:4;51322:27;:::i;:::-;51314:6;51310:40;51452:6;51440:10;51437:22;51416:18;51404:10;51401:34;51398:62;51395:88;;;51463:18;;:::i;:::-;51395:88;51503:10;51499:2;51492:22;51282:238;51239:281;;:::o;51526:233::-;51565:3;51588:24;51606:5;51588:24;:::i;:::-;51579:33;;51634:66;51627:5;51624:77;51621:103;;;51704:18;;:::i;:::-;51621:103;51751:1;51744:5;51740:13;51733:20;;51526:233;;;:::o;51765:176::-;51797:1;51814:20;51832:1;51814:20;:::i;:::-;51809:25;;51848:20;51866:1;51848:20;:::i;:::-;51843:25;;51887:1;51877:35;;51892:18;;:::i;:::-;51877:35;51933:1;51930;51926:9;51921:14;;51765:176;;;;:::o;51947:180::-;51995:77;51992:1;51985:88;52092:4;52089:1;52082:15;52116:4;52113:1;52106:15;52133:180;52181:77;52178:1;52171:88;52278:4;52275:1;52268:15;52302:4;52299:1;52292:15;52319:180;52367:77;52364:1;52357:88;52464:4;52461:1;52454:15;52488:4;52485:1;52478:15;52505:180;52553:77;52550:1;52543:88;52650:4;52647:1;52640:15;52674:4;52671:1;52664:15;52691:180;52739:77;52736:1;52729:88;52836:4;52833:1;52826:15;52860:4;52857:1;52850:15;52877:183;52912:3;52950:1;52932:16;52929:23;52926:128;;;52988:1;52985;52982;52967:23;53010:34;53041:1;53035:8;53010:34;:::i;:::-;53003:41;;52926:128;52877:183;:::o;53066:117::-;53175:1;53172;53165:12;53189:117;53298:1;53295;53288:12;53312:117;53421:1;53418;53411:12;53435:117;53544:1;53541;53534:12;53558:117;53667:1;53664;53657:12;53681:117;53790:1;53787;53780:12;53804:102;53845:6;53896:2;53892:7;53887:2;53880:5;53876:14;53872:28;53862:38;;53804:102;;;:::o;53912:106::-;53956:8;54005:5;54000:3;53996:15;53975:36;;53912:106;;;:::o;54024:239::-;54164:34;54160:1;54152:6;54148:14;54141:58;54233:22;54228:2;54220:6;54216:15;54209:47;54024:239;:::o;54269:227::-;54409:34;54405:1;54397:6;54393:14;54386:58;54478:10;54473:2;54465:6;54461:15;54454:35;54269:227;:::o;54502:230::-;54642:34;54638:1;54630:6;54626:14;54619:58;54711:13;54706:2;54698:6;54694:15;54687:38;54502:230;:::o;54738:178::-;54878:30;54874:1;54866:6;54862:14;54855:54;54738:178;:::o;54922:226::-;55062:34;55058:1;55050:6;55046:14;55039:58;55131:9;55126:2;55118:6;55114:15;55107:34;54922:226;:::o;55154:234::-;55294:34;55290:1;55282:6;55278:14;55271:58;55363:17;55358:2;55350:6;55346:15;55339:42;55154:234;:::o;55394:228::-;55534:34;55530:1;55522:6;55518:14;55511:58;55603:11;55598:2;55590:6;55586:15;55579:36;55394:228;:::o;55628:232::-;55768:34;55764:1;55756:6;55752:14;55745:58;55837:15;55832:2;55824:6;55820:15;55813:40;55628:232;:::o;55866:170::-;56006:22;56002:1;55994:6;55990:14;55983:46;55866:170;:::o;56042:224::-;56182:34;56178:1;56170:6;56166:14;56159:58;56251:7;56246:2;56238:6;56234:15;56227:32;56042:224;:::o;56272:237::-;56412:34;56408:1;56400:6;56396:14;56389:58;56481:20;56476:2;56468:6;56464:15;56457:45;56272:237;:::o;56515:233::-;56655:34;56651:1;56643:6;56639:14;56632:58;56724:16;56719:2;56711:6;56707:15;56700:41;56515:233;:::o;56754:223::-;56894:34;56890:1;56882:6;56878:14;56871:58;56963:6;56958:2;56950:6;56946:15;56939:31;56754:223;:::o;56983:176::-;57123:28;57119:1;57111:6;57107:14;57100:52;56983:176;:::o;57165:229::-;57305:34;57301:1;57293:6;57289:14;57282:58;57374:12;57369:2;57361:6;57357:15;57350:37;57165:229;:::o;57400:250::-;57540:34;57536:1;57528:6;57524:14;57517:58;57609:33;57604:2;57596:6;57592:15;57585:58;57400:250;:::o;57656:228::-;57796:34;57792:1;57784:6;57780:14;57773:58;57865:11;57860:2;57852:6;57848:15;57841:36;57656:228;:::o;57890:::-;58030:34;58026:1;58018:6;58014:14;58007:58;58099:11;58094:2;58086:6;58082:15;58075:36;57890:228;:::o;58124:175::-;58264:27;58260:1;58252:6;58248:14;58241:51;58124:175;:::o;58305:227::-;58445:34;58441:1;58433:6;58429:14;58422:58;58514:10;58509:2;58501:6;58497:15;58490:35;58305:227;:::o;58538:220::-;58678:34;58674:1;58666:6;58662:14;58655:58;58747:3;58742:2;58734:6;58730:15;58723:28;58538:220;:::o;58764:181::-;58904:33;58900:1;58892:6;58888:14;58881:57;58764:181;:::o;58951:235::-;59091:34;59087:1;59079:6;59075:14;59068:58;59160:18;59155:2;59147:6;59143:15;59136:43;58951:235;:::o;59192:711::-;59231:3;59269:4;59251:16;59248:26;59245:39;;;59277:5;;59245:39;59306:20;;:::i;:::-;59381:1;59363:16;59359:24;59356:1;59350:4;59335:49;59414:4;59408:11;59513:16;59506:4;59498:6;59494:17;59491:39;59458:18;59450:6;59447:30;59431:113;59428:146;;;59559:5;;;;59428:146;59605:6;59599:4;59595:17;59641:3;59635:10;59668:18;59660:6;59657:30;59654:43;;;59690:5;;;;;;59654:43;59738:6;59731:4;59726:3;59722:14;59718:27;59797:1;59779:16;59775:24;59769:4;59765:35;59760:3;59757:44;59754:57;;;59804:5;;;;;;;59754:57;59821;59869:6;59863:4;59859:17;59851:6;59847:30;59841:4;59821:57;:::i;:::-;59894:3;59887:10;;59235:668;;;;;59192:711;;:::o;59909:122::-;59982:24;60000:5;59982:24;:::i;:::-;59975:5;59972:35;59962:63;;60021:1;60018;60011:12;59962:63;59909:122;:::o;60037:116::-;60107:21;60122:5;60107:21;:::i;:::-;60100:5;60097:32;60087:60;;60143:1;60140;60133:12;60087:60;60037:116;:::o;60159:120::-;60231:23;60248:5;60231:23;:::i;:::-;60224:5;60221:34;60211:62;;60269:1;60266;60259:12;60211:62;60159:120;:::o;60285:122::-;60358:24;60376:5;60358:24;:::i;:::-;60351:5;60348:35;60338:63;;60397:1;60394;60387:12;60338:63;60285:122;:::o
Swarm Source
ipfs://b3db0a4e3e8792025fc589c13da94e487bdcd43106cd05a38c8644137ac87b76
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.