Roll external/skia de54d7c5e..abf8e41cc (8 commits)

https://skia.googlesource.com/skia.git/+log/de54d7c5e..abf8e41cc

2018-09-24 halcanary@google.com SkPDF: simplify SkPDFDevice::drawPaint.
2018-09-24 jvanverth@google.com Make sure ReflexHash grid count is reasonable
2018-09-24 michaelludwig@google.com Implement an explicit binary search-based analytic gradient colorizer
2018-09-24 mtklein@google.com use __builtin_debugtrap() in sk_abort_no_print() where possible
2018-09-24 mtklein@google.com make only valid SkRRects in FuzzPath
2018-09-24 kjlubick@google.com Remove coverage bots
2018-09-24 mtklein@google.com Reland "focus exported color apis"
2018-09-24 halcanary@google.com SkPDF: cleanup GraphicStackState

The AutoRoll server is located here: https://autoroll-internal.skia.org/r/android-master-autoroll

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+/master/autoroll/README.md

If the roll is causing failures, please contact the current sheriff, who should
be CC'd on the roll, and stop the roller if necessary.

Test: Presubmit checks will test this change.
Change-Id: Ib075745ec56fb6075b8a485fd9d702ec165246ce
Exempt-From-Owner-Approval: The autoroll bot does not require owner approval.
diff --git a/Android.bp b/Android.bp
index 04959a3..be34d41 100644
--- a/Android.bp
+++ b/Android.bp
@@ -538,6 +538,7 @@
         "src/gpu/gradients/GrTextureGradientColorizer.cpp",
         "src/gpu/gradients/GrTiledGradientEffect.cpp",
         "src/gpu/gradients/GrTwoPointConicalGradientLayout.cpp",
+        "src/gpu/gradients/GrUnrolledBinaryGradientColorizer.cpp",
         "src/gpu/mock/GrMockGpu.cpp",
         "src/gpu/ops/GrAAConvexPathRenderer.cpp",
         "src/gpu/ops/GrAAConvexTessellator.cpp",
@@ -1053,6 +1054,7 @@
         "gm/all_bitmap_configs.cpp",
         "gm/alpha_image.cpp",
         "gm/alphagradients.cpp",
+        "gm/analytic_gradients.cpp",
         "gm/androidblendmodes.cpp",
         "gm/animatedGif.cpp",
         "gm/animatedimageblurs.cpp",
@@ -1984,6 +1986,7 @@
         "gm/all_bitmap_configs.cpp",
         "gm/alpha_image.cpp",
         "gm/alphagradients.cpp",
+        "gm/analytic_gradients.cpp",
         "gm/androidblendmodes.cpp",
         "gm/animatedGif.cpp",
         "gm/animatedimageblurs.cpp",
diff --git a/fuzz/FuzzCommon.cpp b/fuzz/FuzzCommon.cpp
index 36ec600..3236f1c 100644
--- a/fuzz/FuzzCommon.cpp
+++ b/fuzz/FuzzCommon.cpp
@@ -140,7 +140,7 @@
                 path->addRoundRect(r, a, b, dir);
                 break;
             case 20:
-                fuzz->next(&rr);
+                FuzzNiceRRect(fuzz, &rr);
                 fuzz->nextRange(&ui, 0, 1);
                 dir = static_cast<SkPath::Direction>(ui);
                 path->addRRect(rr, dir);
@@ -148,7 +148,7 @@
             case 21:
                 fuzz->nextRange(&ui, 0, 1);
                 dir = static_cast<SkPath::Direction>(ui);
-                fuzz->next(&rr, &ui);
+                FuzzNiceRRect(fuzz, &rr);
                 path->addRRect(rr, dir, ui);
                 break;
             case 22: {
@@ -267,6 +267,7 @@
         vec.fY *= 0.5f * r.height();
     }
     rr->setRectRadii(r, radii);
