diff --git a/platform/diff-api/api-dump.txt b/platform/diff-api/api-dump.txt index 48bd1acbdf6d..31a7cd177789 100644 --- a/platform/diff-api/api-dump.txt +++ b/platform/diff-api/api-dump.txt @@ -97,8 +97,13 @@ a:com.intellij.diff.DiffRequestFactory - a:createTextMergeRequestFromFiles(com.intellij.openapi.project.Project,com.intellij.openapi.vfs.VirtualFile,java.util.List,java.lang.String,java.util.List,com.intellij.util.Consumer):com.intellij.diff.merge.TextMergeRequest - a:getContentTitle(com.intellij.openapi.vfs.VirtualFile):java.lang.String - s:getInstance():com.intellij.diff.DiffRequestFactory +- a:getTitle(com.intellij.openapi.vcs.FilePath):java.lang.String - a:getTitle(com.intellij.openapi.vfs.VirtualFile):java.lang.String -- a:getTitle(com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.vfs.VirtualFile):java.lang.String +- getTitle(com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.vfs.VirtualFile):java.lang.String +- a:getTitleForComparison(com.intellij.openapi.vcs.FilePath,com.intellij.openapi.vcs.FilePath):java.lang.String +- a:getTitleForComparison(com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.vfs.VirtualFile):java.lang.String +- a:getTitleForModification(com.intellij.openapi.vcs.FilePath,com.intellij.openapi.vcs.FilePath):java.lang.String +- a:getTitleForModification(com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.vfs.VirtualFile):java.lang.String com.intellij.diff.DiffRequestPanel - com.intellij.openapi.Disposable - a:getComponent():javax.swing.JComponent diff --git a/platform/diff-api/src/com/intellij/diff/DiffRequestFactory.java b/platform/diff-api/src/com/intellij/diff/DiffRequestFactory.java index 88b3235a9a3c..e694ef3abcad 100644 --- a/platform/diff-api/src/com/intellij/diff/DiffRequestFactory.java +++ b/platform/diff-api/src/com/intellij/diff/DiffRequestFactory.java @@ -11,6 +11,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NlsContexts; +import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import org.jetbrains.annotations.Contract; @@ -48,6 +49,9 @@ public abstract class DiffRequestFactory { // Titles // + /** + * See also the prettier {@link com.intellij.openapi.vcs.history.DiffTitleFilePathCustomizer} + */ @NlsContexts.Label @Nullable @Contract("null->null; !null->!null") @@ -55,11 +59,49 @@ public abstract class DiffRequestFactory { @NlsContexts.DialogTitle @NotNull - public abstract String getTitle(@Nullable VirtualFile file1, @Nullable VirtualFile file2); + public abstract String getTitle(@NotNull VirtualFile file); + + /** + * @deprecated Prefer using {@link #getTitleForComparison} or {@link #getTitleForModification} explicitly. + */ + @NlsContexts.DialogTitle + @NotNull + @Deprecated + public String getTitle(@Nullable VirtualFile file1, @Nullable VirtualFile file2) { + return getTitleForComparison(file1, file2); + } + + /** + * Title for 'file1 vs file2' diffs. Ex: "compare two selected files". + */ + @NlsContexts.DialogTitle + @NotNull + public abstract String getTitleForComparison(@Nullable VirtualFile file1, @Nullable VirtualFile file2); + + /** + * Title for 'file1 was changed into file2' diffs. Ex: "show file change in a commit". + */ + @NlsContexts.DialogTitle + @NotNull + public abstract String getTitleForModification(@Nullable VirtualFile file1, @Nullable VirtualFile file2); @NlsContexts.DialogTitle @NotNull - public abstract String getTitle(@NotNull VirtualFile file); + public abstract String getTitle(@NotNull FilePath path); + + /** + * Title for 'path1 vs path2' diffs. Ex: "compare two selected files". + */ + @NlsContexts.DialogTitle + @NotNull + public abstract String getTitleForComparison(@Nullable FilePath path1, @Nullable FilePath path2); + + /** + * Title for 'path1 was changed into path2' diffs. Ex: "show file history for commit". + */ + @NlsContexts.DialogTitle + @NotNull + public abstract String getTitleForModification(@Nullable FilePath path1, @Nullable FilePath path2); // // Merge diff --git a/platform/diff-impl/resources/api-dump.txt b/platform/diff-impl/resources/api-dump.txt index 893be28603d1..45c9bec77ed1 100644 --- a/platform/diff-impl/resources/api-dump.txt +++ b/platform/diff-impl/resources/api-dump.txt @@ -2746,6 +2746,7 @@ f:com.intellij.diff.util.DiffUtil - s:addActionBlock(com.intellij.openapi.actionSystem.DefaultActionGroup,java.util.List,Z):V - s:addActionBlock(com.intellij.openapi.actionSystem.DefaultActionGroup,com.intellij.openapi.actionSystem.AnAction[]):V - s:addNotification(com.intellij.diff.util.DiffNotificationProvider,com.intellij.openapi.util.UserDataHolder):V +- s:addTitleCustomizers(com.intellij.diff.merge.MergeRequest,java.util.List):com.intellij.diff.merge.MergeRequest - s:addTitleCustomizers(com.intellij.diff.requests.DiffRequest,java.util.List):com.intellij.diff.requests.DiffRequest - s:applyModification(com.intellij.openapi.editor.Document,I,I,com.intellij.openapi.editor.Document,I,I):V - s:applyModification(com.intellij.openapi.editor.Document,I,I,java.util.List):V diff --git a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java index be264fee78b0..db1f1532f982 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java @@ -22,10 +22,7 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.LocalFilePath; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.*; import java.io.File; import java.io.IOException; @@ -60,7 +57,7 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { String title1 = getContentTitle(file1); String title2 = getContentTitle(file2); - String title = getTitle(file1, file2); + String title = getTitleForComparison(file1, file2); return new SimpleDiffRequest(title, content1, content2, title1, title2); } @@ -104,21 +101,23 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { @Override public String getContentTitle(@Nullable VirtualFile file) { if (file == null) return null; - return getContentTitle(new LocalFilePath(file.getPath(), file.isDirectory())); + return getContentTitle(toFilePath(file)); } - @NotNull @Override - public String getTitle(@Nullable VirtualFile file1, @Nullable VirtualFile file2) { - FilePath path1 = file1 != null ? new LocalFilePath(file1.getPath(), file1.isDirectory()) : null; - FilePath path2 = file2 != null ? new LocalFilePath(file2.getPath(), file2.isDirectory()) : null; - return getTitle(path1, path2, DIFF_TITLE_SEPARATOR); + public @NotNull String getTitleForModification(@Nullable VirtualFile file1, @Nullable VirtualFile file2) { + return getTitleForModification(toFilePath(file1), toFilePath(file2)); + } + + @Override + public @NotNull String getTitleForComparison(@Nullable VirtualFile file1, @Nullable VirtualFile file2) { + return getTitleForComparison(toFilePath(file1), toFilePath(file2)); } @NotNull @Override public String getTitle(@NotNull VirtualFile file) { - return getTitle(file, null); + return getTitleForComparison(file, null); } @Nls @@ -129,10 +128,27 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { return getContentTitle(path.getName(), path.getPresentableUrl(), parent != null ? parent.getPresentableUrl() : null); } + @Override + public @NotNull String getTitle(@NotNull FilePath path) { + return getTitleForComparison(path, null); + } + + @Override + public @NotNull String getTitleForComparison(@Nullable FilePath path1, @Nullable FilePath path2) { + return getTitle(path1, path2, DIFF_TITLE_SEPARATOR); + } + + @Override + public @NotNull String getTitleForModification(@Nullable FilePath path1, @Nullable FilePath path2) { + return getTitle(path1, path2, DIFF_TITLE_RENAME_SEPARATOR); + } + @Nls @NotNull public static String getTitle(@Nullable FilePath path1, @Nullable FilePath path2, @NotNull @Nls String separator) { - assert path1 != null || path2 != null; + if (path1 == null && path2 == null) { + return DiffBundle.message("diff.files.dialog.title"); + } if (path1 == null || path2 == null) { return getContentTitle(chooseNotNull(path1, path2)); @@ -453,4 +469,10 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { throw new InvalidDiffRequestException("Can't read from file", e); } } + + @Contract("!null -> !null; null -> null") + private static @Nullable LocalFilePath toFilePath(@Nullable VirtualFile file) { + if (file == null) return null; + return new LocalFilePath(file.getPath(), file.isDirectory()); + } } diff --git a/platform/diff-impl/src/com/intellij/diff/actions/BaseShowDiffAction.java b/platform/diff-impl/src/com/intellij/diff/actions/BaseShowDiffAction.java index 5c2a13cf8c29..c66c9774fcdd 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/BaseShowDiffAction.java +++ b/platform/diff-impl/src/com/intellij/diff/actions/BaseShowDiffAction.java @@ -88,7 +88,7 @@ public abstract class BaseShowDiffAction extends DumbAwareAction { chain.setWindowTitle(requestFactory.getTitle(baseFile)); } else { - chain.setWindowTitle(requestFactory.getTitle(file1, file2)); + chain.setWindowTitle(requestFactory.getTitleForComparison(file1, file2)); } return chain; } diff --git a/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java b/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java index 6ce293fda445..080f93add8b1 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java +++ b/platform/diff-impl/src/com/intellij/diff/actions/CompareClipboardWithSelectionAction.java @@ -87,7 +87,7 @@ public class CompareClipboardWithSelectionAction extends BaseShowDiffAction { VirtualFile editorFile = FileDocumentManager.getInstance().getFile(editor.getDocument()); String editorContentTitle = editorFile != null - ? DiffRequestFactory.getInstance().getContentTitle(editorFile) + ? DiffRequestFactory.getInstance().getTitle(editorFile) : DiffBundle.message("diff.content.editor.content.title"); if (editor.getSelectionModel().hasSelection()) { editorContentTitle = DiffBundle.message("diff.content.selection.from.file.content.title", editorContentTitle); diff --git a/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.kt b/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.kt index 7233e997b33a..e15a934f2b64 100644 --- a/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.kt +++ b/platform/diff-impl/src/com/intellij/diff/applications/DiffApplication.kt @@ -88,7 +88,7 @@ private class MyDiffRequestProducer(private val project: Project?, private val f DiffRequestFactory.getInstance().getTitle(base) } else { - DiffRequestFactory.getInstance().getTitle(files[0], files[1]) + DiffRequestFactory.getInstance().getTitleForComparison(files[0], files[1]) } } diff --git a/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java b/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java index 3efd7da88d83..0394beb1354f 100644 --- a/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java +++ b/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java @@ -428,7 +428,7 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode myTarget instanceof VirtualFileDiffElement) { VirtualFile srcFile = ((VirtualFileDiffElement)mySource).getValue(); VirtualFile trgFile = ((VirtualFileDiffElement)myTarget).getValue(); - return DiffRequestFactory.getInstance().getTitle(srcFile, trgFile); + return DiffRequestFactory.getInstance().getTitleForComparison(srcFile, trgFile); } return IdeBundle.message("diff.dialog.title", mySource.getPresentablePath(), myTarget.getPresentablePath()); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java index 89f12535a187..c47c4d1f973a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/diff/ChangeDiffRequestProducer.java @@ -46,7 +46,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.*; -import static com.intellij.diff.DiffRequestFactoryImpl.DIFF_TITLE_RENAME_SEPARATOR; import static com.intellij.util.ObjectUtils.tryCast; import static com.intellij.vcsUtil.VcsUtil.getShortRevisionString; @@ -379,7 +378,7 @@ public final class ChangeDiffRequestProducer implements DiffRequestProducer, Cha public static @NotNull @Nls String getRequestTitle(@NotNull Change change) { FilePath bPath = ChangesUtil.getBeforePath(change); FilePath aPath = ChangesUtil.getAfterPath(change); - return DiffRequestFactoryImpl.getTitle(bPath, aPath, DIFF_TITLE_RENAME_SEPARATOR); + return DiffRequestFactory.getInstance().getTitleForModification(bPath, aPath); } public static @NotNull @Nls String getRevisionTitle(@Nullable ContentRevision revision, @NotNull @Nls String defaultValue) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsHistoryUtil.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsHistoryUtil.java index cdc3d83bdcef..3f0065198a5f 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsHistoryUtil.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/VcsHistoryUtil.java @@ -3,7 +3,7 @@ package com.intellij.openapi.vcs.history; import com.intellij.diff.DiffContentFactoryEx; import com.intellij.diff.DiffManager; -import com.intellij.diff.DiffRequestFactoryImpl; +import com.intellij.diff.DiffRequestFactory; import com.intellij.diff.DiffVcsDataKeys; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.requests.DiffRequest; @@ -28,8 +28,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; -import static com.intellij.diff.DiffRequestFactoryImpl.DIFF_TITLE_RENAME_SEPARATOR; - public final class VcsHistoryUtil { private static final Logger LOG = Logger.getInstance(VcsHistoryUtil.class); @@ -74,13 +72,7 @@ public final class VcsHistoryUtil { FilePath path1 = getRevisionPath(revision1); FilePath path2 = getRevisionPath(revision2); - String title; - if (path1 != null && path2 != null) { - title = DiffRequestFactoryImpl.getTitle(path1, path2, DIFF_TITLE_RENAME_SEPARATOR); - } - else { - title = DiffRequestFactoryImpl.getContentTitle(path); - } + String title = path1 != null || path2 != null ? DiffRequestFactory.getInstance().getTitleForModification(path1, path2) : null; DiffContent diffContent1 = loadContentForDiff(project, path, revision1); DiffContent diffContent2 = loadContentForDiff(project, path, revision2); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/update/ShowUpdatedDiffActionProvider.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/update/ShowUpdatedDiffActionProvider.java index 3390cffc9f9f..d280d22345cb 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/update/ShowUpdatedDiffActionProvider.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/update/ShowUpdatedDiffActionProvider.java @@ -18,7 +18,7 @@ package com.intellij.openapi.vcs.update; import com.intellij.diff.DiffContentFactoryEx; import com.intellij.diff.DiffDialogHints; import com.intellij.diff.DiffManager; -import com.intellij.diff.DiffRequestFactoryImpl; +import com.intellij.diff.DiffRequestFactory; import com.intellij.diff.chains.DiffRequestChain; import com.intellij.diff.chains.DiffRequestProducer; import com.intellij.diff.chains.DiffRequestProducerException; @@ -174,7 +174,7 @@ public class ShowUpdatedDiffActionProvider implements AnActionExtensionProvider content2 = contentFactory.createFromBytes(myProject, bytes2, myFilePath); } - String title = DiffRequestFactoryImpl.getContentTitle(myFilePath); + String title = DiffRequestFactory.getInstance().getTitle(myFilePath); return new SimpleDiffRequest(title, content1, content2, diff --git a/plugins/git4idea/src/git4idea/diff/GitSubmoduleDiffRequestProvider.kt b/plugins/git4idea/src/git4idea/diff/GitSubmoduleDiffRequestProvider.kt index 8e0f15181c5d..87d16862b520 100644 --- a/plugins/git4idea/src/git4idea/diff/GitSubmoduleDiffRequestProvider.kt +++ b/plugins/git4idea/src/git4idea/diff/GitSubmoduleDiffRequestProvider.kt @@ -2,8 +2,7 @@ package git4idea.diff import com.intellij.diff.DiffContentFactory -import com.intellij.diff.DiffRequestFactoryImpl -import com.intellij.diff.DiffRequestFactoryImpl.DIFF_TITLE_RENAME_SEPARATOR +import com.intellij.diff.DiffRequestFactory import com.intellij.diff.chains.DiffRequestProducerException import com.intellij.diff.requests.DiffRequest import com.intellij.diff.requests.SimpleDiffRequest @@ -51,7 +50,7 @@ class GitSubmoduleDiffRequestProvider : ChangeDiffRequestProvider { val factory = DiffContentFactory.getInstance() val beforeContent = beforeRevision?.content?.let { factory.create(it) } ?: factory.createEmpty() val afterContent = afterRevision?.content?.let { factory.create(it) } ?: factory.createEmpty() - val title = DiffRequestFactoryImpl.getTitle(beforeRevision?.file, afterRevision?.file, DIFF_TITLE_RENAME_SEPARATOR) + val title = DiffRequestFactory.getInstance().getTitleForModification(beforeRevision?.file, afterRevision?.file) return SimpleDiffRequest(GitBundle.message("label.diff.content.title.submodule.suffix", title), beforeContent, afterContent, diff --git a/plugins/git4idea/src/git4idea/index/GitStageDiffUtil.kt b/plugins/git4idea/src/git4idea/index/GitStageDiffUtil.kt index 658685f1fee7..0e5163425bb3 100644 --- a/plugins/git4idea/src/git4idea/index/GitStageDiffUtil.kt +++ b/plugins/git4idea/src/git4idea/index/GitStageDiffUtil.kt @@ -3,7 +3,7 @@ package git4idea.index import com.intellij.diff.DiffContentFactory import com.intellij.diff.DiffContentFactoryEx -import com.intellij.diff.DiffRequestFactoryImpl +import com.intellij.diff.DiffRequestFactory import com.intellij.diff.DiffVcsDataKeys import com.intellij.diff.chains.DiffRequestProducerException import com.intellij.diff.contents.DiffContent @@ -49,7 +49,6 @@ import git4idea.repo.GitRepositoryManager import git4idea.util.GitFileUtils import org.jetbrains.annotations.Nls import java.io.IOException -import java.util.* fun createTwoSidesDiffRequestProducer(project: Project, statusNode: GitFileStatusNode, @@ -417,11 +416,10 @@ private fun GitFileStatusNode.has(contentVersion: ContentVersion): Boolean = sta @Nls private fun getTitle(status: GitFileStatus, kind: NodeKind): String { - return DiffRequestFactoryImpl.getTitle(status.path, kind.origPath(status), - DiffRequestFactoryImpl.DIFF_TITLE_RENAME_SEPARATOR) + return DiffRequestFactory.getInstance().getTitleForModification(status.path, kind.origPath(status)) } @Nls private fun getTitle(status: GitFileStatus): String { - return DiffRequestFactoryImpl.getTitle(status.path, status.origPath, DiffRequestFactoryImpl.DIFF_TITLE_RENAME_SEPARATOR) + return DiffRequestFactory.getInstance().getTitleForModification(status.path, status.origPath) } diff --git a/plugins/git4idea/src/git4idea/log/GitLogDiffHandler.java b/plugins/git4idea/src/git4idea/log/GitLogDiffHandler.java index c9e308c3a71a..7109d5349ba5 100644 --- a/plugins/git4idea/src/git4idea/log/GitLogDiffHandler.java +++ b/plugins/git4idea/src/git4idea/log/GitLogDiffHandler.java @@ -1,10 +1,7 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package git4idea.log; -import com.intellij.diff.DiffContentFactoryEx; -import com.intellij.diff.DiffDialogHints; -import com.intellij.diff.DiffManager; -import com.intellij.diff.DiffVcsDataKeys; +import com.intellij.diff.*; import com.intellij.diff.chains.DiffRequestProducer; import com.intellij.diff.chains.SimpleDiffRequestChain; import com.intellij.diff.chains.SimpleDiffRequestProducer; @@ -39,8 +36,6 @@ import java.io.IOException; import java.util.Collection; import java.util.Collections; -import static com.intellij.diff.DiffRequestFactoryImpl.DIFF_TITLE_RENAME_SEPARATOR; -import static com.intellij.diff.DiffRequestFactoryImpl.getTitle; import static com.intellij.util.ObjectUtils.chooseNotNull; public class GitLogDiffHandler implements VcsLogDiffHandler { @@ -70,7 +65,7 @@ public class GitLogDiffHandler implements VcsLogDiffHandler { DiffContent leftDiffContent = createDiffContent(root, leftPath, leftHash); DiffContent rightDiffContent = createDiffContent(root, rightPath, rightHash); - return new SimpleDiffRequest(getTitle(leftPath, rightPath, DIFF_TITLE_RENAME_SEPARATOR), + return new SimpleDiffRequest(DiffRequestFactory.getInstance().getTitleForModification(leftPath, rightPath), leftDiffContent, rightDiffContent, leftHash.asString(), rightHash.asString()); }); @@ -89,7 +84,7 @@ public class GitLogDiffHandler implements VcsLogDiffHandler { DiffRequestProducer requestProducer = SimpleDiffRequestProducer.create(localPath, () -> { DiffContent leftDiffContent = createDiffContent(root, revisionPath, revisionHash); DiffContent rightDiffContent = createCurrentDiffContent(localPath); - return new SimpleDiffRequest(getTitle(revisionPath, localPath, DIFF_TITLE_RENAME_SEPARATOR), + return new SimpleDiffRequest(DiffRequestFactory.getInstance().getTitleForModification(revisionPath, localPath), leftDiffContent, rightDiffContent, revisionHash.asString(), GitBundle.message("git.log.diff.handler.local.version.content.title"));