Merge changes I21f258f1,I1240d25c,I34285466,I3ab30565

* changes:
  Bazel: Split deps and provided_deps in gerrit_plugin rule
  Bazel: Expose neverlink artifact in maven_jar rule
  Bazel: Expose PLUGIN_DEPS and PLUGIN_TEST_DEPS variables
  Format .bzl files with Bazel Buildifier
diff --git a/Documentation/dev-contributing.txt b/Documentation/dev-contributing.txt
index a5a4f90..206b765 100644
--- a/Documentation/dev-contributing.txt
+++ b/Documentation/dev-contributing.txt
@@ -342,32 +342,12 @@
 * Update to the same GWT version in the `gwtjsonrpc` project, and release a
 new version.
 
-=== Updating to new version of CodeMirror
+=== Finding starter projects to work on
 
-* Clone the git from https://github.com/codemirror/CodeMirror
-* Checkout the version needed
-* If the needed version is not a tagged version, use `git describe` to determine
-the version number:
-+
-----
- git describe --tags
-----
-
-* Create the release zip file:
-+
-----
- git archive --format=zip --prefix=codemirror-4.10.0-6-gd0a2dda/ d0a2dda > codemirror-4.10.0-6-gd0a2dda.zip
-----
-
-* Determine the sha1 hash of the zip file:
-+
-----
- openssl sha1 codemirror-4.10.0-6-gd0a2dda.zip
-----
-
-* Upload the zip file to the
-link:https://console.developers.google.com/project/164060093628/storage/gerrit-maven/[
-gerrit-maven] storage bucket
+We have created a
+link:https://bugs.chromium.org/p/gerrit/issues/list?can=2&q=label%3AStarterProject[StarterProject]
+category in the issue tracker and try to assign easy hack projects to it. If in
+doubt, do not hesitate to ask on the developer mailing list.
 
 GERRIT
 ------
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
index 6b4cf36..bebbaaa 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
@@ -255,7 +255,9 @@
     Map<Integer, VotableInfo> d = new HashMap<>();
     for (String name : change.labels()) {
       LabelInfo label = change.label(name);
-      short labelMaxValue = LabelInfo.parseValue(label.maxValue());
+      Short labelMaxValue = label.valueSet().isEmpty()
+        ? null
+        : LabelInfo.parseValue(label.maxValue());
       if (label.all() != null) {
         for (ApprovalInfo ai : Natives.asList(label.all())) {
           int id = ai._accountId();
@@ -264,7 +266,8 @@
             ad = new VotableInfo();
             d.put(id, ad);
           }
-          if (ai.permittedVotingRange() != null
+          if (labelMaxValue != null
+              && ai.permittedVotingRange() != null
               && ai.permittedVotingRange().max() == labelMaxValue) {
             ad.votable(name + " (" + label.maxValue() + ") ");
           } else if (ai.hasValue()) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java
index 479a5e5..e99838a 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Strings.emptyToNull;
 import static com.google.common.net.HttpHeaders.AUTHORIZATION;
+import static java.nio.charset.StandardCharsets.UTF_8;
 
 import org.eclipse.jgit.util.Base64;
 
@@ -72,7 +73,7 @@
 
     } else if (auth.startsWith("Basic ")) {
       auth = auth.substring("Basic ".length());
-      auth = new String(Base64.decode(auth));
+      auth = new String(Base64.decode(auth), UTF_8);
       final int c = auth.indexOf(':');
       return c > 0 ? auth.substring(0, c) : null;
 
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
index 77c8bb4..3812fa11 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
@@ -433,7 +433,8 @@
     appendPluginInfoTable(md, scanner.getManifest().getMainAttributes());
 
     if (about != null) {
-      InputStreamReader isr = new InputStreamReader(scanner.getInputStream(about));
+      InputStreamReader isr = new InputStreamReader(
+          scanner.getInputStream(about), UTF_8);
       StringBuilder aboutContent = new StringBuilder();
       try (BufferedReader reader = new BufferedReader(isr)) {
         String line;
diff --git a/gerrit-main/BUCK b/gerrit-main/BUCK
index 388126e..da39eec 100644
--- a/gerrit-main/BUCK
+++ b/gerrit-main/BUCK
@@ -9,7 +9,5 @@
   name = 'main_lib',
   srcs = ['src/main/java/Main.java'],
   deps = ['//gerrit-launcher:launcher'],
-  source = '1.2',
-  target = '1.2',
   visibility = ['//tools/eclipse:classpath'],
 )
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
index f24d0f0..789d9a7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
@@ -26,8 +26,8 @@
 import com.google.gerrit.extensions.webui.DiffWebLink;
 import com.google.gerrit.extensions.webui.FileHistoryWebLink;
 import com.google.gerrit.extensions.webui.FileWebLink;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
 import com.google.gerrit.extensions.webui.ParentWebLink;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
 import com.google.gerrit.extensions.webui.ProjectWebLink;
 import com.google.gerrit.extensions.webui.WebLink;
 import com.google.gerrit.reviewdb.client.Project;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
index 851d331..7d86aa2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
@@ -27,8 +27,8 @@
 import com.google.gerrit.extensions.webui.BranchWebLink;
 import com.google.gerrit.extensions.webui.FileHistoryWebLink;
 import com.google.gerrit.extensions.webui.FileWebLink;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
 import com.google.gerrit.extensions.webui.ParentWebLink;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
 import com.google.gerrit.extensions.webui.ProjectWebLink;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin
index d3c74f3..e1855f1 160000
--- a/plugins/cookbook-plugin
+++ b/plugins/cookbook-plugin
@@ -1 +1 @@
-Subproject commit d3c74f3692b0b10926cab300baaef905fcdf4136
+Subproject commit e1855f1f4689bf00b2264668ef707c6aee4c216e
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index 7931d94..a233892 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -208,7 +208,7 @@
         items="[[_shownFiles]]"
         as="file"
         initial-count="[[_fileListIncrement]]">
-      <div class="file-row row" selected$="[[_computeFileSelected(index, selectedIndex)]]">
+      <div class="file-row row">
         <div class="reviewed" hidden$="[[!_loggedIn]]" hidden>
           <input type="checkbox" checked$="[[_computeReviewed(file, _reviewed)]]"
               data-path$="[[file.__path]]" on-change="_handleReviewedChange"
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
index cb4cde6..7b0eb45 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
@@ -35,6 +35,10 @@
       drafts: Object,
       revisions: Object,
       projectConfig: Object,
+      selectedIndex: {
+        type: Number,
+        notify: true,
+      },
       keyEventTarget: {
         type: Object,
         value: function() { return document.body; },
@@ -367,6 +371,7 @@
         this.$.diffCursor.moveDown();
       } else {
         this.$.fileCursor.next();
+        this.selectedIndex = this.$.fileCursor.index;
       }
     },
 
@@ -378,6 +383,7 @@
         this.$.diffCursor.moveUp();
       } else {
         this.$.fileCursor.previous();
+        this.selectedIndex = this.$.fileCursor.index;
       }
     },
 
@@ -496,10 +502,6 @@
           _patchChange.size_delta_deleted === 0;
     },
 