+    SkASSERT(rr->isValid());
 }
 
 void FuzzNiceMatrix(Fuzz* fuzz, SkMatrix* m) {
diff --git a/gm/analytic_gradients.cpp b/gm/analytic_gradients.cpp
new file mode 100644
index 0000000..df84b19
--- /dev/null
+++ b/gm/analytic_gradients.cpp
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/*
+ * This GM presents a variety of gradients meant to test the correctness of the analytic
+ * GrUnrolledBinaryGradientColorizer, which can handle arbitrary gradients with 1 to 8 interpolation
+ * intervals. These intervals can be either hardstops or smooth color transitions.
+ *
+ * It produces an image similar to that of GM_hardstop_gradients, but is arranged as follows:
+ *
+ *            | Clamp          |
+ *            |________________|
+ *            | M1  M2  M3  M4 |
+ * ___________|________________|
+ *      1     |
+ *      2     |
+ *      3     |
+ *      4     |
+ *      5     |
+ *      6     |
+ *      7     |
+ *      8     |
+ * The M-modes are different ways of interlveaving hardstops with smooth transitions:
+ *   - M1 = All smooth transitions
+ *   - M2 = All hard stops
+ *   - M5 = Alternating smooth then hard
+ *   - M6 = Alternating hard then smooth
+ *
+ * Only clamping is tested since this is focused more on within the interpolation region behavior,
+ * compared to overall behavior.
+ */
+
+#include "gm.h"
+
+#include "SkGradientShader.h"
+
+// All positions must be divided by the target interval count, which will produce the expected
+// normalized position array for that interval number (assuming an appropriate color count is
+// provided).
+const int M1_POSITIONS[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
+const int M2_POSITIONS[] = { 0, 1,1, 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8 };
+const int M3_POSITIONS[] = { 0, 1, 2,2, 3, 4,4, 5, 6,6, 7, 8 };
+const int M4_POSITIONS[] = { 0, 1,1, 2, 3,3, 4, 5,5, 6, 7,7, 8 };
+
+// Color count = index of first occurrence of interval count value in Mx_POSITIONS array.
+const int INT1_COLOR_COUNTS[] = { 2, 2, 2, 2 };
+const int INT2_COLOR_COUNTS[] = { 3, 4, 3, 4 };
+const int INT3_COLOR_COUNTS[] = { 4, 6, 5, 5 };
+const int INT4_COLOR_COUNTS[] = { 5, 8, 6, 7 };
+const int INT5_COLOR_COUNTS[] = { 6, 10, 8, 8 };
+const int INT6_COLOR_COUNTS[] = { 7, 12, 9, 10 };
+const int INT7_COLOR_COUNTS[] = { 8, 14, 11, 11 };
+const int INT8_COLOR_COUNTS[] = { 9, 16, 12, 13 };
+
+// Cycle through defined colors for positions 0 through 8.
+const SkColor COLORS[] = {
+    SK_ColorDKGRAY,
+    SK_ColorRED,
+    SK_ColorYELLOW,
+    SK_ColorGREEN,
+    SK_ColorCYAN,
+    SK_ColorBLUE,
+    SK_ColorMAGENTA,
+    SK_ColorBLACK,
+    SK_ColorLTGRAY
+};
+
+const int* INTERVAL_COLOR_COUNTS[] = {
+    INT1_COLOR_COUNTS,
+    INT2_COLOR_COUNTS,
+    INT3_COLOR_COUNTS,
+    INT4_COLOR_COUNTS,
+    INT5_COLOR_COUNTS,
+    INT6_COLOR_COUNTS,
+    INT7_COLOR_COUNTS,
+    INT8_COLOR_COUNTS
+};
+const int COLOR_COUNT = SK_ARRAY_COUNT(COLORS);
+
+const int* M_POSITIONS[] = {
+    M1_POSITIONS,
+    M2_POSITIONS,
+    M3_POSITIONS,
+    M4_POSITIONS
+};
+
+const int WIDTH  = 500;
+const int HEIGHT = 500;
+
+const int NUM_ROWS = 8;
+const int NUM_COLS = 4;
+
+const int CELL_WIDTH  = WIDTH  / NUM_COLS;
+const int CELL_HEIGHT = HEIGHT / NUM_ROWS;
+
+const int PAD_WIDTH  = 3;
+const int PAD_HEIGHT = 3;
+
+const int RECT_WIDTH  = CELL_WIDTH  - (2 * PAD_WIDTH);
+const int RECT_HEIGHT = CELL_HEIGHT - (2 * PAD_HEIGHT);
+
+static void shade_rect(SkCanvas* canvas, sk_sp<SkShader> shader, int cellRow, int cellCol) {
+    SkPaint paint;
+    paint.setShader(shader);
+
+    canvas->save();
+    canvas->translate(SkIntToScalar(cellCol * CELL_WIDTH + PAD_WIDTH),
+                      SkIntToScalar(cellRow * CELL_HEIGHT + PAD_HEIGHT));
+
+    const SkRect rect = SkRect::MakeWH(SkIntToScalar(RECT_WIDTH), SkIntToScalar(RECT_HEIGHT));
+    canvas->drawRect(rect, paint);
+    canvas->restore();
+}
+
+class AnalyticGradientShaderGM : public skiagm::GM {
+public:
+    AnalyticGradientShaderGM() {
+
+    }
+
+protected:
+    SkString onShortName() override {
+        return SkString("analytic_gradients");
+    }
+
+    SkISize onISize() override {
+        return SkISize::Make(1024, 512);
+    }
+
+    void onDraw(SkCanvas* canvas) override {
+        const SkPoint points[2] = { SkPoint::Make(0, 0), SkPoint::Make(RECT_WIDTH, 0.0) };
+
+        for (int cellRow = 0; cellRow < NUM_ROWS; cellRow++) {
+            // Each interval has 4 different color counts, one per mode
+            const int* colorCounts = INTERVAL_COLOR_COUNTS[cellRow]; // Has len = 4
+
+            for (int cellCol = 0; cellCol < NUM_COLS; cellCol++) {
+                // create_gradient_points(cellRow, cellCol, points);
+
+                // Get the color count dependent on interval and mode
+                int colorCount = colorCounts[cellCol];
+                // Get the positions given the mode
+                const int* layout = M_POSITIONS[cellCol];
+
+                // Collect positions and colors specific to the interval+mode normalizing the
+                // position based on the interval count (== cellRow+1)
+                SkAutoSTMalloc<4, SkColor> colors(colorCount);
+                SkAutoSTMalloc<4, SkScalar> positions(colorCount);
+                int j = 0;
+                for (int i = 0; i < colorCount; i++) {
+                    positions[i] = SkIntToScalar(layout[i]) / (cellRow + 1);
+                    colors[i] = COLORS[j % COLOR_COUNT];
+                    j++;
+                }
+
+                auto shader = SkGradientShader::MakeLinear(
+                                points,
+                                colors.get(),
+                                positions.get(),
+                                colorCount,
+                                SkShader::kClamp_TileMode,
+                                0,
+                                nullptr);
+
+                shade_rect(canvas, shader, cellRow, cellCol);
+            }
+        }
+    }
+
+private:
+    typedef skiagm::GM INHERITED;
+};
+
+DEF_GM(return new AnalyticGradientShaderGM;)
diff --git a/gn/gm.gni b/gn/gm.gni
index a3e6938..475084a 100644
--- a/gn/gm.gni
+++ b/gn/gm.gni
@@ -16,6 +16,7 @@
   "$_gm/all_bitmap_configs.cpp",
   "$_gm/alpha_image.cpp",
   "$_gm/alphagradients.cpp",
+  "$_gm/analytic_gradients.cpp",
   "$_gm/animatedGif.cpp",
   "$_gm/androidblendmodes.cpp",
   "$_gm/animatedimageblurs.cpp",
diff --git a/gn/gpu.gni b/gn/gpu.gni
index 95e0394..0a76b84 100644
--- a/gn/gpu.gni
+++ b/gn/gpu.gni
@@ -406,6 +406,8 @@
   "$_src/gpu/gradients/GrSingleIntervalGradientColorizer.h",
   "$_src/gpu/gradients/GrTextureGradientColorizer.cpp",
   "$_src/gpu/gradients/GrTextureGradientColorizer.h",
+  "$_src/gpu/gradients/GrUnrolledBinaryGradientColorizer.cpp",
+  "$_src/gpu/gradients/GrUnrolledBinaryGradientColorizer.h",
   "$_src/gpu/gradients/GrLinearGradientLayout.cpp",
   "$_src/gpu/gradients/GrLinearGradientLayout.h",
   "$_src/gpu/gradients/GrRadialGradientLayout.cpp",
diff --git a/gn/sksl.gni b/gn/sksl.gni
index 764c946..1f449b1 100644
--- a/gn/sksl.gni
+++ b/gn/sksl.gni
@@ -49,6 +49,7 @@
   "$_src/gpu/gradients/GrDualIntervalGradientColorizer.fp",
   "$_src/gpu/gradients/GrSingleIntervalGradientColorizer.fp",
   "$_src/gpu/gradients/GrTextureGradientColorizer.fp",
+  "$_src/gpu/gradients/GrUnrolledBinaryGradientColorizer.fp",
   "$_src/gpu/gradients/GrLinearGradientLayout.fp",
   "$_src/gpu/gradients/GrRadialGradientLayout.fp",
   "$_src/gpu/gradients/GrSweepGradientLayout.fp",
diff --git a/include/core/SkColor.h b/include/core/SkColor.h
index c64d25a..2566aa6 100644
--- a/include/core/SkColor.h
+++ b/include/core/SkColor.h
@@ -231,7 +231,7 @@
 struct SkPM4f;
 
 template <SkAlphaType kAT>
-struct SK_API SkRGBA4f {
+struct SkRGBA4f {
     float fR;
     float fG;
     float fB;
@@ -274,5 +274,7 @@
 };
 
 using SkColor4f = SkRGBA4f<kUnpremul_SkAlphaType>;
+template <> SK_API SkColor4f SkColor4f::FromColor(SkColor);
+template <> SK_API SkColor   SkColor4f::toSkColor() const;
 
 #endif
diff --git a/infra/bots/gen_tasks.go b/infra/bots/gen_tasks.go
index ecccf1f..4f697cd 100644
--- a/infra/bots/gen_tasks.go
+++ b/infra/bots/gen_tasks.go
@@ -60,11 +60,10 @@
 	MACHINE_TYPE_LARGE = "n1-highcpu-64"
 
 	// Swarming output dirs.
-	OUTPUT_NONE     = "output_ignored" // This will result in outputs not being isolated.
-	OUTPUT_BUILD    = "build"
-	OUTPUT_COVERAGE = "coverage"
-	OUTPUT_TEST     = "test"
-	OUTPUT_PERF     = "perf"
+	OUTPUT_NONE  = "output_ignored" // This will result in outputs not being isolated.
+	OUTPUT_BUILD = "build"
+	OUTPUT_TEST  = "test"
+	OUTPUT_PERF  = "perf"
 
 	// Name prefix for upload jobs.
 	PREFIX_UPLOAD = "Upload"
@@ -77,7 +76,6 @@
 	SERVICE_ACCOUNT_UPDATE_META_CONFIG = "skia-update-meta-config@skia-swarming-bots.iam.gserviceaccount.com"
 	SERVICE_ACCOUNT_UPLOAD_BINARY      = "skia-external-binary-uploader@skia-swarming-bots.iam.gserviceaccount.com"
 	SERVICE_ACCOUNT_UPLOAD_CALMBENCH   = "skia-external-calmbench-upload@skia-swarming-bots.iam.gserviceaccount.com"
-	SERVICE_ACCOUNT_UPLOAD_COVERAGE    = "skia-external-coverage-uploade@skia-swarming-bots.iam.gserviceaccount.com"
 	SERVICE_ACCOUNT_UPLOAD_GM          = "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
 	SERVICE_ACCOUNT_UPLOAD_NANO        = "skia-external-nano-uploader@skia-swarming-bots.iam.gserviceaccount.com"
 )
@@ -91,13 +89,12 @@
 
 	// General configuration information.
 	CONFIG struct {
-		GsBucketCoverage string   `json:"gs_bucket_coverage"`
-		GsBucketGm       string   `json:"gs_bucket_gm"`
-		GoldHashesURL    string   `json:"gold_hashes_url"`
-		GsBucketNano     string   `json:"gs_bucket_nano"`
-		GsBucketCalm     string   `json:"gs_bucket_calm"`
-		NoUpload         []string `json:"no_upload"`
-		Pool             string   `json:"pool"`
+		GsBucketGm    string   `json:"gs_bucket_gm"`
+		GoldHashesURL string   `json:"gold_hashes_url"`
+		GsBucketNano  string   `json:"gs_bucket_nano"`
+		GsBucketCalm  string   `json:"gs_bucket_calm"`
+		NoUpload      []string `json:"no_upload"`
+		Pool          string   `json:"pool"`
 	}
 
 	// alternateProject can be set in an init function to override the default project ID.
@@ -527,12 +524,7 @@
 				d["os"] = DEFAULT_OS_LINUX_GCE
 			}
 			if parts["model"] == "GCE" && d["cpu"] == "x86-64-Haswell_GCE" {
-				// Coverage gets slower with more cores.
-				if strings.Contains(parts["extra_config"], "Coverage") {
-					d["machine_type"] = MACHINE_TYPE_SMALL
-				} else {
-					d["machine_type"] = MACHINE_TYPE_MEDIUM
-				}
+				d["machine_type"] = MACHINE_TYPE_MEDIUM
 			}
 		} else {
 			if strings.Contains(parts["os"], "Win") {
@@ -1105,58 +1097,6 @@
 	return name
 }
 
-func coverage(b *specs.TasksCfgBuilder, name string, parts map[string]string, compileTaskName string, pkgs []*specs.CipdPackage) string {
-	shards := 1
-	deps := []string{}
-
-	tf := parts["test_filter"]
-	if strings.Contains(tf, "Shard") {
-		// Expected Shard_NN
-		shardstr := strings.Split(tf, "_")[1]
-		var err error
-		shards, err = strconv.Atoi(shardstr)
-		if err != nil {
-			glog.Fatalf("Expected int for number of shards %q in %s: %s", shardstr, name, err)
-		}
-	}
-	for i := 0; i < shards; i++ {
-		n := strings.Replace(name, tf, fmt.Sprintf("shard_%02d_%02d", i, shards), 1)
-		task := kitchenTask(n, "test", "test_skia_bundled.isolate", "", swarmDimensions(parts), nil, OUTPUT_COVERAGE)
-		task.CipdPackages = append(task.CipdPackages, pkgs...)
-		task.Dependencies = append(task.Dependencies, compileTaskName)
-
-		task.Expiration = 20 * time.Hour
-		task.MaxAttempts = 1
-		timeout(task, 4*time.Hour)
-		if deps := getIsolatedCIPDDeps(parts); len(deps) > 0 {
-			task.Dependencies = append(task.Dependencies, deps...)
-		}
-		b.MustAddTask(n, task)
-		deps = append(deps, n)
-	}
-
-	uploadName := fmt.Sprintf("%s%s%s", "Upload", jobNameSchema.Sep, name)
-	extraProps := map[string]string{
-		"gs_bucket": CONFIG.GsBucketCoverage,
-	}
-	// Use MACHINE_TYPE_LARGE because this does a bunch of computation before upload.
-	uploadTask := kitchenTask(uploadName, "upload_coverage_results", "swarm_recipe.isolate", SERVICE_ACCOUNT_UPLOAD_COVERAGE, linuxGceDimensions(MACHINE_TYPE_LARGE), extraProps, OUTPUT_NONE)
-	usesGit(uploadTask, uploadName)
-	uploadTask.CipdPackages = append(uploadTask.CipdPackages, CIPD_PKGS_GSUTIL...)
-	// We need clang_linux to get access to the llvm-profdata and llvm-cov binaries
-	// which are used to deal with the raw coverage data output by the Test step.
-	uploadTask.CipdPackages = append(uploadTask.CipdPackages, b.MustGetCipdPackageFromAsset("clang_linux"))
-	uploadTask.CipdPackages = append(uploadTask.CipdPackages, pkgs...)
-	// A dependency on compileTaskName makes the TaskScheduler link the
-	// isolated output of the compile step to the input of the upload step,
-	// which gives us access to the instrumented binary. The binary is
-	// needed to figure out symbol names and line numbers.
-	uploadTask.Dependencies = append(uploadTask.Dependencies, compileTaskName)
-	uploadTask.Dependencies = append(uploadTask.Dependencies, deps...)
-	b.MustAddTask(uploadName, uploadTask)
-	return uploadName
-}
-
 // perf generates a Perf task. Returns the name of the last task in the
 // generated chain of tasks, which the Job should add as a dependency.
 func perf(b *specs.TasksCfgBuilder, name string, parts map[string]string, compileTaskName string, pkgs []*specs.CipdPackage) string {
@@ -1370,12 +1310,9 @@
 
 	// Test bots.
 	if parts["role"] == "Test" {
-		if strings.Contains(parts["extra_config"], "Coverage") {
-			deps = append(deps, coverage(b, name, parts, compileTaskName, pkgs))
-		} else if !strings.Contains(name, "-CT_") {
+		if !strings.Contains(name, "-CT_") {
 			deps = append(deps, test(b, name, parts, compileTaskName, pkgs))
 		}
-
 	}
 
 	// Perf bots.
diff --git a/infra/bots/jobs.json b/infra/bots/jobs.json
index f0055ee..b0426f9 100644
--- a/infra/bots/jobs.json
+++ b/infra/bots/jobs.json
@@ -28,7 +28,6 @@
   "Build-Debian9-Clang-x86_64-Debug-ASAN",
   "Build-Debian9-Clang-x86_64-Debug-ASAN_Vulkan",
   "Build-Debian9-Clang-x86_64-Debug-Chromebook_GLES",
-  "Build-Debian9-Clang-x86_64-Debug-Coverage",
   "Build-Debian9-Clang-x86_64-Debug-MSAN",
   "Build-Debian9-Clang-x86_64-Debug-OpenCL",
   "Build-Debian9-Clang-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE",
@@ -36,7 +35,6 @@
   "Build-Debian9-Clang-x86_64-Debug-Static",
   "Build-Debian9-Clang-x86_64-Debug-SwiftShader",
   "Build-Debian9-Clang-x86_64-Debug-Vulkan",
-  "Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage",
   "Build-Debian9-Clang-x86_64-Release",
   "Build-Debian9-Clang-x86_64-Release-ANGLE",
   "Build-Debian9-Clang-x86_64-Release-ASAN",
@@ -401,7 +399,6 @@
   "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-NativeFonts",
   "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-SK_USE_DISCARDABLE_SCALEDIMAGECACHE",
   "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-SafeStack",
-  "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-Shard_12-Coverage",
   "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All",
   "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All-ASAN",
   "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All-BonusConfigs",
@@ -465,7 +462,6 @@
   "Test-Ubuntu14-Clang-GCE-CPU-AVX2-x86_64-Debug-All-CT_IMG_DECODE_100k_SKPs",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-ASAN",
-  "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Coverage",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL1",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL1_Vulkan",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL3",
@@ -473,7 +469,6 @@
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL3_ASAN_Vulkan",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL3_Vulkan",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan",
-  "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan_Coverage",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-ASAN",
   "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-DDL3_ASAN",
diff --git a/infra/bots/recipes/upload_coverage_results.expected/alternate_bucket.json b/infra/bots/recipes/upload_coverage_results.expected/alternate_bucket.json
deleted file mode 100644
index 86deee5..0000000
--- a/infra/bots/recipes/upload_coverage_results.expected/alternate_bucket.json
+++ /dev/null
@@ -1,143 +0,0 @@
-[
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "glob",
-      "[START_DIR]/coverage",
-      "*.profraw"
-    ],
-    "infra_step": true,
-    "name": "find raw inputs",
-    "stdout": "/path/to/tmp/",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/a.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/b.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/c.raw@@@",
-      "@@@STEP_LOG_END@glob@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "tar",
-      "-zcvf",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "create raw data archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "gs://skia-coverage-alt/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profraw.tar.gz"
-    ],
-    "name": "upload raw data archive"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-profdata",
-      "merge",
-      "-sparse",
-      "-o",
-      "[START_DIR]/output.profdata",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "merge and index"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage-alt/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=0",
-      "-format=text",
-      "-output-dir=[START_DIR]/coverage_text"
-    ],
-    "name": "create text summary"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage_text/index.txt",
-      "gs://skia-coverage-alt/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.summary"
-    ],
-    "name": "upload coverage summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.text.tar",
-      "[START_DIR]/coverage_text"
-    ],
-    "name": "create text coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.text.tar",
-      "gs://skia-coverage-alt/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.text.tar"
-    ],
-    "name": "upload text coverage data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=1",
-      "-format=html",
-      "-output-dir=[START_DIR]/coverage_html"
-    ],
-    "name": "create html summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.html.tar",
-      "[START_DIR]/coverage_html"
-    ],
-    "name": "create html coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.html.tar",
-      "gs://skia-coverage-alt/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.html.tar"
-    ],
-    "name": "upload html coverage data"
-  },
-  {
-    "name": "$result",
-    "recipe_result": null,
-    "status_code": 0
-  }
-]
\ No newline at end of file
diff --git a/infra/bots/recipes/upload_coverage_results.expected/failed_all.json b/infra/bots/recipes/upload_coverage_results.expected/failed_all.json
deleted file mode 100644
index f8c4893..0000000
--- a/infra/bots/recipes/upload_coverage_results.expected/failed_all.json
+++ /dev/null
@@ -1,132 +0,0 @@
-[
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "glob",
-      "[START_DIR]/coverage",
-      "*.profraw"
-    ],
-    "infra_step": true,
-    "name": "find raw inputs",
-    "stdout": "/path/to/tmp/",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/a.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/b.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/c.raw@@@",
-      "@@@STEP_LOG_END@glob@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "tar",
-      "-zcvf",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "create raw data archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profraw.tar.gz"
-    ],
-    "name": "upload raw data archive"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-profdata",
-      "merge",
-      "-sparse",
-      "-o",
-      "[START_DIR]/output.profdata",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "merge and index"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data",
-    "~followup_annotations": [
-      "step returned non-zero exit code: 1",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data (attempt 2)",
-    "~followup_annotations": [
-      "step returned non-zero exit code: 1",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data (attempt 3)",
-    "~followup_annotations": [
-      "step returned non-zero exit code: 1",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data (attempt 4)",
-    "~followup_annotations": [
-      "step returned non-zero exit code: 1",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data (attempt 5)",
-    "~followup_annotations": [
-      "step returned non-zero exit code: 1",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "name": "$result",
-    "reason": "Step('upload parsed data (attempt 5)') failed with return_code 1",
-    "recipe_result": null,
-    "status_code": 1
-  }
-]
\ No newline at end of file
diff --git a/infra/bots/recipes/upload_coverage_results.expected/failed_once.json b/infra/bots/recipes/upload_coverage_results.expected/failed_once.json
deleted file mode 100644
index 0cc5c1a..0000000
--- a/infra/bots/recipes/upload_coverage_results.expected/failed_once.json
+++ /dev/null
@@ -1,157 +0,0 @@
-[
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "glob",
-      "[START_DIR]/coverage",
-      "*.profraw"
-    ],
-    "infra_step": true,
-    "name": "find raw inputs",
-    "stdout": "/path/to/tmp/",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/a.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/b.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/c.raw@@@",
-      "@@@STEP_LOG_END@glob@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "tar",
-      "-zcvf",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "create raw data archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profraw.tar.gz"
-    ],
-    "name": "upload raw data archive"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-profdata",
-      "merge",
-      "-sparse",
-      "-o",
-      "[START_DIR]/output.profdata",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "merge and index"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data",
-    "~followup_annotations": [
-      "step returned non-zero exit code: 1",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data (attempt 2)"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=0",
-      "-format=text",
-      "-output-dir=[START_DIR]/coverage_text"
-    ],
-    "name": "create text summary"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage_text/index.txt",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.summary"
-    ],
-    "name": "upload coverage summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.text.tar",
-      "[START_DIR]/coverage_text"
-    ],
-    "name": "create text coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.text.tar",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.text.tar"
-    ],
-    "name": "upload text coverage data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=1",
-      "-format=html",
-      "-output-dir=[START_DIR]/coverage_html"
-    ],
-    "name": "create html summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.html.tar",
-      "[START_DIR]/coverage_html"
-    ],
-    "name": "create html coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.html.tar",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.html.tar"
-    ],
-    "name": "upload html coverage data"
-  },
-  {
-    "name": "$result",
-    "recipe_result": null,
-    "status_code": 0
-  }
-]
\ No newline at end of file
diff --git a/infra/bots/recipes/upload_coverage_results.expected/normal_bot.json b/infra/bots/recipes/upload_coverage_results.expected/normal_bot.json
deleted file mode 100644
index a34b1ee..0000000
--- a/infra/bots/recipes/upload_coverage_results.expected/normal_bot.json
+++ /dev/null
@@ -1,143 +0,0 @@
-[
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "glob",
-      "[START_DIR]/coverage",
-      "*.profraw"
-    ],
-    "infra_step": true,
-    "name": "find raw inputs",
-    "stdout": "/path/to/tmp/",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/a.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/b.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/c.raw@@@",
-      "@@@STEP_LOG_END@glob@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "tar",
-      "-zcvf",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "create raw data archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profraw.tar.gz"
-    ],
-    "name": "upload raw data archive"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-profdata",
-      "merge",
-      "-sparse",
-      "-o",
-      "[START_DIR]/output.profdata",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "merge and index"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=0",
-      "-format=text",
-      "-output-dir=[START_DIR]/coverage_text"
-    ],
-    "name": "create text summary"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage_text/index.txt",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.summary"
-    ],
-    "name": "upload coverage summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.text.tar",
-      "[START_DIR]/coverage_text"
-    ],
-    "name": "create text coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.text.tar",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.text.tar"
-    ],
-    "name": "upload text coverage data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=1",
-      "-format=html",
-      "-output-dir=[START_DIR]/coverage_html"
-    ],
-    "name": "create html summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.html.tar",
-      "[START_DIR]/coverage_html"
-    ],
-    "name": "create html coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.html.tar",
-      "gs://skia-coverage/commit/abc123/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.html.tar"
-    ],
-    "name": "upload html coverage data"
-  },
-  {
-    "name": "$result",
-    "recipe_result": null,
-    "status_code": 0
-  }
-]
\ No newline at end of file
diff --git a/infra/bots/recipes/upload_coverage_results.expected/trybot.json b/infra/bots/recipes/upload_coverage_results.expected/trybot.json
deleted file mode 100644
index 4176c24..0000000
--- a/infra/bots/recipes/upload_coverage_results.expected/trybot.json
+++ /dev/null
@@ -1,143 +0,0 @@
-[
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "glob",
-      "[START_DIR]/coverage",
-      "*.profraw"
-    ],
-    "infra_step": true,
-    "name": "find raw inputs",
-    "stdout": "/path/to/tmp/",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/a.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/b.raw@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/coverage/c.raw@@@",
-      "@@@STEP_LOG_END@glob@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "tar",
-      "-zcvf",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "create raw data archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "[START_DIR]/raw_data.profraw.tar.gz",
-      "gs://skia-coverage/trybot/456789/12/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profraw.tar.gz"
-    ],
-    "name": "upload raw data archive"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-profdata",
-      "merge",
-      "-sparse",
-      "-o",
-      "[START_DIR]/output.profdata",
-      "[START_DIR]/coverage/a.raw",
-      "[START_DIR]/coverage/b.raw",
-      "[START_DIR]/coverage/c.raw"
-    ],
-    "name": "merge and index"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/output.profdata",
-      "gs://skia-coverage/trybot/456789/12/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.profdata"
-    ],
-    "name": "upload parsed data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=0",
-      "-format=text",
-      "-output-dir=[START_DIR]/coverage_text"
-    ],
-    "name": "create text summary"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage_text/index.txt",
-      "gs://skia-coverage/trybot/456789/12/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.summary"
-    ],
-    "name": "upload coverage summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.text.tar",
-      "[START_DIR]/coverage_text"
-    ],
-    "name": "create text coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.text.tar",
-      "gs://skia-coverage/trybot/456789/12/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.text.tar"
-    ],
-    "name": "upload text coverage data"
-  },
-  {
-    "cmd": [
-      "[START_DIR]/clang_linux/bin/llvm-cov",
-      "show",
-      "[START_DIR]/build/dm",
-      "-instr-profile=[START_DIR]/output.profdata",
-      "-use-color=1",
-      "-format=html",
-      "-output-dir=[START_DIR]/coverage_html"
-    ],
-    "name": "create html summary"
-  },
-  {
-    "cmd": [
-      "tar",
-      "-cvf",
-      "[START_DIR]/coverage.html.tar",
-      "[START_DIR]/coverage_html"
-    ],
-    "name": "create html coverage archive"
-  },
-  {
-    "cmd": [
-      "gsutil",
-      "cp",
-      "-Z",
-      "[START_DIR]/coverage.html.tar",
-      "gs://skia-coverage/trybot/456789/12/Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All.html.tar"
-    ],
-    "name": "upload html coverage data"
-  },
-  {
-    "name": "$result",
-    "recipe_result": null,
-    "status_code": 0
-  }
-]
\ No newline at end of file
diff --git a/infra/bots/recipes/upload_coverage_results.py b/infra/bots/recipes/upload_coverage_results.py
deleted file mode 100644
index 0719c5f..0000000
--- a/infra/bots/recipes/upload_coverage_results.py
+++ /dev/null
@@ -1,200 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-# Recipe for uploading Coverage results.
-
-
-import calendar
-
-
-DEPS = [
-  'gsutil',
-  'recipe_engine/file',
-  'recipe_engine/json',
-  'recipe_engine/path',
-  'recipe_engine/properties',
-  'recipe_engine/python',
-  'recipe_engine/raw_io',
-  'recipe_engine/step',
-  'recipe_engine/time',
-]
-
-
-TRY_JOB_FOLDER = 'trybot/%s/%s/' # % (issue_number, patchset_number)
-COMMIT_FOLDER = 'commit/%s/'      # % (git_revision)
-
-RAW_FILE = '*.profraw'
-PARSED_FILE = '%s.profdata'
-SUMMARY_FILE = '%s.summary'
-
-COVERAGE_RAW_ARCHIVE = '%s.profraw.tar.gz'
-# Text is an easier format to read with machines (e.g. for Gerrit).
-COVERAGE_TEXT_FILE = '%s.text.tar'
-# HTML is a quick and dirty browsable format. (e.g. for coverage.skia.org)
-COVERAGE_HTML_FILE = '%s.html.tar'
-
-def RunSteps(api):
-  # See https://clang.llvm.org/docs/SourceBasedCodeCoverage.html for a
-  # detailed explanation of getting code coverage from LLVM.
-  # Since we have already compiled the binary with the special flags
-  # and run the executable to generate an output.profraw, we
-  # need to merge and index the data, create the coverage output,
-  # and then upload the results to GCS. We also upload the intermediate
-  # results to GCS so we can regenerate reports if needed.
-  builder_name = api.properties['buildername']
-  bucket = api.properties['gs_bucket']
-
-  # The raw data files are brought in as isolated inputs. It is possible
-  # for there to be 1 if the coverage task wasn't broken up.
-  raw_inputs = api.file.glob_paths(
-      'find raw inputs', api.path['start_dir'].join('coverage'),
-      RAW_FILE, test_data=['a.raw', 'b.raw', 'c.raw'])
-
-
-  # The instrumented executable is brought in as an isolated input.
-  executable = api.path['start_dir'].join('build', 'dm')
-  # clang_dir is brought in via CIPD.
-  clang_dir = api.path['start_dir'].join('clang_linux', 'bin')
-
-  revision = api.properties['revision']
-  path = COMMIT_FOLDER % revision
-
-  issue = api.properties.get('patch_issue')
-  patchset = api.properties.get('patch_set')
-  if issue and patchset:
-    path = TRY_JOB_FOLDER % (issue, patchset)
-
-  # Upload the raw files, tarred together to decrease upload time and
-  # improve compression.
-  tar_file = api.path['start_dir'].join('raw_data.profraw.tar.gz')
-  cmd = ['tar', '-zcvf', tar_file]
-  cmd.extend(raw_inputs)
-  api.step('create raw data archive', cmd=cmd)
-
-  gcs_file = COVERAGE_RAW_ARCHIVE % builder_name
-  api.gsutil.cp('raw data archive', tar_file,
-                'gs://%s/%s%s' % (bucket, path, gcs_file))
-
-  # Merge all the raw data files together, then index the data.
-  # This creates one cohesive
-  indexed_data = api.path['start_dir'].join('output.profdata')
-  cmd = [clang_dir.join('llvm-profdata'),
-         'merge',
-         '-sparse',
-         '-o',
-         indexed_data]
-  cmd.extend(raw_inputs)
-  api.step('merge and index',
-           cmd=cmd)
-
-  gcs_file = PARSED_FILE % builder_name
-  api.gsutil.cp('parsed data', indexed_data,
-                   'gs://%s/%s%s' % (bucket, path, gcs_file), extra_args=['-Z'])
-
-  # Create text coverage output
-  output_data = api.path['start_dir'].join('coverage_text')
-  api.step('create text summary',
-           cmd=[clang_dir.join('llvm-cov'),
-               'show',
-               executable,
-               '-instr-profile=' + str(indexed_data),
-               '-use-color=0',
-               '-format=text',
-               '-output-dir=' + str(output_data)])
-
-  # Upload the summary by itself so we can get easier access to it (instead of
-  # downloading and untarring all the coverage data.
-  gcs_file = SUMMARY_FILE % builder_name
-  api.gsutil.cp('coverage summary', output_data.join('index.txt'),
-                   'gs://%s/%s%s' % (bucket, path, gcs_file), extra_args=['-Z'])
-
-  tar_file = api.path['start_dir'].join('coverage.text.tar')
-
-  # Tar and upload the coverage data. We tar it to ease downloading/ingestion,
-  # otherwise, there is a 1:1 mapping of source code files -> coverage files.
-  api.step('create text coverage archive', cmd=['tar', '-cvf',
-                                           tar_file, output_data])
-
-  gcs_file = COVERAGE_TEXT_FILE % builder_name
-  api.gsutil.cp('text coverage data', tar_file,
-                   'gs://%s/%s%s' % (bucket, path, gcs_file), extra_args=['-Z'])
-
-  # Create html coverage output
-  output_data = api.path['start_dir'].join('coverage_html')
-  api.step('create html summary',
-           cmd=[clang_dir.join('llvm-cov'),
-               'show',
-               executable,
-               '-instr-profile=' + str(indexed_data),
-               '-use-color=1',
-               '-format=html',
-               '-output-dir=' + str(output_data)])
-
-  tar_file = api.path['start_dir'].join('coverage.html.tar')
-
-  # Tar and upload the coverage data. We tar it to ease downloading/ingestion,
-  # otherwise, there is a 1:1 mapping of source code files -> coverage files.
-  api.step('create html coverage archive',
-           cmd=['tar', '-cvf', tar_file, output_data])
-
-  gcs_file = COVERAGE_HTML_FILE % builder_name
-  api.gsutil.cp('html coverage data', tar_file,
-                   'gs://%s/%s%s' % (bucket, path, gcs_file), extra_args=['-Z'])
-
-
-def GenTests(api):
-  builder = 'Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All'
-  yield (
-    api.test('normal_bot') +
-    api.properties(buildername=builder,
-                   gs_bucket='skia-coverage',
-                   revision='abc123',
-                   path_config='kitchen')
-  )
-
-  yield (
-    api.test('alternate_bucket') +
-    api.properties(buildername=builder,
-                   gs_bucket='skia-coverage-alt',
-                   revision='abc123',
-                   path_config='kitchen')
-  )
-
-  yield (
-    api.test('failed_once') +
-    api.properties(buildername=builder,
-                   gs_bucket='skia-coverage',
-                   revision='abc123',
-                   path_config='kitchen') +
-    api.step_data('upload parsed data', retcode=1)
-  )
-
-  yield (
-    api.test('failed_all') +
-    api.properties(buildername=builder,
-                   gs_bucket='skia-coverage',
-                   revision='abc123',
-                   path_config='kitchen') +
-    api.step_data('upload parsed data', retcode=1) +
-    api.step_data('upload parsed data (attempt 2)', retcode=1) +
-    api.step_data('upload parsed data (attempt 3)', retcode=1) +
-    api.step_data('upload parsed data (attempt 4)', retcode=1) +
-    api.step_data('upload parsed data (attempt 5)', retcode=1)
-  )
-
-  yield (
-      api.test('trybot') +
-      api.properties(
-          buildername=builder,
-          gs_bucket='skia-coverage',
-          revision='abc123',
-          path_config='kitchen',
-          patch_storage='gerrit') +
-      api.properties.tryserver(
-          buildername=builder,
-          gerrit_project='skia',
-          gerrit_url='https://skia-review.googlesource.com/',
-      )
-  )
diff --git a/infra/bots/tasks.json b/infra/bots/tasks.json
index 0cef34d..58cfe00 100755
--- a/infra/bots/tasks.json
+++ b/infra/bots/tasks.json
@@ -146,11 +146,6 @@
         "Build-Debian9-Clang-x86_64-Debug-Chromebook_GLES"
       ]
     },
