```\\nfunction removeLiquidity(uint256 LPamount, address outputToken, uint256 minOutputAmount)\\n  external\\n  onlyListedToken(outputToken)\\n  override\\n  returns (uint256 actualOutput)\\n{\\n  // Checks the initial balance of the token desired as output token\\n  uint256 initialBalance;\\n  if (outputToken == address(0)) {\\n    initialBalance = address(this).balance;\\n  } else {\\n    initialBalance = IERC20(outputToken).balanceOf(address(this));\\n  }\\n\\n  // Calculates intermediate variable F = (1-R)^16 and then the resulting output amount.\\n  uint256 F_;\\n  F_ = (1 << 64) - (LPamount << 64) / totalSupply();   // (1-R)      (0.64 bits)\\n  F_ = F_ * F_;                                       // (1-R)^2    (0.128 bits)\\n  F_ = F_ * F_ >> 192;                                // (1-R)^4    (0.64 bits)\\n  F_ = F_ * F_;                                       // (1-R)^8    (0.128 bits)\\n  F_ = F_ * F_ >> 192;                                // (1-R)^16   (0.64 bits)\\n  actualOutput = initialBalance * ((1 << 64) - F_) >> 64;\\n  require(actualOutput > minOutputAmount, "DFP: No deal");\\n\\n  // Burns the LP tokens and sends the output tokens\\n  _burn(msg.sender, LPamount);\\n  if (outputToken == address(0)) {\\n    address payable sender = payable(msg.sender);\\n    sender.transfer(actualOutput);\\n  } else {\\n    IERC20(outputToken).safeTransfer(msg.sender, actualOutput);\\n  }\\n\\n  // Emitting liquidity removal event to enable better governance decisions\\n  emit LiquidityRemoved(msg.sender, outputToken, actualOutput, LPamount);\\n}\\n```\\n