-    _computeFileSelected: function(index, selectedIndex) {
-      return index === selectedIndex;
-    },
-
     _computeFileStatus: function(status) {
       return status || 'M';
     },
@@ -570,7 +572,7 @@
 
         var files = Polymer.dom(this.root).querySelectorAll('.file-row');
         this.$.fileCursor.stops = files;
-        if (this.$.fileCursor.index === -1) { this.$.fileCursor.moveToStart(); }
+        this.$.fileCursor.setCursorAtIndex(this.selectedIndex);
       }.bind(this), 1);
     },
 
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
index 5da2995..bc46590 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
@@ -308,16 +308,19 @@
         assert.isFalse(items[2].classList.contains('selected'));
         MockInteractions.pressAndReleaseKeyOn(element, 74, null, 'j');
         assert.equal(element.$.fileCursor.index, 1);
+        assert.equal(element.selectedIndex, 1);
         MockInteractions.pressAndReleaseKeyOn(element, 74, null, 'j');
 
         var showStub = sandbox.stub(page, 'show');
         assert.equal(element.$.fileCursor.index, 2);
+        assert.equal(element.selectedIndex, 2);
         MockInteractions.pressAndReleaseKeyOn(element, 13, null, 'enter');
         assert(showStub.lastCall.calledWith('/c/42/2/myfile.txt'),
             'Should navigate to /c/42/2/myfile.txt');
 
         MockInteractions.pressAndReleaseKeyOn(element, 75, null, 'k');
         assert.equal(element.$.fileCursor.index, 1);
+        assert.equal(element.selectedIndex, 1);
         MockInteractions.pressAndReleaseKeyOn(element, 79, null, 'o');
         assert(showStub.lastCall.calledWith('/c/42/2/file_added_in_rev2.txt'),
             'Should navigate to /c/42/2/file_added_in_rev2.txt');
@@ -326,6 +329,7 @@
         MockInteractions.pressAndReleaseKeyOn(element, 75, null, 'k');
         MockInteractions.pressAndReleaseKeyOn(element, 75, null, 'k');
         assert.equal(element.$.fileCursor.index, 0);
+        assert.equal(element.selectedIndex, 0);
       });
 
       test('i key shows/hides selected inline diff', function() {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
index 313fa2a..21f8f32 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -138,6 +138,10 @@
       .content.remove.lightHighlight {
         background-color: var(--light-remove-highlight-color);
       }
+      .content .contentText:after {
+        /* Newline, to ensure all lines are one line-height tall. */
+        content: '\A';
+      }
       .contextControl {
         background-color: #fef;
         color: #849;