-    "Build-Debian9-Clang-x86_64-Debug-Coverage": {
-      "tasks": [
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ]
-    },
     "Build-Debian9-Clang-x86_64-Debug-MSAN": {
       "tasks": [
         "Build-Debian9-Clang-x86_64-Debug-MSAN"
@@ -186,11 +181,6 @@
         "Build-Debian9-Clang-x86_64-Debug-Vulkan"
       ]
     },
-    "Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage": {
-      "tasks": [
-        "Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage"
-      ]
-    },
     "Build-Debian9-Clang-x86_64-Release": {
       "tasks": [
         "Build-Debian9-Clang-x86_64-Release"
@@ -2023,11 +2013,6 @@
         "Upload-Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-SafeStack"
       ]
     },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-Shard_12-Coverage": {
-      "tasks": [
-        "Upload-Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-Shard_12-Coverage"
-      ]
-    },
     "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All": {
       "tasks": [
         "Upload-Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All"
@@ -2348,11 +2333,6 @@
         "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-ASAN"
       ]
     },
-    "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Coverage": {
-      "tasks": [
-        "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Coverage"
-      ]
-    },
     "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL1": {
       "tasks": [
         "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL1"
@@ -2388,11 +2368,6 @@
         "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan"
       ]
     },
-    "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan_Coverage": {
-      "tasks": [
-        "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan_Coverage"
-      ]
-    },
     "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All": {
       "tasks": [
         "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All"
@@ -6585,135 +6560,6 @@
       ],
       "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
     },
-    "Build-Debian9-Clang-x86_64-Debug-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        },
-        {
-          "name": "git",
-          "path": "cache/git"
-        },
-        {
-          "name": "git_cache",
-          "path": "cache/git_cache"
-        },
-        {
-          "name": "work",
-          "path": "cache/work"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "infra/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "version:2.17.1.chromium15"
-        },
-        {
-          "name": "infra/tools/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:0ae21738597e5601ba90372315145fec18582fc4"
-        },
-        {
-          "name": "infra/tools/luci/git-credential-luci/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "skia/bots/clang_linux",
-          "path": "clang_linux",
-          "version": "version:12"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "compile",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Build-Debian9-Clang-x86_64-Debug-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"build\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "gpu:none",
-        "machine_type:n1-highcpu-64",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 3600000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 3600000000000,
-      "isolate": "swarm_recipe.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "build"
-      ],
-      "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
-    },
     "Build-Debian9-Clang-x86_64-Debug-MSAN": {
       "caches": [
         {
@@ -7637,140 +7483,6 @@
       ],
       "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
     },
-    "Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        },
-        {
-          "name": "git",
-          "path": "cache/git"
-        },
-        {
-          "name": "git_cache",
-          "path": "cache/git_cache"
-        },
-        {
-          "name": "work",
-          "path": "cache/work"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "infra/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "version:2.17.1.chromium15"
-        },
-        {
-          "name": "infra/tools/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:0ae21738597e5601ba90372315145fec18582fc4"
-        },
-        {
-          "name": "infra/tools/luci/git-credential-luci/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "skia/bots/clang_linux",
-          "path": "clang_linux",
-          "version": "version:12"
-        },
-        {
-          "name": "skia/bots/linux_vulkan_sdk",
-          "path": "linux_vulkan_sdk",
-          "version": "version:1"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "compile",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"build\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "gpu:none",
-        "machine_type:n1-highcpu-64",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 3600000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 3600000000000,
-      "isolate": "swarm_recipe.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "build"
-      ],
-      "service_account": "skia-external-compile-tasks@skia-swarming-bots.iam.gserviceaccount.com"
-    },
     "Build-Debian9-Clang-x86_64-Release": {
       "caches": [
         {
@@ -48130,1350 +47842,6 @@
         "test"
       ]
     },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_00_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_00_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_01_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_01_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_02_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_02_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_03_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_03_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_04_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_04_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_05_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_05_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_06_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_06_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_07_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_07_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_08_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_08_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_09_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_09_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_10_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_10_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_11_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_11_12-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "machine_type:n1-highmem-2",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
     "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All": {
       "caches": [
         {
@@ -57404,235 +55772,6 @@
         "test"
       ]
     },
-    "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-shard_00_01-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-shard_00_01-Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage"
-      ],
-      "dimensions": [
-        "gpu:10de:1cb3-384.59",
-        "os:Ubuntu-17.04",
-        "pool:Skia",
-        "rack:1"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
-    "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-shard_00_01-Vulkan_Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        },
-        {
-          "name": "skia/bots/linux_vulkan_sdk",
-          "path": "linux_vulkan_sdk",
-          "version": "version:1"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "test",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-shard_00_01-Vulkan_Coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"coverage\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage"
-      ],
-      "dimensions": [
-        "gpu:10de:1cb3-384.59",
-        "os:Ubuntu-17.04",
-        "pool:Skia",
-        "rack:1"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 14400000000000,
-      "expiration_ns": 72000000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 14400000000000,
-      "isolate": "test_skia_bundled.isolate",
-      "max_attempts": 1,
-      "outputs": [
-        "coverage"
-      ]
-    },
     "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All": {
       "caches": [
         {
@@ -87401,164 +85540,6 @@
       "isolate": "swarm_recipe.isolate",
       "service_account": "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
     },
-    "Upload-Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-Shard_12-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        },
-        {
-          "name": "git",
-          "path": "cache/git"
-        },
-        {
-          "name": "git_cache",
-          "path": "cache/git_cache"
-        },
-        {
-          "name": "work",
-          "path": "cache/work"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "infra/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "version:2.17.1.chromium15"
-        },
-        {
-          "name": "infra/tools/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:0ae21738597e5601ba90372315145fec18582fc4"
-        },
-        {
-          "name": "infra/tools/luci/git-credential-luci/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/gsutil",
-          "path": "cipd_bin_packages",
-          "version": "version:4.28"
-        },
-        {
-          "name": "skia/bots/clang_linux",
-          "path": "clang_linux",
-          "version": "version:12"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "upload_coverage_results",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Upload-Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-Shard_12-Coverage\",\"gs_bucket\":\"skia-coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"output_ignored\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_00_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_01_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_02_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_03_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_04_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_05_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_06_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_07_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_08_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_09_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_10_12-Coverage",
-        "Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_11_12-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "gpu:none",
-        "machine_type:n1-highcpu-64",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 3600000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 3600000000000,
-      "isolate": "swarm_recipe.isolate",
-      "service_account": "skia-external-coverage-uploade@skia-swarming-bots.iam.gserviceaccount.com"
-    },
     "Upload-Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All": {
       "caches": [
         {
@@ -92707,153 +90688,6 @@
       "isolate": "swarm_recipe.isolate",
       "service_account": "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
     },
-    "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        },
-        {
-          "name": "git",
-          "path": "cache/git"
-        },
-        {
-          "name": "git_cache",
-          "path": "cache/git_cache"
-        },
-        {
-          "name": "work",
-          "path": "cache/work"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "infra/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "version:2.17.1.chromium15"
-        },
-        {
-          "name": "infra/tools/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:0ae21738597e5601ba90372315145fec18582fc4"
-        },
-        {
-          "name": "infra/tools/luci/git-credential-luci/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/gsutil",
-          "path": "cipd_bin_packages",
-          "version": "version:4.28"
-        },
-        {
-          "name": "skia/bots/clang_linux",
-          "path": "clang_linux",
-          "version": "version:12"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "upload_coverage_results",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Coverage\",\"gs_bucket\":\"skia-coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"output_ignored\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Coverage",
-        "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-shard_00_01-Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "gpu:none",
-        "machine_type:n1-highcpu-64",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 3600000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 3600000000000,
-      "isolate": "swarm_recipe.isolate",
-      "service_account": "skia-external-coverage-uploade@skia-swarming-bots.iam.gserviceaccount.com"
-    },
     "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL1": {
       "caches": [
         {
@@ -93349,158 +91183,6 @@
       "isolate": "swarm_recipe.isolate",
       "service_account": "skia-external-gm-uploader@skia-swarming-bots.iam.gserviceaccount.com"
     },
-    "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan_Coverage": {
-      "caches": [
-        {
-          "name": "vpython",
-          "path": "cache/vpython"
-        },
-        {
-          "name": "git",
-          "path": "cache/git"
-        },
-        {
-          "name": "git_cache",
-          "path": "cache/git_cache"
-        },
-        {
-          "name": "work",
-          "path": "cache/work"
-        }
-      ],
-      "cipd_packages": [
-        {
-          "name": "infra/tools/luci/kitchen/${platform}",
-          "path": ".",
-          "version": "git_revision:546aae39f1fb9dce9add528e2011afa574535ecd"
-        },
-        {
-          "name": "infra/tools/luci-auth/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/tools/luci/vpython/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:b6cdec8586c9f8d3d728b1bc0bd4331330ba66fc"
-        },
-        {
-          "name": "infra/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "version:2.17.1.chromium15"
-        },
-        {
-          "name": "infra/tools/git/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:0ae21738597e5601ba90372315145fec18582fc4"
-        },
-        {
-          "name": "infra/tools/luci/git-credential-luci/${platform}",
-          "path": "cipd_bin_packages",
-          "version": "git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c"
-        },
-        {
-          "name": "infra/gsutil",
-          "path": "cipd_bin_packages",
-          "version": "version:4.28"
-        },
-        {
-          "name": "skia/bots/clang_linux",
-          "path": "clang_linux",
-          "version": "version:12"
-        },
-        {
-          "name": "skia/bots/skimage",
-          "path": "skimage",
-          "version": "version:34"
-        },
-        {
-          "name": "skia/bots/skp",
-          "path": "skp",
-          "version": "version:144"
-        },
-        {
-          "name": "skia/bots/svg",
-          "path": "svg",
-          "version": "version:9"
-        },
-        {
-          "name": "skia/bots/linux_vulkan_sdk",
-          "path": "linux_vulkan_sdk",
-          "version": "version:1"
-        }
-      ],
-      "command": [
-        "./kitchen${EXECUTABLE_SUFFIX}",
-        "cook",
-        "-checkout-dir",
-        "recipe_bundle",
-        "-mode",
-        "swarming",
-        "-luci-system-account",
-        "system",
-        "-cache-dir",
-        "cache",
-        "-temp-dir",
-        "tmp",
-        "-known-gerrit-host",
-        "android.googlesource.com",
-        "-known-gerrit-host",
-        "boringssl.googlesource.com",
-        "-known-gerrit-host",
-        "chromium.googlesource.com",
-        "-known-gerrit-host",
-        "dart.googlesource.com",
-        "-known-gerrit-host",
-        "fuchsia.googlesource.com",
-        "-known-gerrit-host",
-        "go.googlesource.com",
-        "-known-gerrit-host",
-        "llvm.googlesource.com",
-        "-known-gerrit-host",
-        "skia.googlesource.com",
-        "-known-gerrit-host",
-        "webrtc.googlesource.com",
-        "-output-result-json",
-        "${ISOLATED_OUTDIR}/build_result_filename",
-        "-workdir",
-        ".",
-        "-recipe",
-        "upload_coverage_results",
-        "-properties",
-        "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"buildbucket_build_id\":\"<(BUILDBUCKET_BUILD_ID)\",\"buildername\":\"Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan_Coverage\",\"gs_bucket\":\"skia-coverage\",\"patch_issue\":\"<(ISSUE)\",\"patch_ref\":\"<(PATCH_REF)\",\"patch_repo\":\"<(PATCH_REPO)\",\"patch_set\":\"<(PATCHSET)\",\"patch_storage\":\"<(PATCH_STORAGE)\",\"repository\":\"<(REPO)\",\"revision\":\"<(REVISION)\",\"swarm_out_dir\":\"output_ignored\"}",
-        "-logdog-annotation-url",
-        "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      ],
-      "dependencies": [
-        "Housekeeper-PerCommit-BundleRecipes",
-        "Build-Debian9-Clang-x86_64-Debug-Vulkan_Coverage",
-        "Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-shard_00_01-Vulkan_Coverage"
-      ],
-      "dimensions": [
-        "cpu:x86-64-Haswell_GCE",
-        "gpu:none",
-        "machine_type:n1-highcpu-64",
-        "os:Debian-9.4",
-        "pool:Skia"
-      ],
-      "env_prefixes": {
-        "PATH": [
-          "cipd_bin_packages",
-          "cipd_bin_packages/bin"
-        ],
-        "VPYTHON_VIRTUALENV_ROOT": [
-          "cache/vpython"
-        ]
-      },
-      "execution_timeout_ns": 3600000000000,
-      "extra_tags": {
-        "log_location": "logdog://logs.chromium.org/skia/<(TASK_ID)/+/annotations"
-      },
-      "io_timeout_ns": 3600000000000,
-      "isolate": "swarm_recipe.isolate",
-      "service_account": "skia-external-coverage-uploade@skia-swarming-bots.iam.gserviceaccount.com"
-    },
     "Upload-Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All": {
       "caches": [
         {
diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp
index da60d6d..ffbecd6 100644
--- a/src/core/SkColor.cpp
+++ b/src/core/SkColor.cpp
@@ -124,26 +124,26 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 template <>
-SK_API SkColor4f SkColor4f::FromColor(SkColor bgra) {
+SkColor4f SkColor4f::FromColor(SkColor bgra) {
     SkColor4f rgba;
     swizzle_rb(Sk4f_fromL32(bgra)).store(rgba.vec());
     return rgba;
 }
 
 template <>
-SK_API SkColor SkColor4f::toSkColor() const {
+SkColor SkColor4f::toSkColor() const {
     return Sk4f_toL32(swizzle_rb(Sk4f::Load(this->vec())));
 }
 
 template <>
-SK_API SkColor4f SkColor4f::Pin(float r, float g, float b, float a) {
+SkColor4f SkColor4f::Pin(float r, float g, float b, float a) {
     SkColor4f c4;
     Sk4f::Min(Sk4f::Max(Sk4f(r, g, b, a), Sk4f(0)), Sk4f(1)).store(c4.vec());
     return c4;
 }
 
 template <>
-SK_API SkPM4f SkColor4f::toPM4f() const {
+SkPM4f SkColor4f::toPM4f() const {
     auto rgba = Sk4f::Load(this->vec());
     return SkPM4f::From4f(rgba * Sk4f(rgba[3], rgba[3], rgba[3], 1));
 }
diff --git a/src/gpu/GrProcessor.h b/src/gpu/GrProcessor.h
index a7a03b7..b35f280 100644
--- a/src/gpu/GrProcessor.h
+++ b/src/gpu/GrProcessor.h
@@ -144,6 +144,7 @@
         kGrTiledGradientEffect_ClassID,
         kGrTwoPointConicalGradientLayout_ClassID,
         kGrUnpremulInputFragmentProcessor_ClassID,
+        kGrUnrolledBinaryGradientColorizer_ClassID,
         kGrYUVtoRGBEffect_ClassID,
         kHighContrastFilterEffect_ClassID,
         kInstanceProcessor_ClassID,
diff --git a/src/gpu/gradients/GrGradientShader.cpp b/src/gpu/gradients/GrGradientShader.cpp
index 12b9270..0bd27a5 100644
--- a/src/gpu/gradients/GrGradientShader.cpp
+++ b/src/gpu/gradients/GrGradientShader.cpp
@@ -18,6 +18,7 @@
 #include "GrDualIntervalGradientColorizer.h"
 #include "GrSingleIntervalGradientColorizer.h"
 #include "GrTextureGradientColorizer.h"
+#include "GrUnrolledBinaryGradientColorizer.h"
 #include "GrGradientBitmapCache.h"
 
 #include "SkGr.h"
@@ -99,6 +100,17 @@
                                                      positions[offset + 1]);
     }
 
+    // The single and dual intervals are a specialized case of the unrolled binary search colorizer
+    // which can analytically render gradients of up to 8 intervals (up to 9 or 16 colors depending
+    // on how many hard stops are inserted).
+    std::unique_ptr<GrFragmentProcessor> unrolled = GrUnrolledBinaryGradientColorizer::Make(
+            colors + offset, positions + offset, count);
+    if (unrolled) {
+        return unrolled;
+    }
+
+    // Otherwise fall back to a rasterized gradient sampled by a texture, which can handle
+    // arbitrary gradients (the only downside being sampling resolution).
     return make_textured_colorizer(colors + offset, positions + offset, count, premul, args);
 }
 
diff --git a/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.cpp b/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.cpp
new file mode 100644
index 0000000..a33e71e
--- /dev/null
+++ b/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.cpp
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**************************************************************************************************
+ *** This file was autogenerated from GrUnrolledBinaryGradientColorizer.fp; do not modify.
+ **************************************************************************************************/
+#include "GrUnrolledBinaryGradientColorizer.h"
+#include "glsl/GrGLSLFragmentProcessor.h"
+#include "glsl/GrGLSLFragmentShaderBuilder.h"
+#include "glsl/GrGLSLProgramBuilder.h"
+#include "GrTexture.h"
+#include "SkSLCPP.h"
+#include "SkSLUtil.h"
+class GrGLSLUnrolledBinaryGradientColorizer : public GrGLSLFragmentProcessor {
+public:
+    GrGLSLUnrolledBinaryGradientColorizer() {}
+    void emitCode(EmitArgs& args) override {
+        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
+        const GrUnrolledBinaryGradientColorizer& _outer =
+                args.fFp.cast<GrUnrolledBinaryGradientColorizer>();
+        (void)_outer;
+        auto intervalCount = _outer.intervalCount();
+        (void)intervalCount;
+        auto scale0_1 = _outer.scale0_1();
+        (void)scale0_1;
+        auto scale2_3 = _outer.scale2_3();
+        (void)scale2_3;
+        auto scale4_5 = _outer.scale4_5();
+        (void)scale4_5;
+        auto scale6_7 = _outer.scale6_7();
+        (void)scale6_7;
+        auto scale8_9 = _outer.scale8_9();
+        (void)scale8_9;
+        auto scale10_11 = _outer.scale10_11();
+        (void)scale10_11;
+        auto scale12_13 = _outer.scale12_13();
+        (void)scale12_13;
+        auto scale14_15 = _outer.scale14_15();
+        (void)scale14_15;
+        auto bias0_1 = _outer.bias0_1();
+        (void)bias0_1;
+        auto bias2_3 = _outer.bias2_3();
+        (void)bias2_3;
+        auto bias4_5 = _outer.bias4_5();
+        (void)bias4_5;
+        auto bias6_7 = _outer.bias6_7();
+        (void)bias6_7;
+        auto bias8_9 = _outer.bias8_9();
+        (void)bias8_9;
+        auto bias10_11 = _outer.bias10_11();
+        (void)bias10_11;
+        auto bias12_13 = _outer.bias12_13();
+        (void)bias12_13;
+        auto bias14_15 = _outer.bias14_15();
+        (void)bias14_15;
+        auto thresholds1_7 = _outer.thresholds1_7();
+        (void)thresholds1_7;
+        auto thresholds9_13 = _outer.thresholds9_13();
+        (void)thresholds9_13;
+        fScale0_1Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                        kDefault_GrSLPrecision, "scale0_1");
+        if (intervalCount > 1) {
+            fScale2_3Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                            kDefault_GrSLPrecision, "scale2_3");
+        }
+        if (intervalCount > 2) {
+            fScale4_5Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                            kDefault_GrSLPrecision, "scale4_5");
+        }
+        if (intervalCount > 3) {
+            fScale6_7Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                            kDefault_GrSLPrecision, "scale6_7");
+        }
+        if (intervalCount > 4) {
+            fScale8_9Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                            kDefault_GrSLPrecision, "scale8_9");
+        }
+        if (intervalCount > 5) {
+            fScale10_11Var = args.fUniformHandler->addUniform(
+                    kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "scale10_11");
+        }
+        if (intervalCount > 6) {
+            fScale12_13Var = args.fUniformHandler->addUniform(
+                    kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "scale12_13");
+        }
+        if (intervalCount > 7) {
+            fScale14_15Var = args.fUniformHandler->addUniform(
+                    kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "scale14_15");
+        }
+        fBias0_1Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                       kDefault_GrSLPrecision, "bias0_1");
+        if (intervalCount > 1) {
+            fBias2_3Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                           kDefault_GrSLPrecision, "bias2_3");
+        }
+        if (intervalCount > 2) {
+            fBias4_5Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                           kDefault_GrSLPrecision, "bias4_5");
+        }
+        if (intervalCount > 3) {
+            fBias6_7Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                           kDefault_GrSLPrecision, "bias6_7");
+        }
+        if (intervalCount > 4) {
+            fBias8_9Var = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType,
+                                                           kDefault_GrSLPrecision, "bias8_9");
+        }
+        if (intervalCount > 5) {
+            fBias10_11Var = args.fUniformHandler->addUniform(
+                    kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "bias10_11");
+        }
+        if (intervalCount > 6) {
+            fBias12_13Var = args.fUniformHandler->addUniform(
+                    kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "bias12_13");
+        }
+        if (intervalCount > 7) {
+            fBias14_15Var = args.fUniformHandler->addUniform(
+                    kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "bias14_15");
+        }
+        fThresholds1_7Var = args.fUniformHandler->addUniform(
+                kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "thresholds1_7");
+        fThresholds9_13Var = args.fUniformHandler->addUniform(
+                kFragment_GrShaderFlag, kHalf4_GrSLType, kDefault_GrSLPrecision, "thresholds9_13");
+        fragBuilder->codeAppendf(
+                "half t = %s.x;\nhalf4 scale, bias;\nif (%d <= 4 || t < %s.w) {\n    if (%d <= 2 "
+                "|| t < %s.y) {\n        if (%d <= 1 || t < %s.x) {\n            scale = %s;\n     "
+                "       bias = %s;\n        } else {\n            scale = %s;\n            bias = "
+                "%s;\n        }\n    } else {\n        if (%d <= 3 || t < %s.z) {\n            "
+                "scale = %s;\n            bias = %s;\n        } else {\n            scale = %s;\n  "
+                "          bias = %s;\n        }\n    }\n} else {\n    if (%d <= 6 || t < %s.y) "
+                "{\n        if (%d <= 5 || t < ",
+                args.fInputColor, _outer.intervalCount(),
+                args.fUniformHandler->getUniformCStr(fThresholds1_7Var), _outer.intervalCount(),
+                args.fUniformHandler->getUniformCStr(fThresholds1_7Var), _outer.intervalCount(),
+                args.fUniformHandler->getUniformCStr(fThresholds1_7Var),
+                args.fUniformHandler->getUniformCStr(fScale0_1Var),
+                args.fUniformHandler->getUniformCStr(fBias0_1Var),
+                fScale2_3Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale2_3Var)
+                                       : "half4(0)",
+                fBias2_3Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias2_3Var)
+                                      : "half4(0)",
+                _outer.intervalCount(), args.fUniformHandler->getUniformCStr(fThresholds1_7Var),
+                fScale4_5Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale4_5Var)
+                                       : "half4(0)",
+                fBias4_5Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias4_5Var)
+                                      : "half4(0)",
+                fScale6_7Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale6_7Var)
+                                       : "half4(0)",
+                fBias6_7Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias6_7Var)
+                                      : "half4(0)",
+                _outer.intervalCount(), args.fUniformHandler->getUniformCStr(fThresholds9_13Var),
+                _outer.intervalCount());
+        fragBuilder->codeAppendf(
+                "%s.x) {\n            scale = %s;\n            bias = %s;\n        } else {\n      "
+                "      scale = %s;\n            bias = %s;\n        }\n    } else {\n        if "
+                "(%d <= 7 || t < %s.z) {\n            scale = %s;\n            bias = %s;\n        "
+                "} else {\n            scale = %s;\n            bias = %s;\n        }\n    "
+                "}\n}\n%s = t * scale + bias;\n",
+                args.fUniformHandler->getUniformCStr(fThresholds9_13Var),
+                fScale8_9Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale8_9Var)
+                                       : "half4(0)",
+                fBias8_9Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias8_9Var)
+                                      : "half4(0)",
+                fScale10_11Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale10_11Var)
+                                         : "half4(0)",
+                fBias10_11Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias10_11Var)
+                                        : "half4(0)",
+                _outer.intervalCount(), args.fUniformHandler->getUniformCStr(fThresholds9_13Var),
+                fScale12_13Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale12_13Var)
+                                         : "half4(0)",
+                fBias12_13Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias12_13Var)
+                                        : "half4(0)",
+                fScale14_15Var.isValid() ? args.fUniformHandler->getUniformCStr(fScale14_15Var)
+                                         : "half4(0)",
+                fBias14_15Var.isValid() ? args.fUniformHandler->getUniformCStr(fBias14_15Var)
+                                        : "half4(0)",
+                args.fOutputColor);
+    }
+
+private:
+    void onSetData(const GrGLSLProgramDataManager& pdman,
+                   const GrFragmentProcessor& _proc) override {
+        const GrUnrolledBinaryGradientColorizer& _outer =
+                _proc.cast<GrUnrolledBinaryGradientColorizer>();
+        {
+            pdman.set4fv(fScale0_1Var, 1, (_outer.scale0_1()).fRGBA);
+            if (fScale2_3Var.isValid()) {
+                pdman.set4fv(fScale2_3Var, 1, (_outer.scale2_3()).fRGBA);
+            }
+            if (fScale4_5Var.isValid()) {
+                pdman.set4fv(fScale4_5Var, 1, (_outer.scale4_5()).fRGBA);
+            }
+            if (fScale6_7Var.isValid()) {
+                pdman.set4fv(fScale6_7Var, 1, (_outer.scale6_7()).fRGBA);
+            }
+            if (fScale8_9Var.isValid()) {
+                pdman.set4fv(fScale8_9Var, 1, (_outer.scale8_9()).fRGBA);
+            }
+            if (fScale10_11Var.isValid()) {
+                pdman.set4fv(fScale10_11Var, 1, (_outer.scale10_11()).fRGBA);
+            }
+            if (fScale12_13Var.isValid()) {
+                pdman.set4fv(fScale12_13Var, 1, (_outer.scale12_13()).fRGBA);
+            }
+            if (fScale14_15Var.isValid()) {
+                pdman.set4fv(fScale14_15Var, 1, (_outer.scale14_15()).fRGBA);
+            }
+            pdman.set4fv(fBias0_1Var, 1, (_outer.bias0_1()).fRGBA);
+            if (fBias2_3Var.isValid()) {
+                pdman.set4fv(fBias2_3Var, 1, (_outer.bias2_3()).fRGBA);
+            }
+            if (fBias4_5Var.isValid()) {
+                pdman.set4fv(fBias4_5Var, 1, (_outer.bias4_5()).fRGBA);
+            }
+            if (fBias6_7Var.isValid()) {
+                pdman.set4fv(fBias6_7Var, 1, (_outer.bias6_7()).fRGBA);
+            }
+            if (fBias8_9Var.isValid()) {
+                pdman.set4fv(fBias8_9Var, 1, (_outer.bias8_9()).fRGBA);
+            }
+            if (fBias10_11Var.isValid()) {
+                pdman.set4fv(fBias10_11Var, 1, (_outer.bias10_11()).fRGBA);
+            }
+            if (fBias12_13Var.isValid()) {
+                pdman.set4fv(fBias12_13Var, 1, (_outer.bias12_13()).fRGBA);
+            }
+            if (fBias14_15Var.isValid()) {
+                pdman.set4fv(fBias14_15Var, 1, (_outer.bias14_15()).fRGBA);
+            }
+            pdman.set4fv(fThresholds1_7Var, 1,
+                         reinterpret_cast<const float*>(&(_outer.thresholds1_7())));
+            pdman.set4fv(fThresholds9_13Var, 1,
+                         reinterpret_cast<const float*>(&(_outer.thresholds9_13())));
+        }
+    }
+    UniformHandle fScale0_1Var;
+    UniformHandle fScale2_3Var;
+    UniformHandle fScale4_5Var;
+    UniformHandle fScale6_7Var;
+    UniformHandle fScale8_9Var;
+    UniformHandle fScale10_11Var;
+    UniformHandle fScale12_13Var;
+    UniformHandle fScale14_15Var;
+    UniformHandle fBias0_1Var;
+    UniformHandle fBias2_3Var;
+    UniformHandle fBias4_5Var;
+    UniformHandle fBias6_7Var;
+    UniformHandle fBias8_9Var;
+    UniformHandle fBias10_11Var;
+    UniformHandle fBias12_13Var;
+    UniformHandle fBias14_15Var;
+    UniformHandle fThresholds1_7Var;
+    UniformHandle fThresholds9_13Var;
+};
+GrGLSLFragmentProcessor* GrUnrolledBinaryGradientColorizer::onCreateGLSLInstance() const {
+    return new GrGLSLUnrolledBinaryGradientColorizer();
+}
+void GrUnrolledBinaryGradientColorizer::onGetGLSLProcessorKey(const GrShaderCaps& caps,
+                                                              GrProcessorKeyBuilder* b) const {
+    b->add32((int32_t)fIntervalCount);
+}
+bool GrUnrolledBinaryGradientColorizer::onIsEqual(const GrFragmentProcessor& other) const {
+    const GrUnrolledBinaryGradientColorizer& that = other.cast<GrUnrolledBinaryGradientColorizer>();
+    (void)that;
+    if (fIntervalCount != that.fIntervalCount) return false;
+    if (fScale0_1 != that.fScale0_1) return false;
+    if (fScale2_3 != that.fScale2_3) return false;
+    if (fScale4_5 != that.fScale4_5) return false;
+    if (fScale6_7 != that.fScale6_7) return false;
+    if (fScale8_9 != that.fScale8_9) return false;
+    if (fScale10_11 != that.fScale10_11) return false;
+    if (fScale12_13 != that.fScale12_13) return false;
+    if (fScale14_15 != that.fScale14_15) return false;
+    if (fBias0_1 != that.fBias0_1) return false;
+    if (fBias2_3 != that.fBias2_3) return false;
+    if (fBias4_5 != that.fBias4_5) return false;
+    if (fBias6_7 != that.fBias6_7) return false;
+    if (fBias8_9 != that.fBias8_9) return false;
+    if (fBias10_11 != that.fBias10_11) return false;
+    if (fBias12_13 != that.fBias12_13) return false;
+    if (fBias14_15 != that.fBias14_15) return false;
+    if (fThresholds1_7 != that.fThresholds1_7) return false;
+    if (fThresholds9_13 != that.fThresholds9_13) return false;
+    return true;
+}
+GrUnrolledBinaryGradientColorizer::GrUnrolledBinaryGradientColorizer(
+        const GrUnrolledBinaryGradientColorizer& src)
+        : INHERITED(kGrUnrolledBinaryGradientColorizer_ClassID, src.optimizationFlags())
+        , fIntervalCount(src.fIntervalCount)
+        , fScale0_1(src.fScale0_1)
+        , fScale2_3(src.fScale2_3)
+        , fScale4_5(src.fScale4_5)
+        , fScale6_7(src.fScale6_7)
+        , fScale8_9(src.fScale8_9)
+        , fScale10_11(src.fScale10_11)
+        , fScale12_13(src.fScale12_13)
+        , fScale14_15(src.fScale14_15)
+        , fBias0_1(src.fBias0_1)
+        , fBias2_3(src.fBias2_3)
+        , fBias4_5(src.fBias4_5)
+        , fBias6_7(src.fBias6_7)
+        , fBias8_9(src.fBias8_9)
+        , fBias10_11(src.fBias10_11)
+        , fBias12_13(src.fBias12_13)
+        , fBias14_15(src.fBias14_15)
+        , fThresholds1_7(src.fThresholds1_7)
+        , fThresholds9_13(src.fThresholds9_13) {}
+std::unique_ptr<GrFragmentProcessor> GrUnrolledBinaryGradientColorizer::clone() const {
+    return std::unique_ptr<GrFragmentProcessor>(new GrUnrolledBinaryGradientColorizer(*this));
+}
+
+static const int kMaxIntervals = 8;
+std::unique_ptr<GrFragmentProcessor> GrUnrolledBinaryGradientColorizer::Make(
+        const GrColor4f* colors, const SkScalar* positions, int count) {
+    // Depending on how the positions resolve into hard stops or regular stops, the number of
+    // intervals specified by the number of colors/positions can change. For instance, a plain
+    // 3 color gradient is two intervals, but a 4 color gradient with a hard stop is also
+    // two intervals. At the most extreme end, an 8 interval gradient made entirely of hard
+    // stops has 16 colors.
+
+    if (count > 16) {
+        // Definitely cannot represent this gradient configuration
+        return nullptr;
+    }
+
+    // The raster implementation also uses scales and biases, but since they must be calculated
+    // after the dst color space is applied, it limits our ability to cache their values.
+    GrColor4f scales[kMaxIntervals];
+    GrColor4f biases[kMaxIntervals];
+    SkScalar thresholds[kMaxIntervals];
+
+    int intervalCount = 0;
+
+    for (int i = 0; i < count - 1; i++) {
+        if (intervalCount >= kMaxIntervals) {
+            // Already reached kMaxIntervals, and haven't run out of color stops so this
+            // gradient cannot be represented by this shader.
+            return nullptr;
+        }
+
+        SkScalar t0 = positions[i];
+        SkScalar t1 = positions[i + 1];
+        SkScalar dt = t1 - t0;
+        // If the interval is empty, skip to the next interval. This will automatically create
+        // distinct hard stop intervals as needed. It also protects against malformed gradients
+        // that have repeated hard stops at the very beginning that are effectively unreachable.
+        if (SkScalarNearlyZero(dt)) {
+            continue;
+        }
+
+        auto c0 = Sk4f::Load(colors[i].fRGBA);
+        auto c1 = Sk4f::Load(colors[i + 1].fRGBA);
+
+        auto scale = (c1 - c0) / dt;
+        auto bias = c0 - t0 * scale;
+
+        scale.store(scales + intervalCount);
+        bias.store(biases + intervalCount);
+        thresholds[intervalCount] = t1;
+        intervalCount++;
+    }
+
+    // For isEqual to make sense, set the unused values to something consistent
+    for (int i = intervalCount; i < kMaxIntervals; i++) {
+        scales[i] = GrColor4f::TransparentBlack();
+        biases[i] = GrColor4f::TransparentBlack();
+        thresholds[i] = 0.0;
+    }
+
+    return std::unique_ptr<GrFragmentProcessor>(new GrUnrolledBinaryGradientColorizer(
+            intervalCount, scales[0], scales[1], scales[2], scales[3], scales[4], scales[5],
+            scales[6], scales[7], biases[0], biases[1], biases[2], biases[3], biases[4], biases[5],
+            biases[6], biases[7],
+            SkRect::MakeLTRB(thresholds[0], thresholds[1], thresholds[2], thresholds[3]),
+            SkRect::MakeLTRB(thresholds[4], thresholds[5], thresholds[6], 0.0)));
+}
diff --git a/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.fp b/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.fp
new file mode 100644
index 0000000..6877f2f
--- /dev/null
+++ b/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.fp
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+// Unrolled gradient code supporting up to 8 intervals that produces code
+// targeting a specific interval count.
+
+// Assumed to be between 1 and 8.
+layout(key) in int intervalCount;
+
+layout(ctype=GrColor4f) in uniform half4 scale0_1;
+layout(ctype=GrColor4f, when=intervalCount > 1) in uniform half4 scale2_3;
+layout(ctype=GrColor4f, when=intervalCount > 2) in uniform half4 scale4_5;
+layout(ctype=GrColor4f, when=intervalCount > 3) in uniform half4 scale6_7;
+layout(ctype=GrColor4f, when=intervalCount > 4) in uniform half4 scale8_9;
+layout(ctype=GrColor4f, when=intervalCount > 5) in uniform half4 scale10_11;
+layout(ctype=GrColor4f, when=intervalCount > 6) in uniform half4 scale12_13;
+layout(ctype=GrColor4f, when=intervalCount > 7) in uniform half4 scale14_15;
+
+layout(ctype=GrColor4f) in uniform half4 bias0_1;
+layout(ctype=GrColor4f, when=intervalCount > 1) in uniform half4 bias2_3;
+layout(ctype=GrColor4f, when=intervalCount > 2) in uniform half4 bias4_5;
+layout(ctype=GrColor4f, when=intervalCount > 3) in uniform half4 bias6_7;
+layout(ctype=GrColor4f, when=intervalCount > 4) in uniform half4 bias8_9;
+layout(ctype=GrColor4f, when=intervalCount > 5) in uniform half4 bias10_11;
+layout(ctype=GrColor4f, when=intervalCount > 6) in uniform half4 bias12_13;
+layout(ctype=GrColor4f, when=intervalCount > 7) in uniform half4 bias14_15;
+
+// The 7 threshold positions that define the boundaries of the 8 intervals (excluding t = 0, and t =
+// 1) are packed into two half4's instead of having up to 7 separate scalar uniforms. For low
+// interval counts, the extra components are ignored in the shader, but the uniform simplification
+// is worth it. It is assumed thresholds are provided in increasing value, mapped as:
+//  - thresholds1_7.x = boundary between (0,1) and (2,3) -> 1_2
+//  -              .y = boundary between (2,3) and (4,5) -> 3_4
+//  -              .z = boundary between (4,5) and (6,7) -> 5_6
+//  -              .w = boundary between (6,7) and (8,9) -> 7_8
+//  - thresholds9_13.x = boundary between (8,9) and (10,11) -> 9_10
+//  -               .y = boundary between (10,11) and (12,13) -> 11_12
+//  -               .z = boundary between (12,13) and (14,15) -> 13_14
+//  -               .w = unused
+in uniform half4 thresholds1_7;
+in uniform half4 thresholds9_13;
+
+void main() {
+    half t = sk_InColor.x;
+
+    half4 scale, bias;
+    // Explicit binary search for the proper interval that t falls within. The interval count
+    // checks are converted into constant expressions in the C++ generated SkSL, which are then
+    // optimized to the minimal number of branches for the specific interval count.
+
+    // thresholds1_7.w is mid point for intervals (0,7) and (8,15)
+    if (intervalCount <= 4 || t < thresholds1_7.w) {
+        // thresholds1_7.y is mid point for intervals (0,3) and (4,7)
+        if (intervalCount <= 2 || t < thresholds1_7.y) {
+            // thresholds1_7.x is mid point for intervals (0,1) and (2,3)
+            if (intervalCount <= 1 || t < thresholds1_7.x) {
+                scale = scale0_1;
+                bias = bias0_1;
+            } else {
+                scale = scale2_3;
+                bias = bias2_3;
+            }
+        } else {
+            // thresholds1_7.z is mid point for intervals (4,5) and (6,7)
+            if (intervalCount <= 3 || t < thresholds1_7.z) {
+                scale = scale4_5;
+                bias = bias4_5;
+            } else {
+                scale = scale6_7;
+                bias = bias6_7;
+            }
+        }
+    } else {
+        // thresholds9_13.y is mid point for intervals (8,11) and (12,15)
+        if (intervalCount <= 6 || t < thresholds9_13.y) {
+            // thresholds9_13.x is mid point for intervals (8,9) and (10,11)
+            if (intervalCount <= 5 || t < thresholds9_13.x) {
+                // interval 8-9
+                scale = scale8_9;
+                bias = bias8_9;
+            } else {
+                // interval 10-11
+                scale = scale10_11;
+                bias = bias10_11;
+            }
+        } else {
+            // thresholds9_13.z is mid point for intervals (12,13) and (14,15)
+            if (intervalCount <= 7 || t < thresholds9_13.z) {
+                // interval 12-13
+                scale = scale12_13;
+                bias = bias12_13;
+            } else {
+                // interval 14-15
+                scale = scale14_15;
+                bias = bias14_15;
+            }
+        }
+    }
+
+    sk_OutColor = t * scale + bias;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+@make {
+    static std::unique_ptr<GrFragmentProcessor> Make(const GrColor4f* colors,
+                                                     const SkScalar* positions,
+                                                     int count);
+}
+
+@cppEnd {
+    static const int kMaxIntervals = 8;
+    std::unique_ptr<GrFragmentProcessor> GrUnrolledBinaryGradientColorizer::Make(
+            const GrColor4f* colors, const SkScalar* positions, int count) {
+        // Depending on how the positions resolve into hard stops or regular stops, the number of
+        // intervals specified by the number of colors/positions can change. For instance, a plain
+        // 3 color gradient is two intervals, but a 4 color gradient with a hard stop is also
+        // two intervals. At the most extreme end, an 8 interval gradient made entirely of hard
+        // stops has 16 colors.
+
+        if (count > 16) {
+            // Definitely cannot represent this gradient configuration
+            return nullptr;
+        }
+
+        // The raster implementation also uses scales and biases, but since they must be calculated
+        // after the dst color space is applied, it limits our ability to cache their values.
+        GrColor4f scales[kMaxIntervals];
+        GrColor4f biases[kMaxIntervals];
+        SkScalar thresholds[kMaxIntervals];
+
+        int intervalCount = 0;
+
+        for (int i = 0; i < count - 1; i++) {
+            if (intervalCount >= kMaxIntervals) {
+                // Already reached kMaxIntervals, and haven't run out of color stops so this
+                // gradient cannot be represented by this shader.
+                return nullptr;
+            }
+
+            SkScalar t0 = positions[i];
+            SkScalar t1 = positions[i + 1];
+            SkScalar dt = t1 - t0;
+            // If the interval is empty, skip to the next interval. This will automatically create
+            // distinct hard stop intervals as needed. It also protects against malformed gradients
+            // that have repeated hard stops at the very beginning that are effectively unreachable.
+            if (SkScalarNearlyZero(dt)) {
+                continue;
+            }
+
+            auto c0 = Sk4f::Load(colors[i].fRGBA);
+            auto c1 = Sk4f::Load(colors[i + 1].fRGBA);
+
+            auto scale = (c1 - c0) / dt;
+            auto bias = c0 - t0 * scale;
+
+            scale.store(scales + intervalCount);
+            bias.store(biases + intervalCount);
+            thresholds[intervalCount] = t1;
+            intervalCount++;
+        }
+
+        // For isEqual to make sense, set the unused values to something consistent
+        for (int i = intervalCount; i < kMaxIntervals; i++) {
+            scales[i] = GrColor4f::TransparentBlack();
+            biases[i] = GrColor4f::TransparentBlack();
+            thresholds[i] = 0.0;
+        }
+
+        return std::unique_ptr<GrFragmentProcessor>(new GrUnrolledBinaryGradientColorizer(
+                intervalCount, scales[0], scales[1], scales[2], scales[3], scales[4], scales[5],
+                scales[6], scales[7], biases[0], biases[1], biases[2], biases[3], biases[4],
+                biases[5], biases[6], biases[7],
+                SkRect::MakeLTRB(thresholds[0], thresholds[1], thresholds[2], thresholds[3]),
+                SkRect::MakeLTRB(thresholds[4], thresholds[5], thresholds[6], 0.0)));
+    }
+}
diff --git a/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.h b/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.h
new file mode 100644
index 0000000..a0135ce
--- /dev/null
+++ b/src/gpu/gradients/GrUnrolledBinaryGradientColorizer.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**************************************************************************************************
+ *** This file was autogenerated from GrUnrolledBinaryGradientColorizer.fp; do not modify.
+ **************************************************************************************************/
+#ifndef GrUnrolledBinaryGradientColorizer_DEFINED
+#define GrUnrolledBinaryGradientColorizer_DEFINED
+#include "SkTypes.h"
+#include "GrFragmentProcessor.h"
+#include "GrCoordTransform.h"
+class GrUnrolledBinaryGradientColorizer : public GrFragmentProcessor {
+public:
+    int32_t intervalCount() const { return fIntervalCount; }
+    const GrColor4f& scale0_1() const { return fScale0_1; }
+    const GrColor4f& scale2_3() const { return fScale2_3; }
+    const GrColor4f& scale4_5() const { return fScale4_5; }
+    const GrColor4f& scale6_7() const { return fScale6_7; }
+    const GrColor4f& scale8_9() const { return fScale8_9; }
+    const GrColor4f& scale10_11() const { return fScale10_11; }
+    const GrColor4f& scale12_13() const { return fScale12_13; }
+    const GrColor4f& scale14_15() const { return fScale14_15; }
+    const GrColor4f& bias0_1() const { return fBias0_1; }
+    const GrColor4f& bias2_3() const { return fBias2_3; }
+    const GrColor4f& bias4_5() const { return fBias4_5; }
+    const GrColor4f& bias6_7() const { return fBias6_7; }
+    const GrColor4f& bias8_9() const { return fBias8_9; }
+    const GrColor4f& bias10_11() const { return fBias10_11; }
+    const GrColor4f& bias12_13() const { return fBias12_13; }
+    const GrColor4f& bias14_15() const { return fBias14_15; }
+    const SkRect& thresholds1_7() const { return fThresholds1_7; }
+    const SkRect& thresholds9_13() const { return fThresholds9_13; }
+
+    static std::unique_ptr<GrFragmentProcessor> Make(const GrColor4f* colors,
+                                                     const SkScalar* positions,
+                                                     int count);
+    GrUnrolledBinaryGradientColorizer(const GrUnrolledBinaryGradientColorizer& src);
+    std::unique_ptr<GrFragmentProcessor> clone() const override;
+    const char* name() const override { return "UnrolledBinaryGradientColorizer"; }
+
+private:
+    GrUnrolledBinaryGradientColorizer(int32_t intervalCount,
+                                      GrColor4f scale0_1,
+                                      GrColor4f scale2_3,
+                                      GrColor4f scale4_5,
+                                      GrColor4f scale6_7,
+                                      GrColor4f scale8_9,
+                                      GrColor4f scale10_11,
+                                      GrColor4f scale12_13,
+                                      GrColor4f scale14_15,
+                                      GrColor4f bias0_1,
+                                      GrColor4f bias2_3,
+                                      GrColor4f bias4_5,
+                                      GrColor4f bias6_7,
+                                      GrColor4f bias8_9,
+                                      GrColor4f bias10_11,
+                                      GrColor4f bias12_13,
+                                      GrColor4f bias14_15,
+                                      SkRect thresholds1_7,
+                                      SkRect thresholds9_13)
+            : INHERITED(kGrUnrolledBinaryGradientColorizer_ClassID, kNone_OptimizationFlags)
+            , fIntervalCount(intervalCount)
+            , fScale0_1(scale0_1)
+            , fScale2_3(scale2_3)
+            , fScale4_5(scale4_5)
+            , fScale6_7(scale6_7)
+            , fScale8_9(scale8_9)
+            , fScale10_11(scale10_11)
+            , fScale12_13(scale12_13)
+            , fScale14_15(scale14_15)
+            , fBias0_1(bias0_1)
+            , fBias2_3(bias2_3)
+            , fBias4_5(bias4_5)
+            , fBias6_7(bias6_7)
+            , fBias8_9(bias8_9)
+            , fBias10_11(bias10_11)
+            , fBias12_13(bias12_13)
+            , fBias14_15(bias14_15)
+            , fThresholds1_7(thresholds1_7)
+            , fThresholds9_13(thresholds9_13) {}
+    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
+    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
+    bool onIsEqual(const GrFragmentProcessor&) const override;
+    GR_DECLARE_FRAGMENT_PROCESSOR_TEST
+    int32_t fIntervalCount;
+    GrColor4f fScale0_1;
+    GrColor4f fScale2_3;
+    GrColor4f fScale4_5;
+    GrColor4f fScale6_7;
+    GrColor4f fScale8_9;
+    GrColor4f fScale10_11;
+    GrColor4f fScale12_13;
+    GrColor4f fScale14_15;
+    GrColor4f fBias0_1;
+    GrColor4f fBias2_3;
+    GrColor4f fBias4_5;
+    GrColor4f fBias6_7;
+    GrColor4f fBias8_9;
+    GrColor4f fBias10_11;
+    GrColor4f fBias12_13;
+    GrColor4f fBias14_15;
+    SkRect fThresholds1_7;
+    SkRect fThresholds9_13;
+    typedef GrFragmentProcessor INHERITED;
+};
+#endif
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 3162e70..b7867eb 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -184,26 +184,6 @@
     }
 }
 
-SkPDFDevice::GraphicStateEntry::GraphicStateEntry()
-    : fColor(SK_ColorBLACK)
-    , fTextScaleX(SK_Scalar1)
-    , fTextFill(SkPaint::kFill_Style)
-    , fShaderIndex(-1)
-    , fGraphicStateIndex(-1) {
-    fMatrix.reset();
-}
-
-bool SkPDFDevice::GraphicStateEntry::compareInitialState(
-        const GraphicStateEntry& cur) {
-    return fColor == cur.fColor &&
-           fShaderIndex == cur.fShaderIndex &&
-           fGraphicStateIndex == cur.fGraphicStateIndex &&
-           fMatrix == cur.fMatrix &&
-           fClipStack == cur.fClipStack &&
-           (fTextScaleX == 0 ||
-               (fTextScaleX == cur.fTextScaleX && fTextFill == cur.fTextFill));
-}
-
 class GraphicStackState {
 public:
     GraphicStackState(const SkClipStack& existingClipStack,
@@ -613,40 +593,19 @@
 }
 
 void SkPDFDevice::drawPaint(const SkPaint& srcPaint) {
+    SkMatrix inverse;
+    if (!this->ctm().invert(&inverse)) {
+        return;
+    }
+    SkRect bbox = this->cs().bounds(this->bounds());
+    inverse.mapRect(&bbox);
+    bbox.roundOut(&bbox);
     if (this->hasEmptyClip()) {
         return;
     }
     SkPaint newPaint = srcPaint;
-    remove_color_filter(&newPaint);
-    replace_srcmode_on_opaque_paint(&newPaint);
     newPaint.setStyle(SkPaint::kFill_Style);
-
-    SkMatrix ctm = this->ctm();
-    if (ctm.getType() & SkMatrix::kPerspective_Mask) {
-        if (newPaint.getShader()) {
-            transform_shader(&newPaint, ctm);
-        }
-        ctm = SkMatrix::I();
-    }
-    ScopedContentEntry content(this, this->cs(), ctm, newPaint);
-    this->internalDrawPaint(newPaint, content.entry());
-}
-
-void SkPDFDevice::internalDrawPaint(const SkPaint& paint,
-                                    SkPDFDevice::ContentEntry* contentEntry) {
-    if (!contentEntry) {
-        return;
-    }
-    SkRect bbox = SkRect::Make(this->imageInfo().dimensions());
-    SkMatrix inverse;
-    if (!contentEntry->fState.fMatrix.invert(&inverse)) {
-        return;
-    }
-    inverse.mapRect(&bbox);
-
-    SkPDFUtils::AppendRectangle(bbox, &contentEntry->fContent);
-    SkPDFUtils::PaintPath(paint.getStyle(), SkPath::kWinding_FillType,
-                          &contentEntry->fContent);
+    this->drawRect(bbox, newPaint);
 }
 
 void SkPDFDevice::drawPoints(SkCanvas::PointMode mode,
diff --git a/src/pdf/SkPDFDevice.h b/src/pdf/SkPDFDevice.h
index ce99f06..2d3cc43 100644
--- a/src/pdf/SkPDFDevice.h
+++ b/src/pdf/SkPDFDevice.h
@@ -121,25 +121,13 @@
     // It is important to not confuse GraphicStateEntry with SkPDFGraphicState, the
     // later being our representation of an object in the PDF file.
     struct GraphicStateEntry {
-        GraphicStateEntry();
-
-        // Compare the fields we care about when setting up a new content entry.
-        bool compareInitialState(const GraphicStateEntry& b);
-
-        SkMatrix fMatrix;
-        // We can't do set operations on Paths, though PDF natively supports
-        // intersect.  If the clip stack does anything other than intersect,
-        // we have to fall back to the region.  Treat fClipStack as authoritative.
-        // See https://bugs.skia.org/221
+        SkMatrix fMatrix = SkMatrix::I();
         SkClipStack fClipStack;
-
-        // When emitting the content entry, we will ensure the graphic state
-        // is set to these values first.
-        SkColor fColor;
-        SkScalar fTextScaleX;  // Zero means we don't care what the value is.
-        SkPaint::Style fTextFill;  // Only if TextScaleX is non-zero.
-        int fShaderIndex;
-        int fGraphicStateIndex;
+        SkColor fColor = SK_ColorBLACK;
+        SkScalar fTextScaleX = 1;  // Zero means we don't care what the value is.
+        SkPaint::Style fTextFill = SkPaint::kFill_Style;  // Only if TextScaleX is non-zero.
+        int fShaderIndex = -1;
+        int fGraphicStateIndex = -1;
     };
 
 protected:
@@ -222,8 +210,6 @@
 
     void internalDrawGlyphRun(const SkGlyphRun& glyphRun, SkPoint offset);
 
-    void internalDrawPaint(const SkPaint& paint, ContentEntry* contentEntry);
-
     void internalDrawImageRect(SkKeyedImage,
                                const SkRect* src,
                                const SkRect& dst,
diff --git a/src/ports/SkMemory_malloc.cpp b/src/ports/SkMemory_malloc.cpp
index 29e7543..fd09af9 100644
--- a/src/ports/SkMemory_malloc.cpp
+++ b/src/ports/SkMemory_malloc.cpp
@@ -37,6 +37,8 @@
 #endif
 #if defined(SK_DEBUG) && defined(SK_BUILD_FOR_WIN)
     __debugbreak();
+#elif defined(__clang__)
+    __builtin_debugtrap();
 #else
     abort();
 #endif
diff --git a/src/utils/SkPolyUtils.cpp b/src/utils/SkPolyUtils.cpp
index 23e7394..1d8bec0 100644
--- a/src/utils/SkPolyUtils.cpp
+++ b/src/utils/SkPolyUtils.cpp
@@ -1440,7 +1440,8 @@
             : fBounds(bounds)
             , fNumVerts(0) {
         // We want vertexCount grid cells, roughly distributed to match the bounds ratio
-        fHCount = SkScalarRoundToInt(SkScalarSqrt(vertexCount*bounds.width()/bounds.height()));
+        SkScalar hCount = SkScalarSqrt(vertexCount*bounds.width()/bounds.height());
+        fHCount = SkTMax(SkTMin(SkScalarRoundToInt(hCount), vertexCount), 1);
         fVCount = vertexCount/fHCount;
         fGridConversion.set((fHCount - 0.001f)/bounds.width(), (fVCount - 0.001f)/bounds.height());
         fGrid.setCount(fHCount*fVCount);