diff --git a/tools/aapt2/.clang-format b/tools/aapt2/.clang-format
new file mode 100644
index 0000000..71c5ef2
--- /dev/null
+++ b/tools/aapt2/.clang-format
@@ -0,0 +1,3 @@
+BasedOnStyle: Google
+ColumnLimit: 100
+
diff --git a/tools/aapt2/AppInfo.h b/tools/aapt2/AppInfo.h
index a9794a4..2cbe117 100644
--- a/tools/aapt2/AppInfo.h
+++ b/tools/aapt2/AppInfo.h
@@ -28,27 +28,27 @@
  * will come from the app's AndroidManifest.
  */
 struct AppInfo {
-    /**
-     * App's package name.
-     */
-    std::string package;
+  /**
+   * App's package name.
+   */
+  std::string package;
 
-    /**
-     * The App's minimum SDK version.
-     */
-    Maybe<std::string> minSdkVersion;
+  /**
+   * The App's minimum SDK version.
+   */
+  Maybe<std::string> minSdkVersion;
 
-    /**
-     * The Version code of the app.
-     */
-    Maybe<uint32_t> versionCode;
+  /**
+   * The Version code of the app.
+   */
+  Maybe<uint32_t> versionCode;
 
-    /**
-     * The revision code of the app.
-     */
-    Maybe<uint32_t> revisionCode;
+  /**
+   * The revision code of the app.
+   */
+  Maybe<uint32_t> revisionCode;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_APP_INFO_H
+#endif  // AAPT_APP_INFO_H
diff --git a/tools/aapt2/ConfigDescription.cpp b/tools/aapt2/ConfigDescription.cpp
index 1812d96..6598d63 100644
--- a/tools/aapt2/ConfigDescription.cpp
+++ b/tools/aapt2/ConfigDescription.cpp
@@ -31,854 +31,869 @@
 static const char* kWildcardName = "any";
 
 const ConfigDescription& ConfigDescription::defaultConfig() {
-    static ConfigDescription config = {};
-    return config;
+  static ConfigDescription config = {};
+  return config;
 }
 
 static bool parseMcc(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->mcc = 0;
-        return true;
-    }
-    const char* c = name;
-    if (tolower(*c) != 'm') return false;
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->mcc = 0;
+    return true;
+  }
+  const char* c = name;
+  if (tolower(*c) != 'm') return false;
+  c++;
+  if (tolower(*c) != 'c') return false;
+  c++;
+  if (tolower(*c) != 'c') return false;
+  c++;
+
+  const char* val = c;
+
+  while (*c >= '0' && *c <= '9') {
     c++;
-    if (tolower(*c) != 'c') return false;
-    c++;
-    if (tolower(*c) != 'c') return false;
-    c++;
+  }
+  if (*c != 0) return false;
+  if (c - val != 3) return false;
 
-    const char* val = c;
+  int d = atoi(val);
+  if (d != 0) {
+    if (out) out->mcc = d;
+    return true;
+  }
 
-    while (*c >= '0' && *c <= '9') {
-        c++;
-    }
-    if (*c != 0) return false;
-    if (c-val != 3) return false;
-
-    int d = atoi(val);
-    if (d != 0) {
-        if (out) out->mcc = d;
-        return true;
-    }
-
-    return false;
+  return false;
 }
 
 static bool parseMnc(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->mcc = 0;
-        return true;
-    }
-    const char* c = name;
-    if (tolower(*c) != 'm') return false;
-    c++;
-    if (tolower(*c) != 'n') return false;
-    c++;
-    if (tolower(*c) != 'c') return false;
-    c++;
-
-    const char* val = c;
-
-    while (*c >= '0' && *c <= '9') {
-        c++;
-    }
-    if (*c != 0) return false;
-    if (c-val == 0 || c-val > 3) return false;
-
-    if (out) {
-        out->mnc = atoi(val);
-        if (out->mnc == 0) {
-            out->mnc = ACONFIGURATION_MNC_ZERO;
-        }
-    }
-
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->mcc = 0;
     return true;
+  }
+  const char* c = name;
+  if (tolower(*c) != 'm') return false;
+  c++;
+  if (tolower(*c) != 'n') return false;
+  c++;
+  if (tolower(*c) != 'c') return false;
+  c++;
+
+  const char* val = c;
+
+  while (*c >= '0' && *c <= '9') {
+    c++;
+  }
+  if (*c != 0) return false;
+  if (c - val == 0 || c - val > 3) return false;
+
+  if (out) {
+    out->mnc = atoi(val);
+    if (out->mnc == 0) {
+      out->mnc = ACONFIGURATION_MNC_ZERO;
+    }
+  }
+
+  return true;
 }
 
 static bool parseLayoutDirection(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
-                | ResTable_config::LAYOUTDIR_ANY;
-        return true;
-    } else if (strcmp(name, "ldltr") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
-                | ResTable_config::LAYOUTDIR_LTR;
-        return true;
-    } else if (strcmp(name, "ldrtl") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
-                | ResTable_config::LAYOUTDIR_RTL;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_LAYOUTDIR) |
+          ResTable_config::LAYOUTDIR_ANY;
+    return true;
+  } else if (strcmp(name, "ldltr") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_LAYOUTDIR) |
+          ResTable_config::LAYOUTDIR_LTR;
+    return true;
+  } else if (strcmp(name, "ldrtl") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_LAYOUTDIR) |
+          ResTable_config::LAYOUTDIR_RTL;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenLayoutSize(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_ANY;
-        return true;
-    } else if (strcmp(name, "small") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_SMALL;
-        return true;
-    } else if (strcmp(name, "normal") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_NORMAL;
-        return true;
-    } else if (strcmp(name, "large") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_LARGE;
-        return true;
-    } else if (strcmp(name, "xlarge") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_XLARGE;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_ANY;
+    return true;
+  } else if (strcmp(name, "small") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_SMALL;
+    return true;
+  } else if (strcmp(name, "normal") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_NORMAL;
+    return true;
+  } else if (strcmp(name, "large") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_LARGE;
+    return true;
+  } else if (strcmp(name, "xlarge") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_XLARGE;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenLayoutLong(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
-                | ResTable_config::SCREENLONG_ANY;
-        return true;
-    } else if (strcmp(name, "long") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
-                | ResTable_config::SCREENLONG_YES;
-        return true;
-    } else if (strcmp(name, "notlong") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
-                | ResTable_config::SCREENLONG_NO;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENLONG) |
+          ResTable_config::SCREENLONG_ANY;
+    return true;
+  } else if (strcmp(name, "long") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENLONG) |
+          ResTable_config::SCREENLONG_YES;
+    return true;
+  } else if (strcmp(name, "notlong") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENLONG) |
+          ResTable_config::SCREENLONG_NO;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenRound(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout2 =
-                (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
-                | ResTable_config::SCREENROUND_ANY;
-        return true;
-    } else if (strcmp(name, "round") == 0) {
-        if (out) out->screenLayout2 =
-                (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
-                | ResTable_config::SCREENROUND_YES;
-        return true;
-    } else if (strcmp(name, "notround") == 0) {
-        if (out) out->screenLayout2 =
-                (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
-                | ResTable_config::SCREENROUND_NO;
-        return true;
-    }
-    return false;
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout2 =
+          (out->screenLayout2 & ~ResTable_config::MASK_SCREENROUND) |
+          ResTable_config::SCREENROUND_ANY;
+    return true;
+  } else if (strcmp(name, "round") == 0) {
+    if (out)
+      out->screenLayout2 =
+          (out->screenLayout2 & ~ResTable_config::MASK_SCREENROUND) |
+          ResTable_config::SCREENROUND_YES;
+    return true;
+  } else if (strcmp(name, "notround") == 0) {
+    if (out)
+      out->screenLayout2 =
+          (out->screenLayout2 & ~ResTable_config::MASK_SCREENROUND) |
+          ResTable_config::SCREENROUND_NO;
+    return true;
+  }
+  return false;
 }
 
 static bool parseOrientation(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->orientation = out->ORIENTATION_ANY;
-        return true;
-    } else if (strcmp(name, "port") == 0) {
-        if (out) out->orientation = out->ORIENTATION_PORT;
-        return true;
-    } else if (strcmp(name, "land") == 0) {
-        if (out) out->orientation = out->ORIENTATION_LAND;
-        return true;
-    } else if (strcmp(name, "square") == 0) {
-        if (out) out->orientation = out->ORIENTATION_SQUARE;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->orientation = out->ORIENTATION_ANY;
+    return true;
+  } else if (strcmp(name, "port") == 0) {
+    if (out) out->orientation = out->ORIENTATION_PORT;
+    return true;
+  } else if (strcmp(name, "land") == 0) {
+    if (out) out->orientation = out->ORIENTATION_LAND;
+    return true;
+  } else if (strcmp(name, "square") == 0) {
+    if (out) out->orientation = out->ORIENTATION_SQUARE;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseUiModeType(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->uiMode =
-                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-                | ResTable_config::UI_MODE_TYPE_ANY;
-        return true;
-    } else if (strcmp(name, "desk") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_DESK;
-        return true;
-    } else if (strcmp(name, "car") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_CAR;
-        return true;
-    } else if (strcmp(name, "television") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_TELEVISION;
-        return true;
-    } else if (strcmp(name, "appliance") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
-        return true;
-    } else if (strcmp(name, "watch") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_WATCH;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_ANY;
+    return true;
+  } else if (strcmp(name, "desk") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_DESK;
+    return true;
+  } else if (strcmp(name, "car") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_CAR;
+    return true;
+  } else if (strcmp(name, "television") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_TELEVISION;
+    return true;
+  } else if (strcmp(name, "appliance") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_APPLIANCE;
+    return true;
+  } else if (strcmp(name, "watch") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_WATCH;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseUiModeNight(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->uiMode =
-                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
-                | ResTable_config::UI_MODE_NIGHT_ANY;
-        return true;
-    } else if (strcmp(name, "night") == 0) {
-        if (out) out->uiMode =
-                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
-                | ResTable_config::UI_MODE_NIGHT_YES;
-        return true;
-    } else if (strcmp(name, "notnight") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
-              | ResTable_config::UI_MODE_NIGHT_NO;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_NIGHT) |
+                    ResTable_config::UI_MODE_NIGHT_ANY;
+    return true;
+  } else if (strcmp(name, "night") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_NIGHT) |
+                    ResTable_config::UI_MODE_NIGHT_YES;
+    return true;
+  } else if (strcmp(name, "notnight") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_NIGHT) |
+                    ResTable_config::UI_MODE_NIGHT_NO;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseDensity(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->density = ResTable_config::DENSITY_DEFAULT;
+    return true;
+  }
 
-    if (strcmp(name, "anydpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_ANY;
-        return true;
-    }
+  if (strcmp(name, "anydpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_ANY;
+    return true;
+  }
 
-    if (strcmp(name, "nodpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_NONE;
-        return true;
-    }
+  if (strcmp(name, "nodpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_NONE;
+    return true;
+  }
 
-    if (strcmp(name, "ldpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_LOW;
-        return true;
-    }
+  if (strcmp(name, "ldpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_LOW;
+    return true;
+  }
 
-    if (strcmp(name, "mdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_MEDIUM;
-        return true;
-    }
+  if (strcmp(name, "mdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_MEDIUM;
+    return true;
+  }
 
-    if (strcmp(name, "tvdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_TV;
-        return true;
-    }
+  if (strcmp(name, "tvdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_TV;
+    return true;
+  }
 
-    if (strcmp(name, "hdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_HIGH;
-        return true;
-    }
+  if (strcmp(name, "hdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_HIGH;
+    return true;
+  }
 
-    if (strcmp(name, "xhdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_XHIGH;
-        return true;
-    }
+  if (strcmp(name, "xhdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_XHIGH;
+    return true;
+  }
 
-    if (strcmp(name, "xxhdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
-        return true;
-    }
+  if (strcmp(name, "xxhdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_XXHIGH;
+    return true;
+  }
 
-    if (strcmp(name, "xxxhdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
-        return true;
-    }
+  if (strcmp(name, "xxxhdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
+    return true;
+  }
 
-    char* c = (char*)name;
-    while (*c >= '0' && *c <= '9') {
-        c++;
-    }
+  char* c = (char*)name;
+  while (*c >= '0' && *c <= '9') {
+    c++;
+  }
 
-    // check that we have 'dpi' after the last digit.
-    if (toupper(c[0]) != 'D' ||
-            toupper(c[1]) != 'P' ||
-            toupper(c[2]) != 'I' ||
-            c[3] != 0) {
-        return false;
-    }
-
-    // temporarily replace the first letter with \0 to
-    // use atoi.
-    char tmp = c[0];
-    c[0] = '\0';
-
-    int d = atoi(name);
-    c[0] = tmp;
-
-    if (d != 0) {
-        if (out) out->density = d;
-        return true;
-    }
-
+  // check that we have 'dpi' after the last digit.
+  if (toupper(c[0]) != 'D' || toupper(c[1]) != 'P' || toupper(c[2]) != 'I' ||
+      c[3] != 0) {
     return false;
+  }
+
+  // temporarily replace the first letter with \0 to
+  // use atoi.
+  char tmp = c[0];
+  c[0] = '\0';
+
+  int d = atoi(name);
+  c[0] = tmp;
+
+  if (d != 0) {
+    if (out) out->density = d;
+    return true;
+  }
+
+  return false;
 }
 
 static bool parseTouchscreen(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
-        return true;
-    } else if (strcmp(name, "notouch") == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
-        return true;
-    } else if (strcmp(name, "stylus") == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
-        return true;
-    } else if (strcmp(name, "finger") == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
+    return true;
+  } else if (strcmp(name, "notouch") == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
+    return true;
+  } else if (strcmp(name, "stylus") == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
+    return true;
+  } else if (strcmp(name, "finger") == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseKeysHidden(const char* name, ResTable_config* out) {
-    uint8_t mask = 0;
-    uint8_t value = 0;
-    if (strcmp(name, kWildcardName) == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_ANY;
-    } else if (strcmp(name, "keysexposed") == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_NO;
-    } else if (strcmp(name, "keyshidden") == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_YES;
-    } else if (strcmp(name, "keyssoft") == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_SOFT;
-    }
+  uint8_t mask = 0;
+  uint8_t value = 0;
+  if (strcmp(name, kWildcardName) == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_ANY;
+  } else if (strcmp(name, "keysexposed") == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_NO;
+  } else if (strcmp(name, "keyshidden") == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_YES;
+  } else if (strcmp(name, "keyssoft") == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_SOFT;
+  }
 
-    if (mask != 0) {
-        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
-        return true;
-    }
+  if (mask != 0) {
+    if (out) out->inputFlags = (out->inputFlags & ~mask) | value;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseKeyboard(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->keyboard = out->KEYBOARD_ANY;
-        return true;
-    } else if (strcmp(name, "nokeys") == 0) {
-        if (out) out->keyboard = out->KEYBOARD_NOKEYS;
-        return true;
-    } else if (strcmp(name, "qwerty") == 0) {
-        if (out) out->keyboard = out->KEYBOARD_QWERTY;
-        return true;
-    } else if (strcmp(name, "12key") == 0) {
-        if (out) out->keyboard = out->KEYBOARD_12KEY;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->keyboard = out->KEYBOARD_ANY;
+    return true;
+  } else if (strcmp(name, "nokeys") == 0) {
+    if (out) out->keyboard = out->KEYBOARD_NOKEYS;
+    return true;
+  } else if (strcmp(name, "qwerty") == 0) {
+    if (out) out->keyboard = out->KEYBOARD_QWERTY;
+    return true;
+  } else if (strcmp(name, "12key") == 0) {
+    if (out) out->keyboard = out->KEYBOARD_12KEY;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseNavHidden(const char* name, ResTable_config* out) {
-    uint8_t mask = 0;
-    uint8_t value = 0;
-    if (strcmp(name, kWildcardName) == 0) {
-        mask = ResTable_config::MASK_NAVHIDDEN;
-        value = ResTable_config::NAVHIDDEN_ANY;
-    } else if (strcmp(name, "navexposed") == 0) {
-        mask = ResTable_config::MASK_NAVHIDDEN;
-        value = ResTable_config::NAVHIDDEN_NO;
-    } else if (strcmp(name, "navhidden") == 0) {
-        mask = ResTable_config::MASK_NAVHIDDEN;
-        value = ResTable_config::NAVHIDDEN_YES;
-    }
+  uint8_t mask = 0;
+  uint8_t value = 0;
+  if (strcmp(name, kWildcardName) == 0) {
+    mask = ResTable_config::MASK_NAVHIDDEN;
+    value = ResTable_config::NAVHIDDEN_ANY;
+  } else if (strcmp(name, "navexposed") == 0) {
+    mask = ResTable_config::MASK_NAVHIDDEN;
+    value = ResTable_config::NAVHIDDEN_NO;
+  } else if (strcmp(name, "navhidden") == 0) {
+    mask = ResTable_config::MASK_NAVHIDDEN;
+    value = ResTable_config::NAVHIDDEN_YES;
+  }
 
-    if (mask != 0) {
-        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
-        return true;
-    }
+  if (mask != 0) {
+    if (out) out->inputFlags = (out->inputFlags & ~mask) | value;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseNavigation(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->navigation = out->NAVIGATION_ANY;
-        return true;
-    } else if (strcmp(name, "nonav") == 0) {
-        if (out) out->navigation = out->NAVIGATION_NONAV;
-        return true;
-    } else if (strcmp(name, "dpad") == 0) {
-        if (out) out->navigation = out->NAVIGATION_DPAD;
-        return true;
-    } else if (strcmp(name, "trackball") == 0) {
-        if (out) out->navigation = out->NAVIGATION_TRACKBALL;
-        return true;
-    } else if (strcmp(name, "wheel") == 0) {
-        if (out) out->navigation = out->NAVIGATION_WHEEL;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->navigation = out->NAVIGATION_ANY;
+    return true;
+  } else if (strcmp(name, "nonav") == 0) {
+    if (out) out->navigation = out->NAVIGATION_NONAV;
+    return true;
+  } else if (strcmp(name, "dpad") == 0) {
+    if (out) out->navigation = out->NAVIGATION_DPAD;
+    return true;
+  } else if (strcmp(name, "trackball") == 0) {
+    if (out) out->navigation = out->NAVIGATION_TRACKBALL;
+    return true;
+  } else if (strcmp(name, "wheel") == 0) {
+    if (out) out->navigation = out->NAVIGATION_WHEEL;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenSize(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->screenWidth = out->SCREENWIDTH_ANY;
-            out->screenHeight = out->SCREENHEIGHT_ANY;
-        }
-        return true;
-    }
-
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || *x != 'x') return false;
-    std::string xName(name, x-name);
-    x++;
-
-    const char* y = x;
-    while (*y >= '0' && *y <= '9') y++;
-    if (y == name || *y != 0) return false;
-    std::string yName(x, y-x);
-
-    uint16_t w = (uint16_t)atoi(xName.c_str());
-    uint16_t h = (uint16_t)atoi(yName.c_str());
-    if (w < h) {
-        return false;
-    }
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->screenWidth = w;
-        out->screenHeight = h;
+      out->screenWidth = out->SCREENWIDTH_ANY;
+      out->screenHeight = out->SCREENHEIGHT_ANY;
     }
-
     return true;
+  }
+
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || *x != 'x') return false;
+  std::string xName(name, x - name);
+  x++;
+
+  const char* y = x;
+  while (*y >= '0' && *y <= '9') y++;
+  if (y == name || *y != 0) return false;
+  std::string yName(x, y - x);
+
+  uint16_t w = (uint16_t)atoi(xName.c_str());
+  uint16_t h = (uint16_t)atoi(yName.c_str());
+  if (w < h) {
+    return false;
+  }
+
+  if (out) {
+    out->screenWidth = w;
+    out->screenHeight = h;
+  }
+
+  return true;
 }
 
 static bool parseSmallestScreenWidthDp(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 's') return false;
-    name++;
-    if (*name != 'w') return false;
-    name++;
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
-    std::string xName(name, x-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->smallestScreenWidthDp = (uint16_t)atoi(xName.c_str());
+      out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 's') return false;
+  name++;
+  if (*name != 'w') return false;
+  name++;
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+  std::string xName(name, x - name);
+
+  if (out) {
+    out->smallestScreenWidthDp = (uint16_t)atoi(xName.c_str());
+  }
+
+  return true;
 }
 
 static bool parseScreenWidthDp(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->screenWidthDp = out->SCREENWIDTH_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 'w') return false;
-    name++;
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
-    std::string xName(name, x-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->screenWidthDp = (uint16_t)atoi(xName.c_str());
+      out->screenWidthDp = out->SCREENWIDTH_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 'w') return false;
+  name++;
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+  std::string xName(name, x - name);
+
+  if (out) {
+    out->screenWidthDp = (uint16_t)atoi(xName.c_str());
+  }
+
+  return true;
 }
 
 static bool parseScreenHeightDp(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->screenHeightDp = out->SCREENWIDTH_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 'h') return false;
-    name++;
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
-    std::string xName(name, x-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->screenHeightDp = (uint16_t)atoi(xName.c_str());
+      out->screenHeightDp = out->SCREENWIDTH_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 'h') return false;
+  name++;
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+  std::string xName(name, x - name);
+
+  if (out) {
+    out->screenHeightDp = (uint16_t)atoi(xName.c_str());
+  }
+
+  return true;
 }
 
 static bool parseVersion(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->sdkVersion = out->SDKVERSION_ANY;
-            out->minorVersion = out->MINORVERSION_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 'v') {
-        return false;
-    }
-
-    name++;
-    const char* s = name;
-    while (*s >= '0' && *s <= '9') s++;
-    if (s == name || *s != 0) return false;
-    std::string sdkName(name, s-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->sdkVersion = (uint16_t)atoi(sdkName.c_str());
-        out->minorVersion = 0;
+      out->sdkVersion = out->SDKVERSION_ANY;
+      out->minorVersion = out->MINORVERSION_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 'v') {
+    return false;
+  }
+
+  name++;
+  const char* s = name;
+  while (*s >= '0' && *s <= '9') s++;
+  if (s == name || *s != 0) return false;
+  std::string sdkName(name, s - name);
+
+  if (out) {
+    out->sdkVersion = (uint16_t)atoi(sdkName.c_str());
+    out->minorVersion = 0;
+  }
+
+  return true;
 }
 
 bool ConfigDescription::parse(const StringPiece& str, ConfigDescription* out) {
-    std::vector<std::string> parts = util::splitAndLowercase(str, '-');
+  std::vector<std::string> parts = util::splitAndLowercase(str, '-');
 
-    ConfigDescription config;
-    ssize_t partsConsumed = 0;
-    LocaleValue locale;
+  ConfigDescription config;
+  ssize_t partsConsumed = 0;
+  LocaleValue locale;
 
-    const auto partsEnd = parts.end();
-    auto partIter = parts.begin();
+  const auto partsEnd = parts.end();
+  auto partIter = parts.begin();
 
-    if (str.size() == 0) {
-        goto success;
+  if (str.size() == 0) {
+    goto success;
+  }
+
+  if (parseMcc(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
     }
+  }
 
-    if (parseMcc(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
+  if (parseMnc(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
     }
+  }
 
-    if (parseMnc(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    // Locale spans a few '-' separators, so we let it
-    // control the index.
-    partsConsumed = locale.initFromParts(partIter, partsEnd);
-    if (partsConsumed < 0) {
-        return false;
-    } else {
-        locale.writeTo(&config);
-        partIter += partsConsumed;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseLayoutDirection(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseSmallestScreenWidthDp(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenWidthDp(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenHeightDp(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenLayoutSize(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenLayoutLong(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenRound(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseOrientation(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseUiModeType(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseUiModeNight(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseDensity(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseTouchscreen(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseKeysHidden(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseKeyboard(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseNavHidden(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseNavigation(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenSize(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseVersion(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    // Unrecognized.
+  // Locale spans a few '-' separators, so we let it
+  // control the index.
+  partsConsumed = locale.initFromParts(partIter, partsEnd);
+  if (partsConsumed < 0) {
     return false;
+  } else {
+    locale.writeTo(&config);
+    partIter += partsConsumed;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseLayoutDirection(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseSmallestScreenWidthDp(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenWidthDp(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenHeightDp(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenLayoutSize(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenLayoutLong(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenRound(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseOrientation(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseUiModeType(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseUiModeNight(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseDensity(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseTouchscreen(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseKeysHidden(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseKeyboard(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseNavHidden(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseNavigation(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenSize(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseVersion(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  // Unrecognized.
+  return false;
 
 success:
-    if (out != NULL) {
-        applyVersionForCompatibility(&config);
-        *out = config;
-    }
-    return true;
+  if (out != NULL) {
+    applyVersionForCompatibility(&config);
+    *out = config;
+  }
+  return true;
 }
 
-void ConfigDescription::applyVersionForCompatibility(ConfigDescription* config) {
-    uint16_t minSdk = 0;
-    if (config->screenLayout2 & ResTable_config::MASK_SCREENROUND) {
-        minSdk = SDK_MARSHMALLOW;
-    } else if (config->density == ResTable_config::DENSITY_ANY) {
-        minSdk = SDK_LOLLIPOP;
-    } else if (config->smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
-            || config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY
-            || config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
-        minSdk = SDK_HONEYCOMB_MR2;
-    } else if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE)
-                != ResTable_config::UI_MODE_TYPE_ANY
-            ||  (config->uiMode & ResTable_config::MASK_UI_MODE_NIGHT)
-                != ResTable_config::UI_MODE_NIGHT_ANY) {
-        minSdk = SDK_FROYO;
-    } else if ((config->screenLayout & ResTable_config::MASK_SCREENSIZE)
-                != ResTable_config::SCREENSIZE_ANY
-            ||  (config->screenLayout & ResTable_config::MASK_SCREENLONG)
-                != ResTable_config::SCREENLONG_ANY
-            || config->density != ResTable_config::DENSITY_DEFAULT) {
-        minSdk = SDK_DONUT;
-    }
+void ConfigDescription::applyVersionForCompatibility(
+    ConfigDescription* config) {
+  uint16_t minSdk = 0;
+  if (config->screenLayout2 & ResTable_config::MASK_SCREENROUND) {
+    minSdk = SDK_MARSHMALLOW;
+  } else if (config->density == ResTable_config::DENSITY_ANY) {
+    minSdk = SDK_LOLLIPOP;
+  } else if (config->smallestScreenWidthDp !=
+                 ResTable_config::SCREENWIDTH_ANY ||
+             config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY ||
+             config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
+    minSdk = SDK_HONEYCOMB_MR2;
+  } else if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE) !=
+                 ResTable_config::UI_MODE_TYPE_ANY ||
+             (config->uiMode & ResTable_config::MASK_UI_MODE_NIGHT) !=
+                 ResTable_config::UI_MODE_NIGHT_ANY) {
+    minSdk = SDK_FROYO;
+  } else if ((config->screenLayout & ResTable_config::MASK_SCREENSIZE) !=
+                 ResTable_config::SCREENSIZE_ANY ||
+             (config->screenLayout & ResTable_config::MASK_SCREENLONG) !=
+                 ResTable_config::SCREENLONG_ANY ||
+             config->density != ResTable_config::DENSITY_DEFAULT) {
+    minSdk = SDK_DONUT;
+  }
 
-    if (minSdk > config->sdkVersion) {
-        config->sdkVersion = minSdk;
-    }
+  if (minSdk > config->sdkVersion) {
+    config->sdkVersion = minSdk;
+  }
 }
 
 ConfigDescription ConfigDescription::copyWithoutSdkVersion() const {
-    ConfigDescription copy = *this;
-    copy.sdkVersion = 0;
-    return copy;
+  ConfigDescription copy = *this;
+  copy.sdkVersion = 0;
+  return copy;
 }
 
 bool ConfigDescription::dominates(const ConfigDescription& o) const {
-    if (*this == defaultConfig() || *this == o) {
-        return true;
-    }
-    return matchWithDensity(o)
-            && !o.matchWithDensity(*this)
-            && !isMoreSpecificThan(o)
-            && !o.hasHigherPrecedenceThan(*this);
+  if (*this == defaultConfig() || *this == o) {
+    return true;
+  }
+  return matchWithDensity(o) && !o.matchWithDensity(*this) &&
+         !isMoreSpecificThan(o) && !o.hasHigherPrecedenceThan(*this);
 }
 
-bool ConfigDescription::hasHigherPrecedenceThan(const ConfigDescription& o) const {
-    // The order of the following tests defines the importance of one
-    // configuration parameter over another. Those tests first are more
-    // important, trumping any values in those following them.
-    // The ordering should be the same as ResTable_config#isBetterThan.
-    if (mcc || o.mcc) return (!o.mcc);
-    if (mnc || o.mnc) return (!o.mnc);
-    if (language[0] || o.language[0]) return (!o.language[0]);
-    if (country[0] || o.country[0]) return (!o.country[0]);
-    // Script and variant require either a language or country, both of which
-    // have higher precedence.
-    if ((screenLayout | o.screenLayout) & MASK_LAYOUTDIR) {
-        return !(o.screenLayout & MASK_LAYOUTDIR);
-    }
-    if (smallestScreenWidthDp || o.smallestScreenWidthDp) return (!o.smallestScreenWidthDp);
-    if (screenWidthDp || o.screenWidthDp) return (!o.screenWidthDp);
-    if (screenHeightDp || o.screenHeightDp) return (!o.screenHeightDp);
-    if ((screenLayout | o.screenLayout) & MASK_SCREENSIZE) {
-        return !(o.screenLayout & MASK_SCREENSIZE);
-    }
-    if ((screenLayout | o.screenLayout) & MASK_SCREENLONG) {
-        return !(o.screenLayout & MASK_SCREENLONG);
-    }
-    if ((screenLayout2 | o.screenLayout2) & MASK_SCREENROUND) {
-        return !(o.screenLayout2 & MASK_SCREENROUND);
-    }
-    if (orientation || o.orientation) return (!o.orientation);
-    if ((uiMode | o.uiMode) & MASK_UI_MODE_TYPE) {
-        return !(o.uiMode & MASK_UI_MODE_TYPE);
-    }
-    if ((uiMode | o.uiMode) & MASK_UI_MODE_NIGHT) {
-        return !(o.uiMode & MASK_UI_MODE_NIGHT);
-    }
-    if (density || o.density) return (!o.density);
-    if (touchscreen || o.touchscreen) return (!o.touchscreen);
-    if ((inputFlags | o.inputFlags) & MASK_KEYSHIDDEN) {
-        return !(o.inputFlags & MASK_KEYSHIDDEN);
-    }
-    if ((inputFlags | o.inputFlags) & MASK_NAVHIDDEN) {
-        return !(o.inputFlags & MASK_NAVHIDDEN);
-    }
-    if (keyboard || o.keyboard) return (!o.keyboard);
-    if (navigation || o.navigation) return (!o.navigation);
-    if (screenWidth || o.screenWidth) return (!o.screenWidth);
-    if (screenHeight || o.screenHeight) return (!o.screenHeight);
-    if (sdkVersion || o.sdkVersion) return (!o.sdkVersion);
-    if (minorVersion || o.minorVersion) return (!o.minorVersion);
-    // Both configurations have nothing defined except some possible future
-    // value. Returning the comparison of the two configurations is a
-    // "best effort" at this point to protect against incorrect dominations.
-    return *this != o;
+bool ConfigDescription::hasHigherPrecedenceThan(
+    const ConfigDescription& o) const {
+  // The order of the following tests defines the importance of one
+  // configuration parameter over another. Those tests first are more
+  // important, trumping any values in those following them.
+  // The ordering should be the same as ResTable_config#isBetterThan.
+  if (mcc || o.mcc) return (!o.mcc);
+  if (mnc || o.mnc) return (!o.mnc);
+  if (language[0] || o.language[0]) return (!o.language[0]);
+  if (country[0] || o.country[0]) return (!o.country[0]);
+  // Script and variant require either a language or country, both of which
+  // have higher precedence.
+  if ((screenLayout | o.screenLayout) & MASK_LAYOUTDIR) {
+    return !(o.screenLayout & MASK_LAYOUTDIR);
+  }
+  if (smallestScreenWidthDp || o.smallestScreenWidthDp)
+    return (!o.smallestScreenWidthDp);
+  if (screenWidthDp || o.screenWidthDp) return (!o.screenWidthDp);
+  if (screenHeightDp || o.screenHeightDp) return (!o.screenHeightDp);
+  if ((screenLayout | o.screenLayout) & MASK_SCREENSIZE) {
+    return !(o.screenLayout & MASK_SCREENSIZE);
+  }
+  if ((screenLayout | o.screenLayout) & MASK_SCREENLONG) {
+    return !(o.screenLayout & MASK_SCREENLONG);
+  }
+  if ((screenLayout2 | o.screenLayout2) & MASK_SCREENROUND) {
+    return !(o.screenLayout2 & MASK_SCREENROUND);
+  }
+  if (orientation || o.orientation) return (!o.orientation);
+  if ((uiMode | o.uiMode) & MASK_UI_MODE_TYPE) {
+    return !(o.uiMode & MASK_UI_MODE_TYPE);
+  }
+  if ((uiMode | o.uiMode) & MASK_UI_MODE_NIGHT) {
+    return !(o.uiMode & MASK_UI_MODE_NIGHT);
+  }
+  if (density || o.density) return (!o.density);
+  if (touchscreen || o.touchscreen) return (!o.touchscreen);
+  if ((inputFlags | o.inputFlags) & MASK_KEYSHIDDEN) {
+    return !(o.inputFlags & MASK_KEYSHIDDEN);
+  }
+  if ((inputFlags | o.inputFlags) & MASK_NAVHIDDEN) {
+    return !(o.inputFlags & MASK_NAVHIDDEN);
+  }
+  if (keyboard || o.keyboard) return (!o.keyboard);
+  if (navigation || o.navigation) return (!o.navigation);
+  if (screenWidth || o.screenWidth) return (!o.screenWidth);
+  if (screenHeight || o.screenHeight) return (!o.screenHeight);
+  if (sdkVersion || o.sdkVersion) return (!o.sdkVersion);
+  if (minorVersion || o.minorVersion) return (!o.minorVersion);
+  // Both configurations have nothing defined except some possible future
+  // value. Returning the comparison of the two configurations is a
+  // "best effort" at this point to protect against incorrect dominations.
+  return *this != o;
 }
 
 bool ConfigDescription::conflictsWith(const ConfigDescription& o) const {
-    // This method should be updated as new configuration parameters are
-    // introduced (e.g. screenConfig2).
-    auto pred = [](const uint32_t a, const uint32_t b) -> bool {
-        return a == 0 || b == 0 || a == b;
-    };
-    // The values here can be found in ResTable_config#match. Density and range
-    // values can't lead to conflicts, and are ignored.
-    return !pred(mcc, o.mcc)
-            || !pred(mnc, o.mnc)
-            || !pred(locale, o.locale)
-            || !pred(screenLayout & MASK_LAYOUTDIR, o.screenLayout & MASK_LAYOUTDIR)
-            || !pred(screenLayout & MASK_SCREENLONG, o.screenLayout & MASK_SCREENLONG)
-            || !pred(screenLayout & MASK_UI_MODE_TYPE, o.screenLayout & MASK_UI_MODE_TYPE)
-            || !pred(uiMode & MASK_UI_MODE_TYPE, o.uiMode & MASK_UI_MODE_TYPE)
-            || !pred(uiMode & MASK_UI_MODE_NIGHT, o.uiMode & MASK_UI_MODE_NIGHT)
-            || !pred(screenLayout2 & MASK_SCREENROUND, o.screenLayout2 & MASK_SCREENROUND)
-            || !pred(orientation, o.orientation)
-            || !pred(touchscreen, o.touchscreen)
-            || !pred(inputFlags & MASK_KEYSHIDDEN, o.inputFlags & MASK_KEYSHIDDEN)
-            || !pred(inputFlags & MASK_NAVHIDDEN, o.inputFlags & MASK_NAVHIDDEN)
-            || !pred(keyboard, o.keyboard)
-            || !pred(navigation, o.navigation);
+  // This method should be updated as new configuration parameters are
+  // introduced (e.g. screenConfig2).
+  auto pred = [](const uint32_t a, const uint32_t b) -> bool {
+    return a == 0 || b == 0 || a == b;
+  };
+  // The values here can be found in ResTable_config#match. Density and range
+  // values can't lead to conflicts, and are ignored.
+  return !pred(mcc, o.mcc) || !pred(mnc, o.mnc) || !pred(locale, o.locale) ||
+         !pred(screenLayout & MASK_LAYOUTDIR,
+               o.screenLayout & MASK_LAYOUTDIR) ||
+         !pred(screenLayout & MASK_SCREENLONG,
+               o.screenLayout & MASK_SCREENLONG) ||
+         !pred(screenLayout & MASK_UI_MODE_TYPE,
+               o.screenLayout & MASK_UI_MODE_TYPE) ||
+         !pred(uiMode & MASK_UI_MODE_TYPE, o.uiMode & MASK_UI_MODE_TYPE) ||
+         !pred(uiMode & MASK_UI_MODE_NIGHT, o.uiMode & MASK_UI_MODE_NIGHT) ||
+         !pred(screenLayout2 & MASK_SCREENROUND,
+               o.screenLayout2 & MASK_SCREENROUND) ||
+         !pred(orientation, o.orientation) ||
+         !pred(touchscreen, o.touchscreen) ||
+         !pred(inputFlags & MASK_KEYSHIDDEN, o.inputFlags & MASK_KEYSHIDDEN) ||
+         !pred(inputFlags & MASK_NAVHIDDEN, o.inputFlags & MASK_NAVHIDDEN) ||
+         !pred(keyboard, o.keyboard) || !pred(navigation, o.navigation);
 }
 
 bool ConfigDescription::isCompatibleWith(const ConfigDescription& o) const {
-    return !conflictsWith(o) && !dominates(o) && !o.dominates(*this);
+  return !conflictsWith(o) && !dominates(o) && !o.dominates(*this);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ConfigDescription.h b/tools/aapt2/ConfigDescription.h
index d801621..bb54886 100644
--- a/tools/aapt2/ConfigDescription.h
+++ b/tools/aapt2/ConfigDescription.h
@@ -29,148 +29,152 @@
  * initialization and comparison methods.
  */
 struct ConfigDescription : public android::ResTable_config {
-    /**
-     * Returns an immutable default config.
-     */
-    static const ConfigDescription& defaultConfig();
+  /**
+   * Returns an immutable default config.
+   */
+  static const ConfigDescription& defaultConfig();
 
-    /*
-     * Parse a string of the form 'fr-sw600dp-land' and fill in the
-     * given ResTable_config with resulting configuration parameters.
-     *
-     * The resulting configuration has the appropriate sdkVersion defined
-     * for backwards compatibility.
-     */
-    static bool parse(const StringPiece& str, ConfigDescription* out = nullptr);
+  /*
+   * Parse a string of the form 'fr-sw600dp-land' and fill in the
+   * given ResTable_config with resulting configuration parameters.
+   *
+   * The resulting configuration has the appropriate sdkVersion defined
+   * for backwards compatibility.
+   */
+  static bool parse(const StringPiece& str, ConfigDescription* out = nullptr);
 
-    /**
-     * If the configuration uses an axis that was added after
-     * the original Android release, make sure the SDK version
-     * is set accordingly.
-     */
-    static void applyVersionForCompatibility(ConfigDescription* config);
+  /**
+   * If the configuration uses an axis that was added after
+   * the original Android release, make sure the SDK version
+   * is set accordingly.
+   */
+  static void applyVersionForCompatibility(ConfigDescription* config);
 
-    ConfigDescription();
-    ConfigDescription(const android::ResTable_config& o);  // NOLINT(implicit)
-    ConfigDescription(const ConfigDescription& o);
-    ConfigDescription(ConfigDescription&& o);
+  ConfigDescription();
+  ConfigDescription(const android::ResTable_config& o);  // NOLINT(implicit)
+  ConfigDescription(const ConfigDescription& o);
+  ConfigDescription(ConfigDescription&& o);
 
-    ConfigDescription& operator=(const android::ResTable_config& o);
-    ConfigDescription& operator=(const ConfigDescription& o);
-    ConfigDescription& operator=(ConfigDescription&& o);
+  ConfigDescription& operator=(const android::ResTable_config& o);
+  ConfigDescription& operator=(const ConfigDescription& o);
+  ConfigDescription& operator=(ConfigDescription&& o);
 
-    ConfigDescription copyWithoutSdkVersion() const;
+  ConfigDescription copyWithoutSdkVersion() const;
 
-    /**
-     * A configuration X dominates another configuration Y, if X has at least the
-     * precedence of Y and X is strictly more general than Y: for any type defined
-     * by X, the same type is defined by Y with a value equal to or, in the case
-     * of ranges, more specific than that of X.
-     *
-     * For example, the configuration 'en-w800dp' dominates 'en-rGB-w1024dp'. It
-     * does not dominate 'fr', 'en-w720dp', or 'mcc001-en-w800dp'.
-     */
-    bool dominates(const ConfigDescription& o) const;
+  /**
+   * A configuration X dominates another configuration Y, if X has at least the
+   * precedence of Y and X is strictly more general than Y: for any type defined
+   * by X, the same type is defined by Y with a value equal to or, in the case
+   * of ranges, more specific than that of X.
+   *
+   * For example, the configuration 'en-w800dp' dominates 'en-rGB-w1024dp'. It
+   * does not dominate 'fr', 'en-w720dp', or 'mcc001-en-w800dp'.
+   */
+  bool dominates(const ConfigDescription& o) const;
 
-    /**
-     * Returns true if this configuration defines a more important configuration
-     * parameter than o. For example, "en" has higher precedence than "v23",
-     * whereas "en" has the same precedence as "en-v23".
-     */
-    bool hasHigherPrecedenceThan(const ConfigDescription& o) const;
+  /**
+   * Returns true if this configuration defines a more important configuration
+   * parameter than o. For example, "en" has higher precedence than "v23",
+   * whereas "en" has the same precedence as "en-v23".
+   */
+  bool hasHigherPrecedenceThan(const ConfigDescription& o) const;
 
-    /**
-     * A configuration conflicts with another configuration if both
-     * configurations define an incompatible configuration parameter. An
-     * incompatible configuration parameter is a non-range, non-density parameter
-     * that is defined in both configurations as a different, non-default value.
-     */
-    bool conflictsWith(const ConfigDescription& o) const;
+  /**
+   * A configuration conflicts with another configuration if both
+   * configurations define an incompatible configuration parameter. An
+   * incompatible configuration parameter is a non-range, non-density parameter
+   * that is defined in both configurations as a different, non-default value.
+   */
+  bool conflictsWith(const ConfigDescription& o) const;
 
-    /**
-     * A configuration is compatible with another configuration if both
-     * configurations can match a common concrete device configuration and are
-     * unrelated by domination. For example, land-v11 conflicts with port-v21
-     * but is compatible with v21 (both land-v11 and v21 would match en-land-v23).
-     */
-    bool isCompatibleWith(const ConfigDescription& o) const;
+  /**
+   * A configuration is compatible with another configuration if both
+   * configurations can match a common concrete device configuration and are
+   * unrelated by domination. For example, land-v11 conflicts with port-v21
+   * but is compatible with v21 (both land-v11 and v21 would match en-land-v23).
+   */
+  bool isCompatibleWith(const ConfigDescription& o) const;
 
-    bool matchWithDensity(const ConfigDescription& o) const;
+  bool matchWithDensity(const ConfigDescription& o) const;
 
-    bool operator<(const ConfigDescription& o) const;
-    bool operator<=(const ConfigDescription& o) const;
-    bool operator==(const ConfigDescription& o) const;
-    bool operator!=(const ConfigDescription& o) const;
-    bool operator>=(const ConfigDescription& o) const;
-    bool operator>(const ConfigDescription& o) const;
+  bool operator<(const ConfigDescription& o) const;
+  bool operator<=(const ConfigDescription& o) const;
+  bool operator==(const ConfigDescription& o) const;
+  bool operator!=(const ConfigDescription& o) const;
+  bool operator>=(const ConfigDescription& o) const;
+  bool operator>(const ConfigDescription& o) const;
 };
 
 inline ConfigDescription::ConfigDescription() {
-    memset(this, 0, sizeof(*this));
-    size = sizeof(android::ResTable_config);
+  memset(this, 0, sizeof(*this));
+  size = sizeof(android::ResTable_config);
 }
 
 inline ConfigDescription::ConfigDescription(const android::ResTable_config& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
-    size = sizeof(android::ResTable_config);
+  *static_cast<android::ResTable_config*>(this) = o;
+  size = sizeof(android::ResTable_config);
 }
 
 inline ConfigDescription::ConfigDescription(const ConfigDescription& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
+  *static_cast<android::ResTable_config*>(this) = o;
 }
 
 inline ConfigDescription::ConfigDescription(ConfigDescription&& o) {
-    *this = o;
+  *this = o;
 }
 
-inline ConfigDescription& ConfigDescription::operator=(const android::ResTable_config& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
-    size = sizeof(android::ResTable_config);
-    return *this;
+inline ConfigDescription& ConfigDescription::operator=(
+    const android::ResTable_config& o) {
+  *static_cast<android::ResTable_config*>(this) = o;
+  size = sizeof(android::ResTable_config);
+  return *this;
 }
 
-inline ConfigDescription& ConfigDescription::operator=(const ConfigDescription& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
-    return *this;
+inline ConfigDescription& ConfigDescription::operator=(
+    const ConfigDescription& o) {
+  *static_cast<android::ResTable_config*>(this) = o;
+  return *this;
 }
 
 inline ConfigDescription& ConfigDescription::operator=(ConfigDescription&& o) {
-    *this = o;
-    return *this;
+  *this = o;
+  return *this;
 }
 
-inline bool ConfigDescription::matchWithDensity(const ConfigDescription& o) const {
-    return match(o) && (density == 0 || density == o.density);
+inline bool ConfigDescription::matchWithDensity(
+    const ConfigDescription& o) const {
+  return match(o) && (density == 0 || density == o.density);
 }
 
 inline bool ConfigDescription::operator<(const ConfigDescription& o) const {
-    return compare(o) < 0;
+  return compare(o) < 0;
 }
 
 inline bool ConfigDescription::operator<=(const ConfigDescription& o) const {
-    return compare(o) <= 0;
+  return compare(o) <= 0;
 }
 
 inline bool ConfigDescription::operator==(const ConfigDescription& o) const {
-    return compare(o) == 0;
+  return compare(o) == 0;
 }
 
 inline bool ConfigDescription::operator!=(const ConfigDescription& o) const {
-    return compare(o) != 0;
+  return compare(o) != 0;
 }
 
 inline bool ConfigDescription::operator>=(const ConfigDescription& o) const {
-    return compare(o) >= 0;
+  return compare(o) >= 0;
 }
 
 inline bool ConfigDescription::operator>(const ConfigDescription& o) const {
-    return compare(o) > 0;
+  return compare(o) > 0;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ConfigDescription& o) {
-    return out << o.toString().string();
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ConfigDescription& o) {
+  return out << o.toString().string();
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_CONFIG_DESCRIPTION_H
+#endif  // AAPT_CONFIG_DESCRIPTION_H
diff --git a/tools/aapt2/ConfigDescription_test.cpp b/tools/aapt2/ConfigDescription_test.cpp
index 455a57f..66b7d47 100644
--- a/tools/aapt2/ConfigDescription_test.cpp
+++ b/tools/aapt2/ConfigDescription_test.cpp
@@ -23,76 +23,79 @@
 
 namespace aapt {
 
-static ::testing::AssertionResult TestParse(const StringPiece& input,
-                                            ConfigDescription* config = nullptr) {
-    if (ConfigDescription::parse(input, config)) {
-        return ::testing::AssertionSuccess() << input << " was successfully parsed";
-    }
-    return ::testing::AssertionFailure() << input << " could not be parsed";
+static ::testing::AssertionResult TestParse(
+    const StringPiece& input, ConfigDescription* config = nullptr) {
+  if (ConfigDescription::parse(input, config)) {
+    return ::testing::AssertionSuccess() << input << " was successfully parsed";
+  }
+  return ::testing::AssertionFailure() << input << " could not be parsed";
 }
 
 TEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreOutOfOrder) {
-    EXPECT_FALSE(TestParse("en-sw600dp-ldrtl"));
-    EXPECT_FALSE(TestParse("land-en"));
-    EXPECT_FALSE(TestParse("hdpi-320dpi"));
+  EXPECT_FALSE(TestParse("en-sw600dp-ldrtl"));
+  EXPECT_FALSE(TestParse("land-en"));
+  EXPECT_FALSE(TestParse("hdpi-320dpi"));
 }
 
 TEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreNotMatched) {
-    EXPECT_FALSE(TestParse("en-sw600dp-ILLEGAL"));
+  EXPECT_FALSE(TestParse("en-sw600dp-ILLEGAL"));
 }
 
 TEST(ConfigDescriptionTest, ParseFailWhenQualifiersHaveTrailingDash) {
-    EXPECT_FALSE(TestParse("en-sw600dp-land-"));
+  EXPECT_FALSE(TestParse("en-sw600dp-land-"));
 }
 
 TEST(ConfigDescriptionTest, ParseBasicQualifiers) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("", &config));
-    EXPECT_EQ(std::string(""), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("", &config));
+  EXPECT_EQ(std::string(""), config.toString().string());
 
-    EXPECT_TRUE(TestParse("fr-land", &config));
-    EXPECT_EQ(std::string("fr-land"), config.toString().string());
+  EXPECT_TRUE(TestParse("fr-land", &config));
+  EXPECT_EQ(std::string("fr-land"), config.toString().string());
 
-    EXPECT_TRUE(TestParse("mcc310-pl-sw720dp-normal-long-port-night-"
-                "xhdpi-keyssoft-qwerty-navexposed-nonav", &config));
-    EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-"
-                "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"), config.toString().string());
+  EXPECT_TRUE(
+      TestParse("mcc310-pl-sw720dp-normal-long-port-night-"
+                "xhdpi-keyssoft-qwerty-navexposed-nonav",
+                &config));
+  EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-"
+                        "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"),
+            config.toString().string());
 }
 
 TEST(ConfigDescriptionTest, ParseLocales) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("en-rUS", &config));
-    EXPECT_EQ(std::string("en-rUS"), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("en-rUS", &config));
+  EXPECT_EQ(std::string("en-rUS"), config.toString().string());
 }
 
 TEST(ConfigDescriptionTest, ParseQualifierAddedInApi13) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("sw600dp", &config));
-    EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("sw600dp", &config));
+  EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
 
-    EXPECT_TRUE(TestParse("sw600dp-v8", &config));
-    EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
+  EXPECT_TRUE(TestParse("sw600dp-v8", &config));
+  EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
 }
 
 TEST(ConfigDescriptionTest, ParseCarAttribute) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("car", &config));
-    EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode);
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("car", &config));
+  EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode);
 }
 
 TEST(ConfigDescriptionTest, TestParsingRoundQualifier) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("round", &config));
-    EXPECT_EQ(android::ResTable_config::SCREENROUND_YES,
-    config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
-    EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
-    EXPECT_EQ(std::string("round-v23"), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("round", &config));
+  EXPECT_EQ(android::ResTable_config::SCREENROUND_YES,
+            config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
+  EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
+  EXPECT_EQ(std::string("round-v23"), config.toString().string());
 
-    EXPECT_TRUE(TestParse("notround", &config));
-    EXPECT_EQ(android::ResTable_config::SCREENROUND_NO,
-              config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
-    EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
-    EXPECT_EQ(std::string("notround-v23"), config.toString().string());
+  EXPECT_TRUE(TestParse("notround", &config));
+  EXPECT_EQ(android::ResTable_config::SCREENROUND_NO,
+            config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
+  EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
+  EXPECT_EQ(std::string("notround-v23"), config.toString().string());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp
index 304e571..965db9e 100644
--- a/tools/aapt2/Debug.cpp
+++ b/tools/aapt2/Debug.cpp
@@ -17,8 +17,8 @@
 #include "Debug.h"
 #include "ResourceTable.h"
 #include "ResourceValues.h"
-#include "util/Util.h"
 #include "ValueVisitor.h"
+#include "util/Util.h"
 
 #include <algorithm>
 #include <iostream>
@@ -31,275 +31,279 @@
 namespace aapt {
 
 class PrintVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    void visit(Attribute* attr) override {
-        std::cout << "(attr) type=";
-        attr->printMask(&std::cout);
-        static constexpr uint32_t kMask = android::ResTable_map::TYPE_ENUM |
-            android::ResTable_map::TYPE_FLAGS;
-        if (attr->typeMask & kMask) {
-            for (const auto& symbol : attr->symbols) {
-                std::cout << "\n        " << symbol.symbol.name.value().entry;
-                if (symbol.symbol.id) {
-                    std::cout << " (" << symbol.symbol.id.value() << ")";
-                }
-                std::cout << " = " << symbol.value;
-            }
+  void visit(Attribute* attr) override {
+    std::cout << "(attr) type=";
+    attr->printMask(&std::cout);
+    static constexpr uint32_t kMask =
+        android::ResTable_map::TYPE_ENUM | android::ResTable_map::TYPE_FLAGS;
+    if (attr->typeMask & kMask) {
+      for (const auto& symbol : attr->symbols) {
+        std::cout << "\n        " << symbol.symbol.name.value().entry;
+        if (symbol.symbol.id) {
+          std::cout << " (" << symbol.symbol.id.value() << ")";
         }
+        std::cout << " = " << symbol.value;
+      }
     }
+  }
 
-    void visit(Style* style) override {
-        std::cout << "(style)";
-        if (style->parent) {
-            const Reference& parentRef = style->parent.value();
-            std::cout << " parent=";
-            if (parentRef.name) {
-                if (parentRef.privateReference) {
-                    std::cout << "*";
-                }
-                std::cout << parentRef.name.value() << " ";
-            }
-
-            if (parentRef.id) {
-                std::cout << parentRef.id.value();
-            }
+  void visit(Style* style) override {
+    std::cout << "(style)";
+    if (style->parent) {
+      const Reference& parentRef = style->parent.value();
+      std::cout << " parent=";
+      if (parentRef.name) {
+        if (parentRef.privateReference) {
+          std::cout << "*";
         }
+        std::cout << parentRef.name.value() << " ";
+      }
 
-        for (const auto& entry : style->entries) {
-            std::cout << "\n        ";
-            if (entry.key.name) {
-                const ResourceName& name = entry.key.name.value();
-                if (!name.package.empty()) {
-                    std::cout << name.package << ":";
-                }
-                std::cout << name.entry;
-            }
+      if (parentRef.id) {
+        std::cout << parentRef.id.value();
+      }
+    }
 
-            if (entry.key.id) {
-                std::cout << "(" << entry.key.id.value() << ")";
-            }
-
-            std::cout << "=" << *entry.value;
+    for (const auto& entry : style->entries) {
+      std::cout << "\n        ";
+      if (entry.key.name) {
+        const ResourceName& name = entry.key.name.value();
+        if (!name.package.empty()) {
+          std::cout << name.package << ":";
         }
+        std::cout << name.entry;
+      }
+
+      if (entry.key.id) {
+        std::cout << "(" << entry.key.id.value() << ")";
+      }
+
+      std::cout << "=" << *entry.value;
     }
+  }
 
-    void visit(Array* array) override {
-        array->print(&std::cout);
-    }
+  void visit(Array* array) override { array->print(&std::cout); }
 
-    void visit(Plural* plural) override {
-        plural->print(&std::cout);
-    }
+  void visit(Plural* plural) override { plural->print(&std::cout); }
 
-    void visit(Styleable* styleable) override {
-        std::cout << "(styleable)";
-        for (const auto& attr : styleable->entries) {
-            std::cout << "\n        ";
-            if (attr.name) {
-                const ResourceName& name = attr.name.value();
-                if (!name.package.empty()) {
-                    std::cout << name.package << ":";
-                }
-                std::cout << name.entry;
-            }
-
-            if (attr.id) {
-                std::cout << "(" << attr.id.value() << ")";
-            }
+  void visit(Styleable* styleable) override {
+    std::cout << "(styleable)";
+    for (const auto& attr : styleable->entries) {
+      std::cout << "\n        ";
+      if (attr.name) {
+        const ResourceName& name = attr.name.value();
+        if (!name.package.empty()) {
+          std::cout << name.package << ":";
         }
-    }
+        std::cout << name.entry;
+      }
 
-    void visitItem(Item* item) override {
-        item->print(&std::cout);
+      if (attr.id) {
+        std::cout << "(" << attr.id.value() << ")";
+      }
     }
+  }
+
+  void visitItem(Item* item) override { item->print(&std::cout); }
 };
 
-void Debug::printTable(ResourceTable* table, const DebugPrintTableOptions& options) {
-    PrintVisitor visitor;
+void Debug::printTable(ResourceTable* table,
+                       const DebugPrintTableOptions& options) {
+  PrintVisitor visitor;
 
-    for (auto& package : table->packages) {
-        std::cout << "Package name=" << package->name;
-        if (package->id) {
-            std::cout << " id=" << std::hex << (int) package->id.value() << std::dec;
+  for (auto& package : table->packages) {
+    std::cout << "Package name=" << package->name;
+    if (package->id) {
+      std::cout << " id=" << std::hex << (int)package->id.value() << std::dec;
+    }
+    std::cout << std::endl;
+
+    for (const auto& type : package->types) {
+      std::cout << "\n  type " << type->type;
+      if (type->id) {
+        std::cout << " id=" << std::hex << (int)type->id.value() << std::dec;
+      }
+      std::cout << " entryCount=" << type->entries.size() << std::endl;
+
+      std::vector<const ResourceEntry*> sortedEntries;
+      for (const auto& entry : type->entries) {
+        auto iter = std::lower_bound(
+            sortedEntries.begin(), sortedEntries.end(), entry.get(),
+            [](const ResourceEntry* a, const ResourceEntry* b) -> bool {
+              if (a->id && b->id) {
+                return a->id.value() < b->id.value();
+              } else if (a->id) {
+                return true;
+              } else {
+                return false;
+              }
+            });
+        sortedEntries.insert(iter, entry.get());
+      }
+
+      for (const ResourceEntry* entry : sortedEntries) {
+        ResourceId id(package->id ? package->id.value() : uint8_t(0),
+                      type->id ? type->id.value() : uint8_t(0),
+                      entry->id ? entry->id.value() : uint16_t(0));
+        ResourceName name(package->name, type->type, entry->name);
+
+        std::cout << "    spec resource " << id << " " << name;
+        switch (entry->symbolStatus.state) {
+          case SymbolState::kPublic:
+            std::cout << " PUBLIC";
+            break;
+          case SymbolState::kPrivate:
+            std::cout << " _PRIVATE_";
+            break;
+          default:
+            break;
         }
+
         std::cout << std::endl;
 
-        for (const auto& type : package->types) {
-            std::cout << "\n  type " << type->type;
-            if (type->id) {
-                std::cout << " id=" << std::hex << (int) type->id.value() << std::dec;
-            }
-            std::cout << " entryCount=" << type->entries.size() << std::endl;
-
-            std::vector<const ResourceEntry*> sortedEntries;
-            for (const auto& entry : type->entries) {
-                auto iter = std::lower_bound(sortedEntries.begin(), sortedEntries.end(), entry.get(),
-                        [](const ResourceEntry* a, const ResourceEntry* b) -> bool {
-                            if (a->id && b->id) {
-                                return a->id.value() < b->id.value();
-                            } else if (a->id) {
-                                return true;
-                            } else {
-                                return false;
-                            }
-                        });
-                sortedEntries.insert(iter, entry.get());
-            }
-
-            for (const ResourceEntry* entry : sortedEntries) {
-                ResourceId id(package->id ? package->id.value() : uint8_t(0),
-                              type->id ? type->id.value() : uint8_t(0),
-                              entry->id ? entry->id.value() : uint16_t(0));
-                ResourceName name(package->name, type->type, entry->name);
-
-                std::cout << "    spec resource " << id << " " << name;
-                switch (entry->symbolStatus.state) {
-                case SymbolState::kPublic: std::cout << " PUBLIC"; break;
-                case SymbolState::kPrivate: std::cout << " _PRIVATE_"; break;
-                default: break;
-                }
-
-                std::cout << std::endl;
-
-                for (const auto& value : entry->values) {
-                    std::cout << "      (" << value->config << ") ";
-                    value->value->accept(&visitor);
-                    if (options.showSources && !value->value->getSource().path.empty()) {
-                        std::cout << " src=" << value->value->getSource();
-                    }
-                    std::cout << std::endl;
-                }
-            }
+        for (const auto& value : entry->values) {
+          std::cout << "      (" << value->config << ") ";
+          value->value->accept(&visitor);
+          if (options.showSources && !value->value->getSource().path.empty()) {
+            std::cout << " src=" << value->value->getSource();
+          }
+          std::cout << std::endl;
         }
+      }
     }
+  }
 }
 
-static size_t getNodeIndex(const std::vector<ResourceName>& names, const ResourceName& name) {
-    auto iter = std::lower_bound(names.begin(), names.end(), name);
-    assert(iter != names.end() && *iter == name);
-    return std::distance(names.begin(), iter);
+static size_t getNodeIndex(const std::vector<ResourceName>& names,
+                           const ResourceName& name) {
+  auto iter = std::lower_bound(names.begin(), names.end(), name);
+  assert(iter != names.end() && *iter == name);
+  return std::distance(names.begin(), iter);
 }
 
-void Debug::printStyleGraph(ResourceTable* table, const ResourceName& targetStyle) {
-    std::map<ResourceName, std::set<ResourceName>> graph;
+void Debug::printStyleGraph(ResourceTable* table,
+                            const ResourceName& targetStyle) {
+  std::map<ResourceName, std::set<ResourceName>> graph;
 
-    std::queue<ResourceName> stylesToVisit;
-    stylesToVisit.push(targetStyle);
-    for (; !stylesToVisit.empty(); stylesToVisit.pop()) {
-        const ResourceName& styleName = stylesToVisit.front();
-        std::set<ResourceName>& parents = graph[styleName];
-        if (!parents.empty()) {
-            // We've already visited this style.
-            continue;
+  std::queue<ResourceName> stylesToVisit;
+  stylesToVisit.push(targetStyle);
+  for (; !stylesToVisit.empty(); stylesToVisit.pop()) {
+    const ResourceName& styleName = stylesToVisit.front();
+    std::set<ResourceName>& parents = graph[styleName];
+    if (!parents.empty()) {
+      // We've already visited this style.
+      continue;
+    }
+
+    Maybe<ResourceTable::SearchResult> result = table->findResource(styleName);
+    if (result) {
+      ResourceEntry* entry = result.value().entry;
+      for (const auto& value : entry->values) {
+        if (Style* style = valueCast<Style>(value->value.get())) {
+          if (style->parent && style->parent.value().name) {
+            parents.insert(style->parent.value().name.value());
+            stylesToVisit.push(style->parent.value().name.value());
+          }
         }
-
-        Maybe<ResourceTable::SearchResult> result = table->findResource(styleName);
-        if (result) {
-            ResourceEntry* entry = result.value().entry;
-            for (const auto& value : entry->values) {
-                if (Style* style = valueCast<Style>(value->value.get())) {
-                    if (style->parent && style->parent.value().name) {
-                        parents.insert(style->parent.value().name.value());
-                        stylesToVisit.push(style->parent.value().name.value());
-                    }
-                }
-            }
-        }
+      }
     }
+  }
 
-    std::vector<ResourceName> names;
-    for (const auto& entry : graph) {
-        names.push_back(entry.first);
+  std::vector<ResourceName> names;
+  for (const auto& entry : graph) {
+    names.push_back(entry.first);
+  }
+
+  std::cout << "digraph styles {\n";
+  for (const auto& name : names) {
+    std::cout << "  node_" << getNodeIndex(names, name) << " [label=\"" << name
+              << "\"];\n";
+  }
+
+  for (const auto& entry : graph) {
+    const ResourceName& styleName = entry.first;
+    size_t styleNodeIndex = getNodeIndex(names, styleName);
+
+    for (const auto& parentName : entry.second) {
+      std::cout << "  node_" << styleNodeIndex << " -> "
+                << "node_" << getNodeIndex(names, parentName) << ";\n";
     }
+  }
 
-    std::cout << "digraph styles {\n";
-    for (const auto& name : names) {
-        std::cout << "  node_" << getNodeIndex(names, name)
-                  << " [label=\"" << name << "\"];\n";
-    }
-
-    for (const auto& entry : graph) {
-        const ResourceName& styleName = entry.first;
-        size_t styleNodeIndex = getNodeIndex(names, styleName);
-
-        for (const auto& parentName : entry.second) {
-            std::cout << "  node_" << styleNodeIndex << " -> "
-                      << "node_" << getNodeIndex(names, parentName) << ";\n";
-        }
-    }
-
-    std::cout << "}" << std::endl;
+  std::cout << "}" << std::endl;
 }
 
 void Debug::dumpHex(const void* data, size_t len) {
-    const uint8_t* d = (const uint8_t*) data;
-    for (size_t i = 0; i < len; i++) {
-        std::cerr << std::hex << std::setfill('0') << std::setw(2) << (uint32_t) d[i] << " ";
-        if (i % 8 == 7) {
-            std::cerr << "\n";
-        }
+  const uint8_t* d = (const uint8_t*)data;
+  for (size_t i = 0; i < len; i++) {
+    std::cerr << std::hex << std::setfill('0') << std::setw(2) << (uint32_t)d[i]
+              << " ";
+    if (i % 8 == 7) {
+      std::cerr << "\n";
     }
+  }
 
-    if (len - 1 % 8 != 7) {
-        std::cerr << std::endl;
-    }
+  if (len - 1 % 8 != 7) {
+    std::cerr << std::endl;
+  }
 }
 
 namespace {
 
 class XmlPrinter : public xml::Visitor {
-public:
-    using xml::Visitor::visit;
+ public:
+  using xml::Visitor::visit;
 
-    void visit(xml::Element* el) override {
-        std::cerr << mPrefix;
-        std::cerr << "E: ";
-        if (!el->namespaceUri.empty()) {
-            std::cerr << el->namespaceUri << ":";
-        }
-        std::cerr << el->name << " (line=" << el->lineNumber << ")\n";
+  void visit(xml::Element* el) override {
+    std::cerr << mPrefix;
+    std::cerr << "E: ";
+    if (!el->namespaceUri.empty()) {
+      std::cerr << el->namespaceUri << ":";
+    }
+    std::cerr << el->name << " (line=" << el->lineNumber << ")\n";
 
-        for (const xml::Attribute& attr : el->attributes) {
-            std::cerr << mPrefix << "  A: ";
-            if (!attr.namespaceUri.empty()) {
-                std::cerr << attr.namespaceUri << ":";
-            }
-            std::cerr << attr.name << "=" << attr.value << "\n";
-        }
-
-        const size_t previousSize = mPrefix.size();
-        mPrefix += "  ";
-        xml::Visitor::visit(el);
-        mPrefix.resize(previousSize);
+    for (const xml::Attribute& attr : el->attributes) {
+      std::cerr << mPrefix << "  A: ";
+      if (!attr.namespaceUri.empty()) {
+        std::cerr << attr.namespaceUri << ":";
+      }
+      std::cerr << attr.name << "=" << attr.value << "\n";
     }
 
-    void visit(xml::Namespace* ns) override {
-        std::cerr << mPrefix;
-        std::cerr << "N: " << ns->namespacePrefix << "=" << ns->namespaceUri
-                << " (line=" << ns->lineNumber << ")\n";
+    const size_t previousSize = mPrefix.size();
+    mPrefix += "  ";
+    xml::Visitor::visit(el);
+    mPrefix.resize(previousSize);
+  }
 
-        const size_t previousSize = mPrefix.size();
-        mPrefix += "  ";
-        xml::Visitor::visit(ns);
-        mPrefix.resize(previousSize);
-    }
+  void visit(xml::Namespace* ns) override {
+    std::cerr << mPrefix;
+    std::cerr << "N: " << ns->namespacePrefix << "=" << ns->namespaceUri
+              << " (line=" << ns->lineNumber << ")\n";
 
-    void visit(xml::Text* text) override {
-        std::cerr << mPrefix;
-        std::cerr << "T: '" << text->text << "'\n";
-    }
+    const size_t previousSize = mPrefix.size();
+    mPrefix += "  ";
+    xml::Visitor::visit(ns);
+    mPrefix.resize(previousSize);
+  }
 
-private:
-    std::string mPrefix;
+  void visit(xml::Text* text) override {
+    std::cerr << mPrefix;
+    std::cerr << "T: '" << text->text << "'\n";
+  }
+
+ private:
+  std::string mPrefix;
 };
 
-} // namespace
+}  // namespace
 
 void Debug::dumpXml(xml::XmlResource* doc) {
-    XmlPrinter printer;
-    doc->root->accept(&printer);
+  XmlPrinter printer;
+  doc->root->accept(&printer);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Debug.h b/tools/aapt2/Debug.h
index c0fcbf1..bd92ec1 100644
--- a/tools/aapt2/Debug.h
+++ b/tools/aapt2/Debug.h
@@ -27,17 +27,18 @@
 namespace aapt {
 
 struct DebugPrintTableOptions {
-    bool showSources = false;
+  bool showSources = false;
 };
 
 struct Debug {
-    static void printTable(ResourceTable* table, const DebugPrintTableOptions& options = {});
-    static void printStyleGraph(ResourceTable* table,
-                                const ResourceName& targetStyle);
-    static void dumpHex(const void* data, size_t len);
-    static void dumpXml(xml::XmlResource* doc);
+  static void printTable(ResourceTable* table,
+                         const DebugPrintTableOptions& options = {});
+  static void printStyleGraph(ResourceTable* table,
+                              const ResourceName& targetStyle);
+  static void dumpHex(const void* data, size_t len);
+  static void dumpXml(xml::XmlResource* doc);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_DEBUG_H
+#endif  // AAPT_DEBUG_H
diff --git a/tools/aapt2/Diagnostics.h b/tools/aapt2/Diagnostics.h
index 725027c..d39cf4c 100644
--- a/tools/aapt2/Diagnostics.h
+++ b/tools/aapt2/Diagnostics.h
@@ -29,119 +29,112 @@
 namespace aapt {
 
 struct DiagMessageActual {
-    Source source;
-    std::string message;
+  Source source;
+  std::string message;
 };
 
 struct DiagMessage {
-private:
-    Source mSource;
-    std::stringstream mMessage;
+ private:
+  Source mSource;
+  std::stringstream mMessage;
 
-public:
-    DiagMessage() = default;
+ public:
+  DiagMessage() = default;
 
-    explicit DiagMessage(const StringPiece& src) : mSource(src) {
-    }
+  explicit DiagMessage(const StringPiece& src) : mSource(src) {}
 
-    explicit DiagMessage(const Source& src) : mSource(src) {
-    }
+  explicit DiagMessage(const Source& src) : mSource(src) {}
 
-    explicit DiagMessage(size_t line) : mSource(Source().withLine(line)) {
-    }
+  explicit DiagMessage(size_t line) : mSource(Source().withLine(line)) {}
 
-    template <typename T>
-    DiagMessage& operator<<(const T& value) {
-        mMessage << value;
-        return *this;
-    }
+  template <typename T>
+  DiagMessage& operator<<(const T& value) {
+    mMessage << value;
+    return *this;
+  }
 
-    DiagMessageActual build() const {
-        return DiagMessageActual{ mSource, mMessage.str() };
-    }
+  DiagMessageActual build() const {
+    return DiagMessageActual{mSource, mMessage.str()};
+  }
 };
 
 struct IDiagnostics {
-    virtual ~IDiagnostics() = default;
+  virtual ~IDiagnostics() = default;
 
-    enum class Level {
-        Note,
-        Warn,
-        Error
-    };
+  enum class Level { Note, Warn, Error };
 
-    virtual void log(Level level, DiagMessageActual& actualMsg) = 0;
+  virtual void log(Level level, DiagMessageActual& actualMsg) = 0;
 
-    virtual void error(const DiagMessage& message) {
-        DiagMessageActual actual = message.build();
-        log(Level::Error, actual);
-    }
+  virtual void error(const DiagMessage& message) {
+    DiagMessageActual actual = message.build();
+    log(Level::Error, actual);
+  }
 
-    virtual void warn(const DiagMessage& message) {
-        DiagMessageActual actual = message.build();
-        log(Level::Warn, actual);
-    }
+  virtual void warn(const DiagMessage& message) {
+    DiagMessageActual actual = message.build();
+    log(Level::Warn, actual);
+  }
 
-    virtual void note(const DiagMessage& message) {
-        DiagMessageActual actual = message.build();
-        log(Level::Note, actual);
-    }
+  virtual void note(const DiagMessage& message) {
+    DiagMessageActual actual = message.build();
+    log(Level::Note, actual);
+  }
 };
 
 class StdErrDiagnostics : public IDiagnostics {
-public:
-    StdErrDiagnostics() = default;
+ public:
+  StdErrDiagnostics() = default;
 
-    void log(Level level, DiagMessageActual& actualMsg) override {
-        const char* tag;
+  void log(Level level, DiagMessageActual& actualMsg) override {
+    const char* tag;
 
-        switch (level) {
-        case Level::Error:
-            mNumErrors++;
-            if (mNumErrors > 20) {
-                return;
-            }
-            tag = "error";
-            break;
-
-        case Level::Warn:
-            tag = "warn";
-            break;
-
-        case Level::Note:
-            tag = "note";
-            break;
+    switch (level) {
+      case Level::Error:
+        mNumErrors++;
+        if (mNumErrors > 20) {
+          return;
         }
+        tag = "error";
+        break;
 
-        if (!actualMsg.source.path.empty()) {
-            std::cerr << actualMsg.source << ": ";
-        }
-        std::cerr << tag << ": " << actualMsg.message << "." << std::endl;
+      case Level::Warn:
+        tag = "warn";
+        break;
+
+      case Level::Note:
+        tag = "note";
+        break;
     }
 
-private:
-    size_t mNumErrors = 0;
+    if (!actualMsg.source.path.empty()) {
+      std::cerr << actualMsg.source << ": ";
+    }
+    std::cerr << tag << ": " << actualMsg.message << "." << std::endl;
+  }
 
-    DISALLOW_COPY_AND_ASSIGN(StdErrDiagnostics);
+ private:
+  size_t mNumErrors = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(StdErrDiagnostics);
 };
 
 class SourcePathDiagnostics : public IDiagnostics {
-public:
-    SourcePathDiagnostics(const Source& src, IDiagnostics* diag) : mSource(src), mDiag(diag) {
-    }
+ public:
+  SourcePathDiagnostics(const Source& src, IDiagnostics* diag)
+      : mSource(src), mDiag(diag) {}
 
-    void log(Level level, DiagMessageActual& actualMsg) override {
-        actualMsg.source.path = mSource.path;
-        mDiag->log(level, actualMsg);
-    }
+  void log(Level level, DiagMessageActual& actualMsg) override {
+    actualMsg.source.path = mSource.path;
+    mDiag->log(level, actualMsg);
+  }
 
-private:
-    Source mSource;
-    IDiagnostics* mDiag;
+ private:
+  Source mSource;
+  IDiagnostics* mDiag;
 
-    DISALLOW_COPY_AND_ASSIGN(SourcePathDiagnostics);
+  DISALLOW_COPY_AND_ASSIGN(SourcePathDiagnostics);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_DIAGNOSTICS_H */
diff --git a/tools/aapt2/DominatorTree.cpp b/tools/aapt2/DominatorTree.cpp
index 29587a8..8f6f783 100644
--- a/tools/aapt2/DominatorTree.cpp
+++ b/tools/aapt2/DominatorTree.cpp
@@ -14,76 +14,78 @@
  * limitations under the License.
  */
 
-#include "ConfigDescription.h"
 #include "DominatorTree.h"
+#include "ConfigDescription.h"
 
 #include <algorithm>
 
 namespace aapt {
 
 DominatorTree::DominatorTree(
-        const std::vector<std::unique_ptr<ResourceConfigValue>>& configs) {
-    for (const auto& config : configs) {
-        mProductRoots[config->product].tryAddChild(
-                util::make_unique<Node>(config.get(), nullptr));
-    }
+    const std::vector<std::unique_ptr<ResourceConfigValue>>& configs) {
+  for (const auto& config : configs) {
+    mProductRoots[config->product].tryAddChild(
+        util::make_unique<Node>(config.get(), nullptr));
+  }
 }
 
 void DominatorTree::accept(Visitor* visitor) {
-    for (auto& entry : mProductRoots) {
-        visitor->visitTree(entry.first, &entry.second);
-    }
+  for (auto& entry : mProductRoots) {
+    visitor->visitTree(entry.first, &entry.second);
+  }
 }
 
 bool DominatorTree::Node::tryAddChild(std::unique_ptr<Node> newChild) {
-    assert(newChild->mValue && "cannot add a root or empty node as a child");
-    if (mValue && !dominates(newChild.get())) {
-        // This is not the root and the child dominates us.
-        return false;
-    }
-    return addChild(std::move(newChild));
+  assert(newChild->mValue && "cannot add a root or empty node as a child");
+  if (mValue && !dominates(newChild.get())) {
+    // This is not the root and the child dominates us.
+    return false;
+  }
+  return addChild(std::move(newChild));
 }
 
 bool DominatorTree::Node::addChild(std::unique_ptr<Node> newChild) {
-    bool hasDominatedChildren = false;
-    // Demote children dominated by the new config.
-    for (auto& child : mChildren) {
-        if (newChild->dominates(child.get())) {
-            child->mParent = newChild.get();
-            newChild->mChildren.push_back(std::move(child));
-            child = {};
-            hasDominatedChildren = true;
-        }
+  bool hasDominatedChildren = false;
+  // Demote children dominated by the new config.
+  for (auto& child : mChildren) {
+    if (newChild->dominates(child.get())) {
+      child->mParent = newChild.get();
+      newChild->mChildren.push_back(std::move(child));
+      child = {};
+      hasDominatedChildren = true;
     }
-    // Remove dominated children.
-    if (hasDominatedChildren) {
-        mChildren.erase(std::remove_if(mChildren.begin(), mChildren.end(),
-                [](const std::unique_ptr<Node>& child) -> bool {
-            return child == nullptr;
-        }), mChildren.end());
+  }
+  // Remove dominated children.
+  if (hasDominatedChildren) {
+    mChildren.erase(
+        std::remove_if(mChildren.begin(), mChildren.end(),
+                       [](const std::unique_ptr<Node>& child) -> bool {
+                         return child == nullptr;
+                       }),
+        mChildren.end());
+  }
+  // Add the new config to a child if a child dominates the new config.
+  for (auto& child : mChildren) {
+    if (child->dominates(newChild.get())) {
+      child->addChild(std::move(newChild));
+      return true;
     }
-    // Add the new config to a child if a child dominates the new config.
-    for (auto& child : mChildren) {
-        if (child->dominates(newChild.get())) {
-            child->addChild(std::move(newChild));
-            return true;
-        }
-    }
-    // The new config is not dominated by a child, so add it here.
-    newChild->mParent = this;
-    mChildren.push_back(std::move(newChild));
-    return true;
+  }
+  // The new config is not dominated by a child, so add it here.
+  newChild->mParent = this;
+  mChildren.push_back(std::move(newChild));
+  return true;
 }
 
 bool DominatorTree::Node::dominates(const Node* other) const {
-    // Check root node dominations.
-    if (other->isRootNode()) {
-        return isRootNode();
-    } else if (isRootNode()) {
-        return true;
-    }
-    // Neither node is a root node; compare the configurations.
-    return mValue->config.dominates(other->mValue->config);
+  // Check root node dominations.
+  if (other->isRootNode()) {
+    return isRootNode();
+  } else if (isRootNode()) {
+    return true;
+  }
+  // Neither node is a root node; compare the configurations.
+  return mValue->config.dominates(other->mValue->config);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/DominatorTree.h b/tools/aapt2/DominatorTree.h
index ad2df0e..6d45b5d 100644
--- a/tools/aapt2/DominatorTree.h
+++ b/tools/aapt2/DominatorTree.h
@@ -46,82 +46,76 @@
  * will exhibit undefined behavior.
  */
 class DominatorTree {
-public:
-    explicit DominatorTree(const std::vector<std::unique_ptr<ResourceConfigValue>>& configs);
+ public:
+  explicit DominatorTree(
+      const std::vector<std::unique_ptr<ResourceConfigValue>>& configs);
 
-    class Node {
-    public:
-        explicit Node(ResourceConfigValue* value = nullptr, Node* parent = nullptr) :
-                mValue(value), mParent(parent) {
-        }
+  class Node {
+   public:
+    explicit Node(ResourceConfigValue* value = nullptr, Node* parent = nullptr)
+        : mValue(value), mParent(parent) {}
 
-        inline ResourceConfigValue* value() const {
-            return mValue;
-        }
+    inline ResourceConfigValue* value() const { return mValue; }
 
-        inline Node* parent() const {
-            return mParent;
-        }
+    inline Node* parent() const { return mParent; }
 
-        inline bool isRootNode() const {
-            return !mValue;
-        }
+    inline bool isRootNode() const { return !mValue; }
 
-        inline const std::vector<std::unique_ptr<Node>>& children() const {
-            return mChildren;
-        }
-
-        bool tryAddChild(std::unique_ptr<Node> newChild);
-
-    private:
-        bool addChild(std::unique_ptr<Node> newChild);
-        bool dominates(const Node* other) const;
-
-        ResourceConfigValue* mValue;
-        Node* mParent;
-        std::vector<std::unique_ptr<Node>> mChildren;
-
-        DISALLOW_COPY_AND_ASSIGN(Node);
-    };
-
-    struct Visitor {
-        virtual ~Visitor() = default;
-        virtual void visitTree(const std::string& product, Node* root) = 0;
-    };
-
-    class BottomUpVisitor : public Visitor {
-    public:
-        virtual ~BottomUpVisitor() = default;
-
-        void visitTree(const std::string& product, Node* root) override {
-            for (auto& child : root->children()) {
-                visitNode(child.get());
-            }
-        }
-
-        virtual void visitConfig(Node* node) = 0;
-
-    private:
-        void visitNode(Node* node) {
-            for (auto& child : node->children()) {
-                visitNode(child.get());
-            }
-            visitConfig(node);
-        }
-    };
-
-    void accept(Visitor* visitor);
-
-    inline const std::map<std::string, Node>& getProductRoots() const {
-        return mProductRoots;
+    inline const std::vector<std::unique_ptr<Node>>& children() const {
+      return mChildren;
     }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(DominatorTree);
+    bool tryAddChild(std::unique_ptr<Node> newChild);
 
-    std::map<std::string, Node> mProductRoots;
+   private:
+    bool addChild(std::unique_ptr<Node> newChild);
+    bool dominates(const Node* other) const;
+
+    ResourceConfigValue* mValue;
+    Node* mParent;
+    std::vector<std::unique_ptr<Node>> mChildren;
+
+    DISALLOW_COPY_AND_ASSIGN(Node);
+  };
+
+  struct Visitor {
+    virtual ~Visitor() = default;
+    virtual void visitTree(const std::string& product, Node* root) = 0;
+  };
+
+  class BottomUpVisitor : public Visitor {
+   public:
+    virtual ~BottomUpVisitor() = default;
+
+    void visitTree(const std::string& product, Node* root) override {
+      for (auto& child : root->children()) {
+        visitNode(child.get());
+      }
+    }
+
+    virtual void visitConfig(Node* node) = 0;
+
+   private:
+    void visitNode(Node* node) {
+      for (auto& child : node->children()) {
+        visitNode(child.get());
+      }
+      visitConfig(node);
+    }
+  };
+
+  void accept(Visitor* visitor);
+
+  inline const std::map<std::string, Node>& getProductRoots() const {
+    return mProductRoots;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DominatorTree);
+
+  std::map<std::string, Node> mProductRoots;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_DOMINATOR_TREE_H
+#endif  // AAPT_DOMINATOR_TREE_H
diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp
index fb850e4da..a42d2f7 100644
--- a/tools/aapt2/DominatorTree_test.cpp
+++ b/tools/aapt2/DominatorTree_test.cpp
@@ -27,125 +27,132 @@
 namespace {
 
 class PrettyPrinter : public DominatorTree::Visitor {
-public:
-    explicit PrettyPrinter(const int indent = 2) : mIndent(indent) {
-    }
+ public:
+  explicit PrettyPrinter(const int indent = 2) : mIndent(indent) {}
 
-    void visitTree(const std::string& product, DominatorTree::Node* root) override {
-        for (auto& child : root->children()) {
-            visitNode(child.get(), 0);
-        }
+  void visitTree(const std::string& product,
+                 DominatorTree::Node* root) override {
+    for (auto& child : root->children()) {
+      visitNode(child.get(), 0);
     }
+  }
 
-    std::string toString(DominatorTree* tree) {
-        mBuffer.str("");
-        mBuffer.clear();
-        tree->accept(this);
-        return mBuffer.str();
+  std::string toString(DominatorTree* tree) {
+    mBuffer.str("");
+    mBuffer.clear();
+    tree->accept(this);
+    return mBuffer.str();
+  }
+
+ private:
+  void visitConfig(const DominatorTree::Node* node, const int indent) {
+    auto configString = node->value()->config.toString();
+    mBuffer << std::string(indent, ' ')
+            << (configString.isEmpty() ? "<default>" : configString)
+            << std::endl;
+  }
+
+  void visitNode(const DominatorTree::Node* node, const int indent) {
+    visitConfig(node, indent);
+    for (const auto& child : node->children()) {
+      visitNode(child.get(), indent + mIndent);
     }
+  }
 
-private:
-    void visitConfig(const DominatorTree::Node* node, const int indent) {
-        auto configString = node->value()->config.toString();
-        mBuffer << std::string(indent, ' ')
-                << (configString.isEmpty() ? "<default>" : configString)
-                << std::endl;
-    }
-
-    void visitNode(const DominatorTree::Node* node, const int indent) {
-        visitConfig(node, indent);
-        for (const auto& child : node->children()) {
-            visitNode(child.get(), indent + mIndent);
-        }
-    }
-
-    std::stringstream mBuffer;
-    const int mIndent = 2;
+  std::stringstream mBuffer;
+  const int mIndent = 2;
 };
 
-} // namespace
+}  // namespace
 
 TEST(DominatorTreeTest, DefaultDominatesEverything) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
-    const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land-v13");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  const ConfigDescription sw600dpLandConfig =
+      test::parseConfigOrDie("sw600dp-land-v13");
 
-    std::vector<std::unique_ptr<ResourceConfigValue>> configs;
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
 
-    DominatorTree tree(configs);
-    PrettyPrinter printer;
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
 
-    std::string expected =
-            "<default>\n"
-            "  land\n"
-            "  sw600dp-land-v13\n";
-    EXPECT_EQ(expected, printer.toString(&tree));
+  std::string expected =
+      "<default>\n"
+      "  land\n"
+      "  sw600dp-land-v13\n";
+  EXPECT_EQ(expected, printer.toString(&tree));
 }
 
 TEST(DominatorTreeTest, ProductsAreDominatedSeparately) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
-    const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land-v13");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  const ConfigDescription sw600dpLandConfig =
+      test::parseConfigOrDie("sw600dp-land-v13");
 
-    std::vector<std::unique_ptr<ResourceConfigValue>> configs;
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, "phablet"));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, "phablet"));
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(defaultConfig, "phablet"));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpLandConfig, "phablet"));
 
-    DominatorTree tree(configs);
-    PrettyPrinter printer;
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
 
-    std::string expected =
-            "<default>\n"
-            "  land\n"
-            "<default>\n"
-            "  sw600dp-land-v13\n";
-    EXPECT_EQ(expected, printer.toString(&tree));
+  std::string expected =
+      "<default>\n"
+      "  land\n"
+      "<default>\n"
+      "  sw600dp-land-v13\n";
+  EXPECT_EQ(expected, printer.toString(&tree));
 }
 
 TEST(DominatorTreeTest, MoreSpecificConfigurationsAreDominated) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription enConfig = test::parseConfigOrDie("en");
-    const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
-    const ConfigDescription ldrtlConfig = test::parseConfigOrDie("ldrtl-v4");
-    const ConfigDescription ldrtlXhdpiConfig = test::parseConfigOrDie("ldrtl-xhdpi-v4");
-    const ConfigDescription sw300dpConfig = test::parseConfigOrDie("sw300dp-v13");
-    const ConfigDescription sw540dpConfig = test::parseConfigOrDie("sw540dp-v14");
-    const ConfigDescription sw600dpConfig = test::parseConfigOrDie("sw600dp-v14");
-    const ConfigDescription sw720dpConfig = test::parseConfigOrDie("sw720dp-v13");
-    const ConfigDescription v20Config = test::parseConfigOrDie("v20");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription enConfig = test::parseConfigOrDie("en");
+  const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
+  const ConfigDescription ldrtlConfig = test::parseConfigOrDie("ldrtl-v4");
+  const ConfigDescription ldrtlXhdpiConfig =
+      test::parseConfigOrDie("ldrtl-xhdpi-v4");
+  const ConfigDescription sw300dpConfig = test::parseConfigOrDie("sw300dp-v13");
+  const ConfigDescription sw540dpConfig = test::parseConfigOrDie("sw540dp-v14");
+  const ConfigDescription sw600dpConfig = test::parseConfigOrDie("sw600dp-v14");
+  const ConfigDescription sw720dpConfig = test::parseConfigOrDie("sw720dp-v13");
+  const ConfigDescription v20Config = test::parseConfigOrDie("v20");
 
-    std::vector<std::unique_ptr<ResourceConfigValue>> configs;
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(enConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(enV21Config, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlXhdpiConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw300dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw540dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw720dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(v20Config, ""));
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(enConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(enV21Config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlConfig, ""));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(ldrtlXhdpiConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw300dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw540dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw720dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(v20Config, ""));
 
-    DominatorTree tree(configs);
-    PrettyPrinter printer;
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
 
-    std::string expected =
-            "<default>\n"
-            "  en\n"
-            "    en-v21\n"
-            "  ldrtl-v4\n"
-            "    ldrtl-xhdpi-v4\n"
-            "  sw300dp-v13\n"
-            "    sw540dp-v14\n"
-            "      sw600dp-v14\n"
-            "    sw720dp-v13\n"
-            "  v20\n";
-    EXPECT_EQ(expected, printer.toString(&tree));
+  std::string expected =
+      "<default>\n"
+      "  en\n"
+      "    en-v21\n"
+      "  ldrtl-v4\n"
+      "    ldrtl-xhdpi-v4\n"
+      "  sw300dp-v13\n"
+      "    sw540dp-v14\n"
+      "      sw600dp-v14\n"
+      "    sw720dp-v13\n"
+      "  v20\n";
+  EXPECT_EQ(expected, printer.toString(&tree));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Flags.cpp b/tools/aapt2/Flags.cpp
index 3731ac7..cb16196 100644
--- a/tools/aapt2/Flags.cpp
+++ b/tools/aapt2/Flags.cpp
@@ -25,155 +25,167 @@
 
 namespace aapt {
 
-Flags& Flags::requiredFlag(const StringPiece& name, const StringPiece& description,
-                         std::string* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        *value = arg.toString();
-        return true;
-    };
+Flags& Flags::requiredFlag(const StringPiece& name,
+                           const StringPiece& description, std::string* value) {
+  auto func = [value](const StringPiece& arg) -> bool {
+    *value = arg.toString();
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, true, 1, false});
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, true, 1, false});
+  return *this;
 }
 
-Flags& Flags::requiredFlagList(const StringPiece& name, const StringPiece& description,
+Flags& Flags::requiredFlagList(const StringPiece& name,
+                               const StringPiece& description,
                                std::vector<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        value->push_back(arg.toString());
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    value->push_back(arg.toString());
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, true, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, true, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalFlag(const StringPiece& name, const StringPiece& description,
+Flags& Flags::optionalFlag(const StringPiece& name,
+                           const StringPiece& description,
                            Maybe<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        *value = arg.toString();
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    *value = arg.toString();
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description,
+Flags& Flags::optionalFlagList(const StringPiece& name,
+                               const StringPiece& description,
                                std::vector<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        value->push_back(arg.toString());
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    value->push_back(arg.toString());
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description,
+Flags& Flags::optionalFlagList(const StringPiece& name,
+                               const StringPiece& description,
                                std::unordered_set<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        value->insert(arg.toString());
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    value->insert(arg.toString());
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalSwitch(const StringPiece& name, const StringPiece& description,
-                             bool* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        *value = true;
-        return true;
-    };
+Flags& Flags::optionalSwitch(const StringPiece& name,
+                             const StringPiece& description, bool* value) {
+  auto func = [value](const StringPiece& arg) -> bool {
+    *value = true;
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 0, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 0, false});
+  return *this;
 }
 
 void Flags::usage(const StringPiece& command, std::ostream* out) {
-    constexpr size_t kWidth = 50;
+  constexpr size_t kWidth = 50;
 
-    *out << command << " [options]";
-    for (const Flag& flag : mFlags) {
-        if (flag.required) {
-            *out << " " << flag.name << " arg";
-        }
+  *out << command << " [options]";
+  for (const Flag& flag : mFlags) {
+    if (flag.required) {
+      *out << " " << flag.name << " arg";
+    }
+  }
+
+  *out << " files...\n\nOptions:\n";
+
+  for (const Flag& flag : mFlags) {
+    std::string argLine = flag.name;
+    if (flag.numArgs > 0) {
+      argLine += " arg";
     }
 
-    *out << " files...\n\nOptions:\n";
-
-    for (const Flag& flag : mFlags) {
-        std::string argLine = flag.name;
-        if (flag.numArgs > 0) {
-            argLine += " arg";
-        }
-
-        // Split the description by newlines and write out the argument (which is empty after
-        // the first line) followed by the description line. This will make sure that multiline
-        // descriptions are still right justified and aligned.
-        for (StringPiece line : util::tokenize(flag.description, '\n')) {
-            *out << " " << std::setw(kWidth) << std::left << argLine << line << "\n";
-            argLine = " ";
-        }
+    // Split the description by newlines and write out the argument (which is
+    // empty after
+    // the first line) followed by the description line. This will make sure
+    // that multiline
+    // descriptions are still right justified and aligned.
+    for (StringPiece line : util::tokenize(flag.description, '\n')) {
+      *out << " " << std::setw(kWidth) << std::left << argLine << line << "\n";
+      argLine = " ";
     }
-    *out << " " << std::setw(kWidth) << std::left << "-h" << "Displays this help menu\n";
-    out->flush();
+  }
+  *out << " " << std::setw(kWidth) << std::left << "-h"
+       << "Displays this help menu\n";
+  out->flush();
 }
 
-bool Flags::parse(const StringPiece& command, const std::vector<StringPiece>& args,
+bool Flags::parse(const StringPiece& command,
+                  const std::vector<StringPiece>& args,
                   std::ostream* outError) {
-    for (size_t i = 0; i < args.size(); i++) {
-        StringPiece arg = args[i];
-        if (*(arg.data()) != '-') {
-            mArgs.push_back(arg.toString());
-            continue;
-        }
-
-        if (arg == "-h" || arg == "--help") {
-            usage(command, outError);
-            return false;
-        }
-
-        bool match = false;
-        for (Flag& flag : mFlags) {
-            if (arg == flag.name) {
-                if (flag.numArgs > 0) {
-                    i++;
-                    if (i >= args.size()) {
-                        *outError << flag.name << " missing argument.\n\n";
-                        usage(command, outError);
-                        return false;
-                    }
-                    flag.action(args[i]);
-                } else {
-                    flag.action({});
-                }
-                flag.parsed = true;
-                match = true;
-                break;
-            }
-        }
-
-        if (!match) {
-            *outError << "unknown option '" << arg << "'.\n\n";
-            usage(command, outError);
-            return false;
-        }
+  for (size_t i = 0; i < args.size(); i++) {
+    StringPiece arg = args[i];
+    if (*(arg.data()) != '-') {
+      mArgs.push_back(arg.toString());
+      continue;
     }
 
-    for (const Flag& flag : mFlags) {
-        if (flag.required && !flag.parsed) {
-            *outError << "missing required flag " << flag.name << "\n\n";
+    if (arg == "-h" || arg == "--help") {
+      usage(command, outError);
+      return false;
+    }
+
+    bool match = false;
+    for (Flag& flag : mFlags) {
+      if (arg == flag.name) {
+        if (flag.numArgs > 0) {
+          i++;
+          if (i >= args.size()) {
+            *outError << flag.name << " missing argument.\n\n";
             usage(command, outError);
             return false;
+          }
+          flag.action(args[i]);
+        } else {
+          flag.action({});
         }
+        flag.parsed = true;
+        match = true;
+        break;
+      }
     }
-    return true;
+
+    if (!match) {
+      *outError << "unknown option '" << arg << "'.\n\n";
+      usage(command, outError);
+      return false;
+    }
+  }
+
+  for (const Flag& flag : mFlags) {
+    if (flag.required && !flag.parsed) {
+      *outError << "missing required flag " << flag.name << "\n\n";
+      usage(command, outError);
+      return false;
+    }
+  }
+  return true;
 }
 
-const std::vector<std::string>& Flags::getArgs() {
-    return mArgs;
-}
+const std::vector<std::string>& Flags::getArgs() { return mArgs; }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Flags.h b/tools/aapt2/Flags.h
index b092855..4a0efdb 100644
--- a/tools/aapt2/Flags.h
+++ b/tools/aapt2/Flags.h
@@ -29,42 +29,45 @@
 namespace aapt {
 
 class Flags {
-public:
-    Flags& requiredFlag(const StringPiece& name, const StringPiece& description,
-                        std::string* value);
-    Flags& requiredFlagList(const StringPiece& name, const StringPiece& description,
-                            std::vector<std::string>* value);
-    Flags& optionalFlag(const StringPiece& name, const StringPiece& description,
-                        Maybe<std::string>* value);
-    Flags& optionalFlagList(const StringPiece& name, const StringPiece& description,
-                            std::vector<std::string>* value);
-    Flags& optionalFlagList(const StringPiece& name, const StringPiece& description,
-                            std::unordered_set<std::string>* value);
-    Flags& optionalSwitch(const StringPiece& name, const StringPiece& description,
-                          bool* value);
+ public:
+  Flags& requiredFlag(const StringPiece& name, const StringPiece& description,
+                      std::string* value);
+  Flags& requiredFlagList(const StringPiece& name,
+                          const StringPiece& description,
+                          std::vector<std::string>* value);
+  Flags& optionalFlag(const StringPiece& name, const StringPiece& description,
+                      Maybe<std::string>* value);
+  Flags& optionalFlagList(const StringPiece& name,
+                          const StringPiece& description,
+                          std::vector<std::string>* value);
+  Flags& optionalFlagList(const StringPiece& name,
+                          const StringPiece& description,
+                          std::unordered_set<std::string>* value);
+  Flags& optionalSwitch(const StringPiece& name, const StringPiece& description,
+                        bool* value);
 
-    void usage(const StringPiece& command, std::ostream* out);
+  void usage(const StringPiece& command, std::ostream* out);
 
-    bool parse(const StringPiece& command, const std::vector<StringPiece>& args,
-               std::ostream* outError);
+  bool parse(const StringPiece& command, const std::vector<StringPiece>& args,
+             std::ostream* outError);
 
-    const std::vector<std::string>& getArgs();
+  const std::vector<std::string>& getArgs();
 
-private:
-    struct Flag {
-        std::string name;
-        std::string description;
-        std::function<bool(const StringPiece& value)> action;
-        bool required;
-        size_t numArgs;
+ private:
+  struct Flag {
+    std::string name;
+    std::string description;
+    std::function<bool(const StringPiece& value)> action;
+    bool required;
+    size_t numArgs;
 
-        bool parsed;
-    };
+    bool parsed;
+  };
 
-    std::vector<Flag> mFlags;
-    std::vector<std::string> mArgs;
+  std::vector<Flag> mFlags;
+  std::vector<std::string> mArgs;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_FLAGS_H
+#endif  // AAPT_FLAGS_H
diff --git a/tools/aapt2/Locale.cpp b/tools/aapt2/Locale.cpp
index f7956c0..a0f7641 100644
--- a/tools/aapt2/Locale.cpp
+++ b/tools/aapt2/Locale.cpp
@@ -17,8 +17,8 @@
 #include "Locale.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <ctype.h>
+#include <algorithm>
 #include <string>
 #include <vector>
 
@@ -27,225 +27,226 @@
 using android::ResTable_config;
 
 void LocaleValue::setLanguage(const char* languageChars) {
-     size_t i = 0;
-     while ((*languageChars) != '\0') {
-          language[i++] = ::tolower(*languageChars);
-          languageChars++;
-     }
+  size_t i = 0;
+  while ((*languageChars) != '\0') {
+    language[i++] = ::tolower(*languageChars);
+    languageChars++;
+  }
 }
 
 void LocaleValue::setRegion(const char* regionChars) {
-    size_t i = 0;
-    while ((*regionChars) != '\0') {
-         region[i++] = ::toupper(*regionChars);
-         regionChars++;
-    }
+  size_t i = 0;
+  while ((*regionChars) != '\0') {
+    region[i++] = ::toupper(*regionChars);
+    regionChars++;
+  }
 }
 
 void LocaleValue::setScript(const char* scriptChars) {
-    size_t i = 0;
-    while ((*scriptChars) != '\0') {
-         if (i == 0) {
-             script[i++] = ::toupper(*scriptChars);
-         } else {
-             script[i++] = ::tolower(*scriptChars);
-         }
-         scriptChars++;
+  size_t i = 0;
+  while ((*scriptChars) != '\0') {
+    if (i == 0) {
+      script[i++] = ::toupper(*scriptChars);
+    } else {
+      script[i++] = ::tolower(*scriptChars);
     }
+    scriptChars++;
+  }
 }
 
 void LocaleValue::setVariant(const char* variantChars) {
-     size_t i = 0;
-     while ((*variantChars) != '\0') {
-          variant[i++] = *variantChars;
-          variantChars++;
-     }
+  size_t i = 0;
+  while ((*variantChars) != '\0') {
+    variant[i++] = *variantChars;
+    variantChars++;
+  }
 }
 
 static inline bool isAlpha(const std::string& str) {
-    return std::all_of(std::begin(str), std::end(str), ::isalpha);
+  return std::all_of(std::begin(str), std::end(str), ::isalpha);
 }
 
 static inline bool isNumber(const std::string& str) {
-    return std::all_of(std::begin(str), std::end(str), ::isdigit);
+  return std::all_of(std::begin(str), std::end(str), ::isdigit);
 }
 
 bool LocaleValue::initFromFilterString(const StringPiece& str) {
-     // A locale (as specified in the filter) is an underscore separated name such
-     // as "en_US", "en_Latn_US", or "en_US_POSIX".
-     std::vector<std::string> parts = util::splitAndLowercase(str, '_');
+  // A locale (as specified in the filter) is an underscore separated name such
+  // as "en_US", "en_Latn_US", or "en_US_POSIX".
+  std::vector<std::string> parts = util::splitAndLowercase(str, '_');
 
-     const int numTags = parts.size();
-     bool valid = false;
-     if (numTags >= 1) {
-         const std::string& lang = parts[0];
-         if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) {
-             setLanguage(lang.c_str());
-             valid = true;
-         }
-     }
+  const int numTags = parts.size();
+  bool valid = false;
+  if (numTags >= 1) {
+    const std::string& lang = parts[0];
+    if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) {
+      setLanguage(lang.c_str());
+      valid = true;
+    }
+  }
 
-     if (!valid || numTags == 1) {
-         return valid;
-     }
+  if (!valid || numTags == 1) {
+    return valid;
+  }
 
-     // At this point, valid == true && numTags > 1.
-     const std::string& part2 = parts[1];
-     if ((part2.length() == 2 && isAlpha(part2)) ||
-         (part2.length() == 3 && isNumber(part2))) {
-         setRegion(part2.c_str());
-     } else if (part2.length() == 4 && isAlpha(part2)) {
-         setScript(part2.c_str());
-     } else if (part2.length() >= 4 && part2.length() <= 8) {
-         setVariant(part2.c_str());
-     } else {
-         valid = false;
-     }
+  // At this point, valid == true && numTags > 1.
+  const std::string& part2 = parts[1];
+  if ((part2.length() == 2 && isAlpha(part2)) ||
+      (part2.length() == 3 && isNumber(part2))) {
+    setRegion(part2.c_str());
+  } else if (part2.length() == 4 && isAlpha(part2)) {
+    setScript(part2.c_str());
+  } else if (part2.length() >= 4 && part2.length() <= 8) {
+    setVariant(part2.c_str());
+  } else {
+    valid = false;
+  }
 
-     if (!valid || numTags == 2) {
-         return valid;
-     }
+  if (!valid || numTags == 2) {
+    return valid;
+  }
 
-     // At this point, valid == true && numTags > 1.
-     const std::string& part3 = parts[2];
-     if (((part3.length() == 2 && isAlpha(part3)) ||
-         (part3.length() == 3 && isNumber(part3))) && script[0]) {
-         setRegion(part3.c_str());
-     } else if (part3.length() >= 4 && part3.length() <= 8) {
-         setVariant(part3.c_str());
-     } else {
-         valid = false;
-     }
+  // At this point, valid == true && numTags > 1.
+  const std::string& part3 = parts[2];
+  if (((part3.length() == 2 && isAlpha(part3)) ||
+       (part3.length() == 3 && isNumber(part3))) &&
+      script[0]) {
+    setRegion(part3.c_str());
+  } else if (part3.length() >= 4 && part3.length() <= 8) {
+    setVariant(part3.c_str());
+  } else {
+    valid = false;
+  }
 
-     if (!valid || numTags == 3) {
-         return valid;
-     }
+  if (!valid || numTags == 3) {
+    return valid;
+  }
 
-     const std::string& part4 = parts[3];
-     if (part4.length() >= 4 && part4.length() <= 8) {
-         setVariant(part4.c_str());
-     } else {
-         valid = false;
-     }
+  const std::string& part4 = parts[3];
+  if (part4.length() >= 4 && part4.length() <= 8) {
+    setVariant(part4.c_str());
+  } else {
+    valid = false;
+  }
 
-     if (!valid || numTags > 4) {
-         return false;
-     }
+  if (!valid || numTags > 4) {
+    return false;
+  }
 
-     return true;
+  return true;
 }
 
 ssize_t LocaleValue::initFromParts(std::vector<std::string>::iterator iter,
-        std::vector<std::string>::iterator end) {
-    const std::vector<std::string>::iterator startIter = iter;
+                                   std::vector<std::string>::iterator end) {
+  const std::vector<std::string>::iterator startIter = iter;
 
-    std::string& part = *iter;
-    if (part[0] == 'b' && part[1] == '+') {
-        // This is a "modified" BCP 47 language tag. Same semantics as BCP 47 tags,
-        // except that the separator is "+" and not "-".
-        std::vector<std::string> subtags = util::splitAndLowercase(part, '+');
-        subtags.erase(subtags.begin());
-        if (subtags.size() == 1) {
-            setLanguage(subtags[0].c_str());
-        } else if (subtags.size() == 2) {
-            setLanguage(subtags[0].c_str());
+  std::string& part = *iter;
+  if (part[0] == 'b' && part[1] == '+') {
+    // This is a "modified" BCP 47 language tag. Same semantics as BCP 47 tags,
+    // except that the separator is "+" and not "-".
+    std::vector<std::string> subtags = util::splitAndLowercase(part, '+');
+    subtags.erase(subtags.begin());
+    if (subtags.size() == 1) {
+      setLanguage(subtags[0].c_str());
+    } else if (subtags.size() == 2) {
+      setLanguage(subtags[0].c_str());
 
-            // The second tag can either be a region, a variant or a script.
-            switch (subtags[1].size()) {
-                case 2:
-                case 3:
-                    setRegion(subtags[1].c_str());
-                    break;
-                case 4:
-                    if ('0' <= subtags[1][0] && subtags[1][0] <= '9') {
-                        // This is a variant: fall through
-                    } else {
-                        setScript(subtags[1].c_str());
-                        break;
-                    }
-                case 5:
-                case 6:
-                case 7:
-                case 8:
-                    setVariant(subtags[1].c_str());
-                    break;
-                default:
-                    return -1;
-            }
-        } else if (subtags.size() == 3) {
-            // The language is always the first subtag.
-            setLanguage(subtags[0].c_str());
-
-            // The second subtag can either be a script or a region code.
-            // If its size is 4, it's a script code, else it's a region code.
-            if (subtags[1].size() == 4) {
-                setScript(subtags[1].c_str());
-            } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
-                setRegion(subtags[1].c_str());
-            } else {
-                return -1;
-            }
-
-            // The third tag can either be a region code (if the second tag was
-            // a script), else a variant code.
-            if (subtags[2].size() >= 4) {
-                setVariant(subtags[2].c_str());
-            } else {
-                setRegion(subtags[2].c_str());
-            }
-        } else if (subtags.size() == 4) {
-            setLanguage(subtags[0].c_str());
+      // The second tag can either be a region, a variant or a script.
+      switch (subtags[1].size()) {
+        case 2:
+        case 3:
+          setRegion(subtags[1].c_str());
+          break;
+        case 4:
+          if ('0' <= subtags[1][0] && subtags[1][0] <= '9') {
+            // This is a variant: fall through
+          } else {
             setScript(subtags[1].c_str());
-            setRegion(subtags[2].c_str());
-            setVariant(subtags[3].c_str());
-        } else {
-            return -1;
-        }
+            break;
+          }
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+          setVariant(subtags[1].c_str());
+          break;
+        default:
+          return -1;
+      }
+    } else if (subtags.size() == 3) {
+      // The language is always the first subtag.
+      setLanguage(subtags[0].c_str());
 
-        ++iter;
+      // The second subtag can either be a script or a region code.
+      // If its size is 4, it's a script code, else it's a region code.
+      if (subtags[1].size() == 4) {
+        setScript(subtags[1].c_str());
+      } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
+        setRegion(subtags[1].c_str());
+      } else {
+        return -1;
+      }
 
+      // The third tag can either be a region code (if the second tag was
+      // a script), else a variant code.
+      if (subtags[2].size() >= 4) {
+        setVariant(subtags[2].c_str());
+      } else {
+        setRegion(subtags[2].c_str());
+      }
+    } else if (subtags.size() == 4) {
+      setLanguage(subtags[0].c_str());
+      setScript(subtags[1].c_str());
+      setRegion(subtags[2].c_str());
+      setVariant(subtags[3].c_str());
     } else {
-        if ((part.length() == 2 || part.length() == 3)
-                && isAlpha(part) && part != "car") {
-            setLanguage(part.c_str());
-            ++iter;
-
-            if (iter != end) {
-                const std::string& regionPart = *iter;
-                if (regionPart.c_str()[0] == 'r' && regionPart.length() == 3) {
-                    setRegion(regionPart.c_str() + 1);
-                    ++iter;
-                }
-            }
-        }
+      return -1;
     }
 
-    return static_cast<ssize_t>(iter - startIter);
+    ++iter;
+
+  } else {
+    if ((part.length() == 2 || part.length() == 3) && isAlpha(part) &&
+        part != "car") {
+      setLanguage(part.c_str());
+      ++iter;
+
+      if (iter != end) {
+        const std::string& regionPart = *iter;
+        if (regionPart.c_str()[0] == 'r' && regionPart.length() == 3) {
+          setRegion(regionPart.c_str() + 1);
+          ++iter;
+        }
+      }
+    }
+  }
+
+  return static_cast<ssize_t>(iter - startIter);
 }
 
 void LocaleValue::initFromResTable(const ResTable_config& config) {
-    config.unpackLanguage(language);
-    config.unpackRegion(region);
-    if (config.localeScript[0] && !config.localeScriptWasComputed) {
-        memcpy(script, config.localeScript, sizeof(config.localeScript));
-    }
+  config.unpackLanguage(language);
+  config.unpackRegion(region);
+  if (config.localeScript[0] && !config.localeScriptWasComputed) {
+    memcpy(script, config.localeScript, sizeof(config.localeScript));
+  }
 
-    if (config.localeVariant[0]) {
-        memcpy(variant, config.localeVariant, sizeof(config.localeVariant));
-    }
+  if (config.localeVariant[0]) {
+    memcpy(variant, config.localeVariant, sizeof(config.localeVariant));
+  }
 }
 
 void LocaleValue::writeTo(ResTable_config* out) const {
-    out->packLanguage(language);
-    out->packRegion(region);
+  out->packLanguage(language);
+  out->packRegion(region);
 
-    if (script[0]) {
-        memcpy(out->localeScript, script, sizeof(out->localeScript));
-    }
+  if (script[0]) {
+    memcpy(out->localeScript, script, sizeof(out->localeScript));
+  }
 
-    if (variant[0]) {
-        memcpy(out->localeVariant, variant, sizeof(out->localeVariant));
-    }
+  if (variant[0]) {
+    memcpy(out->localeVariant, variant, sizeof(out->localeVariant));
+  }
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Locale.h b/tools/aapt2/Locale.h
index 33f80ad..0f75850 100644
--- a/tools/aapt2/Locale.h
+++ b/tools/aapt2/Locale.h
@@ -29,86 +29,84 @@
  * A convenience class to build and parse locales.
  */
 struct LocaleValue {
-    char language[4];
-    char region[4];
-    char script[4];
-    char variant[8];
+  char language[4];
+  char region[4];
+  char script[4];
+  char variant[8];
 
-    inline LocaleValue();
+  inline LocaleValue();
 
-    /**
-     * Initialize this LocaleValue from a config string.
-     */
-    bool initFromFilterString(const StringPiece& config);
+  /**
+   * Initialize this LocaleValue from a config string.
+   */
+  bool initFromFilterString(const StringPiece& config);
 
-    /**
-     * Initialize this LocaleValue from parts of a vector.
-     */
-    ssize_t initFromParts(std::vector<std::string>::iterator iter,
-            std::vector<std::string>::iterator end);
+  /**
+   * Initialize this LocaleValue from parts of a vector.
+   */
+  ssize_t initFromParts(std::vector<std::string>::iterator iter,
+                        std::vector<std::string>::iterator end);
 
-    /**
-     * Initialize this LocaleValue from a ResTable_config.
-     */
-    void initFromResTable(const android::ResTable_config& config);
+  /**
+   * Initialize this LocaleValue from a ResTable_config.
+   */
+  void initFromResTable(const android::ResTable_config& config);
 
-    /**
-     * Set the locale in a ResTable_config from this LocaleValue.
-     */
-    void writeTo(android::ResTable_config* out) const;
+  /**
+   * Set the locale in a ResTable_config from this LocaleValue.
+   */
+  void writeTo(android::ResTable_config* out) const;
 
-    inline int compare(const LocaleValue& other) const;
+  inline int compare(const LocaleValue& other) const;
 
-    inline bool operator<(const LocaleValue& o) const;
-    inline bool operator<=(const LocaleValue& o) const;
-    inline bool operator==(const LocaleValue& o) const;
-    inline bool operator!=(const LocaleValue& o) const;
-    inline bool operator>=(const LocaleValue& o) const;
-    inline bool operator>(const LocaleValue& o) const;
+  inline bool operator<(const LocaleValue& o) const;
+  inline bool operator<=(const LocaleValue& o) const;
+  inline bool operator==(const LocaleValue& o) const;
+  inline bool operator!=(const LocaleValue& o) const;
+  inline bool operator>=(const LocaleValue& o) const;
+  inline bool operator>(const LocaleValue& o) const;
 
-private:
-     void setLanguage(const char* language);
-     void setRegion(const char* language);
-     void setScript(const char* script);
-     void setVariant(const char* variant);
+ private:
+  void setLanguage(const char* language);
+  void setRegion(const char* language);
+  void setScript(const char* script);
+  void setVariant(const char* variant);
 };
 
 //
 // Implementation
 //
 
-LocaleValue::LocaleValue() {
-    memset(this, 0, sizeof(LocaleValue));
-}
+LocaleValue::LocaleValue() { memset(this, 0, sizeof(LocaleValue)); }
 
 int LocaleValue::compare(const LocaleValue& other) const {
-    return memcmp(this, &other, sizeof(LocaleValue));
+  return memcmp(this, &other, sizeof(LocaleValue));
 }
 
 bool LocaleValue::operator<(const LocaleValue& o) const {
-    return compare(o) < 0;
+  return compare(o) < 0;
 }
 
 bool LocaleValue::operator<=(const LocaleValue& o) const {
-    return compare(o) <= 0;
+  return compare(o) <= 0;
 }
 
 bool LocaleValue::operator==(const LocaleValue& o) const {
-    return compare(o) == 0;
+  return compare(o) == 0;
 }
 
 bool LocaleValue::operator!=(const LocaleValue& o) const {
-    return compare(o) != 0;
+  return compare(o) != 0;
 }
 
 bool LocaleValue::operator>=(const LocaleValue& o) const {
-    return compare(o) >= 0;
+  return compare(o) >= 0;
 }
 
 bool LocaleValue::operator>(const LocaleValue& o) const {
-    return compare(o) > 0;
+  return compare(o) > 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_LOCALE_VALUE_H
+#endif  // AAPT_LOCALE_VALUE_H
diff --git a/tools/aapt2/Locale_test.cpp b/tools/aapt2/Locale_test.cpp
index e4b8ce7..b82d2b9 100644
--- a/tools/aapt2/Locale_test.cpp
+++ b/tools/aapt2/Locale_test.cpp
@@ -22,61 +22,73 @@
 
 namespace aapt {
 
-static ::testing::AssertionResult TestLanguage(const char* input, const char* lang) {
-    std::vector<std::string> parts = util::splitAndLowercase(input, '-');
-    LocaleValue lv;
-    ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
-    if (count < 0) {
-        return ::testing::AssertionFailure() << " failed to parse '" << input << "'.";
-    }
+static ::testing::AssertionResult TestLanguage(const char* input,
+                                               const char* lang) {
+  std::vector<std::string> parts = util::splitAndLowercase(input, '-');
+  LocaleValue lv;
+  ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
+  if (count < 0) {
+    return ::testing::AssertionFailure() << " failed to parse '" << input
+                                         << "'.";
+  }
 
-    if (count != 1) {
-        return ::testing::AssertionFailure() << count
-            << " parts were consumed parsing '" << input << "' but expected 1.";
-    }
+  if (count != 1) {
+    return ::testing::AssertionFailure()
+           << count << " parts were consumed parsing '" << input
+           << "' but expected 1.";
+  }
 
-    if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) != 0) {
-        return ::testing::AssertionFailure() << "expected " << lang << " but got "
-            << std::string(lv.language, sizeof(lv.language)) << ".";
-    }
+  if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) !=
+      0) {
+    return ::testing::AssertionFailure()
+           << "expected " << lang << " but got "
+           << std::string(lv.language, sizeof(lv.language)) << ".";
+  }
 
-    return ::testing::AssertionSuccess();
+  return ::testing::AssertionSuccess();
 }
 
-static ::testing::AssertionResult TestLanguageRegion(const char* input, const char* lang,
+static ::testing::AssertionResult TestLanguageRegion(const char* input,
+                                                     const char* lang,
                                                      const char* region) {
-    std::vector<std::string> parts = util::splitAndLowercase(input, '-');
-    LocaleValue lv;
-    ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
-    if (count < 0) {
-        return ::testing::AssertionFailure() << " failed to parse '" << input << "'.";
-    }
+  std::vector<std::string> parts = util::splitAndLowercase(input, '-');
+  LocaleValue lv;
+  ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
+  if (count < 0) {
+    return ::testing::AssertionFailure() << " failed to parse '" << input
+                                         << "'.";
+  }
 
-    if (count != 2) {
-        return ::testing::AssertionFailure() << count
-            << " parts were consumed parsing '" << input << "' but expected 2.";
-    }
+  if (count != 2) {
+    return ::testing::AssertionFailure()
+           << count << " parts were consumed parsing '" << input
+           << "' but expected 2.";
+  }
 
-    if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) != 0) {
-        return ::testing::AssertionFailure() << "expected " << input << " but got "
-            << std::string(lv.language, sizeof(lv.language)) << ".";
-    }
+  if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) !=
+      0) {
+    return ::testing::AssertionFailure()
+           << "expected " << input << " but got "
+           << std::string(lv.language, sizeof(lv.language)) << ".";
+  }
 
-    if (memcmp(lv.region, region, std::min(strlen(region), sizeof(lv.region))) != 0) {
-        return ::testing::AssertionFailure() << "expected " << region << " but got "
-            << std::string(lv.region, sizeof(lv.region)) << ".";
-    }
+  if (memcmp(lv.region, region, std::min(strlen(region), sizeof(lv.region))) !=
+      0) {
+    return ::testing::AssertionFailure()
+           << "expected " << region << " but got "
+           << std::string(lv.region, sizeof(lv.region)) << ".";
+  }
 
-    return ::testing::AssertionSuccess();
+  return ::testing::AssertionSuccess();
 }
 
 TEST(ConfigDescriptionTest, ParseLanguage) {
-    EXPECT_TRUE(TestLanguage("en", "en"));
-    EXPECT_TRUE(TestLanguage("fr", "fr"));
-    EXPECT_FALSE(TestLanguage("land", ""));
-    EXPECT_TRUE(TestLanguage("fr-land", "fr"));
+  EXPECT_TRUE(TestLanguage("en", "en"));
+  EXPECT_TRUE(TestLanguage("fr", "fr"));
+  EXPECT_FALSE(TestLanguage("land", ""));
+  EXPECT_TRUE(TestLanguage("fr-land", "fr"));
 
-    EXPECT_TRUE(TestLanguageRegion("fr-rCA", "fr", "CA"));
+  EXPECT_TRUE(TestLanguageRegion("fr-rCA", "fr", "CA"));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index f3f70d6..8aedd44 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -28,9 +28,9 @@
 static const char* sMinorVersion = "2";
 
 int printVersion() {
-    std::cerr << "Android Asset Packaging Tool (aapt) "
-            << sMajorVersion << "." << sMinorVersion << std::endl;
-    return 0;
+  std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
+            << sMinorVersion << std::endl;
+  return 0;
 }
 
 extern int compile(const std::vector<StringPiece>& args);
@@ -38,35 +38,36 @@
 extern int dump(const std::vector<StringPiece>& args);
 extern int diff(const std::vector<StringPiece>& args);
 
-} // namespace aapt
+}  // namespace aapt
 
 int main(int argc, char** argv) {
-    if (argc >= 2) {
-        argv += 1;
-        argc -= 1;
+  if (argc >= 2) {
+    argv += 1;
+    argc -= 1;
 
-        std::vector<aapt::StringPiece> args;
-        for (int i = 1; i < argc; i++) {
-            args.push_back(argv[i]);
-        }
-
-        aapt::StringPiece command(argv[0]);
-        if (command == "compile" || command == "c") {
-            return aapt::compile(args);
-        } else if (command == "link" || command == "l") {
-            return aapt::link(args);
-        } else if (command == "dump" || command == "d") {
-            return aapt::dump(args);
-        } else if (command == "diff") {
-            return aapt::diff(args);
-        } else if (command == "version") {
-            return aapt::printVersion();
-        }
-        std::cerr << "unknown command '" << command << "'\n";
-    } else {
-        std::cerr << "no command specified\n";
+    std::vector<aapt::StringPiece> args;
+    for (int i = 1; i < argc; i++) {
+      args.push_back(argv[i]);
     }
 
-    std::cerr << "\nusage: aapt2 [compile|link|dump|diff|version] ..." << std::endl;
-    return 1;
+    aapt::StringPiece command(argv[0]);
+    if (command == "compile" || command == "c") {
+      return aapt::compile(args);
+    } else if (command == "link" || command == "l") {
+      return aapt::link(args);
+    } else if (command == "dump" || command == "d") {
+      return aapt::dump(args);
+    } else if (command == "diff") {
+      return aapt::diff(args);
+    } else if (command == "version") {
+      return aapt::printVersion();
+    }
+    std::cerr << "unknown command '" << command << "'\n";
+  } else {
+    std::cerr << "no command specified\n";
+  }
+
+  std::cerr << "\nusage: aapt2 [compile|link|dump|diff|version] ..."
+            << std::endl;
+  return 1;
 }
diff --git a/tools/aapt2/NameMangler.h b/tools/aapt2/NameMangler.h
index b6aaa4d..6d244aa 100644
--- a/tools/aapt2/NameMangler.h
+++ b/tools/aapt2/NameMangler.h
@@ -26,69 +26,71 @@
 namespace aapt {
 
 struct NameManglerPolicy {
-    /**
-     * Represents the package we are trying to build. References pointing
-     * to this package are not mangled, and mangled references inherit this package name.
-     */
-    std::string targetPackageName;
+  /**
+   * Represents the package we are trying to build. References pointing
+   * to this package are not mangled, and mangled references inherit this
+   * package name.
+   */
+  std::string targetPackageName;
 
-    /**
-     * We must know which references to mangle, and which to keep (android vs. com.android.support).
-     */
-    std::set<std::string> packagesToMangle;
+  /**
+   * We must know which references to mangle, and which to keep (android vs.
+   * com.android.support).
+   */
+  std::set<std::string> packagesToMangle;
 };
 
 class NameMangler {
-private:
-    NameManglerPolicy mPolicy;
+ private:
+  NameManglerPolicy mPolicy;
 
-public:
-    explicit NameMangler(NameManglerPolicy policy) : mPolicy(policy) {
+ public:
+  explicit NameMangler(NameManglerPolicy policy) : mPolicy(policy) {}
+
+  Maybe<ResourceName> mangleName(const ResourceName& name) {
+    if (mPolicy.targetPackageName == name.package ||
+        mPolicy.packagesToMangle.count(name.package) == 0) {
+      return {};
     }
 
-    Maybe<ResourceName> mangleName(const ResourceName& name) {
-        if (mPolicy.targetPackageName == name.package ||
-                mPolicy.packagesToMangle.count(name.package) == 0) {
-            return {};
-        }
+    std::string mangledEntryName = mangleEntry(name.package, name.entry);
+    return ResourceName(mPolicy.targetPackageName, name.type, mangledEntryName);
+  }
 
-        std::string mangledEntryName = mangleEntry(name.package, name.entry);
-        return ResourceName(mPolicy.targetPackageName, name.type, mangledEntryName);
+  bool shouldMangle(const std::string& package) const {
+    if (package.empty() || mPolicy.targetPackageName == package) {
+      return false;
+    }
+    return mPolicy.packagesToMangle.count(package) != 0;
+  }
+
+  /**
+   * Returns a mangled name that is a combination of `name` and `package`.
+   * The mangled name should contain symbols that are illegal to define in XML,
+   * so that there will never be name mangling collisions.
+   */
+  static std::string mangleEntry(const std::string& package,
+                                 const std::string& name) {
+    return package + "$" + name;
+  }
+
+  /**
+   * Unmangles the name in `outName`, storing the correct name back in `outName`
+   * and the package in `outPackage`. Returns true if the name was unmangled or
+   * false if the name was never mangled to begin with.
+   */
+  static bool unmangle(std::string* outName, std::string* outPackage) {
+    size_t pivot = outName->find('$');
+    if (pivot == std::string::npos) {
+      return false;
     }
 
-    bool shouldMangle(const std::string& package) const {
-        if (package.empty() || mPolicy.targetPackageName == package) {
-            return false;
-        }
-        return mPolicy.packagesToMangle.count(package) != 0;
-    }
-
-    /**
-     * Returns a mangled name that is a combination of `name` and `package`.
-     * The mangled name should contain symbols that are illegal to define in XML,
-     * so that there will never be name mangling collisions.
-     */
-    static std::string mangleEntry(const std::string& package, const std::string& name) {
-        return package + "$" + name;
-    }
-
-    /**
-     * Unmangles the name in `outName`, storing the correct name back in `outName`
-     * and the package in `outPackage`. Returns true if the name was unmangled or
-     * false if the name was never mangled to begin with.
-     */
-    static bool unmangle(std::string* outName, std::string* outPackage) {
-        size_t pivot = outName->find('$');
-        if (pivot == std::string::npos) {
-            return false;
-        }
-
-        outPackage->assign(outName->data(), pivot);
-        outName->assign(outName->data() + pivot + 1, outName->size() - (pivot + 1));
-        return true;
-    }
+    outPackage->assign(outName->data(), pivot);
+    outName->assign(outName->data() + pivot + 1, outName->size() - (pivot + 1));
+    return true;
+  }
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_NAME_MANGLER_H
+#endif  // AAPT_NAME_MANGLER_H
diff --git a/tools/aapt2/NameMangler_test.cpp b/tools/aapt2/NameMangler_test.cpp
index f624df2..b02986d 100644
--- a/tools/aapt2/NameMangler_test.cpp
+++ b/tools/aapt2/NameMangler_test.cpp
@@ -22,25 +22,25 @@
 namespace aapt {
 
 TEST(NameManglerTest, MangleName) {
-    std::string package = "android.appcompat";
-    std::string name = "Platform.AppCompat";
+  std::string package = "android.appcompat";
+  std::string name = "Platform.AppCompat";
 
-    std::string mangledName = NameMangler::mangleEntry(package, name);
-    EXPECT_EQ(mangledName, "android.appcompat$Platform.AppCompat");
+  std::string mangledName = NameMangler::mangleEntry(package, name);
+  EXPECT_EQ(mangledName, "android.appcompat$Platform.AppCompat");
 
-    std::string unmangledPackage;
-    std::string unmangledName = mangledName;
-    ASSERT_TRUE(NameMangler::unmangle(&unmangledName, &unmangledPackage));
-    EXPECT_EQ(unmangledName, "Platform.AppCompat");
-    EXPECT_EQ(unmangledPackage, "android.appcompat");
+  std::string unmangledPackage;
+  std::string unmangledName = mangledName;
+  ASSERT_TRUE(NameMangler::unmangle(&unmangledName, &unmangledPackage));
+  EXPECT_EQ(unmangledName, "Platform.AppCompat");
+  EXPECT_EQ(unmangledPackage, "android.appcompat");
 }
 
 TEST(NameManglerTest, IgnoreUnmangledName) {
-    std::string package;
-    std::string name = "foo_bar";
+  std::string package;
+  std::string name = "foo_bar";
 
-    EXPECT_FALSE(NameMangler::unmangle(&name, &package));
-    EXPECT_EQ(name, "foo_bar");
+  EXPECT_FALSE(NameMangler::unmangle(&name, &package));
+  EXPECT_EQ(name, "foo_bar");
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Resource.cpp b/tools/aapt2/Resource.cpp
index b7a091e..6805631 100644
--- a/tools/aapt2/Resource.cpp
+++ b/tools/aapt2/Resource.cpp
@@ -23,74 +23,97 @@
 namespace aapt {
 
 StringPiece toString(ResourceType type) {
-    switch (type) {
-        case ResourceType::kAnim:          return "anim";
-        case ResourceType::kAnimator:      return "animator";
-        case ResourceType::kArray:         return "array";
-        case ResourceType::kAttr:          return "attr";
-        case ResourceType::kAttrPrivate:   return "^attr-private";
-        case ResourceType::kBool:          return "bool";
-        case ResourceType::kColor:         return "color";
-        case ResourceType::kDimen:         return "dimen";
-        case ResourceType::kDrawable:      return "drawable";
-        case ResourceType::kFraction:      return "fraction";
-        case ResourceType::kId:            return "id";
-        case ResourceType::kInteger:       return "integer";
-        case ResourceType::kInterpolator:  return "interpolator";
-        case ResourceType::kLayout:        return "layout";
-        case ResourceType::kMenu:          return "menu";
-        case ResourceType::kMipmap:        return "mipmap";
-        case ResourceType::kPlurals:       return "plurals";
-        case ResourceType::kRaw:           return "raw";
-        case ResourceType::kString:        return "string";
-        case ResourceType::kStyle:         return "style";
-        case ResourceType::kStyleable:     return "styleable";
-        case ResourceType::kTransition:    return "transition";
-        case ResourceType::kXml:           return "xml";
-    }
-    return {};
+  switch (type) {
+    case ResourceType::kAnim:
+      return "anim";
+    case ResourceType::kAnimator:
+      return "animator";
+    case ResourceType::kArray:
+      return "array";
+    case ResourceType::kAttr:
+      return "attr";
+    case ResourceType::kAttrPrivate:
+      return "^attr-private";
+    case ResourceType::kBool:
+      return "bool";
+    case ResourceType::kColor:
+      return "color";
+    case ResourceType::kDimen:
+      return "dimen";
+    case ResourceType::kDrawable:
+      return "drawable";
+    case ResourceType::kFraction:
+      return "fraction";
+    case ResourceType::kId:
+      return "id";
+    case ResourceType::kInteger:
+      return "integer";
+    case ResourceType::kInterpolator:
+      return "interpolator";
+    case ResourceType::kLayout:
+      return "layout";
+    case ResourceType::kMenu:
+      return "menu";
+    case ResourceType::kMipmap:
+      return "mipmap";
+    case ResourceType::kPlurals:
+      return "plurals";
+    case ResourceType::kRaw:
+      return "raw";
+    case ResourceType::kString:
+      return "string";
+    case ResourceType::kStyle:
+      return "style";
+    case ResourceType::kStyleable:
+      return "styleable";
+    case ResourceType::kTransition:
+      return "transition";
+    case ResourceType::kXml:
+      return "xml";
+  }
+  return {};
 }
 
-static const std::map<StringPiece, ResourceType> sResourceTypeMap {
-        { "anim", ResourceType::kAnim },
-        { "animator", ResourceType::kAnimator },
-        { "array", ResourceType::kArray },
-        { "attr", ResourceType::kAttr },
-        { "^attr-private", ResourceType::kAttrPrivate },
-        { "bool", ResourceType::kBool },
-        { "color", ResourceType::kColor },
-        { "dimen", ResourceType::kDimen },
-        { "drawable", ResourceType::kDrawable },
-        { "fraction", ResourceType::kFraction },
-        { "id", ResourceType::kId },
-        { "integer", ResourceType::kInteger },
-        { "interpolator", ResourceType::kInterpolator },
-        { "layout", ResourceType::kLayout },
-        { "menu", ResourceType::kMenu },
-        { "mipmap", ResourceType::kMipmap },
-        { "plurals", ResourceType::kPlurals },
-        { "raw", ResourceType::kRaw },
-        { "string", ResourceType::kString },
-        { "style", ResourceType::kStyle },
-        { "styleable", ResourceType::kStyleable },
-        { "transition", ResourceType::kTransition },
-        { "xml", ResourceType::kXml },
+static const std::map<StringPiece, ResourceType> sResourceTypeMap{
+    {"anim", ResourceType::kAnim},
+    {"animator", ResourceType::kAnimator},
+    {"array", ResourceType::kArray},
+    {"attr", ResourceType::kAttr},
+    {"^attr-private", ResourceType::kAttrPrivate},
+    {"bool", ResourceType::kBool},
+    {"color", ResourceType::kColor},
+    {"dimen", ResourceType::kDimen},
+    {"drawable", ResourceType::kDrawable},
+    {"fraction", ResourceType::kFraction},
+    {"id", ResourceType::kId},
+    {"integer", ResourceType::kInteger},
+    {"interpolator", ResourceType::kInterpolator},
+    {"layout", ResourceType::kLayout},
+    {"menu", ResourceType::kMenu},
+    {"mipmap", ResourceType::kMipmap},
+    {"plurals", ResourceType::kPlurals},
+    {"raw", ResourceType::kRaw},
+    {"string", ResourceType::kString},
+    {"style", ResourceType::kStyle},
+    {"styleable", ResourceType::kStyleable},
+    {"transition", ResourceType::kTransition},
+    {"xml", ResourceType::kXml},
 };
 
 const ResourceType* parseResourceType(const StringPiece& str) {
-    auto iter = sResourceTypeMap.find(str);
-    if (iter == std::end(sResourceTypeMap)) {
-        return nullptr;
-    }
-    return &iter->second;
+  auto iter = sResourceTypeMap.find(str);
+  if (iter == std::end(sResourceTypeMap)) {
+    return nullptr;
+  }
+  return &iter->second;
 }
 
 bool operator<(const ResourceKey& a, const ResourceKey& b) {
-    return std::tie(a.name, a.config) < std::tie(b.name, b.config);
+  return std::tie(a.name, a.config) < std::tie(b.name, b.config);
 }
 
 bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b) {
-    return std::tie(a.name, a.config) < std::tie(b.name, b.config);
+  return std::tie(a.name, a.config) < std::tie(b.name, b.config);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 2969b8c..30739db 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -37,29 +37,29 @@
  * to the 'type' in package:type/entry.
  */
 enum class ResourceType {
-    kAnim,
-    kAnimator,
-    kArray,
-    kAttr,
-    kAttrPrivate,
-    kBool,
-    kColor,
-    kDimen,
-    kDrawable,
-    kFraction,
-    kId,
-    kInteger,
-    kInterpolator,
-    kLayout,
-    kMenu,
-    kMipmap,
-    kPlurals,
-    kRaw,
-    kString,
-    kStyle,
-    kStyleable,
-    kTransition,
-    kXml,
+  kAnim,
+  kAnimator,
+  kArray,
+  kAttr,
+  kAttrPrivate,
+  kBool,
+  kColor,
+  kDimen,
+  kDrawable,
+  kFraction,
+  kId,
+  kInteger,
+  kInterpolator,
+  kLayout,
+  kMenu,
+  kMipmap,
+  kPlurals,
+  kRaw,
+  kString,
+  kStyle,
+  kStyleable,
+  kTransition,
+  kXml,
 };
 
 StringPiece toString(ResourceType type);
@@ -75,17 +75,17 @@
  * a resource in the ResourceTable.
  */
 struct ResourceName {
-    std::string package;
-    ResourceType type;
-    std::string entry;
+  std::string package;
+  ResourceType type;
+  std::string entry;
 
-    ResourceName() : type(ResourceType::kRaw) {}
-    ResourceName(const StringPiece& p, ResourceType t, const StringPiece& e);
+  ResourceName() : type(ResourceType::kRaw) {}
+  ResourceName(const StringPiece& p, ResourceType t, const StringPiece& e);
 
-    int compare(const ResourceName& other) const;
+  int compare(const ResourceName& other) const;
 
-    bool isValid() const;
-    std::string toString() const;
+  bool isValid() const;
+  std::string toString() const;
 };
 
 /**
@@ -95,21 +95,21 @@
  * of the original string.
  */
 struct ResourceNameRef {
-    StringPiece package;
-    ResourceType type;
-    StringPiece entry;
+  StringPiece package;
+  ResourceType type;
+  StringPiece entry;
 
-    ResourceNameRef() = default;
-    ResourceNameRef(const ResourceNameRef&) = default;
-    ResourceNameRef(ResourceNameRef&&) = default;
-    ResourceNameRef(const ResourceName& rhs);  // NOLINT(implicit)
-    ResourceNameRef(const StringPiece& p, ResourceType t, const StringPiece& e);
-    ResourceNameRef& operator=(const ResourceNameRef& rhs) = default;
-    ResourceNameRef& operator=(ResourceNameRef&& rhs) = default;
-    ResourceNameRef& operator=(const ResourceName& rhs);
+  ResourceNameRef() = default;
+  ResourceNameRef(const ResourceNameRef&) = default;
+  ResourceNameRef(ResourceNameRef&&) = default;
+  ResourceNameRef(const ResourceName& rhs);  // NOLINT(implicit)
+  ResourceNameRef(const StringPiece& p, ResourceType t, const StringPiece& e);
+  ResourceNameRef& operator=(const ResourceNameRef& rhs) = default;
+  ResourceNameRef& operator=(ResourceNameRef&& rhs) = default;
+  ResourceNameRef& operator=(const ResourceName& rhs);
 
-    ResourceName toResourceName() const;
-    bool isValid() const;
+  ResourceName toResourceName() const;
+  bool isValid() const;
 };
 
 /**
@@ -124,64 +124,66 @@
  * EEEE: 16 bit entry identifier.
  */
 struct ResourceId {
-    uint32_t id;
+  uint32_t id;
 
-    ResourceId();
-    ResourceId(const ResourceId& rhs);
-    ResourceId(uint32_t resId);  // NOLINT(implicit)
-    ResourceId(uint8_t p, uint8_t t, uint16_t e);
+  ResourceId();
+  ResourceId(const ResourceId& rhs);
+  ResourceId(uint32_t resId);  // NOLINT(implicit)
+  ResourceId(uint8_t p, uint8_t t, uint16_t e);
 
-    bool isValid() const;
-    uint8_t packageId() const;
-    uint8_t typeId() const;
-    uint16_t entryId() const;
+  bool isValid() const;
+  uint8_t packageId() const;
+  uint8_t typeId() const;
+  uint16_t entryId() const;
 };
 
 struct SourcedResourceName {
-    ResourceName name;
-    size_t line;
+  ResourceName name;
+  size_t line;
 };
 
 struct ResourceFile {
-    // Name
-    ResourceName name;
+  // Name
+  ResourceName name;
 
-    // Configuration
-    ConfigDescription config;
+  // Configuration
+  ConfigDescription config;
 
-    // Source
-    Source source;
+  // Source
+  Source source;
 
-    // Exported symbols
-    std::vector<SourcedResourceName> exportedSymbols;
+  // Exported symbols
+  std::vector<SourcedResourceName> exportedSymbols;
 };
 
 /**
- * Useful struct used as a key to represent a unique resource in associative containers.
+ * Useful struct used as a key to represent a unique resource in associative
+ * containers.
  */
 struct ResourceKey {
-    ResourceName name;
-    ConfigDescription config;
+  ResourceName name;
+  ConfigDescription config;
 };
 
 bool operator<(const ResourceKey& a, const ResourceKey& b);
 
 /**
- * Useful struct used as a key to represent a unique resource in associative containers.
+ * Useful struct used as a key to represent a unique resource in associative
+ * containers.
  * Holds a reference to the name, so that name better live longer than this key!
  */
 struct ResourceKeyRef {
-    ResourceNameRef name;
-    ConfigDescription config;
+  ResourceNameRef name;
+  ConfigDescription config;
 
-    ResourceKeyRef() = default;
-    ResourceKeyRef(const ResourceNameRef& n, const ConfigDescription& c) : name(n), config(c) {
-    }
+  ResourceKeyRef() = default;
+  ResourceKeyRef(const ResourceNameRef& n, const ConfigDescription& c)
+      : name(n), config(c) {}
 
-    /**
-     * Prevent taking a reference to a temporary. This is bad.
-     */
-    ResourceKeyRef(ResourceName&& n, const ConfigDescription& c) = delete;
+  /**
+   * Prevent taking a reference to a temporary. This is bad.
+   */
+  ResourceKeyRef(ResourceName&& n, const ConfigDescription& c) = delete;
 };
 
 bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b);
@@ -190,193 +192,194 @@
 // ResourceId implementation.
 //
 
-inline ResourceId::ResourceId() : id(0) {
-}
+inline ResourceId::ResourceId() : id(0) {}
 
-inline ResourceId::ResourceId(const ResourceId& rhs) : id(rhs.id) {
-}
+inline ResourceId::ResourceId(const ResourceId& rhs) : id(rhs.id) {}
 
-inline ResourceId::ResourceId(uint32_t resId) : id(resId) {
-}
+inline ResourceId::ResourceId(uint32_t resId) : id(resId) {}
 
-inline ResourceId::ResourceId(uint8_t p, uint8_t t, uint16_t e) : id((p << 24) | (t << 16) | e) {
-}
+inline ResourceId::ResourceId(uint8_t p, uint8_t t, uint16_t e)
+    : id((p << 24) | (t << 16) | e) {}
 
 inline bool ResourceId::isValid() const {
-    return (id & 0xff000000u) != 0 && (id & 0x00ff0000u) != 0;
+  return (id & 0xff000000u) != 0 && (id & 0x00ff0000u) != 0;
 }
 
 inline uint8_t ResourceId::packageId() const {
-    return static_cast<uint8_t>(id >> 24);
+  return static_cast<uint8_t>(id >> 24);
 }
 
 inline uint8_t ResourceId::typeId() const {
-    return static_cast<uint8_t>(id >> 16);
+  return static_cast<uint8_t>(id >> 16);
 }
 
 inline uint16_t ResourceId::entryId() const {
-    return static_cast<uint16_t>(id);
+  return static_cast<uint16_t>(id);
 }
 
 inline bool operator<(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id < rhs.id;
+  return lhs.id < rhs.id;
 }
 
 inline bool operator>(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id > rhs.id;
+  return lhs.id > rhs.id;
 }
 
 inline bool operator==(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id == rhs.id;
+  return lhs.id == rhs.id;
 }
 
 inline bool operator!=(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id != rhs.id;
+  return lhs.id != rhs.id;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceId& resId) {
-    std::ios_base::fmtflags oldFlags = out.flags();
-    char oldFill = out.fill();
-    out << "0x" << std::internal << std::setfill('0') << std::setw(8)
-        << std::hex << resId.id;
-    out.flags(oldFlags);
-    out.fill(oldFill);
-    return out;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceId& resId) {
+  std::ios_base::fmtflags oldFlags = out.flags();
+  char oldFill = out.fill();
+  out << "0x" << std::internal << std::setfill('0') << std::setw(8) << std::hex
+      << resId.id;
+  out.flags(oldFlags);
+  out.fill(oldFill);
+  return out;
 }
 
 //
 // ResourceType implementation.
 //
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceType& val) {
-    return out << toString(val);
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceType& val) {
+  return out << toString(val);
 }
 
 //
 // ResourceName implementation.
 //
 
-inline ResourceName::ResourceName(const StringPiece& p, ResourceType t, const StringPiece& e) :
-        package(p.toString()), type(t), entry(e.toString()) {
-}
+inline ResourceName::ResourceName(const StringPiece& p, ResourceType t,
+                                  const StringPiece& e)
+    : package(p.toString()), type(t), entry(e.toString()) {}
 
 inline int ResourceName::compare(const ResourceName& other) const {
-    int cmp = package.compare(other.package);
-    if (cmp != 0) return cmp;
-    cmp = static_cast<int>(type) - static_cast<int>(other.type);
-    if (cmp != 0) return cmp;
-    cmp = entry.compare(other.entry);
-    return cmp;
+  int cmp = package.compare(other.package);
+  if (cmp != 0) return cmp;
+  cmp = static_cast<int>(type) - static_cast<int>(other.type);
+  if (cmp != 0) return cmp;
+  cmp = entry.compare(other.entry);
+  return cmp;
 }
 
 inline bool ResourceName::isValid() const {
-    return !package.empty() && !entry.empty();
+  return !package.empty() && !entry.empty();
 }
 
 inline bool operator<(const ResourceName& lhs, const ResourceName& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            < std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) <
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator==(const ResourceName& lhs, const ResourceName& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            == std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) ==
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator!=(const ResourceName& lhs, const ResourceName& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            != std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) !=
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceName& name) {
-    if (!name.package.empty()) {
-        out << name.package << ":";
-    }
-    return out << name.type << "/" << name.entry;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceName& name) {
+  if (!name.package.empty()) {
+    out << name.package << ":";
+  }
+  return out << name.type << "/" << name.entry;
 }
 
 inline std::string ResourceName::toString() const {
-    std::stringstream stream;
-    stream << *this;
-    return stream.str();
+  std::stringstream stream;
+  stream << *this;
+  return stream.str();
 }
 
 //
 // ResourceNameRef implementation.
 //
 
-inline ResourceNameRef::ResourceNameRef(const ResourceName& rhs) :
-        package(rhs.package), type(rhs.type), entry(rhs.entry) {
-}
+inline ResourceNameRef::ResourceNameRef(const ResourceName& rhs)
+    : package(rhs.package), type(rhs.type), entry(rhs.entry) {}
 
 inline ResourceNameRef::ResourceNameRef(const StringPiece& p, ResourceType t,
-                                        const StringPiece& e) :
-        package(p), type(t), entry(e) {
-}
+                                        const StringPiece& e)
+    : package(p), type(t), entry(e) {}
 
 inline ResourceNameRef& ResourceNameRef::operator=(const ResourceName& rhs) {
-    package = rhs.package;
-    type = rhs.type;
-    entry = rhs.entry;
-    return *this;
+  package = rhs.package;
+  type = rhs.type;
+  entry = rhs.entry;
+  return *this;
 }
 
 inline ResourceName ResourceNameRef::toResourceName() const {
-    return ResourceName(package, type, entry);
+  return ResourceName(package, type, entry);
 }
 
 inline bool ResourceNameRef::isValid() const {
-    return !package.empty() && !entry.empty();
+  return !package.empty() && !entry.empty();
 }
 
 inline bool operator<(const ResourceNameRef& lhs, const ResourceNameRef& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            < std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) <
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator==(const ResourceNameRef& lhs, const ResourceNameRef& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            == std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) ==
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator!=(const ResourceNameRef& lhs, const ResourceNameRef& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            != std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) !=
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceNameRef& name) {
-    if (!name.package.empty()) {
-        out << name.package << ":";
-    }
-    return out << name.type << "/" << name.entry;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceNameRef& name) {
+  if (!name.package.empty()) {
+    out << name.package << ":";
+  }
+  return out << name.type << "/" << name.entry;
 }
 
 inline bool operator<(const ResourceName& lhs, const ResourceNameRef& b) {
-    return ResourceNameRef(lhs) < b;
+  return ResourceNameRef(lhs) < b;
 }
 
 inline bool operator!=(const ResourceName& lhs, const ResourceNameRef& rhs) {
-    return ResourceNameRef(lhs) != rhs;
+  return ResourceNameRef(lhs) != rhs;
 }
 
-inline bool operator==(const SourcedResourceName& lhs, const SourcedResourceName& rhs) {
-    return lhs.name == rhs.name && lhs.line == rhs.line;
+inline bool operator==(const SourcedResourceName& lhs,
+                       const SourcedResourceName& rhs) {
+  return lhs.name == rhs.name && lhs.line == rhs.line;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
 namespace std {
 
-template <> struct hash<aapt::ResourceName> {
-    size_t operator()(const aapt::ResourceName& name) const {
-        android::hash_t h = 0;
-        h = android::JenkinsHashMix(h, hash<string>()(name.package));
-        h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
-        h = android::JenkinsHashMix(h, hash<string>()(name.entry));
-        return static_cast<size_t>(h);
-    }
+template <>
+struct hash<aapt::ResourceName> {
+  size_t operator()(const aapt::ResourceName& name) const {
+    android::hash_t h = 0;
+    h = android::JenkinsHashMix(h, hash<string>()(name.package));
+    h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
+    h = android::JenkinsHashMix(h, hash<string>()(name.entry));
+    return static_cast<size_t>(h);
+  }
 };
 
-} // namespace std
+}  // namespace std
 
-#endif // AAPT_RESOURCE_H
+#endif  // AAPT_RESOURCE_H
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index c430c46..51aed13 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -28,445 +28,488 @@
 
 namespace aapt {
 
-constexpr const char* sXliffNamespaceUri = "urn:oasis:names:tc:xliff:document:1.2";
+constexpr const char* sXliffNamespaceUri =
+    "urn:oasis:names:tc:xliff:document:1.2";
 
 /**
- * Returns true if the element is <skip> or <eat-comment> and can be safely ignored.
+ * Returns true if the element is <skip> or <eat-comment> and can be safely
+ * ignored.
  */
-static bool shouldIgnoreElement(const StringPiece& ns, const StringPiece& name) {
-    return ns.empty() && (name == "skip" || name == "eat-comment");
+static bool shouldIgnoreElement(const StringPiece& ns,
+                                const StringPiece& name) {
+  return ns.empty() && (name == "skip" || name == "eat-comment");
 }
 
 static uint32_t parseFormatType(const StringPiece& piece) {
-    if (piece == "reference")      return android::ResTable_map::TYPE_REFERENCE;
-    else if (piece == "string")    return android::ResTable_map::TYPE_STRING;
-    else if (piece == "integer")   return android::ResTable_map::TYPE_INTEGER;
-    else if (piece == "boolean")   return android::ResTable_map::TYPE_BOOLEAN;
-    else if (piece == "color")     return android::ResTable_map::TYPE_COLOR;
-    else if (piece == "float")     return android::ResTable_map::TYPE_FLOAT;
-    else if (piece == "dimension") return android::ResTable_map::TYPE_DIMENSION;
-    else if (piece == "fraction")  return android::ResTable_map::TYPE_FRACTION;
-    else if (piece == "enum")      return android::ResTable_map::TYPE_ENUM;
-    else if (piece == "flags")     return android::ResTable_map::TYPE_FLAGS;
-    return 0;
+  if (piece == "reference")
+    return android::ResTable_map::TYPE_REFERENCE;
+  else if (piece == "string")
+    return android::ResTable_map::TYPE_STRING;
+  else if (piece == "integer")
+    return android::ResTable_map::TYPE_INTEGER;
+  else if (piece == "boolean")
+    return android::ResTable_map::TYPE_BOOLEAN;
+  else if (piece == "color")
+    return android::ResTable_map::TYPE_COLOR;
+  else if (piece == "float")
+    return android::ResTable_map::TYPE_FLOAT;
+  else if (piece == "dimension")
+    return android::ResTable_map::TYPE_DIMENSION;
+  else if (piece == "fraction")
+    return android::ResTable_map::TYPE_FRACTION;
+  else if (piece == "enum")
+    return android::ResTable_map::TYPE_ENUM;
+  else if (piece == "flags")
+    return android::ResTable_map::TYPE_FLAGS;
+  return 0;
 }
 
 static uint32_t parseFormatAttribute(const StringPiece& str) {
-    uint32_t mask = 0;
-    for (StringPiece part : util::tokenize(str, '|')) {
-        StringPiece trimmedPart = util::trimWhitespace(part);
-        uint32_t type = parseFormatType(trimmedPart);
-        if (type == 0) {
-            return 0;
-        }
-        mask |= type;
+  uint32_t mask = 0;
+  for (StringPiece part : util::tokenize(str, '|')) {
+    StringPiece trimmedPart = util::trimWhitespace(part);
+    uint32_t type = parseFormatType(trimmedPart);
+    if (type == 0) {
+      return 0;
     }
-    return mask;
+    mask |= type;
+  }
+  return mask;
 }
 
 /**
  * A parsed resource ready to be added to the ResourceTable.
  */
 struct ParsedResource {
-    ResourceName name;
-    ConfigDescription config;
-    std::string product;
-    Source source;
-    ResourceId id;
-    Maybe<SymbolState> symbolState;
-    std::string comment;
-    std::unique_ptr<Value> value;
-    std::list<ParsedResource> childResources;
+  ResourceName name;
+  ConfigDescription config;
+  std::string product;
+  Source source;
+  ResourceId id;
+  Maybe<SymbolState> symbolState;
+  std::string comment;
+  std::unique_ptr<Value> value;
+  std::list<ParsedResource> childResources;
 };
 
 // Recursively adds resources to the ResourceTable.
-static bool addResourcesToTable(ResourceTable* table, IDiagnostics* diag, ParsedResource* res) {
-    StringPiece trimmedComment = util::trimWhitespace(res->comment);
-    if (trimmedComment.size() != res->comment.size()) {
-        // Only if there was a change do we re-assign.
-        res->comment = trimmedComment.toString();
-    }
+static bool addResourcesToTable(ResourceTable* table, IDiagnostics* diag,
+                                ParsedResource* res) {
+  StringPiece trimmedComment = util::trimWhitespace(res->comment);
+  if (trimmedComment.size() != res->comment.size()) {
+    // Only if there was a change do we re-assign.
+    res->comment = trimmedComment.toString();
+  }
 
-    if (res->symbolState) {
-        Symbol symbol;
-        symbol.state = res->symbolState.value();
-        symbol.source = res->source;
-        symbol.comment = res->comment;
-        if (!table->setSymbolState(res->name, res->id, symbol, diag)) {
-            return false;
-        }
+  if (res->symbolState) {
+    Symbol symbol;
+    symbol.state = res->symbolState.value();
+    symbol.source = res->source;
+    symbol.comment = res->comment;
+    if (!table->setSymbolState(res->name, res->id, symbol, diag)) {
+      return false;
     }
+  }
 
-    if (res->value) {
-        // Attach the comment, source and config to the value.
-        res->value->setComment(std::move(res->comment));
-        res->value->setSource(std::move(res->source));
+  if (res->value) {
+    // Attach the comment, source and config to the value.
+    res->value->setComment(std::move(res->comment));
+    res->value->setSource(std::move(res->source));
 
-        if (!table->addResource(res->name, res->id, res->config, res->product,
-                                std::move(res->value), diag)) {
-            return false;
-        }
+    if (!table->addResource(res->name, res->id, res->config, res->product,
+                            std::move(res->value), diag)) {
+      return false;
     }
+  }
 
-    bool error = false;
-    for (ParsedResource& child : res->childResources) {
-        error |= !addResourcesToTable(table, diag, &child);
-    }
-    return !error;
+  bool error = false;
+  for (ParsedResource& child : res->childResources) {
+    error |= !addResourcesToTable(table, diag, &child);
+  }
+  return !error;
 }
 
 // Convenient aliases for more readable function calls.
-enum {
-    kAllowRawString = true,
-    kNoRawString = false
-};
+enum { kAllowRawString = true, kNoRawString = false };
 
-ResourceParser::ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
+ResourceParser::ResourceParser(IDiagnostics* diag, ResourceTable* table,
+                               const Source& source,
                                const ConfigDescription& config,
-                               const ResourceParserOptions& options) :
-        mDiag(diag), mTable(table), mSource(source), mConfig(config), mOptions(options) {
-}
+                               const ResourceParserOptions& options)
+    : mDiag(diag),
+      mTable(table),
+      mSource(source),
+      mConfig(config),
+      mOptions(options) {}
 
 /**
  * Build a string from XML that converts nested elements into Span objects.
  */
-bool ResourceParser::flattenXmlSubtree(xml::XmlPullParser* parser, std::string* outRawString,
+bool ResourceParser::flattenXmlSubtree(xml::XmlPullParser* parser,
+                                       std::string* outRawString,
                                        StyleString* outStyleString) {
-    std::vector<Span> spanStack;
+  std::vector<Span> spanStack;
 
-    bool error = false;
-    outRawString->clear();
-    outStyleString->spans.clear();
-    util::StringBuilder builder;
-    size_t depth = 1;
-    while (xml::XmlPullParser::isGoodEvent(parser->next())) {
-        const xml::XmlPullParser::Event event = parser->getEvent();
-        if (event == xml::XmlPullParser::Event::kEndElement) {
-            if (!parser->getElementNamespace().empty()) {
-                // We already warned and skipped the start element, so just skip here too
-                continue;
-            }
+  bool error = false;
+  outRawString->clear();
+  outStyleString->spans.clear();
+  util::StringBuilder builder;
+  size_t depth = 1;
+  while (xml::XmlPullParser::isGoodEvent(parser->next())) {
+    const xml::XmlPullParser::Event event = parser->getEvent();
+    if (event == xml::XmlPullParser::Event::kEndElement) {
+      if (!parser->getElementNamespace().empty()) {
+        // We already warned and skipped the start element, so just skip here
+        // too
+        continue;
+      }
 
-            depth--;
-            if (depth == 0) {
-                break;
-            }
+      depth--;
+      if (depth == 0) {
+        break;
+      }
 
-            spanStack.back().lastChar = builder.utf16Len() - 1;
-            outStyleString->spans.push_back(spanStack.back());
-            spanStack.pop_back();
+      spanStack.back().lastChar = builder.utf16Len() - 1;
+      outStyleString->spans.push_back(spanStack.back());
+      spanStack.pop_back();
 
-        } else if (event == xml::XmlPullParser::Event::kText) {
-            outRawString->append(parser->getText());
-            builder.append(parser->getText());
+    } else if (event == xml::XmlPullParser::Event::kText) {
+      outRawString->append(parser->getText());
+      builder.append(parser->getText());
 
-        } else if (event == xml::XmlPullParser::Event::kStartElement) {
-            if (!parser->getElementNamespace().empty()) {
-                if (parser->getElementNamespace() != sXliffNamespaceUri) {
-                    // Only warn if this isn't an xliff namespace.
-                    mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                                << "skipping element '"
-                                << parser->getElementName()
-                                << "' with unknown namespace '"
-                                << parser->getElementNamespace()
-                                << "'");
-                }
-                continue;
-            }
-            depth++;
-
-            // Build a span object out of the nested element.
-            std::string spanName = parser->getElementName();
-            const auto endAttrIter = parser->endAttributes();
-            for (auto attrIter = parser->beginAttributes(); attrIter != endAttrIter; ++attrIter) {
-                spanName += ";";
-                spanName += attrIter->name;
-                spanName += "=";
-                spanName += attrIter->value;
-            }
-
-            if (builder.utf16Len() > std::numeric_limits<uint32_t>::max()) {
-                mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                             << "style string '" << builder.str() << "' is too long");
-                error = true;
-            } else {
-                spanStack.push_back(Span{ spanName, static_cast<uint32_t>(builder.utf16Len()) });
-            }
-
-        } else if (event == xml::XmlPullParser::Event::kComment) {
-            // Skip
-        } else {
-            assert(false);
+    } else if (event == xml::XmlPullParser::Event::kStartElement) {
+      if (!parser->getElementNamespace().empty()) {
+        if (parser->getElementNamespace() != sXliffNamespaceUri) {
+          // Only warn if this isn't an xliff namespace.
+          mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                      << "skipping element '" << parser->getElementName()
+                      << "' with unknown namespace '"
+                      << parser->getElementNamespace() << "'");
         }
-    }
-    assert(spanStack.empty() && "spans haven't been fully processed");
+        continue;
+      }
+      depth++;
 
-    outStyleString->str = builder.str();
-    return !error;
+      // Build a span object out of the nested element.
+      std::string spanName = parser->getElementName();
+      const auto endAttrIter = parser->endAttributes();
+      for (auto attrIter = parser->beginAttributes(); attrIter != endAttrIter;
+           ++attrIter) {
+        spanName += ";";
+        spanName += attrIter->name;
+        spanName += "=";
+        spanName += attrIter->value;
+      }
+
+      if (builder.utf16Len() > std::numeric_limits<uint32_t>::max()) {
+        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                     << "style string '" << builder.str() << "' is too long");
+        error = true;
+      } else {
+        spanStack.push_back(
+            Span{spanName, static_cast<uint32_t>(builder.utf16Len())});
+      }
+
+    } else if (event == xml::XmlPullParser::Event::kComment) {
+      // Skip
+    } else {
+      assert(false);
+    }
+  }
+  assert(spanStack.empty() && "spans haven't been fully processed");
+
+  outStyleString->str = builder.str();
+  return !error;
 }
 
 bool ResourceParser::parse(xml::XmlPullParser* parser) {
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip comments and text.
-            continue;
-        }
-
-        if (!parser->getElementNamespace().empty() || parser->getElementName() != "resources") {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "root element must be <resources>");
-            return false;
-        }
-
-        error |= !parseResources(parser);
-        break;
-    };
-
-    if (parser->getEvent() == xml::XmlPullParser::Event::kBadDocument) {
-        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                     << "xml parser error: " << parser->getLastError());
-        return false;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip comments and text.
+      continue;
     }
-    return !error;
+
+    if (!parser->getElementNamespace().empty() ||
+        parser->getElementName() != "resources") {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "root element must be <resources>");
+      return false;
+    }
+
+    error |= !parseResources(parser);
+    break;
+  };
+
+  if (parser->getEvent() == xml::XmlPullParser::Event::kBadDocument) {
+    mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                 << "xml parser error: " << parser->getLastError());
+    return false;
+  }
+  return !error;
 }
 
 bool ResourceParser::parseResources(xml::XmlPullParser* parser) {
-    std::set<ResourceName> strippedResources;
+  std::set<ResourceName> strippedResources;
 
-    bool error = false;
-    std::string comment;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        const xml::XmlPullParser::Event event = parser->getEvent();
-        if (event == xml::XmlPullParser::Event::kComment) {
-            comment = parser->getComment();
-            continue;
-        }
-
-        if (event == xml::XmlPullParser::Event::kText) {
-            if (!util::trimWhitespace(parser->getText()).empty()) {
-                mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                             << "plain text not allowed here");
-                error = true;
-            }
-            continue;
-        }
-
-        assert(event == xml::XmlPullParser::Event::kStartElement);
-
-        if (!parser->getElementNamespace().empty()) {
-            // Skip unknown namespace.
-            continue;
-        }
-
-        std::string elementName = parser->getElementName();
-        if (elementName == "skip" || elementName == "eat-comment") {
-            comment = "";
-            continue;
-        }
-
-        ParsedResource parsedResource;
-        parsedResource.config = mConfig;
-        parsedResource.source = mSource.withLine(parser->getLineNumber());
-        parsedResource.comment = std::move(comment);
-
-        // Extract the product name if it exists.
-        if (Maybe<StringPiece> maybeProduct = xml::findNonEmptyAttribute(parser, "product")) {
-            parsedResource.product = maybeProduct.value().toString();
-        }
-
-        // Parse the resource regardless of product.
-        if (!parseResource(parser, &parsedResource)) {
-            error = true;
-            continue;
-        }
-
-        if (!addResourcesToTable(mTable, mDiag, &parsedResource)) {
-            error = true;
-        }
+  bool error = false;
+  std::string comment;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    const xml::XmlPullParser::Event event = parser->getEvent();
+    if (event == xml::XmlPullParser::Event::kComment) {
+      comment = parser->getComment();
+      continue;
     }
 
-    // Check that we included at least one variant of each stripped resource.
-    for (const ResourceName& strippedResource : strippedResources) {
-        if (!mTable->findResource(strippedResource)) {
-            // Failed to find the resource.
-            mDiag->error(DiagMessage(mSource) << "resource '" << strippedResource << "' "
-                         "was filtered out but no product variant remains");
-            error = true;
-        }
+    if (event == xml::XmlPullParser::Event::kText) {
+      if (!util::trimWhitespace(parser->getText()).empty()) {
+        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                     << "plain text not allowed here");
+        error = true;
+      }
+      continue;
     }
 
-    return !error;
+    assert(event == xml::XmlPullParser::Event::kStartElement);
+
+    if (!parser->getElementNamespace().empty()) {
+      // Skip unknown namespace.
+      continue;
+    }
+
+    std::string elementName = parser->getElementName();
+    if (elementName == "skip" || elementName == "eat-comment") {
+      comment = "";
+      continue;
+    }
+
+    ParsedResource parsedResource;
+    parsedResource.config = mConfig;
+    parsedResource.source = mSource.withLine(parser->getLineNumber());
+    parsedResource.comment = std::move(comment);
+
+    // Extract the product name if it exists.
+    if (Maybe<StringPiece> maybeProduct =
+            xml::findNonEmptyAttribute(parser, "product")) {
+      parsedResource.product = maybeProduct.value().toString();
+    }
+
+    // Parse the resource regardless of product.
+    if (!parseResource(parser, &parsedResource)) {
+      error = true;
+      continue;
+    }
+
+    if (!addResourcesToTable(mTable, mDiag, &parsedResource)) {
+      error = true;
+    }
+  }
+
+  // Check that we included at least one variant of each stripped resource.
+  for (const ResourceName& strippedResource : strippedResources) {
+    if (!mTable->findResource(strippedResource)) {
+      // Failed to find the resource.
+      mDiag->error(DiagMessage(mSource)
+                   << "resource '" << strippedResource
+                   << "' "
+                      "was filtered out but no product variant remains");
+      error = true;
+    }
+  }
+
+  return !error;
 }
 
+bool ResourceParser::parseResource(xml::XmlPullParser* parser,
+                                   ParsedResource* outResource) {
+  struct ItemTypeFormat {
+    ResourceType type;
+    uint32_t format;
+  };
 
-bool ResourceParser::parseResource(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    struct ItemTypeFormat {
-        ResourceType type;
-        uint32_t format;
-    };
+  using BagParseFunc = std::function<bool(ResourceParser*, xml::XmlPullParser*,
+                                          ParsedResource*)>;
 
-    using BagParseFunc = std::function<bool(ResourceParser*, xml::XmlPullParser*, ParsedResource*)>;
+  static const auto elToItemMap =
+      ImmutableMap<std::string, ItemTypeFormat>::createPreSorted({
+          {"bool", {ResourceType::kBool, android::ResTable_map::TYPE_BOOLEAN}},
+          {"color", {ResourceType::kColor, android::ResTable_map::TYPE_COLOR}},
+          {"dimen",
+           {ResourceType::kDimen, android::ResTable_map::TYPE_FLOAT |
+                                      android::ResTable_map::TYPE_FRACTION |
+                                      android::ResTable_map::TYPE_DIMENSION}},
+          {"drawable",
+           {ResourceType::kDrawable, android::ResTable_map::TYPE_COLOR}},
+          {"fraction",
+           {ResourceType::kFraction,
+            android::ResTable_map::TYPE_FLOAT |
+                android::ResTable_map::TYPE_FRACTION |
+                android::ResTable_map::TYPE_DIMENSION}},
+          {"integer",
+           {ResourceType::kInteger, android::ResTable_map::TYPE_INTEGER}},
+          {"string",
+           {ResourceType::kString, android::ResTable_map::TYPE_STRING}},
+      });
 
-    static const auto elToItemMap = ImmutableMap<std::string, ItemTypeFormat>::createPreSorted({
-            { "bool",      { ResourceType::kBool, android::ResTable_map::TYPE_BOOLEAN } },
-            { "color",     { ResourceType::kColor, android::ResTable_map::TYPE_COLOR } },
-            { "dimen",     { ResourceType::kDimen, android::ResTable_map::TYPE_FLOAT
-                                                    | android::ResTable_map::TYPE_FRACTION
-                                                    | android::ResTable_map::TYPE_DIMENSION } },
-            { "drawable",  { ResourceType::kDrawable, android::ResTable_map::TYPE_COLOR } },
-            { "fraction",  { ResourceType::kFraction, android::ResTable_map::TYPE_FLOAT
-                                                       | android::ResTable_map::TYPE_FRACTION
-                                                       | android::ResTable_map::TYPE_DIMENSION } },
-            { "integer",   { ResourceType::kInteger, android::ResTable_map::TYPE_INTEGER } },
-            { "string",    { ResourceType::kString, android::ResTable_map::TYPE_STRING } },
-    });
+  static const auto elToBagMap =
+      ImmutableMap<std::string, BagParseFunc>::createPreSorted({
+          {"add-resource", std::mem_fn(&ResourceParser::parseAddResource)},
+          {"array", std::mem_fn(&ResourceParser::parseArray)},
+          {"attr", std::mem_fn(&ResourceParser::parseAttr)},
+          {"declare-styleable",
+           std::mem_fn(&ResourceParser::parseDeclareStyleable)},
+          {"integer-array", std::mem_fn(&ResourceParser::parseIntegerArray)},
+          {"java-symbol", std::mem_fn(&ResourceParser::parseSymbol)},
+          {"plurals", std::mem_fn(&ResourceParser::parsePlural)},
+          {"public", std::mem_fn(&ResourceParser::parsePublic)},
+          {"public-group", std::mem_fn(&ResourceParser::parsePublicGroup)},
+          {"string-array", std::mem_fn(&ResourceParser::parseStringArray)},
+          {"style", std::mem_fn(&ResourceParser::parseStyle)},
+          {"symbol", std::mem_fn(&ResourceParser::parseSymbol)},
+      });
 
-    static const auto elToBagMap = ImmutableMap<std::string, BagParseFunc>::createPreSorted({
-            { "add-resource",      std::mem_fn(&ResourceParser::parseAddResource) },
-            { "array",             std::mem_fn(&ResourceParser::parseArray) },
-            { "attr",              std::mem_fn(&ResourceParser::parseAttr) },
-            { "declare-styleable", std::mem_fn(&ResourceParser::parseDeclareStyleable) },
-            { "integer-array",     std::mem_fn(&ResourceParser::parseIntegerArray) },
-            { "java-symbol",       std::mem_fn(&ResourceParser::parseSymbol) },
-            { "plurals",           std::mem_fn(&ResourceParser::parsePlural) },
-            { "public",            std::mem_fn(&ResourceParser::parsePublic) },
-            { "public-group",      std::mem_fn(&ResourceParser::parsePublicGroup) },
-            { "string-array",      std::mem_fn(&ResourceParser::parseStringArray) },
-            { "style",             std::mem_fn(&ResourceParser::parseStyle) },
-            { "symbol",            std::mem_fn(&ResourceParser::parseSymbol) },
-    });
+  std::string resourceType = parser->getElementName();
 
-    std::string resourceType = parser->getElementName();
+  // The value format accepted for this resource.
+  uint32_t resourceFormat = 0u;
 
-    // The value format accepted for this resource.
-    uint32_t resourceFormat = 0u;
-
-    if (resourceType == "item") {
-        // Items have their type encoded in the type attribute.
-        if (Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type")) {
-            resourceType = maybeType.value().toString();
-        } else {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "<item> must have a 'type' attribute");
-            return false;
-        }
-
-        if (Maybe<StringPiece> maybeFormat = xml::findNonEmptyAttribute(parser, "format")) {
-            // An explicit format for this resource was specified. The resource will retain
-            // its type in its name, but the accepted value for this type is overridden.
-            resourceFormat = parseFormatType(maybeFormat.value());
-            if (!resourceFormat) {
-                mDiag->error(DiagMessage(outResource->source)
-                             << "'" << maybeFormat.value() << "' is an invalid format");
-                return false;
-            }
-        }
+  if (resourceType == "item") {
+    // Items have their type encoded in the type attribute.
+    if (Maybe<StringPiece> maybeType =
+            xml::findNonEmptyAttribute(parser, "type")) {
+      resourceType = maybeType.value().toString();
+    } else {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "<item> must have a 'type' attribute");
+      return false;
     }
 
-    // Get the name of the resource. This will be checked later, because not all
-    // XML elements require a name.
-    Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-
-    if (resourceType == "id") {
-        if (!maybeName) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "<" << parser->getElementName() << "> missing 'name' attribute");
-            return false;
-        }
-
-        outResource->name.type = ResourceType::kId;
-        outResource->name.entry = maybeName.value().toString();
-        outResource->value = util::make_unique<Id>();
-        return true;
-    }
-
-    const auto itemIter = elToItemMap.find(resourceType);
-    if (itemIter != elToItemMap.end()) {
-        // This is an item, record its type and format and start parsing.
-
-        if (!maybeName) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "<" << parser->getElementName() << "> missing 'name' attribute");
-            return false;
-        }
-
-        outResource->name.type = itemIter->second.type;
-        outResource->name.entry = maybeName.value().toString();
-
-        // Only use the implicit format for this type if it wasn't overridden.
-        if (!resourceFormat) {
-            resourceFormat = itemIter->second.format;
-        }
-
-        if (!parseItem(parser, outResource, resourceFormat)) {
-            return false;
-        }
-        return true;
-    }
-
-    // This might be a bag or something.
-    const auto bagIter = elToBagMap.find(resourceType);
-    if (bagIter != elToBagMap.end()) {
-        // Ensure we have a name (unless this is a <public-group>).
-        if (resourceType != "public-group") {
-            if (!maybeName) {
-                mDiag->error(DiagMessage(outResource->source)
-                             << "<" << parser->getElementName() << "> missing 'name' attribute");
-                return false;
-            }
-
-            outResource->name.entry = maybeName.value().toString();
-        }
-
-        // Call the associated parse method. The type will be filled in by the
-        // parse func.
-        if (!bagIter->second(this, parser, outResource)) {
-            return false;
-        }
-        return true;
-    }
-
-    // Try parsing the elementName (or type) as a resource. These shall only be
-    // resources like 'layout' or 'xml' and they can only be references.
-    const ResourceType* parsedType = parseResourceType(resourceType);
-    if (parsedType) {
-        if (!maybeName) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "<" << parser->getElementName() << "> missing 'name' attribute");
-            return false;
-        }
-
-        outResource->name.type = *parsedType;
-        outResource->name.entry = maybeName.value().toString();
-        outResource->value = parseXml(parser, android::ResTable_map::TYPE_REFERENCE, kNoRawString);
-        if (!outResource->value) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for type '" << *parsedType << "'. Expected a reference");
-            return false;
-        }
-        return true;
-    }
-
-    mDiag->warn(DiagMessage(outResource->source)
-                << "unknown resource type '" << parser->getElementName() << "'");
-    return false;
-}
-
-bool ResourceParser::parseItem(xml::XmlPullParser* parser, ParsedResource* outResource,
-                               const uint32_t format) {
-    if (format == android::ResTable_map::TYPE_STRING) {
-        return parseString(parser, outResource);
-    }
-
-    outResource->value = parseXml(parser, format, kNoRawString);
-    if (!outResource->value) {
-        mDiag->error(DiagMessage(outResource->source) << "invalid " << outResource->name.type);
+    if (Maybe<StringPiece> maybeFormat =
+            xml::findNonEmptyAttribute(parser, "format")) {
+      // An explicit format for this resource was specified. The resource will
+      // retain
+      // its type in its name, but the accepted value for this type is
+      // overridden.
+      resourceFormat = parseFormatType(maybeFormat.value());
+      if (!resourceFormat) {
+        mDiag->error(DiagMessage(outResource->source)
+                     << "'" << maybeFormat.value() << "' is an invalid format");
         return false;
+      }
+    }
+  }
+
+  // Get the name of the resource. This will be checked later, because not all
+  // XML elements require a name.
+  Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+
+  if (resourceType == "id") {
+    if (!maybeName) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "<" << parser->getElementName()
+                   << "> missing 'name' attribute");
+      return false;
+    }
+
+    outResource->name.type = ResourceType::kId;
+    outResource->name.entry = maybeName.value().toString();
+    outResource->value = util::make_unique<Id>();
+    return true;
+  }
+
+  const auto itemIter = elToItemMap.find(resourceType);
+  if (itemIter != elToItemMap.end()) {
+    // This is an item, record its type and format and start parsing.
+
+    if (!maybeName) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "<" << parser->getElementName()
+                   << "> missing 'name' attribute");
+      return false;
+    }
+
+    outResource->name.type = itemIter->second.type;
+    outResource->name.entry = maybeName.value().toString();
+
+    // Only use the implicit format for this type if it wasn't overridden.
+    if (!resourceFormat) {
+      resourceFormat = itemIter->second.format;
+    }
+
+    if (!parseItem(parser, outResource, resourceFormat)) {
+      return false;
     }
     return true;
+  }
+
+  // This might be a bag or something.
+  const auto bagIter = elToBagMap.find(resourceType);
+  if (bagIter != elToBagMap.end()) {
+    // Ensure we have a name (unless this is a <public-group>).
+    if (resourceType != "public-group") {
+      if (!maybeName) {
+        mDiag->error(DiagMessage(outResource->source)
+                     << "<" << parser->getElementName()
+                     << "> missing 'name' attribute");
+        return false;
+      }
+
+      outResource->name.entry = maybeName.value().toString();
+    }
+
+    // Call the associated parse method. The type will be filled in by the
+    // parse func.
+    if (!bagIter->second(this, parser, outResource)) {
+      return false;
+    }
+    return true;
+  }
+
+  // Try parsing the elementName (or type) as a resource. These shall only be
+  // resources like 'layout' or 'xml' and they can only be references.
+  const ResourceType* parsedType = parseResourceType(resourceType);
+  if (parsedType) {
+    if (!maybeName) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "<" << parser->getElementName()
+                   << "> missing 'name' attribute");
+      return false;
+    }
+
+    outResource->name.type = *parsedType;
+    outResource->name.entry = maybeName.value().toString();
+    outResource->value =
+        parseXml(parser, android::ResTable_map::TYPE_REFERENCE, kNoRawString);
+    if (!outResource->value) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for type '" << *parsedType
+                   << "'. Expected a reference");
+      return false;
+    }
+    return true;
+  }
+
+  mDiag->warn(DiagMessage(outResource->source)
+              << "unknown resource type '" << parser->getElementName() << "'");
+  return false;
+}
+
+bool ResourceParser::parseItem(xml::XmlPullParser* parser,
+                               ParsedResource* outResource,
+                               const uint32_t format) {
+  if (format == android::ResTable_map::TYPE_STRING) {
+    return parseString(parser, outResource);
+  }
+
+  outResource->value = parseXml(parser, format, kNoRawString);
+  if (!outResource->value) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid "
+                                                  << outResource->name.type);
+    return false;
+  }
+  return true;
 }
 
 /**
@@ -476,771 +519,834 @@
  * an Item. If allowRawValue is false, nullptr is returned in this
  * case.
  */
-std::unique_ptr<Item> ResourceParser::parseXml(xml::XmlPullParser* parser, const uint32_t typeMask,
+std::unique_ptr<Item> ResourceParser::parseXml(xml::XmlPullParser* parser,
+                                               const uint32_t typeMask,
                                                const bool allowRawValue) {
-    const size_t beginXmlLine = parser->getLineNumber();
+  const size_t beginXmlLine = parser->getLineNumber();
 
-    std::string rawValue;
-    StyleString styleString;
-    if (!flattenXmlSubtree(parser, &rawValue, &styleString)) {
-        return {};
-    }
-
-    if (!styleString.spans.empty()) {
-        // This can only be a StyledString.
-        return util::make_unique<StyledString>(
-                mTable->stringPool.makeRef(styleString, StringPool::Context{ 1, mConfig }));
-    }
-
-    auto onCreateReference = [&](const ResourceName& name) {
-        // name.package can be empty here, as it will assume the package name of the table.
-        std::unique_ptr<Id> id = util::make_unique<Id>();
-        id->setSource(mSource.withLine(beginXmlLine));
-        mTable->addResource(name, {}, {}, std::move(id), mDiag);
-    };
-
-    // Process the raw value.
-    std::unique_ptr<Item> processedItem = ResourceUtils::tryParseItemForAttribute(
-            rawValue, typeMask, onCreateReference);
-    if (processedItem) {
-        // Fix up the reference.
-        if (Reference* ref = valueCast<Reference>(processedItem.get())) {
-            transformReferenceFromNamespace(parser, "", ref);
-        }
-        return processedItem;
-    }
-
-    // Try making a regular string.
-    if (typeMask & android::ResTable_map::TYPE_STRING) {
-        // Use the trimmed, escaped string.
-        return util::make_unique<String>(
-                mTable->stringPool.makeRef(styleString.str, StringPool::Context{ 1, mConfig }));
-    }
-
-    if (allowRawValue) {
-        // We can't parse this so return a RawString if we are allowed.
-        return util::make_unique<RawString>(
-                mTable->stringPool.makeRef(rawValue, StringPool::Context{ 1, mConfig }));
-    }
+  std::string rawValue;
+  StyleString styleString;
+  if (!flattenXmlSubtree(parser, &rawValue, &styleString)) {
     return {};
+  }
+
+  if (!styleString.spans.empty()) {
+    // This can only be a StyledString.
+    return util::make_unique<StyledString>(mTable->stringPool.makeRef(
+        styleString, StringPool::Context{1, mConfig}));
+  }
+
+  auto onCreateReference = [&](const ResourceName& name) {
+    // name.package can be empty here, as it will assume the package name of the
+    // table.
+    std::unique_ptr<Id> id = util::make_unique<Id>();
+    id->setSource(mSource.withLine(beginXmlLine));
+    mTable->addResource(name, {}, {}, std::move(id), mDiag);
+  };
+
+  // Process the raw value.
+  std::unique_ptr<Item> processedItem = ResourceUtils::tryParseItemForAttribute(
+      rawValue, typeMask, onCreateReference);
+  if (processedItem) {
+    // Fix up the reference.
+    if (Reference* ref = valueCast<Reference>(processedItem.get())) {
+      transformReferenceFromNamespace(parser, "", ref);
+    }
+    return processedItem;
+  }
+
+  // Try making a regular string.
+  if (typeMask & android::ResTable_map::TYPE_STRING) {
+    // Use the trimmed, escaped string.
+    return util::make_unique<String>(mTable->stringPool.makeRef(
+        styleString.str, StringPool::Context{1, mConfig}));
+  }
+
+  if (allowRawValue) {
+    // We can't parse this so return a RawString if we are allowed.
+    return util::make_unique<RawString>(
+        mTable->stringPool.makeRef(rawValue, StringPool::Context{1, mConfig}));
+  }
+  return {};
 }
 
-bool ResourceParser::parseString(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    bool formatted = true;
-    if (Maybe<StringPiece> formattedAttr = xml::findAttribute(parser, "formatted")) {
-        Maybe<bool> maybeFormatted = ResourceUtils::parseBool(formattedAttr.value());
-        if (!maybeFormatted) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for 'formatted'. Must be a boolean");
-            return false;
-        }
-        formatted = maybeFormatted.value();
+bool ResourceParser::parseString(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  bool formatted = true;
+  if (Maybe<StringPiece> formattedAttr =
+          xml::findAttribute(parser, "formatted")) {
+    Maybe<bool> maybeFormatted =
+        ResourceUtils::parseBool(formattedAttr.value());
+    if (!maybeFormatted) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for 'formatted'. Must be a boolean");
+      return false;
     }
+    formatted = maybeFormatted.value();
+  }
 
-    bool translateable = mOptions.translatable;
-    if (Maybe<StringPiece> translateableAttr = xml::findAttribute(parser, "translatable")) {
-        Maybe<bool> maybeTranslateable = ResourceUtils::parseBool(translateableAttr.value());
-        if (!maybeTranslateable) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for 'translatable'. Must be a boolean");
-            return false;
-        }
-        translateable = maybeTranslateable.value();
+  bool translateable = mOptions.translatable;
+  if (Maybe<StringPiece> translateableAttr =
+          xml::findAttribute(parser, "translatable")) {
+    Maybe<bool> maybeTranslateable =
+        ResourceUtils::parseBool(translateableAttr.value());
+    if (!maybeTranslateable) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for 'translatable'. Must be a boolean");
+      return false;
     }
+    translateable = maybeTranslateable.value();
+  }
 
-    outResource->value = parseXml(parser, android::ResTable_map::TYPE_STRING, kNoRawString);
-    if (!outResource->value) {
-        mDiag->error(DiagMessage(outResource->source) << "not a valid string");
-        return false;
-    }
+  outResource->value =
+      parseXml(parser, android::ResTable_map::TYPE_STRING, kNoRawString);
+  if (!outResource->value) {
+    mDiag->error(DiagMessage(outResource->source) << "not a valid string");
+    return false;
+  }
 
-    if (String* stringValue = valueCast<String>(outResource->value.get())) {
-        stringValue->setTranslateable(translateable);
+  if (String* stringValue = valueCast<String>(outResource->value.get())) {
+    stringValue->setTranslateable(translateable);
 
-        if (formatted && translateable) {
-            if (!util::verifyJavaStringFormat(*stringValue->value)) {
-                DiagMessage msg(outResource->source);
-                msg << "multiple substitutions specified in non-positional format; "
-                       "did you mean to add the formatted=\"false\" attribute?";
-                if (mOptions.errorOnPositionalArguments) {
-                    mDiag->error(msg);
-                    return false;
-                }
-
-                mDiag->warn(msg);
-            }
+    if (formatted && translateable) {
+      if (!util::verifyJavaStringFormat(*stringValue->value)) {
+        DiagMessage msg(outResource->source);
+        msg << "multiple substitutions specified in non-positional format; "
+               "did you mean to add the formatted=\"false\" attribute?";
+        if (mOptions.errorOnPositionalArguments) {
+          mDiag->error(msg);
+          return false;
         }
 
-    } else if (StyledString* stringValue = valueCast<StyledString>(outResource->value.get())) {
-        stringValue->setTranslateable(translateable);
+        mDiag->warn(msg);
+      }
     }
-    return true;
+
+  } else if (StyledString* stringValue =
+                 valueCast<StyledString>(outResource->value.get())) {
+    stringValue->setTranslateable(translateable);
+  }
+  return true;
 }
 
-bool ResourceParser::parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
-    if (!maybeType) {
-        mDiag->error(DiagMessage(outResource->source) << "<public> must have a 'type' attribute");
-        return false;
-    }
+bool ResourceParser::parsePublic(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
+  if (!maybeType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<public> must have a 'type' attribute");
+    return false;
+  }
 
-    const ResourceType* parsedType = parseResourceType(maybeType.value());
-    if (!parsedType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource type '" << maybeType.value() << "' in <public>");
-        return false;
-    }
+  const ResourceType* parsedType = parseResourceType(maybeType.value());
+  if (!parsedType) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid resource type '"
+                                                  << maybeType.value()
+                                                  << "' in <public>");
+    return false;
+  }
 
-    outResource->name.type = *parsedType;
+  outResource->name.type = *parsedType;
 
-    if (Maybe<StringPiece> maybeIdStr = xml::findNonEmptyAttribute(parser, "id")) {
-        Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(maybeIdStr.value());
-        if (!maybeId) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid resource ID '" << maybeId.value() << "' in <public>");
-            return false;
-        }
-        outResource->id = maybeId.value();
-    }
-
-    if (*parsedType == ResourceType::kId) {
-        // An ID marked as public is also the definition of an ID.
-        outResource->value = util::make_unique<Id>();
-    }
-
-    outResource->symbolState = SymbolState::kPublic;
-    return true;
-}
-
-bool ResourceParser::parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
-    if (!maybeType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "<public-group> must have a 'type' attribute");
-        return false;
-    }
-
-    const ResourceType* parsedType = parseResourceType(maybeType.value());
-    if (!parsedType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource type '" << maybeType.value() << "' in <public-group>");
-        return false;
-    }
-
-    Maybe<StringPiece> maybeIdStr = xml::findNonEmptyAttribute(parser, "first-id");
-    if (!maybeIdStr) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "<public-group> must have a 'first-id' attribute");
-        return false;
-    }
-
-    Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(maybeIdStr.value());
+  if (Maybe<StringPiece> maybeIdStr =
+          xml::findNonEmptyAttribute(parser, "id")) {
+    Maybe<ResourceId> maybeId =
+        ResourceUtils::parseResourceId(maybeIdStr.value());
     if (!maybeId) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource ID '" << maybeIdStr.value() << "' in <public-group>");
-        return false;
+      mDiag->error(DiagMessage(outResource->source) << "invalid resource ID '"
+                                                    << maybeId.value()
+                                                    << "' in <public>");
+      return false;
     }
+    outResource->id = maybeId.value();
+  }
 
-    ResourceId nextId = maybeId.value();
+  if (*parsedType == ResourceType::kId) {
+    // An ID marked as public is also the definition of an ID.
+    outResource->value = util::make_unique<Id>();
+  }
 
-    std::string comment;
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
-            comment = util::trimWhitespace(parser->getComment()).toString();
-            continue;
-        } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "public") {
-            Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-            if (!maybeName) {
-                mDiag->error(DiagMessage(itemSource) << "<public> must have a 'name' attribute");
-                error = true;
-                continue;
-            }
-
-            if (xml::findNonEmptyAttribute(parser, "id")) {
-                mDiag->error(DiagMessage(itemSource) << "'id' is ignored within <public-group>");
-                error = true;
-                continue;
-            }
-
-            if (xml::findNonEmptyAttribute(parser, "type")) {
-                mDiag->error(DiagMessage(itemSource) << "'type' is ignored within <public-group>");
-                error = true;
-                continue;
-            }
-
-            ParsedResource childResource;
-            childResource.name.type = *parsedType;
-            childResource.name.entry = maybeName.value().toString();
-            childResource.id = nextId;
-            childResource.comment = std::move(comment);
-            childResource.source = itemSource;
-            childResource.symbolState = SymbolState::kPublic;
-            outResource->childResources.push_back(std::move(childResource));
-
-            nextId.id += 1;
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
-            error = true;
-        }
-    }
-    return !error;
+  outResource->symbolState = SymbolState::kPublic;
+  return true;
 }
 
-bool ResourceParser::parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
-    if (!maybeType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "<" << parser->getElementName() << "> must have a 'type' attribute");
-        return false;
-    }
-
-    const ResourceType* parsedType = parseResourceType(maybeType.value());
-    if (!parsedType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource type '" << maybeType.value()
-                     << "' in <" << parser->getElementName() << ">");
-        return false;
-    }
-
-    outResource->name.type = *parsedType;
-    return true;
-}
-
-bool ResourceParser::parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    if (parseSymbolImpl(parser, outResource)) {
-        outResource->symbolState = SymbolState::kPrivate;
-        return true;
-    }
+bool ResourceParser::parsePublicGroup(xml::XmlPullParser* parser,
+                                      ParsedResource* outResource) {
+  Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
+  if (!maybeType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<public-group> must have a 'type' attribute");
     return false;
-}
+  }
 
-bool ResourceParser::parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    if (parseSymbolImpl(parser, outResource)) {
-        outResource->symbolState = SymbolState::kUndefined;
-        return true;
-    }
+  const ResourceType* parsedType = parseResourceType(maybeType.value());
+  if (!parsedType) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid resource type '"
+                                                  << maybeType.value()
+                                                  << "' in <public-group>");
     return false;
+  }
+
+  Maybe<StringPiece> maybeIdStr =
+      xml::findNonEmptyAttribute(parser, "first-id");
+  if (!maybeIdStr) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<public-group> must have a 'first-id' attribute");
+    return false;
+  }
+
+  Maybe<ResourceId> maybeId =
+      ResourceUtils::parseResourceId(maybeIdStr.value());
+  if (!maybeId) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid resource ID '"
+                                                  << maybeIdStr.value()
+                                                  << "' in <public-group>");
+    return false;
+  }
+
+  ResourceId nextId = maybeId.value();
+
+  std::string comment;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
+      comment = util::trimWhitespace(parser->getComment()).toString();
+      continue;
+    } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text.
+      continue;
+    }
+
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "public") {
+      Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+      if (!maybeName) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<public> must have a 'name' attribute");
+        error = true;
+        continue;
+      }
+
+      if (xml::findNonEmptyAttribute(parser, "id")) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "'id' is ignored within <public-group>");
+        error = true;
+        continue;
+      }
+
+      if (xml::findNonEmptyAttribute(parser, "type")) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "'type' is ignored within <public-group>");
+        error = true;
+        continue;
+      }
+
+      ParsedResource childResource;
+      childResource.name.type = *parsedType;
+      childResource.name.entry = maybeName.value().toString();
+      childResource.id = nextId;
+      childResource.comment = std::move(comment);
+      childResource.source = itemSource;
+      childResource.symbolState = SymbolState::kPublic;
+      outResource->childResources.push_back(std::move(childResource));
+
+      nextId.id += 1;
+
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
+      error = true;
+    }
+  }
+  return !error;
 }
 
+bool ResourceParser::parseSymbolImpl(xml::XmlPullParser* parser,
+                                     ParsedResource* outResource) {
+  Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
+  if (!maybeType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<" << parser->getElementName()
+                 << "> must have a 'type' attribute");
+    return false;
+  }
 
-bool ResourceParser::parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseAttrImpl(parser, outResource, false);
+  const ResourceType* parsedType = parseResourceType(maybeType.value());
+  if (!parsedType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "invalid resource type '" << maybeType.value() << "' in <"
+                 << parser->getElementName() << ">");
+    return false;
+  }
+
+  outResource->name.type = *parsedType;
+  return true;
 }
 
-bool ResourceParser::parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
-                                   bool weak) {
-    outResource->name.type = ResourceType::kAttr;
-
-    // Attributes only end up in default configuration.
-    if (outResource->config != ConfigDescription::defaultConfig()) {
-        mDiag->warn(DiagMessage(outResource->source) << "ignoring configuration '"
-                    << outResource->config << "' for attribute " << outResource->name);
-        outResource->config = ConfigDescription::defaultConfig();
-    }
-
-    uint32_t typeMask = 0;
-
-    Maybe<StringPiece> maybeFormat = xml::findAttribute(parser, "format");
-    if (maybeFormat) {
-        typeMask = parseFormatAttribute(maybeFormat.value());
-        if (typeMask == 0) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "invalid attribute format '" << maybeFormat.value() << "'");
-            return false;
-        }
-    }
-
-    Maybe<int32_t> maybeMin, maybeMax;
-
-    if (Maybe<StringPiece> maybeMinStr = xml::findAttribute(parser, "min")) {
-        StringPiece minStr = util::trimWhitespace(maybeMinStr.value());
-        if (!minStr.empty()) {
-            std::u16string minStr16 = util::utf8ToUtf16(minStr);
-            android::Res_value value;
-            if (android::ResTable::stringToInt(minStr16.data(), minStr16.size(), &value)) {
-                maybeMin = static_cast<int32_t>(value.data);
-            }
-        }
-
-        if (!maybeMin) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "invalid 'min' value '" << minStr << "'");
-            return false;
-        }
-    }
-
-    if (Maybe<StringPiece> maybeMaxStr = xml::findAttribute(parser, "max")) {
-        StringPiece maxStr = util::trimWhitespace(maybeMaxStr.value());
-        if (!maxStr.empty()) {
-            std::u16string maxStr16 = util::utf8ToUtf16(maxStr);
-            android::Res_value value;
-            if (android::ResTable::stringToInt(maxStr16.data(), maxStr16.size(), &value)) {
-                maybeMax = static_cast<int32_t>(value.data);
-            }
-        }
-
-        if (!maybeMax) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "invalid 'max' value '" << maxStr << "'");
-            return false;
-        }
-    }
-
-    if ((maybeMin || maybeMax) && (typeMask & android::ResTable_map::TYPE_INTEGER) == 0) {
-        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                     << "'min' and 'max' can only be used when format='integer'");
-        return false;
-    }
-
-    struct SymbolComparator {
-        bool operator()(const Attribute::Symbol& a, const Attribute::Symbol& b) {
-            return a.symbol.name.value() < b.symbol.name.value();
-        }
-    };
-
-    std::set<Attribute::Symbol, SymbolComparator> items;
-
-    std::string comment;
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
-            comment = util::trimWhitespace(parser->getComment()).toString();
-            continue;
-        } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && (elementName == "flag" || elementName == "enum")) {
-            if (elementName == "enum") {
-                if (typeMask & android::ResTable_map::TYPE_FLAGS) {
-                    mDiag->error(DiagMessage(itemSource)
-                                 << "can not define an <enum>; already defined a <flag>");
-                    error = true;
-                    continue;
-                }
-                typeMask |= android::ResTable_map::TYPE_ENUM;
-
-            } else if (elementName == "flag") {
-                if (typeMask & android::ResTable_map::TYPE_ENUM) {
-                    mDiag->error(DiagMessage(itemSource)
-                                 << "can not define a <flag>; already defined an <enum>");
-                    error = true;
-                    continue;
-                }
-                typeMask |= android::ResTable_map::TYPE_FLAGS;
-            }
-
-            if (Maybe<Attribute::Symbol> s = parseEnumOrFlagItem(parser, elementName)) {
-                Attribute::Symbol& symbol = s.value();
-                ParsedResource childResource;
-                childResource.name = symbol.symbol.name.value();
-                childResource.source = itemSource;
-                childResource.value = util::make_unique<Id>();
-                outResource->childResources.push_back(std::move(childResource));
-
-                symbol.symbol.setComment(std::move(comment));
-                symbol.symbol.setSource(itemSource);
-
-                auto insertResult = items.insert(std::move(symbol));
-                if (!insertResult.second) {
-                    const Attribute::Symbol& existingSymbol = *insertResult.first;
-                    mDiag->error(DiagMessage(itemSource)
-                                 << "duplicate symbol '" << existingSymbol.symbol.name.value().entry
-                                 << "'");
-
-                    mDiag->note(DiagMessage(existingSymbol.symbol.getSource())
-                                << "first defined here");
-                    error = true;
-                }
-            } else {
-                error = true;
-            }
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
-            error = true;
-        }
-
-        comment = {};
-    }
-
-    if (error) {
-        return false;
-    }
-
-    std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(weak);
-    attr->symbols = std::vector<Attribute::Symbol>(items.begin(), items.end());
-    attr->typeMask = typeMask ? typeMask : uint32_t(android::ResTable_map::TYPE_ANY);
-    if (maybeMin) {
-        attr->minInt = maybeMin.value();
-    }
-
-    if (maybeMax) {
-        attr->maxInt = maybeMax.value();
-    }
-    outResource->value = std::move(attr);
+bool ResourceParser::parseSymbol(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  if (parseSymbolImpl(parser, outResource)) {
+    outResource->symbolState = SymbolState::kPrivate;
     return true;
+  }
+  return false;
 }
 
-Maybe<Attribute::Symbol> ResourceParser::parseEnumOrFlagItem(xml::XmlPullParser* parser,
-                                                             const StringPiece& tag) {
-    const Source source = mSource.withLine(parser->getLineNumber());
+bool ResourceParser::parseAddResource(xml::XmlPullParser* parser,
+                                      ParsedResource* outResource) {
+  if (parseSymbolImpl(parser, outResource)) {
+    outResource->symbolState = SymbolState::kUndefined;
+    return true;
+  }
+  return false;
+}
 
-    Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-    if (!maybeName) {
-        mDiag->error(DiagMessage(source) << "no attribute 'name' found for tag <" << tag << ">");
-        return {};
+bool ResourceParser::parseAttr(xml::XmlPullParser* parser,
+                               ParsedResource* outResource) {
+  return parseAttrImpl(parser, outResource, false);
+}
+
+bool ResourceParser::parseAttrImpl(xml::XmlPullParser* parser,
+                                   ParsedResource* outResource, bool weak) {
+  outResource->name.type = ResourceType::kAttr;
+
+  // Attributes only end up in default configuration.
+  if (outResource->config != ConfigDescription::defaultConfig()) {
+    mDiag->warn(DiagMessage(outResource->source)
+                << "ignoring configuration '" << outResource->config
+                << "' for attribute " << outResource->name);
+    outResource->config = ConfigDescription::defaultConfig();
+  }
+
+  uint32_t typeMask = 0;
+
+  Maybe<StringPiece> maybeFormat = xml::findAttribute(parser, "format");
+  if (maybeFormat) {
+    typeMask = parseFormatAttribute(maybeFormat.value());
+    if (typeMask == 0) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "invalid attribute format '" << maybeFormat.value()
+                   << "'");
+      return false;
+    }
+  }
+
+  Maybe<int32_t> maybeMin, maybeMax;
+
+  if (Maybe<StringPiece> maybeMinStr = xml::findAttribute(parser, "min")) {
+    StringPiece minStr = util::trimWhitespace(maybeMinStr.value());
+    if (!minStr.empty()) {
+      std::u16string minStr16 = util::utf8ToUtf16(minStr);
+      android::Res_value value;
+      if (android::ResTable::stringToInt(minStr16.data(), minStr16.size(),
+                                         &value)) {
+        maybeMin = static_cast<int32_t>(value.data);
+      }
     }
 
-    Maybe<StringPiece> maybeValue = xml::findNonEmptyAttribute(parser, "value");
-    if (!maybeValue) {
-        mDiag->error(DiagMessage(source) << "no attribute 'value' found for tag <" << tag << ">");
-        return {};
+    if (!maybeMin) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "invalid 'min' value '" << minStr << "'");
+      return false;
+    }
+  }
+
+  if (Maybe<StringPiece> maybeMaxStr = xml::findAttribute(parser, "max")) {
+    StringPiece maxStr = util::trimWhitespace(maybeMaxStr.value());
+    if (!maxStr.empty()) {
+      std::u16string maxStr16 = util::utf8ToUtf16(maxStr);
+      android::Res_value value;
+      if (android::ResTable::stringToInt(maxStr16.data(), maxStr16.size(),
+                                         &value)) {
+        maybeMax = static_cast<int32_t>(value.data);
+      }
     }
 
-    std::u16string value16 = util::utf8ToUtf16(maybeValue.value());
-    android::Res_value val;
-    if (!android::ResTable::stringToInt(value16.data(), value16.size(), &val)) {
-        mDiag->error(DiagMessage(source) << "invalid value '" << maybeValue.value()
-                     << "' for <" << tag << ">; must be an integer");
-        return {};
+    if (!maybeMax) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "invalid 'max' value '" << maxStr << "'");
+      return false;
+    }
+  }
+
+  if ((maybeMin || maybeMax) &&
+      (typeMask & android::ResTable_map::TYPE_INTEGER) == 0) {
+    mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                 << "'min' and 'max' can only be used when format='integer'");
+    return false;
+  }
+
+  struct SymbolComparator {
+    bool operator()(const Attribute::Symbol& a, const Attribute::Symbol& b) {
+      return a.symbol.name.value() < b.symbol.name.value();
+    }
+  };
+
+  std::set<Attribute::Symbol, SymbolComparator> items;
+
+  std::string comment;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
+      comment = util::trimWhitespace(parser->getComment()).toString();
+      continue;
+    } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text.
+      continue;
     }
 
-    return Attribute::Symbol{
-            Reference(ResourceNameRef({}, ResourceType::kId, maybeName.value())), val.data };
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() &&
+        (elementName == "flag" || elementName == "enum")) {
+      if (elementName == "enum") {
+        if (typeMask & android::ResTable_map::TYPE_FLAGS) {
+          mDiag->error(DiagMessage(itemSource)
+                       << "can not define an <enum>; already defined a <flag>");
+          error = true;
+          continue;
+        }
+        typeMask |= android::ResTable_map::TYPE_ENUM;
+
+      } else if (elementName == "flag") {
+        if (typeMask & android::ResTable_map::TYPE_ENUM) {
+          mDiag->error(DiagMessage(itemSource)
+                       << "can not define a <flag>; already defined an <enum>");
+          error = true;
+          continue;
+        }
+        typeMask |= android::ResTable_map::TYPE_FLAGS;
+      }
+
+      if (Maybe<Attribute::Symbol> s =
+              parseEnumOrFlagItem(parser, elementName)) {
+        Attribute::Symbol& symbol = s.value();
+        ParsedResource childResource;
+        childResource.name = symbol.symbol.name.value();
+        childResource.source = itemSource;
+        childResource.value = util::make_unique<Id>();
+        outResource->childResources.push_back(std::move(childResource));
+
+        symbol.symbol.setComment(std::move(comment));
+        symbol.symbol.setSource(itemSource);
+
+        auto insertResult = items.insert(std::move(symbol));
+        if (!insertResult.second) {
+          const Attribute::Symbol& existingSymbol = *insertResult.first;
+          mDiag->error(DiagMessage(itemSource)
+                       << "duplicate symbol '"
+                       << existingSymbol.symbol.name.value().entry << "'");
+
+          mDiag->note(DiagMessage(existingSymbol.symbol.getSource())
+                      << "first defined here");
+          error = true;
+        }
+      } else {
+        error = true;
+      }
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
+      error = true;
+    }
+
+    comment = {};
+  }
+
+  if (error) {
+    return false;
+  }
+
+  std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(weak);
+  attr->symbols = std::vector<Attribute::Symbol>(items.begin(), items.end());
+  attr->typeMask =
+      typeMask ? typeMask : uint32_t(android::ResTable_map::TYPE_ANY);
+  if (maybeMin) {
+    attr->minInt = maybeMin.value();
+  }
+
+  if (maybeMax) {
+    attr->maxInt = maybeMax.value();
+  }
+  outResource->value = std::move(attr);
+  return true;
+}
+
+Maybe<Attribute::Symbol> ResourceParser::parseEnumOrFlagItem(
+    xml::XmlPullParser* parser, const StringPiece& tag) {
+  const Source source = mSource.withLine(parser->getLineNumber());
+
+  Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+  if (!maybeName) {
+    mDiag->error(DiagMessage(source) << "no attribute 'name' found for tag <"
+                                     << tag << ">");
+    return {};
+  }
+
+  Maybe<StringPiece> maybeValue = xml::findNonEmptyAttribute(parser, "value");
+  if (!maybeValue) {
+    mDiag->error(DiagMessage(source) << "no attribute 'value' found for tag <"
+                                     << tag << ">");
+    return {};
+  }
+
+  std::u16string value16 = util::utf8ToUtf16(maybeValue.value());
+  android::Res_value val;
+  if (!android::ResTable::stringToInt(value16.data(), value16.size(), &val)) {
+    mDiag->error(DiagMessage(source) << "invalid value '" << maybeValue.value()
+                                     << "' for <" << tag
+                                     << ">; must be an integer");
+    return {};
+  }
+
+  return Attribute::Symbol{
+      Reference(ResourceNameRef({}, ResourceType::kId, maybeName.value())),
+      val.data};
 }
 
 bool ResourceParser::parseStyleItem(xml::XmlPullParser* parser, Style* style) {
-    const Source source = mSource.withLine(parser->getLineNumber());
+  const Source source = mSource.withLine(parser->getLineNumber());
 
-    Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-    if (!maybeName) {
-        mDiag->error(DiagMessage(source) << "<item> must have a 'name' attribute");
+  Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+  if (!maybeName) {
+    mDiag->error(DiagMessage(source) << "<item> must have a 'name' attribute");
+    return false;
+  }
+
+  Maybe<Reference> maybeKey =
+      ResourceUtils::parseXmlAttributeName(maybeName.value());
+  if (!maybeKey) {
+    mDiag->error(DiagMessage(source) << "invalid attribute name '"
+                                     << maybeName.value() << "'");
+    return false;
+  }
+
+  transformReferenceFromNamespace(parser, "", &maybeKey.value());
+  maybeKey.value().setSource(source);
+
+  std::unique_ptr<Item> value = parseXml(parser, 0, kAllowRawString);
+  if (!value) {
+    mDiag->error(DiagMessage(source) << "could not parse style item");
+    return false;
+  }
+
+  style->entries.push_back(
+      Style::Entry{std::move(maybeKey.value()), std::move(value)});
+  return true;
+}
+
+bool ResourceParser::parseStyle(xml::XmlPullParser* parser,
+                                ParsedResource* outResource) {
+  outResource->name.type = ResourceType::kStyle;
+
+  std::unique_ptr<Style> style = util::make_unique<Style>();
+
+  Maybe<StringPiece> maybeParent = xml::findAttribute(parser, "parent");
+  if (maybeParent) {
+    // If the parent is empty, we don't have a parent, but we also don't infer
+    // either.
+    if (!maybeParent.value().empty()) {
+      std::string errStr;
+      style->parent = ResourceUtils::parseStyleParentReference(
+          maybeParent.value(), &errStr);
+      if (!style->parent) {
+        mDiag->error(DiagMessage(outResource->source) << errStr);
         return false;
+      }
+
+      // Transform the namespace prefix to the actual package name, and mark the
+      // reference as
+      // private if appropriate.
+      transformReferenceFromNamespace(parser, "", &style->parent.value());
     }
 
-    Maybe<Reference> maybeKey = ResourceUtils::parseXmlAttributeName(maybeName.value());
-    if (!maybeKey) {
-        mDiag->error(DiagMessage(source) << "invalid attribute name '" << maybeName.value() << "'");
-        return false;
+  } else {
+    // No parent was specified, so try inferring it from the style name.
+    std::string styleName = outResource->name.entry;
+    size_t pos = styleName.find_last_of(u'.');
+    if (pos != std::string::npos) {
+      style->parentInferred = true;
+      style->parent = Reference(
+          ResourceName({}, ResourceType::kStyle, styleName.substr(0, pos)));
+    }
+  }
+
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text and comments.
+      continue;
     }
 
-    transformReferenceFromNamespace(parser, "", &maybeKey.value());
-    maybeKey.value().setSource(source);
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace == "" && elementName == "item") {
+      error |= !parseStyleItem(parser, style.get());
 
-    std::unique_ptr<Item> value = parseXml(parser, 0, kAllowRawString);
-    if (!value) {
-        mDiag->error(DiagMessage(source) << "could not parse style item");
-        return false;
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << ":" << elementName << ">");
+      error = true;
     }
+  }
 
-    style->entries.push_back(Style::Entry{ std::move(maybeKey.value()), std::move(value) });
-    return true;
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(style);
+  return true;
 }
 
-bool ResourceParser::parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    outResource->name.type = ResourceType::kStyle;
-
-    std::unique_ptr<Style> style = util::make_unique<Style>();
-
-    Maybe<StringPiece> maybeParent = xml::findAttribute(parser, "parent");
-    if (maybeParent) {
-        // If the parent is empty, we don't have a parent, but we also don't infer either.
-        if (!maybeParent.value().empty()) {
-            std::string errStr;
-            style->parent = ResourceUtils::parseStyleParentReference(maybeParent.value(), &errStr);
-            if (!style->parent) {
-                mDiag->error(DiagMessage(outResource->source) << errStr);
-                return false;
-            }
-
-            // Transform the namespace prefix to the actual package name, and mark the reference as
-            // private if appropriate.
-            transformReferenceFromNamespace(parser, "", &style->parent.value());
-        }
-
-    } else {
-        // No parent was specified, so try inferring it from the style name.
-        std::string styleName = outResource->name.entry;
-        size_t pos = styleName.find_last_of(u'.');
-        if (pos != std::string::npos) {
-            style->parentInferred = true;
-            style->parent = Reference(ResourceName({}, ResourceType::kStyle,
-                                                   styleName.substr(0, pos)));
-        }
-    }
-
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text and comments.
-            continue;
-        }
-
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace == "" && elementName == "item") {
-            error |= !parseStyleItem(parser, style.get());
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << ":" << elementName << ">");
-            error = true;
-        }
-    }
-
-    if (error) {
-        return false;
-    }
-
-    outResource->value = std::move(style);
-    return true;
+bool ResourceParser::parseArray(xml::XmlPullParser* parser,
+                                ParsedResource* outResource) {
+  return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_ANY);
 }
 
-bool ResourceParser::parseArray(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_ANY);
+bool ResourceParser::parseIntegerArray(xml::XmlPullParser* parser,
+                                       ParsedResource* outResource) {
+  return parseArrayImpl(parser, outResource,
+                        android::ResTable_map::TYPE_INTEGER);
 }
 
-bool ResourceParser::parseIntegerArray(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_INTEGER);
+bool ResourceParser::parseStringArray(xml::XmlPullParser* parser,
+                                      ParsedResource* outResource) {
+  return parseArrayImpl(parser, outResource,
+                        android::ResTable_map::TYPE_STRING);
 }
 
-bool ResourceParser::parseStringArray(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_STRING);
-}
-
-bool ResourceParser::parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
+bool ResourceParser::parseArrayImpl(xml::XmlPullParser* parser,
+                                    ParsedResource* outResource,
                                     const uint32_t typeMask) {
-    outResource->name.type = ResourceType::kArray;
+  outResource->name.type = ResourceType::kArray;
 
-    std::unique_ptr<Array> array = util::make_unique<Array>();
+  std::unique_ptr<Array> array = util::make_unique<Array>();
 
-    bool translateable = mOptions.translatable;
-    if (Maybe<StringPiece> translateableAttr = xml::findAttribute(parser, "translatable")) {
-        Maybe<bool> maybeTranslateable = ResourceUtils::parseBool(translateableAttr.value());
-        if (!maybeTranslateable) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for 'translatable'. Must be a boolean");
-            return false;
-        }
-        translateable = maybeTranslateable.value();
+  bool translateable = mOptions.translatable;
+  if (Maybe<StringPiece> translateableAttr =
+          xml::findAttribute(parser, "translatable")) {
+    Maybe<bool> maybeTranslateable =
+        ResourceUtils::parseBool(translateableAttr.value());
+    if (!maybeTranslateable) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for 'translatable'. Must be a boolean");
+      return false;
     }
-    array->setTranslateable(translateable);
+    translateable = maybeTranslateable.value();
+  }
+  array->setTranslateable(translateable);
 
-
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text and comments.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "item") {
-            std::unique_ptr<Item> item = parseXml(parser, typeMask, kNoRawString);
-            if (!item) {
-                mDiag->error(DiagMessage(itemSource) << "could not parse array item");
-                error = true;
-                continue;
-            }
-            item->setSource(itemSource);
-            array->items.emplace_back(std::move(item));
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "unknown tag <" << elementNamespace << ":" << elementName << ">");
-            error = true;
-        }
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text and comments.
+      continue;
     }
 
-    if (error) {
-        return false;
-    }
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "item") {
+      std::unique_ptr<Item> item = parseXml(parser, typeMask, kNoRawString);
+      if (!item) {
+        mDiag->error(DiagMessage(itemSource) << "could not parse array item");
+        error = true;
+        continue;
+      }
+      item->setSource(itemSource);
+      array->items.emplace_back(std::move(item));
 
-    outResource->value = std::move(array);
-    return true;
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "unknown tag <" << elementNamespace << ":" << elementName
+                   << ">");
+      error = true;
+    }
+  }
+
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(array);
+  return true;
 }
 
-bool ResourceParser::parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    outResource->name.type = ResourceType::kPlurals;
+bool ResourceParser::parsePlural(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  outResource->name.type = ResourceType::kPlurals;
 
-    std::unique_ptr<Plural> plural = util::make_unique<Plural>();
+  std::unique_ptr<Plural> plural = util::make_unique<Plural>();
 
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text and comments.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "item") {
-            Maybe<StringPiece> maybeQuantity = xml::findNonEmptyAttribute(parser, "quantity");
-            if (!maybeQuantity) {
-                mDiag->error(DiagMessage(itemSource) << "<item> in <plurals> requires attribute "
-                             << "'quantity'");
-                error = true;
-                continue;
-            }
-
-            StringPiece trimmedQuantity = util::trimWhitespace(maybeQuantity.value());
-            size_t index = 0;
-            if (trimmedQuantity == "zero") {
-                index = Plural::Zero;
-            } else if (trimmedQuantity == "one") {
-                index = Plural::One;
-            } else if (trimmedQuantity == "two") {
-                index = Plural::Two;
-            } else if (trimmedQuantity == "few") {
-                index = Plural::Few;
-            } else if (trimmedQuantity == "many") {
-                index = Plural::Many;
-            } else if (trimmedQuantity == "other") {
-                index = Plural::Other;
-            } else {
-                mDiag->error(DiagMessage(itemSource)
-                             << "<item> in <plural> has invalid value '" << trimmedQuantity
-                             << "' for attribute 'quantity'");
-                error = true;
-                continue;
-            }
-
-            if (plural->values[index]) {
-                mDiag->error(DiagMessage(itemSource)
-                             << "duplicate quantity '" << trimmedQuantity << "'");
-                error = true;
-                continue;
-            }
-
-            if (!(plural->values[index] = parseXml(parser, android::ResTable_map::TYPE_STRING,
-                                                   kNoRawString))) {
-                error = true;
-            }
-            plural->values[index]->setSource(itemSource);
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << "unknown tag <" << elementNamespace << ":"
-                         << elementName << ">");
-            error = true;
-        }
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text and comments.
+      continue;
     }
 
-    if (error) {
-        return false;
-    }
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "item") {
+      Maybe<StringPiece> maybeQuantity =
+          xml::findNonEmptyAttribute(parser, "quantity");
+      if (!maybeQuantity) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<item> in <plurals> requires attribute "
+                     << "'quantity'");
+        error = true;
+        continue;
+      }
 
-    outResource->value = std::move(plural);
-    return true;
+      StringPiece trimmedQuantity = util::trimWhitespace(maybeQuantity.value());
+      size_t index = 0;
+      if (trimmedQuantity == "zero") {
+        index = Plural::Zero;
+      } else if (trimmedQuantity == "one") {
+        index = Plural::One;
+      } else if (trimmedQuantity == "two") {
+        index = Plural::Two;
+      } else if (trimmedQuantity == "few") {
+        index = Plural::Few;
+      } else if (trimmedQuantity == "many") {
+        index = Plural::Many;
+      } else if (trimmedQuantity == "other") {
+        index = Plural::Other;
+      } else {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<item> in <plural> has invalid value '"
+                     << trimmedQuantity << "' for attribute 'quantity'");
+        error = true;
+        continue;
+      }
+
+      if (plural->values[index]) {
+        mDiag->error(DiagMessage(itemSource) << "duplicate quantity '"
+                                             << trimmedQuantity << "'");
+        error = true;
+        continue;
+      }
+
+      if (!(plural->values[index] = parseXml(
+                parser, android::ResTable_map::TYPE_STRING, kNoRawString))) {
+        error = true;
+      }
+      plural->values[index]->setSource(itemSource);
+
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource)
+                   << "unknown tag <" << elementNamespace << ":" << elementName
+                   << ">");
+      error = true;
+    }
+  }
+
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(plural);
+  return true;
 }
 
 bool ResourceParser::parseDeclareStyleable(xml::XmlPullParser* parser,
                                            ParsedResource* outResource) {
-    outResource->name.type = ResourceType::kStyleable;
+  outResource->name.type = ResourceType::kStyleable;
 
-    // Declare-styleable is kPrivate by default, because it technically only exists in R.java.
-    outResource->symbolState = SymbolState::kPublic;
+  // Declare-styleable is kPrivate by default, because it technically only
+  // exists in R.java.
+  outResource->symbolState = SymbolState::kPublic;
 
-    // Declare-styleable only ends up in default config;
-    if (outResource->config != ConfigDescription::defaultConfig()) {
-        mDiag->warn(DiagMessage(outResource->source) << "ignoring configuration '"
-                            << outResource->config << "' for styleable "
-                            << outResource->name.entry);
-        outResource->config = ConfigDescription::defaultConfig();
+  // Declare-styleable only ends up in default config;
+  if (outResource->config != ConfigDescription::defaultConfig()) {
+    mDiag->warn(DiagMessage(outResource->source)
+                << "ignoring configuration '" << outResource->config
+                << "' for styleable " << outResource->name.entry);
+    outResource->config = ConfigDescription::defaultConfig();
+  }
+
+  std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>();
+
+  std::string comment;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
+      comment = util::trimWhitespace(parser->getComment()).toString();
+      continue;
+    } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Ignore text.
+      continue;
     }
 
-    std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>();
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "attr") {
+      Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+      if (!maybeName) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<attr> tag must have a 'name' attribute");
+        error = true;
+        continue;
+      }
 
-    std::string comment;
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
-            comment = util::trimWhitespace(parser->getComment()).toString();
-            continue;
-        } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Ignore text.
-            continue;
-        }
+      // If this is a declaration, the package name may be in the name. Separate
+      // these out.
+      // Eg. <attr name="android:text" />
+      Maybe<Reference> maybeRef =
+          ResourceUtils::parseXmlAttributeName(maybeName.value());
+      if (!maybeRef) {
+        mDiag->error(DiagMessage(itemSource) << "<attr> tag has invalid name '"
+                                             << maybeName.value() << "'");
+        error = true;
+        continue;
+      }
 
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "attr") {
-            Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-            if (!maybeName) {
-                mDiag->error(DiagMessage(itemSource) << "<attr> tag must have a 'name' attribute");
-                error = true;
-                continue;
-            }
+      Reference& childRef = maybeRef.value();
+      xml::transformReferenceFromNamespace(parser, "", &childRef);
 
-            // If this is a declaration, the package name may be in the name. Separate these out.
-            // Eg. <attr name="android:text" />
-            Maybe<Reference> maybeRef = ResourceUtils::parseXmlAttributeName(maybeName.value());
-            if (!maybeRef) {
-                mDiag->error(DiagMessage(itemSource) << "<attr> tag has invalid name '"
-                             << maybeName.value() << "'");
-                error = true;
-                continue;
-            }
+      // Create the ParsedResource that will add the attribute to the table.
+      ParsedResource childResource;
+      childResource.name = childRef.name.value();
+      childResource.source = itemSource;
+      childResource.comment = std::move(comment);
 
-            Reference& childRef = maybeRef.value();
-            xml::transformReferenceFromNamespace(parser, "", &childRef);
+      if (!parseAttrImpl(parser, &childResource, true)) {
+        error = true;
+        continue;
+      }
 
-            // Create the ParsedResource that will add the attribute to the table.
-            ParsedResource childResource;
-            childResource.name = childRef.name.value();
-            childResource.source = itemSource;
-            childResource.comment = std::move(comment);
+      // Create the reference to this attribute.
+      childRef.setComment(childResource.comment);
+      childRef.setSource(itemSource);
+      styleable->entries.push_back(std::move(childRef));
 
-            if (!parseAttrImpl(parser, &childResource, true)) {
-                error = true;
-                continue;
-            }
+      outResource->childResources.push_back(std::move(childResource));
 
-            // Create the reference to this attribute.
-            childRef.setComment(childResource.comment);
-            childRef.setSource(itemSource);
-            styleable->entries.push_back(std::move(childRef));
-
-            outResource->childResources.push_back(std::move(childResource));
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << "unknown tag <" << elementNamespace << ":"
-                         << elementName << ">");
-            error = true;
-        }
-
-        comment = {};
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource)
+                   << "unknown tag <" << elementNamespace << ":" << elementName
+                   << ">");
+      error = true;
     }
 
-    if (error) {
-        return false;
-    }
+    comment = {};
+  }
 
-    outResource->value = std::move(styleable);
-    return true;
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(styleable);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceParser.h b/tools/aapt2/ResourceParser.h
index ece3090..644ed49 100644
--- a/tools/aapt2/ResourceParser.h
+++ b/tools/aapt2/ResourceParser.h
@@ -33,79 +33,92 @@
 struct ParsedResource;
 
 struct ResourceParserOptions {
-    /**
-     * Whether the default setting for this parser is to allow translation.
-     */
-    bool translatable = true;
+  /**
+   * Whether the default setting for this parser is to allow translation.
+   */
+  bool translatable = true;
 
-    /**
-     * Whether positional arguments in formatted strings are treated as errors or warnings.
-     */
-    bool errorOnPositionalArguments = true;
+  /**
+   * Whether positional arguments in formatted strings are treated as errors or
+   * warnings.
+   */
+  bool errorOnPositionalArguments = true;
 };
 
 /*
  * Parses an XML file for resources and adds them to a ResourceTable.
  */
 class ResourceParser {
-public:
-    ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
-                   const ConfigDescription& config, const ResourceParserOptions& options = {});
+ public:
+  ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
+                 const ConfigDescription& config,
+                 const ResourceParserOptions& options = {});
 
-    ResourceParser(const ResourceParser&) = delete; // No copy.
+  ResourceParser(const ResourceParser&) = delete;  // No copy.
 
-    bool parse(xml::XmlPullParser* parser);
+  bool parse(xml::XmlPullParser* parser);
 
-private:
-    /*
-     * Parses the XML subtree as a StyleString (flattened XML representation for strings
-     * with formatting). If successful, `outStyleString`
-     * contains the escaped and whitespace trimmed text, while `outRawString`
-     * contains the unescaped text. Returns true on success.
-     */
-    bool flattenXmlSubtree(xml::XmlPullParser* parser, std::string* outRawString,
-                           StyleString* outStyleString);
+ private:
+  /*
+   * Parses the XML subtree as a StyleString (flattened XML representation for
+   * strings
+   * with formatting). If successful, `outStyleString`
+   * contains the escaped and whitespace trimmed text, while `outRawString`
+   * contains the unescaped text. Returns true on success.
+   */
+  bool flattenXmlSubtree(xml::XmlPullParser* parser, std::string* outRawString,
+                         StyleString* outStyleString);
 
-    /*
-     * Parses the XML subtree and returns an Item.
-     * The type of Item that can be parsed is denoted by the `typeMask`.
-     * If `allowRawValue` is true and the subtree can not be parsed as a regular Item, then a
-     * RawString is returned. Otherwise this returns false;
-     */
-    std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser, const uint32_t typeMask,
-                                   const bool allowRawValue);
+  /*
+   * Parses the XML subtree and returns an Item.
+   * The type of Item that can be parsed is denoted by the `typeMask`.
+   * If `allowRawValue` is true and the subtree can not be parsed as a regular
+   * Item, then a
+   * RawString is returned. Otherwise this returns false;
+   */
+  std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser,
+                                 const uint32_t typeMask,
+                                 const bool allowRawValue);
 
-    bool parseResources(xml::XmlPullParser* parser);
-    bool parseResource(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseResources(xml::XmlPullParser* parser);
+  bool parseResource(xml::XmlPullParser* parser, ParsedResource* outResource);
 
-    bool parseItem(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t format);
-    bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseItem(xml::XmlPullParser* parser, ParsedResource* outResource,
+                 uint32_t format);
+  bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource);
 
-    bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource, bool weak);
-    Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser,
-                                                 const StringPiece& tag);
-    bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseStyleItem(xml::XmlPullParser* parser, Style* style);
-    bool parseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseIntegerArray(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseStringArray(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t typeMask);
-    bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parsePublicGroup(xml::XmlPullParser* parser,
+                        ParsedResource* outResource);
+  bool parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseAddResource(xml::XmlPullParser* parser,
+                        ParsedResource* outResource);
+  bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
+                     bool weak);
+  Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser,
+                                               const StringPiece& tag);
+  bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseStyleItem(xml::XmlPullParser* parser, Style* style);
+  bool parseDeclareStyleable(xml::XmlPullParser* parser,
+                             ParsedResource* outResource);
+  bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseIntegerArray(xml::XmlPullParser* parser,
+                         ParsedResource* outResource);
+  bool parseStringArray(xml::XmlPullParser* parser,
+                        ParsedResource* outResource);
+  bool parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
+                      uint32_t typeMask);
+  bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource);
 
-    IDiagnostics* mDiag;
-    ResourceTable* mTable;
-    Source mSource;
-    ConfigDescription mConfig;
-    ResourceParserOptions mOptions;
+  IDiagnostics* mDiag;
+  ResourceTable* mTable;
+  Source mSource;
+  ConfigDescription mConfig;
+  ResourceParserOptions mOptions;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_PARSER_H
+#endif  // AAPT_RESOURCE_PARSER_H
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index e097740..b6d57c0 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -26,512 +26,559 @@
 
 namespace aapt {
 
-constexpr const char* kXmlPreamble = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+constexpr const char* kXmlPreamble =
+    "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
 
 TEST(ResourceParserSingleTest, FailToParseWithNoRootResourcesElement) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::stringstream input(kXmlPreamble);
-    input << "<attr name=\"foo\"/>" << std::endl;
-    ResourceTable table;
-    ResourceParser parser(context->getDiagnostics(), &table, Source{ "test" }, {});
-    xml::XmlPullParser xmlParser(input);
-    ASSERT_FALSE(parser.parse(&xmlParser));
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::stringstream input(kXmlPreamble);
+  input << "<attr name=\"foo\"/>" << std::endl;
+  ResourceTable table;
+  ResourceParser parser(context->getDiagnostics(), &table, Source{"test"}, {});
+  xml::XmlPullParser xmlParser(input);
+  ASSERT_FALSE(parser.parse(&xmlParser));
 }
 
 struct ResourceParserTest : public ::testing::Test {
-    ResourceTable mTable;
-    std::unique_ptr<IAaptContext> mContext;
+  ResourceTable mTable;
+  std::unique_ptr<IAaptContext> mContext;
 
-    void SetUp() override {
-        mContext = test::ContextBuilder().build();
-    }
+  void SetUp() override { mContext = test::ContextBuilder().build(); }
 
-    ::testing::AssertionResult testParse(const StringPiece& str) {
-        return testParse(str, ConfigDescription{});
-    }
+  ::testing::AssertionResult testParse(const StringPiece& str) {
+    return testParse(str, ConfigDescription{});
+  }
 
-    ::testing::AssertionResult testParse(const StringPiece& str, const ConfigDescription& config) {
-        std::stringstream input(kXmlPreamble);
-        input << "<resources>\n" << str << "\n</resources>" << std::endl;
-        ResourceParserOptions parserOptions;
-        ResourceParser parser(mContext->getDiagnostics(), &mTable, Source{ "test" }, config,
-                              parserOptions);
-        xml::XmlPullParser xmlParser(input);
-        if (parser.parse(&xmlParser)) {
-            return ::testing::AssertionSuccess();
-        }
-        return ::testing::AssertionFailure();
+  ::testing::AssertionResult testParse(const StringPiece& str,
+                                       const ConfigDescription& config) {
+    std::stringstream input(kXmlPreamble);
+    input << "<resources>\n" << str << "\n</resources>" << std::endl;
+    ResourceParserOptions parserOptions;
+    ResourceParser parser(mContext->getDiagnostics(), &mTable, Source{"test"},
+                          config, parserOptions);
+    xml::XmlPullParser xmlParser(input);
+    if (parser.parse(&xmlParser)) {
+      return ::testing::AssertionSuccess();
     }
+    return ::testing::AssertionFailure();
+  }
 };
 
 TEST_F(ResourceParserTest, ParseQuotedString) {
-    std::string input = "<string name=\"foo\">   \"  hey there \" </string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">   \"  hey there \" </string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("  hey there "), *str->value);
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("  hey there "), *str->value);
 }
 
 TEST_F(ResourceParserTest, ParseEscapedString) {
-    std::string input = "<string name=\"foo\">\\?123</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">\\?123</string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("?123"), *str->value);
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("?123"), *str->value);
 }
 
 TEST_F(ResourceParserTest, ParseFormattedString) {
-    std::string input = "<string name=\"foo\">%d %s</string>";
-    ASSERT_FALSE(testParse(input));
+  std::string input = "<string name=\"foo\">%d %s</string>";
+  ASSERT_FALSE(testParse(input));
 
-    input = "<string name=\"foo\">%1$d %2$s</string>";
-    ASSERT_TRUE(testParse(input));
+  input = "<string name=\"foo\">%1$d %2$s</string>";
+  ASSERT_TRUE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseStyledString) {
-    // Use a surrogate pair unicode point so that we can verify that the span indices
-    // use UTF-16 length and not UTF-18 length.
-    std::string input = "<string name=\"foo\">This is my aunt\u2019s <b>string</b></string>";
-    ASSERT_TRUE(testParse(input));
+  // Use a surrogate pair unicode point so that we can verify that the span
+  // indices
+  // use UTF-16 length and not UTF-18 length.
+  std::string input =
+      "<string name=\"foo\">This is my aunt\u2019s <b>string</b></string>";
+  ASSERT_TRUE(testParse(input));
 
-    StyledString* str = test::getValue<StyledString>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
+  StyledString* str = test::getValue<StyledString>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
 
-    const std::string expectedStr = "This is my aunt\u2019s string";
-    EXPECT_EQ(expectedStr, *str->value->str);
-    EXPECT_EQ(1u, str->value->spans.size());
+  const std::string expectedStr = "This is my aunt\u2019s string";
+  EXPECT_EQ(expectedStr, *str->value->str);
+  EXPECT_EQ(1u, str->value->spans.size());
 
-    EXPECT_EQ(std::string("b"), *str->value->spans[0].name);
-    EXPECT_EQ(17u, str->value->spans[0].firstChar);
-    EXPECT_EQ(23u, str->value->spans[0].lastChar);
+  EXPECT_EQ(std::string("b"), *str->value->spans[0].name);
+  EXPECT_EQ(17u, str->value->spans[0].firstChar);
+  EXPECT_EQ(23u, str->value->spans[0].lastChar);
 }
 
 TEST_F(ResourceParserTest, ParseStringWithWhitespace) {
-    std::string input = "<string name=\"foo\">  This is what  I think  </string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">  This is what  I think  </string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("This is what I think"), *str->value);
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("This is what I think"), *str->value);
 
-    input = "<string name=\"foo2\">\"  This is what  I think  \"</string>";
-    ASSERT_TRUE(testParse(input));
+  input = "<string name=\"foo2\">\"  This is what  I think  \"</string>";
+  ASSERT_TRUE(testParse(input));
 
-    str = test::getValue<String>(&mTable, "string/foo2");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("  This is what  I think  "), *str->value);
+  str = test::getValue<String>(&mTable, "string/foo2");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("  This is what  I think  "), *str->value);
 }
 
 TEST_F(ResourceParserTest, IgnoreXliffTags) {
-    std::string input = "<string name=\"foo\" \n"
-                        "        xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n"
-                        "  There are <xliff:g id=\"count\">%1$d</xliff:g> apples</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<string name=\"foo\" \n"
+      "        xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n"
+      "  There are <xliff:g id=\"count\">%1$d</xliff:g> apples</string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(StringPiece("There are %1$d apples"), StringPiece(*str->value));
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(StringPiece("There are %1$d apples"), StringPiece(*str->value));
 }
 
 TEST_F(ResourceParserTest, ParseNull) {
-    std::string input = "<integer name=\"foo\">@null</integer>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<integer name=\"foo\">@null</integer>";
+  ASSERT_TRUE(testParse(input));
 
-    // The Android runtime treats a value of android::Res_value::TYPE_NULL as
-    // a non-existing value, and this causes problems in styles when trying to resolve
-    // an attribute. Null values must be encoded as android::Res_value::TYPE_REFERENCE
-    // with a data value of 0.
-    BinaryPrimitive* integer = test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
-    ASSERT_NE(nullptr, integer);
-    EXPECT_EQ(uint16_t(android::Res_value::TYPE_REFERENCE), integer->value.dataType);
-    EXPECT_EQ(0u, integer->value.data);
+  // The Android runtime treats a value of android::Res_value::TYPE_NULL as
+  // a non-existing value, and this causes problems in styles when trying to
+  // resolve
+  // an attribute. Null values must be encoded as
+  // android::Res_value::TYPE_REFERENCE
+  // with a data value of 0.
+  BinaryPrimitive* integer =
+      test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
+  ASSERT_NE(nullptr, integer);
+  EXPECT_EQ(uint16_t(android::Res_value::TYPE_REFERENCE),
+            integer->value.dataType);
+  EXPECT_EQ(0u, integer->value.data);
 }
 
 TEST_F(ResourceParserTest, ParseEmpty) {
-    std::string input = "<integer name=\"foo\">@empty</integer>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<integer name=\"foo\">@empty</integer>";
+  ASSERT_TRUE(testParse(input));
 
-    BinaryPrimitive* integer = test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
-    ASSERT_NE(nullptr, integer);
-    EXPECT_EQ(uint16_t(android::Res_value::TYPE_NULL), integer->value.dataType);
-    EXPECT_EQ(uint32_t(android::Res_value::DATA_NULL_EMPTY), integer->value.data);
+  BinaryPrimitive* integer =
+      test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
+  ASSERT_NE(nullptr, integer);
+  EXPECT_EQ(uint16_t(android::Res_value::TYPE_NULL), integer->value.dataType);
+  EXPECT_EQ(uint32_t(android::Res_value::DATA_NULL_EMPTY), integer->value.data);
 }
 
 TEST_F(ResourceParserTest, ParseAttr) {
-    std::string input = "<attr name=\"foo\" format=\"string\"/>\n"
-                        "<attr name=\"bar\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\" format=\"string\"/>\n"
+      "<attr name=\"bar\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
 
-    attr = test::getValue<Attribute>(&mTable, "attr/bar");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_ANY), attr->typeMask);
+  attr = test::getValue<Attribute>(&mTable, "attr/bar");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_ANY), attr->typeMask);
 }
 
-// Old AAPT allowed attributes to be defined under different configurations, but ultimately
-// stored them with the default configuration. Check that we have the same behavior.
-TEST_F(ResourceParserTest, ParseAttrAndDeclareStyleableUnderConfigButRecordAsNoConfig) {
-    const ConfigDescription watchConfig = test::parseConfigOrDie("watch");
-    std::string input = R"EOF(
+// Old AAPT allowed attributes to be defined under different configurations, but
+// ultimately
+// stored them with the default configuration. Check that we have the same
+// behavior.
+TEST_F(ResourceParserTest,
+       ParseAttrAndDeclareStyleableUnderConfigButRecordAsNoConfig) {
+  const ConfigDescription watchConfig = test::parseConfigOrDie("watch");
+  std::string input = R"EOF(
         <attr name="foo" />
         <declare-styleable name="bar">
           <attr name="baz" />
         </declare-styleable>)EOF";
-    ASSERT_TRUE(testParse(input, watchConfig));
+  ASSERT_TRUE(testParse(input, watchConfig));
 
-    EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/foo", watchConfig));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/baz", watchConfig));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Styleable>(&mTable, "styleable/bar", watchConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/foo",
+                                                        watchConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/baz",
+                                                        watchConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<Styleable>(
+                         &mTable, "styleable/bar", watchConfig));
 
-    EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/foo"));
-    EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/baz"));
-    EXPECT_NE(nullptr, test::getValue<Styleable>(&mTable, "styleable/bar"));
+  EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/foo"));
+  EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/baz"));
+  EXPECT_NE(nullptr, test::getValue<Styleable>(&mTable, "styleable/bar"));
 }
 
 TEST_F(ResourceParserTest, ParseAttrWithMinMax) {
-    std::string input = "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"integer\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"integer\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_INTEGER), attr->typeMask);
-    EXPECT_EQ(10, attr->minInt);
-    EXPECT_EQ(23, attr->maxInt);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_INTEGER), attr->typeMask);
+  EXPECT_EQ(10, attr->minInt);
+  EXPECT_EQ(23, attr->maxInt);
 }
 
 TEST_F(ResourceParserTest, FailParseAttrWithMinMaxButNotInteger) {
-    std::string input = "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"string\"/>";
-    ASSERT_FALSE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"string\"/>";
+  ASSERT_FALSE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseUseAndDeclOfAttr) {
-    std::string input = "<declare-styleable name=\"Styleable\">\n"
-                        "  <attr name=\"foo\" />\n"
-                        "</declare-styleable>\n"
-                        "<attr name=\"foo\" format=\"string\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<declare-styleable name=\"Styleable\">\n"
+      "  <attr name=\"foo\" />\n"
+      "</declare-styleable>\n"
+      "<attr name=\"foo\" format=\"string\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
 }
 
 TEST_F(ResourceParserTest, ParseDoubleUseOfAttr) {
-    std::string input = "<declare-styleable name=\"Theme\">"
-                        "  <attr name=\"foo\" />\n"
-                        "</declare-styleable>\n"
-                        "<declare-styleable name=\"Window\">\n"
-                        "  <attr name=\"foo\" format=\"boolean\"/>\n"
-                        "</declare-styleable>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<declare-styleable name=\"Theme\">"
+      "  <attr name=\"foo\" />\n"
+      "</declare-styleable>\n"
+      "<declare-styleable name=\"Window\">\n"
+      "  <attr name=\"foo\" format=\"boolean\"/>\n"
+      "</declare-styleable>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_BOOLEAN), attr->typeMask);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_BOOLEAN), attr->typeMask);
 }
 
 TEST_F(ResourceParserTest, ParseEnumAttr) {
-    std::string input = "<attr name=\"foo\">\n"
-                        "  <enum name=\"bar\" value=\"0\"/>\n"
-                        "  <enum name=\"bat\" value=\"1\"/>\n"
-                        "  <enum name=\"baz\" value=\"2\"/>\n"
-                        "</attr>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\">\n"
+      "  <enum name=\"bar\" value=\"0\"/>\n"
+      "  <enum name=\"bat\" value=\"1\"/>\n"
+      "  <enum name=\"baz\" value=\"2\"/>\n"
+      "</attr>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* enumAttr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(enumAttr, nullptr);
-    EXPECT_EQ(enumAttr->typeMask, android::ResTable_map::TYPE_ENUM);
-    ASSERT_EQ(enumAttr->symbols.size(), 3u);
+  Attribute* enumAttr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(enumAttr, nullptr);
+  EXPECT_EQ(enumAttr->typeMask, android::ResTable_map::TYPE_ENUM);
+  ASSERT_EQ(enumAttr->symbols.size(), 3u);
 
-    AAPT_ASSERT_TRUE(enumAttr->symbols[0].symbol.name);
-    EXPECT_EQ(enumAttr->symbols[0].symbol.name.value().entry, "bar");
-    EXPECT_EQ(enumAttr->symbols[0].value, 0u);
+  AAPT_ASSERT_TRUE(enumAttr->symbols[0].symbol.name);
+  EXPECT_EQ(enumAttr->symbols[0].symbol.name.value().entry, "bar");
+  EXPECT_EQ(enumAttr->symbols[0].value, 0u);
 
-    AAPT_ASSERT_TRUE(enumAttr->symbols[1].symbol.name);
-    EXPECT_EQ(enumAttr->symbols[1].symbol.name.value().entry, "bat");
-    EXPECT_EQ(enumAttr->symbols[1].value, 1u);
+  AAPT_ASSERT_TRUE(enumAttr->symbols[1].symbol.name);
+  EXPECT_EQ(enumAttr->symbols[1].symbol.name.value().entry, "bat");
+  EXPECT_EQ(enumAttr->symbols[1].value, 1u);
 
-    AAPT_ASSERT_TRUE(enumAttr->symbols[2].symbol.name);
-    EXPECT_EQ(enumAttr->symbols[2].symbol.name.value().entry, "baz");
-    EXPECT_EQ(enumAttr->symbols[2].value, 2u);
+  AAPT_ASSERT_TRUE(enumAttr->symbols[2].symbol.name);
+  EXPECT_EQ(enumAttr->symbols[2].symbol.name.value().entry, "baz");
+  EXPECT_EQ(enumAttr->symbols[2].value, 2u);
 }
 
 TEST_F(ResourceParserTest, ParseFlagAttr) {
-    std::string input = "<attr name=\"foo\">\n"
-                        "  <flag name=\"bar\" value=\"0\"/>\n"
-                        "  <flag name=\"bat\" value=\"1\"/>\n"
-                        "  <flag name=\"baz\" value=\"2\"/>\n"
-                        "</attr>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\">\n"
+      "  <flag name=\"bar\" value=\"0\"/>\n"
+      "  <flag name=\"bat\" value=\"1\"/>\n"
+      "  <flag name=\"baz\" value=\"2\"/>\n"
+      "</attr>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* flagAttr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, flagAttr);
-    EXPECT_EQ(flagAttr->typeMask, android::ResTable_map::TYPE_FLAGS);
-    ASSERT_EQ(flagAttr->symbols.size(), 3u);
+  Attribute* flagAttr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, flagAttr);
+  EXPECT_EQ(flagAttr->typeMask, android::ResTable_map::TYPE_FLAGS);
+  ASSERT_EQ(flagAttr->symbols.size(), 3u);
 
-    AAPT_ASSERT_TRUE(flagAttr->symbols[0].symbol.name);
-    EXPECT_EQ(flagAttr->symbols[0].symbol.name.value().entry, "bar");
-    EXPECT_EQ(flagAttr->symbols[0].value, 0u);
+  AAPT_ASSERT_TRUE(flagAttr->symbols[0].symbol.name);
+  EXPECT_EQ(flagAttr->symbols[0].symbol.name.value().entry, "bar");
+  EXPECT_EQ(flagAttr->symbols[0].value, 0u);
 
-    AAPT_ASSERT_TRUE(flagAttr->symbols[1].symbol.name);
-    EXPECT_EQ(flagAttr->symbols[1].symbol.name.value().entry, "bat");
-    EXPECT_EQ(flagAttr->symbols[1].value, 1u);
+  AAPT_ASSERT_TRUE(flagAttr->symbols[1].symbol.name);
+  EXPECT_EQ(flagAttr->symbols[1].symbol.name.value().entry, "bat");
+  EXPECT_EQ(flagAttr->symbols[1].value, 1u);
 
-    AAPT_ASSERT_TRUE(flagAttr->symbols[2].symbol.name);
-    EXPECT_EQ(flagAttr->symbols[2].symbol.name.value().entry, "baz");
-    EXPECT_EQ(flagAttr->symbols[2].value, 2u);
+  AAPT_ASSERT_TRUE(flagAttr->symbols[2].symbol.name);
+  EXPECT_EQ(flagAttr->symbols[2].symbol.name.value().entry, "baz");
+  EXPECT_EQ(flagAttr->symbols[2].value, 2u);
 
-    std::unique_ptr<BinaryPrimitive> flagValue = ResourceUtils::tryParseFlagSymbol(flagAttr,
-                                                                                   "baz|bat");
-    ASSERT_NE(nullptr, flagValue);
-    EXPECT_EQ(flagValue->value.data, 1u | 2u);
+  std::unique_ptr<BinaryPrimitive> flagValue =
+      ResourceUtils::tryParseFlagSymbol(flagAttr, "baz|bat");
+  ASSERT_NE(nullptr, flagValue);
+  EXPECT_EQ(flagValue->value.data, 1u | 2u);
 }
 
 TEST_F(ResourceParserTest, FailToParseEnumAttrWithNonUniqueKeys) {
-    std::string input = "<attr name=\"foo\">\n"
-                        "  <enum name=\"bar\" value=\"0\"/>\n"
-                        "  <enum name=\"bat\" value=\"1\"/>\n"
-                        "  <enum name=\"bat\" value=\"2\"/>\n"
-                        "</attr>";
-    ASSERT_FALSE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\">\n"
+      "  <enum name=\"bar\" value=\"0\"/>\n"
+      "  <enum name=\"bat\" value=\"1\"/>\n"
+      "  <enum name=\"bat\" value=\"2\"/>\n"
+      "</attr>";
+  ASSERT_FALSE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseStyle) {
-    std::string input = "<style name=\"foo\" parent=\"@style/fu\">\n"
-                        "  <item name=\"bar\">#ffffffff</item>\n"
-                        "  <item name=\"bat\">@string/hey</item>\n"
-                        "  <item name=\"baz\"><b>hey</b></item>\n"
-                        "</style>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<style name=\"foo\" parent=\"@style/fu\">\n"
+      "  <item name=\"bar\">#ffffffff</item>\n"
+      "  <item name=\"bat\">@string/hey</item>\n"
+      "  <item name=\"baz\"><b>hey</b></item>\n"
+      "</style>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(test::parseNameOrDie("style/fu"), style->parent.value().name.value());
-    ASSERT_EQ(3u, style->entries.size());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(test::parseNameOrDie("style/fu"),
+            style->parent.value().name.value());
+  ASSERT_EQ(3u, style->entries.size());
 
-    AAPT_ASSERT_TRUE(style->entries[0].key.name);
-    EXPECT_EQ(test::parseNameOrDie("attr/bar"), style->entries[0].key.name.value());
+  AAPT_ASSERT_TRUE(style->entries[0].key.name);
+  EXPECT_EQ(test::parseNameOrDie("attr/bar"),
+            style->entries[0].key.name.value());
 
-    AAPT_ASSERT_TRUE(style->entries[1].key.name);
-    EXPECT_EQ(test::parseNameOrDie("attr/bat"), style->entries[1].key.name.value());
+  AAPT_ASSERT_TRUE(style->entries[1].key.name);
+  EXPECT_EQ(test::parseNameOrDie("attr/bat"),
+            style->entries[1].key.name.value());
 
-    AAPT_ASSERT_TRUE(style->entries[2].key.name);
-    EXPECT_EQ(test::parseNameOrDie("attr/baz"), style->entries[2].key.name.value());
+  AAPT_ASSERT_TRUE(style->entries[2].key.name);
+  EXPECT_EQ(test::parseNameOrDie("attr/baz"),
+            style->entries[2].key.name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) {
-    std::string input = "<style name=\"foo\" parent=\"com.app:Theme\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<style name=\"foo\" parent=\"com.app:Theme\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(test::parseNameOrDie("com.app:style/Theme"), style->parent.value().name.value());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(test::parseNameOrDie("com.app:style/Theme"),
+            style->parent.value().name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedParent) {
-    std::string input = "<style xmlns:app=\"http://schemas.android.com/apk/res/android\"\n"
-                        "       name=\"foo\" parent=\"app:Theme\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<style xmlns:app=\"http://schemas.android.com/apk/res/android\"\n"
+      "       name=\"foo\" parent=\"app:Theme\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(test::parseNameOrDie("android:style/Theme"), style->parent.value().name.value());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(test::parseNameOrDie("android:style/Theme"),
+            style->parent.value().name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) {
-    std::string input =
-            "<style xmlns:app=\"http://schemas.android.com/apk/res/android\" name=\"foo\">\n"
-            "  <item name=\"app:bar\">0</item>\n"
-            "</style>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<style xmlns:app=\"http://schemas.android.com/apk/res/android\" "
+      "name=\"foo\">\n"
+      "  <item name=\"app:bar\">0</item>\n"
+      "</style>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    ASSERT_EQ(1u, style->entries.size());
-    EXPECT_EQ(test::parseNameOrDie("android:attr/bar"), style->entries[0].key.name.value());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  ASSERT_EQ(1u, style->entries.size());
+  EXPECT_EQ(test::parseNameOrDie("android:attr/bar"),
+            style->entries[0].key.name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithInferredParent) {
-    std::string input = "<style name=\"foo.bar\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<style name=\"foo.bar\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(style->parent.value().name.value(), test::parseNameOrDie("style/foo"));
-    EXPECT_TRUE(style->parentInferred);
+  Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(style->parent.value().name.value(),
+            test::parseNameOrDie("style/foo"));
+  EXPECT_TRUE(style->parentInferred);
 }
 
-TEST_F(ResourceParserTest, ParseStyleWithInferredParentOverridenByEmptyParentAttribute) {
-    std::string input = "<style name=\"foo.bar\" parent=\"\"/>";
-    ASSERT_TRUE(testParse(input));
+TEST_F(ResourceParserTest,
+       ParseStyleWithInferredParentOverridenByEmptyParentAttribute) {
+  std::string input = "<style name=\"foo.bar\" parent=\"\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
-    ASSERT_NE(nullptr, style);
-    AAPT_EXPECT_FALSE(style->parent);
-    EXPECT_FALSE(style->parentInferred);
+  Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
+  ASSERT_NE(nullptr, style);
+  AAPT_EXPECT_FALSE(style->parent);
+  EXPECT_FALSE(style->parentInferred);
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithPrivateParentReference) {
-    std::string input = R"EOF(<style name="foo" parent="*android:style/bar" />)EOF";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      R"EOF(<style name="foo" parent="*android:style/bar" />)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    EXPECT_TRUE(style->parent.value().privateReference);
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  EXPECT_TRUE(style->parent.value().privateReference);
 }
 
 TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) {
-    std::string input = "<string name=\"foo\">@+id/bar</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">@+id/bar</string>";
+  ASSERT_TRUE(testParse(input));
 
-    Id* id = test::getValue<Id>(&mTable, "id/bar");
-    ASSERT_NE(id, nullptr);
+  Id* id = test::getValue<Id>(&mTable, "id/bar");
+  ASSERT_NE(id, nullptr);
 }
 
 TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
-    std::string input = "<declare-styleable name=\"foo\">\n"
-                        "  <attr name=\"bar\" />\n"
-                        "  <attr name=\"bat\" format=\"string|reference\"/>\n"
-                        "  <attr name=\"baz\">\n"
-                        "    <enum name=\"foo\" value=\"1\"/>\n"
-                        "  </attr>\n"
-                        "</declare-styleable>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<declare-styleable name=\"foo\">\n"
+      "  <attr name=\"bar\" />\n"
+      "  <attr name=\"bat\" format=\"string|reference\"/>\n"
+      "  <attr name=\"baz\">\n"
+      "    <enum name=\"foo\" value=\"1\"/>\n"
+      "  </attr>\n"
+      "</declare-styleable>";
+  ASSERT_TRUE(testParse(input));
 
-    Maybe<ResourceTable::SearchResult> result =
-            mTable.findResource(test::parseNameOrDie("styleable/foo"));
-    AAPT_ASSERT_TRUE(result);
-    EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbolStatus.state);
+  Maybe<ResourceTable::SearchResult> result =
+      mTable.findResource(test::parseNameOrDie("styleable/foo"));
+  AAPT_ASSERT_TRUE(result);
+  EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbolStatus.state);
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/bar");
-    ASSERT_NE(attr, nullptr);
-    EXPECT_TRUE(attr->isWeak());
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/bar");
+  ASSERT_NE(attr, nullptr);
+  EXPECT_TRUE(attr->isWeak());
 
-    attr = test::getValue<Attribute>(&mTable, "attr/bat");
-    ASSERT_NE(attr, nullptr);
-    EXPECT_TRUE(attr->isWeak());
+  attr = test::getValue<Attribute>(&mTable, "attr/bat");
+  ASSERT_NE(attr, nullptr);
+  EXPECT_TRUE(attr->isWeak());
 
-    attr = test::getValue<Attribute>(&mTable, "attr/baz");
-    ASSERT_NE(attr, nullptr);
-    EXPECT_TRUE(attr->isWeak());
-    EXPECT_EQ(1u, attr->symbols.size());
+  attr = test::getValue<Attribute>(&mTable, "attr/baz");
+  ASSERT_NE(attr, nullptr);
+  EXPECT_TRUE(attr->isWeak());
+  EXPECT_EQ(1u, attr->symbols.size());
 
-    EXPECT_NE(nullptr, test::getValue<Id>(&mTable, "id/foo"));
+  EXPECT_NE(nullptr, test::getValue<Id>(&mTable, "id/foo"));
 
-    Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
-    ASSERT_NE(styleable, nullptr);
-    ASSERT_EQ(3u, styleable->entries.size());
+  Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
+  ASSERT_NE(styleable, nullptr);
+  ASSERT_EQ(3u, styleable->entries.size());
 
-    EXPECT_EQ(test::parseNameOrDie("attr/bar"), styleable->entries[0].name.value());
-    EXPECT_EQ(test::parseNameOrDie("attr/bat"), styleable->entries[1].name.value());
+  EXPECT_EQ(test::parseNameOrDie("attr/bar"),
+            styleable->entries[0].name.value());
+  EXPECT_EQ(test::parseNameOrDie("attr/bat"),
+            styleable->entries[1].name.value());
 }
 
 TEST_F(ResourceParserTest, ParsePrivateAttributesDeclareStyleable) {
-    std::string input = "<declare-styleable name=\"foo\" xmlns:privAndroid=\"http://schemas.android.com/apk/prv/res/android\">\n"
-                        "  <attr name=\"*android:bar\" />\n"
-                        "  <attr name=\"privAndroid:bat\" />\n"
-                        "</declare-styleable>";
-    ASSERT_TRUE(testParse(input));
-    Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
-    ASSERT_NE(nullptr, styleable);
-    ASSERT_EQ(2u, styleable->entries.size());
+  std::string input =
+      "<declare-styleable name=\"foo\" "
+      "xmlns:privAndroid=\"http://schemas.android.com/apk/prv/res/android\">\n"
+      "  <attr name=\"*android:bar\" />\n"
+      "  <attr name=\"privAndroid:bat\" />\n"
+      "</declare-styleable>";
+  ASSERT_TRUE(testParse(input));
+  Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
+  ASSERT_NE(nullptr, styleable);
+  ASSERT_EQ(2u, styleable->entries.size());
 
-    EXPECT_TRUE(styleable->entries[0].privateReference);
-    AAPT_ASSERT_TRUE(styleable->entries[0].name);
-    EXPECT_EQ(std::string("android"), styleable->entries[0].name.value().package);
+  EXPECT_TRUE(styleable->entries[0].privateReference);
+  AAPT_ASSERT_TRUE(styleable->entries[0].name);
+  EXPECT_EQ(std::string("android"), styleable->entries[0].name.value().package);
 
-    EXPECT_TRUE(styleable->entries[1].privateReference);
-    AAPT_ASSERT_TRUE(styleable->entries[1].name);
-    EXPECT_EQ(std::string("android"), styleable->entries[1].name.value().package);
+  EXPECT_TRUE(styleable->entries[1].privateReference);
+  AAPT_ASSERT_TRUE(styleable->entries[1].name);
+  EXPECT_EQ(std::string("android"), styleable->entries[1].name.value().package);
 }
 
 TEST_F(ResourceParserTest, ParseArray) {
-    std::string input = "<array name=\"foo\">\n"
-                        "  <item>@string/ref</item>\n"
-                        "  <item>hey</item>\n"
-                        "  <item>23</item>\n"
-                        "</array>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<array name=\"foo\">\n"
+      "  <item>@string/ref</item>\n"
+      "  <item>hey</item>\n"
+      "  <item>23</item>\n"
+      "</array>";
+  ASSERT_TRUE(testParse(input));
 
-    Array* array = test::getValue<Array>(&mTable, "array/foo");
-    ASSERT_NE(array, nullptr);
-    ASSERT_EQ(3u, array->items.size());
+  Array* array = test::getValue<Array>(&mTable, "array/foo");
+  ASSERT_NE(array, nullptr);
+  ASSERT_EQ(3u, array->items.size());
 
-    EXPECT_NE(nullptr, valueCast<Reference>(array->items[0].get()));
-    EXPECT_NE(nullptr, valueCast<String>(array->items[1].get()));
-    EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(array->items[2].get()));
+  EXPECT_NE(nullptr, valueCast<Reference>(array->items[0].get()));
+  EXPECT_NE(nullptr, valueCast<String>(array->items[1].get()));
+  EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(array->items[2].get()));
 }
 
 TEST_F(ResourceParserTest, ParseStringArray) {
-    std::string input = "<string-array name=\"foo\">\n"
-                        "  <item>\"Werk\"</item>\n"
-                        "</string-array>\n";
-    ASSERT_TRUE(testParse(input));
-    EXPECT_NE(nullptr, test::getValue<Array>(&mTable, "array/foo"));
+  std::string input =
+      "<string-array name=\"foo\">\n"
+      "  <item>\"Werk\"</item>\n"
+      "</string-array>\n";
+  ASSERT_TRUE(testParse(input));
+  EXPECT_NE(nullptr, test::getValue<Array>(&mTable, "array/foo"));
 }
 
 TEST_F(ResourceParserTest, ParsePlural) {
-    std::string input = "<plurals name=\"foo\">\n"
-                        "  <item quantity=\"other\">apples</item>\n"
-                        "  <item quantity=\"one\">apple</item>\n"
-                        "</plurals>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<plurals name=\"foo\">\n"
+      "  <item quantity=\"other\">apples</item>\n"
+      "  <item quantity=\"one\">apple</item>\n"
+      "</plurals>";
+  ASSERT_TRUE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseCommentsWithResource) {
-    std::string input = "<!--This is a comment-->\n"
-                        "<string name=\"foo\">Hi</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<!--This is a comment-->\n"
+      "<string name=\"foo\">Hi</string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* value = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, value);
-    EXPECT_EQ(value->getComment(), "This is a comment");
+  String* value = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, value);
+  EXPECT_EQ(value->getComment(), "This is a comment");
 }
 
 TEST_F(ResourceParserTest, DoNotCombineMultipleComments) {
-    std::string input = "<!--One-->\n"
-                        "<!--Two-->\n"
-                        "<string name=\"foo\">Hi</string>";
+  std::string input =
+      "<!--One-->\n"
+      "<!--Two-->\n"
+      "<string name=\"foo\">Hi</string>";
 
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    String* value = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, value);
-    EXPECT_EQ(value->getComment(), "Two");
+  String* value = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, value);
+  EXPECT_EQ(value->getComment(), "Two");
 }
 
 TEST_F(ResourceParserTest, IgnoreCommentBeforeEndTag) {
-    std::string input = "<!--One-->\n"
-                        "<string name=\"foo\">\n"
-                        "  Hi\n"
-                        "<!--Two-->\n"
-                        "</string>";
+  std::string input =
+      "<!--One-->\n"
+      "<string name=\"foo\">\n"
+      "  Hi\n"
+      "<!--Two-->\n"
+      "</string>";
 
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    String* value = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, value);
-    EXPECT_EQ(value->getComment(), "One");
+  String* value = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, value);
+  EXPECT_EQ(value->getComment(), "One");
 }
 
 TEST_F(ResourceParserTest, ParseNestedComments) {
-    // We only care about declare-styleable and enum/flag attributes because comments
-    // from those end up in R.java
-    std::string input = R"EOF(
+  // We only care about declare-styleable and enum/flag attributes because
+  // comments
+  // from those end up in R.java
+  std::string input = R"EOF(
         <declare-styleable name="foo">
           <!-- The name of the bar -->
           <attr name="barName" format="string|reference" />
@@ -541,19 +588,21 @@
           <!-- The very first -->
           <enum name="one" value="1" />
         </attr>)EOF";
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
-    ASSERT_NE(nullptr, styleable);
-    ASSERT_EQ(1u, styleable->entries.size());
+  Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
+  ASSERT_NE(nullptr, styleable);
+  ASSERT_EQ(1u, styleable->entries.size());
 
-    EXPECT_EQ(StringPiece("The name of the bar"), styleable->entries.front().getComment());
+  EXPECT_EQ(StringPiece("The name of the bar"),
+            styleable->entries.front().getComment());
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    ASSERT_EQ(1u, attr->symbols.size());
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_EQ(1u, attr->symbols.size());
 
-    EXPECT_EQ(StringPiece("The very first"), attr->symbols.front().symbol.getComment());
+  EXPECT_EQ(StringPiece("The very first"),
+            attr->symbols.front().symbol.getComment());
 }
 
 /*
@@ -561,15 +610,15 @@
  * (as an ID has no value).
  */
 TEST_F(ResourceParserTest, ParsePublicIdAsDefinition) {
-    std::string input = "<public type=\"id\" name=\"foo\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<public type=\"id\" name=\"foo\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Id* id = test::getValue<Id>(&mTable, "id/foo");
-    ASSERT_NE(nullptr, id);
+  Id* id = test::getValue<Id>(&mTable, "id/foo");
+  ASSERT_NE(nullptr, id);
 }
 
 TEST_F(ResourceParserTest, KeepAllProducts) {
-    std::string input = R"EOF(
+  std::string input = R"EOF(
         <string name="foo" product="phone">hi</string>
         <string name="foo" product="no-sdcard">ho</string>
         <string name="bar" product="">wee</string>
@@ -577,88 +626,92 @@
         <string name="bit" product="phablet">hoot</string>
         <string name="bot" product="default">yes</string>
     )EOF";
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/foo",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "phone"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/foo",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "no-sdcard"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/bar",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/baz",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/bit",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "phablet"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/bot",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "default"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/foo",
+                         ConfigDescription::defaultConfig(), "phone"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/foo",
+                         ConfigDescription::defaultConfig(), "no-sdcard"));
+  EXPECT_NE(nullptr,
+            test::getValueForConfigAndProduct<String>(
+                &mTable, "string/bar", ConfigDescription::defaultConfig(), ""));
+  EXPECT_NE(nullptr,
+            test::getValueForConfigAndProduct<String>(
+                &mTable, "string/baz", ConfigDescription::defaultConfig(), ""));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/bit",
+                         ConfigDescription::defaultConfig(), "phablet"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/bot",
+                         ConfigDescription::defaultConfig(), "default"));
 }
 
 TEST_F(ResourceParserTest, AutoIncrementIdsInPublicGroup) {
-    std::string input = R"EOF(
+  std::string input = R"EOF(
     <public-group type="attr" first-id="0x01010040">
       <public name="foo" />
       <public name="bar" />
     </public-group>)EOF";
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    Maybe<ResourceTable::SearchResult> result = mTable.findResource(
-            test::parseNameOrDie("attr/foo"));
-    AAPT_ASSERT_TRUE(result);
+  Maybe<ResourceTable::SearchResult> result =
+      mTable.findResource(test::parseNameOrDie("attr/foo"));
+  AAPT_ASSERT_TRUE(result);
 
-    AAPT_ASSERT_TRUE(result.value().package->id);
-    AAPT_ASSERT_TRUE(result.value().type->id);
-    AAPT_ASSERT_TRUE(result.value().entry->id);
-    ResourceId actualId(result.value().package->id.value(),
+  AAPT_ASSERT_TRUE(result.value().package->id);
+  AAPT_ASSERT_TRUE(result.value().type->id);
+  AAPT_ASSERT_TRUE(result.value().entry->id);
+  ResourceId actualId(result.value().package->id.value(),
+                      result.value().type->id.value(),
+                      result.value().entry->id.value());
+  EXPECT_EQ(ResourceId(0x01010040), actualId);
+
+  result = mTable.findResource(test::parseNameOrDie("attr/bar"));
+  AAPT_ASSERT_TRUE(result);
+
+  AAPT_ASSERT_TRUE(result.value().package->id);
+  AAPT_ASSERT_TRUE(result.value().type->id);
+  AAPT_ASSERT_TRUE(result.value().entry->id);
+  actualId = ResourceId(result.value().package->id.value(),
                         result.value().type->id.value(),
                         result.value().entry->id.value());
-    EXPECT_EQ(ResourceId(0x01010040), actualId);
-
-    result = mTable.findResource(test::parseNameOrDie("attr/bar"));
-    AAPT_ASSERT_TRUE(result);
-
-    AAPT_ASSERT_TRUE(result.value().package->id);
-    AAPT_ASSERT_TRUE(result.value().type->id);
-    AAPT_ASSERT_TRUE(result.value().entry->id);
-    actualId = ResourceId(result.value().package->id.value(),
-                          result.value().type->id.value(),
-                          result.value().entry->id.value());
-    EXPECT_EQ(ResourceId(0x01010041), actualId);
+  EXPECT_EQ(ResourceId(0x01010041), actualId);
 }
 
 TEST_F(ResourceParserTest, ExternalTypesShouldOnlyBeReferences) {
-    std::string input = R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF";
-    ASSERT_FALSE(testParse(input));
+  input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF";
+  ASSERT_FALSE(testParse(input));
 }
 
-TEST_F(ResourceParserTest, AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
-    std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
-    ASSERT_TRUE(testParse(input));
+TEST_F(ResourceParserTest,
+       AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
+  std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    Maybe<ResourceTable::SearchResult> result = mTable.findResource(
-            test::parseNameOrDie("string/bar"));
-    AAPT_ASSERT_TRUE(result);
-    const ResourceEntry* entry = result.value().entry;
-    ASSERT_NE(nullptr, entry);
-    EXPECT_EQ(SymbolState::kUndefined, entry->symbolStatus.state);
+  Maybe<ResourceTable::SearchResult> result =
+      mTable.findResource(test::parseNameOrDie("string/bar"));
+  AAPT_ASSERT_TRUE(result);
+  const ResourceEntry* entry = result.value().entry;
+  ASSERT_NE(nullptr, entry);
+  EXPECT_EQ(SymbolState::kUndefined, entry->symbolStatus.state);
 }
 
 TEST_F(ResourceParserTest, ParseItemElementWithFormat) {
-    std::string input = R"EOF(<item name="foo" type="integer" format="float">0.3</item>)EOF";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      R"EOF(<item name="foo" type="integer" format="float">0.3</item>)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    BinaryPrimitive* val = test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
-    ASSERT_NE(nullptr, val);
+  BinaryPrimitive* val =
+      test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
+  ASSERT_NE(nullptr, val);
 
-    EXPECT_EQ(uint32_t(android::Res_value::TYPE_FLOAT), val->value.dataType);
+  EXPECT_EQ(uint32_t(android::Res_value::TYPE_FLOAT), val->value.dataType);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index bdc6a8c..c52c91c 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -14,266 +14,282 @@
  * limitations under the License.
  */
 
+#include "ResourceTable.h"
 #include "ConfigDescription.h"
 #include "NameMangler.h"
-#include "ResourceTable.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <androidfw/ResourceTypes.h>
+#include <algorithm>
 #include <memory>
 #include <string>
 #include <tuple>
 
 namespace aapt {
 
-static bool lessThanType(const std::unique_ptr<ResourceTableType>& lhs, ResourceType rhs) {
-    return lhs->type < rhs;
+static bool lessThanType(const std::unique_ptr<ResourceTableType>& lhs,
+                         ResourceType rhs) {
+  return lhs->type < rhs;
 }
 
 template <typename T>
 static bool lessThanStructWithName(const std::unique_ptr<T>& lhs,
                                    const StringPiece& rhs) {
-    return lhs->name.compare(0, lhs->name.size(), rhs.data(), rhs.size()) < 0;
+  return lhs->name.compare(0, lhs->name.size(), rhs.data(), rhs.size()) < 0;
 }
 
 ResourceTablePackage* ResourceTable::findPackage(const StringPiece& name) {
-    const auto last = packages.end();
-    auto iter = std::lower_bound(packages.begin(), last, name,
-                                 lessThanStructWithName<ResourceTablePackage>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
-    return nullptr;
+  const auto last = packages.end();
+  auto iter = std::lower_bound(packages.begin(), last, name,
+                               lessThanStructWithName<ResourceTablePackage>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
+  return nullptr;
 }
 
 ResourceTablePackage* ResourceTable::findPackageById(uint8_t id) {
-    for (auto& package : packages) {
-        if (package->id && package->id.value() == id) {
-            return package.get();
-        }
+  for (auto& package : packages) {
+    if (package->id && package->id.value() == id) {
+      return package.get();
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
-ResourceTablePackage* ResourceTable::createPackage(const StringPiece& name, Maybe<uint8_t> id) {
-    ResourceTablePackage* package = findOrCreatePackage(name);
-    if (id && !package->id) {
-        package->id = id;
-        return package;
-    }
-
-    if (id && package->id && package->id.value() != id.value()) {
-        return nullptr;
-    }
+ResourceTablePackage* ResourceTable::createPackage(const StringPiece& name,
+                                                   Maybe<uint8_t> id) {
+  ResourceTablePackage* package = findOrCreatePackage(name);
+  if (id && !package->id) {
+    package->id = id;
     return package;
+  }
+
+  if (id && package->id && package->id.value() != id.value()) {
+    return nullptr;
+  }
+  return package;
 }
 
-ResourceTablePackage* ResourceTable::findOrCreatePackage(const StringPiece& name) {
-    const auto last = packages.end();
-    auto iter = std::lower_bound(packages.begin(), last, name,
-                                 lessThanStructWithName<ResourceTablePackage>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
+ResourceTablePackage* ResourceTable::findOrCreatePackage(
+    const StringPiece& name) {
+  const auto last = packages.end();
+  auto iter = std::lower_bound(packages.begin(), last, name,
+                               lessThanStructWithName<ResourceTablePackage>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
 
-    std::unique_ptr<ResourceTablePackage> newPackage = util::make_unique<ResourceTablePackage>();
-    newPackage->name = name.toString();
-    return packages.emplace(iter, std::move(newPackage))->get();
+  std::unique_ptr<ResourceTablePackage> newPackage =
+      util::make_unique<ResourceTablePackage>();
+  newPackage->name = name.toString();
+  return packages.emplace(iter, std::move(newPackage))->get();
 }
 
 ResourceTableType* ResourceTablePackage::findType(ResourceType type) {
-    const auto last = types.end();
-    auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
-    if (iter != last && (*iter)->type == type) {
-        return iter->get();
-    }
-    return nullptr;
+  const auto last = types.end();
+  auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
+  if (iter != last && (*iter)->type == type) {
+    return iter->get();
+  }
+  return nullptr;
 }
 
 ResourceTableType* ResourceTablePackage::findOrCreateType(ResourceType type) {
-    const auto last = types.end();
-    auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
-    if (iter != last && (*iter)->type == type) {
-        return iter->get();
-    }
-    return types.emplace(iter, new ResourceTableType(type))->get();
+  const auto last = types.end();
+  auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
+  if (iter != last && (*iter)->type == type) {
+    return iter->get();
+  }
+  return types.emplace(iter, new ResourceTableType(type))->get();
 }
 
 ResourceEntry* ResourceTableType::findEntry(const StringPiece& name) {
-    const auto last = entries.end();
-    auto iter = std::lower_bound(entries.begin(), last, name,
-                                 lessThanStructWithName<ResourceEntry>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
-    return nullptr;
+  const auto last = entries.end();
+  auto iter = std::lower_bound(entries.begin(), last, name,
+                               lessThanStructWithName<ResourceEntry>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
+  return nullptr;
 }
 
 ResourceEntry* ResourceTableType::findOrCreateEntry(const StringPiece& name) {
-    auto last = entries.end();
-    auto iter = std::lower_bound(entries.begin(), last, name,
-                                 lessThanStructWithName<ResourceEntry>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
-    return entries.emplace(iter, new ResourceEntry(name))->get();
+  auto last = entries.end();
+  auto iter = std::lower_bound(entries.begin(), last, name,
+                               lessThanStructWithName<ResourceEntry>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
+  return entries.emplace(iter, new ResourceEntry(name))->get();
 }
 
 ResourceConfigValue* ResourceEntry::findValue(const ConfigDescription& config) {
-    return findValue(config, StringPiece());
+  return findValue(config, StringPiece());
 }
 
 struct ConfigKey {
-    const ConfigDescription* config;
-    const StringPiece& product;
+  const ConfigDescription* config;
+  const StringPiece& product;
 };
 
-bool ltConfigKeyRef(const std::unique_ptr<ResourceConfigValue>& lhs, const ConfigKey& rhs) {
-    int cmp = lhs->config.compare(*rhs.config);
-    if (cmp == 0) {
-        cmp = StringPiece(lhs->product).compare(rhs.product);
-    }
-    return cmp < 0;
+bool ltConfigKeyRef(const std::unique_ptr<ResourceConfigValue>& lhs,
+                    const ConfigKey& rhs) {
+  int cmp = lhs->config.compare(*rhs.config);
+  if (cmp == 0) {
+    cmp = StringPiece(lhs->product).compare(rhs.product);
+  }
+  return cmp < 0;
 }
 
 ResourceConfigValue* ResourceEntry::findValue(const ConfigDescription& config,
                                               const StringPiece& product) {
-    auto iter = std::lower_bound(values.begin(), values.end(),
-                                 ConfigKey{ &config, product }, ltConfigKeyRef);
-    if (iter != values.end()) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config && StringPiece(value->product) == product) {
-            return value;
-        }
+  auto iter = std::lower_bound(values.begin(), values.end(),
+                               ConfigKey{&config, product}, ltConfigKeyRef);
+  if (iter != values.end()) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config && StringPiece(value->product) == product) {
+      return value;
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
-ResourceConfigValue* ResourceEntry::findOrCreateValue(const ConfigDescription& config,
-                                                      const StringPiece& product) {
-    auto iter = std::lower_bound(values.begin(), values.end(),
-                                 ConfigKey{ &config, product }, ltConfigKeyRef);
-    if (iter != values.end()) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config && StringPiece(value->product) == product) {
-            return value;
-        }
+ResourceConfigValue* ResourceEntry::findOrCreateValue(
+    const ConfigDescription& config, const StringPiece& product) {
+  auto iter = std::lower_bound(values.begin(), values.end(),
+                               ConfigKey{&config, product}, ltConfigKeyRef);
+  if (iter != values.end()) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config && StringPiece(value->product) == product) {
+      return value;
     }
-    ResourceConfigValue* newValue = values.insert(
-            iter, util::make_unique<ResourceConfigValue>(config, product))->get();
-    return newValue;
+  }
+  ResourceConfigValue* newValue =
+      values
+          .insert(iter, util::make_unique<ResourceConfigValue>(config, product))
+          ->get();
+  return newValue;
 }
 
-std::vector<ResourceConfigValue*> ResourceEntry::findAllValues(const ConfigDescription& config) {
-    std::vector<ResourceConfigValue*> results;
+std::vector<ResourceConfigValue*> ResourceEntry::findAllValues(
+    const ConfigDescription& config) {
+  std::vector<ResourceConfigValue*> results;
 
-    auto iter = values.begin();
-    for (; iter != values.end(); ++iter) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config) {
-            results.push_back(value);
-            ++iter;
-            break;
-        }
+  auto iter = values.begin();
+  for (; iter != values.end(); ++iter) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config) {
+      results.push_back(value);
+      ++iter;
+      break;
     }
+  }
 
-    for (; iter != values.end(); ++iter) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config) {
-            results.push_back(value);
-        }
+  for (; iter != values.end(); ++iter) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config) {
+      results.push_back(value);
     }
-    return results;
+  }
+  return results;
 }
 
 std::vector<ResourceConfigValue*> ResourceEntry::findValuesIf(
-        const std::function<bool(ResourceConfigValue*)>& f) {
-    std::vector<ResourceConfigValue*> results;
-    for (auto& configValue : values) {
-        if (f(configValue.get())) {
-            results.push_back(configValue.get());
-        }
+    const std::function<bool(ResourceConfigValue*)>& f) {
+  std::vector<ResourceConfigValue*> results;
+  for (auto& configValue : values) {
+    if (f(configValue.get())) {
+      results.push_back(configValue.get());
     }
-    return results;
+  }
+  return results;
 }
 
 /**
  * The default handler for collisions.
  *
- * Typically, a weak value will be overridden by a strong value. An existing weak
+ * Typically, a weak value will be overridden by a strong value. An existing
+ * weak
  * value will not be overridden by an incoming weak value.
  *
  * There are some exceptions:
  *
  * Attributes: There are two types of Attribute values: USE and DECL.
  *
- * USE is anywhere an Attribute is declared without a format, and in a place that would
+ * USE is anywhere an Attribute is declared without a format, and in a place
+ * that would
  * be legal to declare if the Attribute already existed. This is typically in a
- * <declare-styleable> tag. Attributes defined in a <declare-styleable> are also weak.
+ * <declare-styleable> tag. Attributes defined in a <declare-styleable> are also
+ * weak.
  *
- * DECL is an absolute declaration of an Attribute and specifies an explicit format.
+ * DECL is an absolute declaration of an Attribute and specifies an explicit
+ * format.
  *
- * A DECL will override a USE without error. Two DECLs must match in their format for there to be
+ * A DECL will override a USE without error. Two DECLs must match in their
+ * format for there to be
  * no error.
  */
 ResourceTable::CollisionResult ResourceTable::resolveValueCollision(
-        Value* existing, Value* incoming) {
-    Attribute* existingAttr = valueCast<Attribute>(existing);
-    Attribute* incomingAttr = valueCast<Attribute>(incoming);
-    if (!incomingAttr) {
-        if (incoming->isWeak()) {
-            // We're trying to add a weak resource but a resource
-            // already exists. Keep the existing.
-            return CollisionResult::kKeepOriginal;
-        } else if (existing->isWeak()) {
-            // Override the weak resource with the new strong resource.
-            return CollisionResult::kTakeNew;
-        }
-        // The existing and incoming values are strong, this is an error
-        // if the values are not both attributes.
-        return CollisionResult::kConflict;
+    Value* existing, Value* incoming) {
+  Attribute* existingAttr = valueCast<Attribute>(existing);
+  Attribute* incomingAttr = valueCast<Attribute>(incoming);
+  if (!incomingAttr) {
+    if (incoming->isWeak()) {
+      // We're trying to add a weak resource but a resource
+      // already exists. Keep the existing.
+      return CollisionResult::kKeepOriginal;
+    } else if (existing->isWeak()) {
+      // Override the weak resource with the new strong resource.
+      return CollisionResult::kTakeNew;
     }
-
-    if (!existingAttr) {
-        if (existing->isWeak()) {
-            // The existing value is not an attribute and it is weak,
-            // so take the incoming attribute value.
-            return CollisionResult::kTakeNew;
-        }
-        // The existing value is not an attribute and it is strong,
-        // so the incoming attribute value is an error.
-        return CollisionResult::kConflict;
-    }
-
-    assert(incomingAttr && existingAttr);
-
-    //
-    // Attribute specific handling. At this point we know both
-    // values are attributes. Since we can declare and define
-    // attributes all-over, we do special handling to see
-    // which definition sticks.
-    //
-    if (existingAttr->typeMask == incomingAttr->typeMask) {
-        // The two attributes are both DECLs, but they are plain attributes
-        // with the same formats.
-        // Keep the strongest one.
-        return existingAttr->isWeak() ? CollisionResult::kTakeNew : CollisionResult::kKeepOriginal;
-    }
-
-    if (existingAttr->isWeak() && existingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
-        // Any incoming attribute is better than this.
-        return CollisionResult::kTakeNew;
-    }
-
-    if (incomingAttr->isWeak() && incomingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
-        // The incoming attribute may be a USE instead of a DECL.
-        // Keep the existing attribute.
-        return CollisionResult::kKeepOriginal;
-    }
+    // The existing and incoming values are strong, this is an error
+    // if the values are not both attributes.
     return CollisionResult::kConflict;
+  }
+
+  if (!existingAttr) {
+    if (existing->isWeak()) {
+      // The existing value is not an attribute and it is weak,
+      // so take the incoming attribute value.
+      return CollisionResult::kTakeNew;
+    }
+    // The existing value is not an attribute and it is strong,
+    // so the incoming attribute value is an error.
+    return CollisionResult::kConflict;
+  }
+
+  assert(incomingAttr && existingAttr);
+
+  //
+  // Attribute specific handling. At this point we know both
+  // values are attributes. Since we can declare and define
+  // attributes all-over, we do special handling to see
+  // which definition sticks.
+  //
+  if (existingAttr->typeMask == incomingAttr->typeMask) {
+    // The two attributes are both DECLs, but they are plain attributes
+    // with the same formats.
+    // Keep the strongest one.
+    return existingAttr->isWeak() ? CollisionResult::kTakeNew
+                                  : CollisionResult::kKeepOriginal;
+  }
+
+  if (existingAttr->isWeak() &&
+      existingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
+    // Any incoming attribute is better than this.
+    return CollisionResult::kTakeNew;
+  }
+
+  if (incomingAttr->isWeak() &&
+      incomingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
+    // The incoming attribute may be a USE instead of a DECL.
+    // Keep the existing attribute.
+    return CollisionResult::kKeepOriginal;
+  }
+  return CollisionResult::kConflict;
 }
 
 static constexpr const char* kValidNameChars = "._-";
@@ -284,8 +300,8 @@
                                 const StringPiece& product,
                                 std::unique_ptr<Value> value,
                                 IDiagnostics* diag) {
-    return addResourceImpl(name, {}, config, product, std::move(value), kValidNameChars,
-                           resolveValueCollision, diag);
+  return addResourceImpl(name, {}, config, product, std::move(value),
+                         kValidNameChars, resolveValueCollision, diag);
 }
 
 bool ResourceTable::addResource(const ResourceNameRef& name,
@@ -294,8 +310,8 @@
                                 const StringPiece& product,
                                 std::unique_ptr<Value> value,
                                 IDiagnostics* diag) {
-    return addResourceImpl(name, resId, config, product, std::move(value), kValidNameChars,
-                           resolveValueCollision, diag);
+  return addResourceImpl(name, resId, config, product, std::move(value),
+                         kValidNameChars, resolveValueCollision, diag);
 }
 
 bool ResourceTable::addFileReference(const ResourceNameRef& name,
@@ -303,31 +319,29 @@
                                      const Source& source,
                                      const StringPiece& path,
                                      IDiagnostics* diag) {
-    return addFileReferenceImpl(name, config, source, path, nullptr, kValidNameChars, diag);
+  return addFileReferenceImpl(name, config, source, path, nullptr,
+                              kValidNameChars, diag);
 }
 
-bool ResourceTable::addFileReferenceAllowMangled(const ResourceNameRef& name,
-                                                 const ConfigDescription& config,
-                                                 const Source& source,
-                                                 const StringPiece& path,
-                                                 io::IFile* file,
-                                                 IDiagnostics* diag) {
-    return addFileReferenceImpl(name, config, source, path, file, kValidNameMangledChars, diag);
+bool ResourceTable::addFileReferenceAllowMangled(
+    const ResourceNameRef& name, const ConfigDescription& config,
+    const Source& source, const StringPiece& path, io::IFile* file,
+    IDiagnostics* diag) {
+  return addFileReferenceImpl(name, config, source, path, file,
+                              kValidNameMangledChars, diag);
 }
 
-bool ResourceTable::addFileReferenceImpl(const ResourceNameRef& name,
-                                         const ConfigDescription& config,
-                                         const Source& source,
-                                         const StringPiece& path,
-                                         io::IFile* file,
-                                         const char* validChars,
-                                         IDiagnostics* diag) {
-    std::unique_ptr<FileReference> fileRef = util::make_unique<FileReference>(
-            stringPool.makeRef(path));
-    fileRef->setSource(source);
-    fileRef->file = file;
-    return addResourceImpl(name, ResourceId{}, config, StringPiece{}, std::move(fileRef),
-                           validChars, resolveValueCollision, diag);
+bool ResourceTable::addFileReferenceImpl(
+    const ResourceNameRef& name, const ConfigDescription& config,
+    const Source& source, const StringPiece& path, io::IFile* file,
+    const char* validChars, IDiagnostics* diag) {
+  std::unique_ptr<FileReference> fileRef =
+      util::make_unique<FileReference>(stringPool.makeRef(path));
+  fileRef->setSource(source);
+  fileRef->file = file;
+  return addResourceImpl(name, ResourceId{}, config, StringPiece{},
+                         std::move(fileRef), validChars, resolveValueCollision,
+                         diag);
 }
 
 bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name,
@@ -335,8 +349,8 @@
                                             const StringPiece& product,
                                             std::unique_ptr<Value> value,
                                             IDiagnostics* diag) {
-    return addResourceImpl(name, ResourceId{}, config, product, std::move(value),
-                           kValidNameMangledChars, resolveValueCollision, diag);
+  return addResourceImpl(name, ResourceId{}, config, product, std::move(value),
+                         kValidNameMangledChars, resolveValueCollision, diag);
 }
 
 bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name,
@@ -345,220 +359,193 @@
                                             const StringPiece& product,
                                             std::unique_ptr<Value> value,
                                             IDiagnostics* diag) {
-    return addResourceImpl(name, id, config, product, std::move(value), kValidNameMangledChars,
-                           resolveValueCollision, diag);
+  return addResourceImpl(name, id, config, product, std::move(value),
+                         kValidNameMangledChars, resolveValueCollision, diag);
 }
 
-bool ResourceTable::addResourceImpl(const ResourceNameRef& name,
-                                    const ResourceId& resId,
-                                    const ConfigDescription& config,
-                                    const StringPiece& product,
-                                    std::unique_ptr<Value> value,
-                                    const char* validChars,
-                                    const CollisionResolverFunc& conflictResolver,
-                                    IDiagnostics* diag) {
-    assert(value && "value can't be nullptr");
-    assert(diag && "diagnostics can't be nullptr");
+bool ResourceTable::addResourceImpl(
+    const ResourceNameRef& name, const ResourceId& resId,
+    const ConfigDescription& config, const StringPiece& product,
+    std::unique_ptr<Value> value, const char* validChars,
+    const CollisionResolverFunc& conflictResolver, IDiagnostics* diag) {
+  assert(value && "value can't be nullptr");
+  assert(diag && "diagnostics can't be nullptr");
 
-    auto badCharIter = util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
-    if (badCharIter != name.entry.end()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "resource '"
-                    << name
-                    << "' has invalid entry name '"
-                    << name.entry
-                    << "'. Invalid character '"
-                    << StringPiece(badCharIter, 1)
-                    << "'");
-        return false;
-    }
+  auto badCharIter =
+      util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
+  if (badCharIter != name.entry.end()) {
+    diag->error(DiagMessage(value->getSource())
+                << "resource '" << name << "' has invalid entry name '"
+                << name.entry << "'. Invalid character '"
+                << StringPiece(badCharIter, 1) << "'");
+    return false;
+  }
 
-    ResourceTablePackage* package = findOrCreatePackage(name.package);
-    if (resId.isValid() && package->id && package->id.value() != resId.packageId()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but package '"
-                    << package->name
-                    << "' already has ID "
-                    << std::hex << (int) package->id.value() << std::dec);
-        return false;
-    }
+  ResourceTablePackage* package = findOrCreatePackage(name.package);
+  if (resId.isValid() && package->id &&
+      package->id.value() != resId.packageId()) {
+    diag->error(DiagMessage(value->getSource())
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but package '" << package->name << "' already has ID "
+                << std::hex << (int)package->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceTableType* type = package->findOrCreateType(name.type);
-    if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but type '"
-                    << type->type
-                    << "' already has ID "
-                    << std::hex << (int) type->id.value() << std::dec);
-        return false;
-    }
+  ResourceTableType* type = package->findOrCreateType(name.type);
+  if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
+    diag->error(DiagMessage(value->getSource())
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but type '" << type->type << "' already has ID "
+                << std::hex << (int)type->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceEntry* entry = type->findOrCreateEntry(name.entry);
-    if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but resource already has ID "
-                    << ResourceId(package->id.value(), type->id.value(), entry->id.value()));
-        return false;
-    }
+  ResourceEntry* entry = type->findOrCreateEntry(name.entry);
+  if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
+    diag->error(DiagMessage(value->getSource())
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but resource already has ID "
+                << ResourceId(package->id.value(), type->id.value(),
+                              entry->id.value()));
+    return false;
+  }
 
-    ResourceConfigValue* configValue = entry->findOrCreateValue(config, product);
-    if (!configValue->value) {
-        // Resource does not exist, add it now.
+  ResourceConfigValue* configValue = entry->findOrCreateValue(config, product);
+  if (!configValue->value) {
+    // Resource does not exist, add it now.
+    configValue->value = std::move(value);
+
+  } else {
+    switch (conflictResolver(configValue->value.get(), value.get())) {
+      case CollisionResult::kTakeNew:
+        // Take the incoming value.
         configValue->value = std::move(value);
+        break;
 
-    } else {
-        switch (conflictResolver(configValue->value.get(), value.get())) {
-        case CollisionResult::kTakeNew:
-            // Take the incoming value.
-            configValue->value = std::move(value);
-            break;
+      case CollisionResult::kConflict:
+        diag->error(DiagMessage(value->getSource())
+                    << "duplicate value for resource '" << name << "' "
+                    << "with config '" << config << "'");
+        diag->error(DiagMessage(configValue->value->getSource())
+                    << "resource previously defined here");
+        return false;
 
-        case CollisionResult::kConflict:
-            diag->error(DiagMessage(value->getSource())
-                                    << "duplicate value for resource '" << name << "' "
-                                    << "with config '" << config << "'");
-            diag->error(DiagMessage(configValue->value->getSource())
-                                    << "resource previously defined here");
-            return false;
-
-        case CollisionResult::kKeepOriginal:
-            break;
-        }
+      case CollisionResult::kKeepOriginal:
+        break;
     }
+  }
 
-    if (resId.isValid()) {
-        package->id = resId.packageId();
-        type->id = resId.typeId();
-        entry->id = resId.entryId();
-    }
-    return true;
+  if (resId.isValid()) {
+    package->id = resId.packageId();
+    type->id = resId.typeId();
+    entry->id = resId.entryId();
+  }
+  return true;
 }
 
-bool ResourceTable::setSymbolState(const ResourceNameRef& name, const ResourceId& resId,
+bool ResourceTable::setSymbolState(const ResourceNameRef& name,
+                                   const ResourceId& resId,
                                    const Symbol& symbol, IDiagnostics* diag) {
-    return setSymbolStateImpl(name, resId, symbol, kValidNameChars, diag);
+  return setSymbolStateImpl(name, resId, symbol, kValidNameChars, diag);
 }
 
 bool ResourceTable::setSymbolStateAllowMangled(const ResourceNameRef& name,
                                                const ResourceId& resId,
-                                               const Symbol& symbol, IDiagnostics* diag) {
-    return setSymbolStateImpl(name, resId, symbol, kValidNameMangledChars, diag);
+                                               const Symbol& symbol,
+                                               IDiagnostics* diag) {
+  return setSymbolStateImpl(name, resId, symbol, kValidNameMangledChars, diag);
 }
 
-bool ResourceTable::setSymbolStateImpl(const ResourceNameRef& name, const ResourceId& resId,
-                                       const Symbol& symbol, const char* validChars,
+bool ResourceTable::setSymbolStateImpl(const ResourceNameRef& name,
+                                       const ResourceId& resId,
+                                       const Symbol& symbol,
+                                       const char* validChars,
                                        IDiagnostics* diag) {
-    assert(diag && "diagnostics can't be nullptr");
+  assert(diag && "diagnostics can't be nullptr");
 
-    auto badCharIter = util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
-    if (badCharIter != name.entry.end()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "resource '"
-                    << name
-                    << "' has invalid entry name '"
-                    << name.entry
-                    << "'. Invalid character '"
-                    << StringPiece(badCharIter, 1)
-                    << "'");
-        return false;
-    }
+  auto badCharIter =
+      util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
+  if (badCharIter != name.entry.end()) {
+    diag->error(DiagMessage(symbol.source)
+                << "resource '" << name << "' has invalid entry name '"
+                << name.entry << "'. Invalid character '"
+                << StringPiece(badCharIter, 1) << "'");
+    return false;
+  }
 
-    ResourceTablePackage* package = findOrCreatePackage(name.package);
-    if (resId.isValid() && package->id && package->id.value() != resId.packageId()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but package '"
-                    << package->name
-                    << "' already has ID "
-                    << std::hex << (int) package->id.value() << std::dec);
-        return false;
-    }
+  ResourceTablePackage* package = findOrCreatePackage(name.package);
+  if (resId.isValid() && package->id &&
+      package->id.value() != resId.packageId()) {
+    diag->error(DiagMessage(symbol.source)
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but package '" << package->name << "' already has ID "
+                << std::hex << (int)package->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceTableType* type = package->findOrCreateType(name.type);
-    if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but type '"
-                    << type->type
-                    << "' already has ID "
-                    << std::hex << (int) type->id.value() << std::dec);
-        return false;
-    }
+  ResourceTableType* type = package->findOrCreateType(name.type);
+  if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
+    diag->error(DiagMessage(symbol.source)
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but type '" << type->type << "' already has ID "
+                << std::hex << (int)type->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceEntry* entry = type->findOrCreateEntry(name.entry);
-    if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but resource already has ID "
-                    << ResourceId(package->id.value(), type->id.value(), entry->id.value()));
-        return false;
-    }
+  ResourceEntry* entry = type->findOrCreateEntry(name.entry);
+  if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
+    diag->error(DiagMessage(symbol.source)
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but resource already has ID "
+                << ResourceId(package->id.value(), type->id.value(),
+                              entry->id.value()));
+    return false;
+  }
 
-    if (resId.isValid()) {
-        package->id = resId.packageId();
-        type->id = resId.typeId();
-        entry->id = resId.entryId();
-    }
+  if (resId.isValid()) {
+    package->id = resId.packageId();
+    type->id = resId.typeId();
+    entry->id = resId.entryId();
+  }
 
-    // Only mark the type state as public, it doesn't care about being private.
-    if (symbol.state == SymbolState::kPublic) {
-        type->symbolStatus.state = SymbolState::kPublic;
-    }
+  // Only mark the type state as public, it doesn't care about being private.
+  if (symbol.state == SymbolState::kPublic) {
+    type->symbolStatus.state = SymbolState::kPublic;
+  }
 
-    if (symbol.state == SymbolState::kUndefined &&
-            entry->symbolStatus.state != SymbolState::kUndefined) {
-        // We can't undefine a symbol (remove its visibility). Ignore.
-        return true;
-    }
-
-    if (symbol.state == SymbolState::kPrivate &&
-            entry->symbolStatus.state == SymbolState::kPublic) {
-        // We can't downgrade public to private. Ignore.
-        return true;
-    }
-
-    entry->symbolStatus = std::move(symbol);
+  if (symbol.state == SymbolState::kUndefined &&
+      entry->symbolStatus.state != SymbolState::kUndefined) {
+    // We can't undefine a symbol (remove its visibility). Ignore.
     return true;
+  }
+
+  if (symbol.state == SymbolState::kPrivate &&
+      entry->symbolStatus.state == SymbolState::kPublic) {
+    // We can't downgrade public to private. Ignore.
+    return true;
+  }
+
+  entry->symbolStatus = std::move(symbol);
+  return true;
 }
 
-Maybe<ResourceTable::SearchResult>
-ResourceTable::findResource(const ResourceNameRef& name) {
-    ResourceTablePackage* package = findPackage(name.package);
-    if (!package) {
-        return {};
-    }
+Maybe<ResourceTable::SearchResult> ResourceTable::findResource(
+    const ResourceNameRef& name) {
+  ResourceTablePackage* package = findPackage(name.package);
+  if (!package) {
+    return {};
+  }
 
-    ResourceTableType* type = package->findType(name.type);
-    if (!type) {
-        return {};
-    }
+  ResourceTableType* type = package->findType(name.type);
+  if (!type) {
+    return {};
+  }
 
-    ResourceEntry* entry = type->findEntry(name.entry);
-    if (!entry) {
-        return {};
-    }
-    return SearchResult{ package, type, entry };
+  ResourceEntry* entry = type->findEntry(name.entry);
+  if (!entry) {
+    return {};
+  }
+  return SearchResult{package, type, entry};
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index 6c246d0..ebaad41 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -37,42 +37,43 @@
 namespace aapt {
 
 enum class SymbolState {
-    kUndefined,
-    kPrivate,
-    kPublic,
+  kUndefined,
+  kPrivate,
+  kPublic,
 };
 
 /**
  * The Public status of a resource.
  */
 struct Symbol {
-    SymbolState state = SymbolState::kUndefined;
-    Source source;
-    std::string comment;
+  SymbolState state = SymbolState::kUndefined;
+  Source source;
+  std::string comment;
 };
 
 class ResourceConfigValue {
-public:
-    /**
-     * The configuration for which this value is defined.
-     */
-    const ConfigDescription config;
+ public:
+  /**
+   * The configuration for which this value is defined.
+   */
+  const ConfigDescription config;
 
-    /**
-     * The product for which this value is defined.
-     */
-    const std::string product;
+  /**
+   * The product for which this value is defined.
+   */
+  const std::string product;
 
-    /**
-     * The actual Value.
-     */
-    std::unique_ptr<Value> value;
+  /**
+   * The actual Value.
+   */
+  std::unique_ptr<Value> value;
 
-    ResourceConfigValue(const ConfigDescription& config, const StringPiece& product) :
-            config(config), product(product.toString()) { }
+  ResourceConfigValue(const ConfigDescription& config,
+                      const StringPiece& product)
+      : config(config), product(product.toString()) {}
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceConfigValue);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceConfigValue);
 };
 
 /**
@@ -80,42 +81,44 @@
  * varying values for each defined configuration.
  */
 class ResourceEntry {
-public:
-    /**
-     * The name of the resource. Immutable, as
-     * this determines the order of this resource
-     * when doing lookups.
-     */
-    const std::string name;
+ public:
+  /**
+   * The name of the resource. Immutable, as
+   * this determines the order of this resource
+   * when doing lookups.
+   */
+  const std::string name;
 
-    /**
-     * The entry ID for this resource.
-     */
-    Maybe<uint16_t> id;
+  /**
+   * The entry ID for this resource.
+   */
+  Maybe<uint16_t> id;
 
-    /**
-     * Whether this resource is public (and must maintain the same entry ID across builds).
-     */
-    Symbol symbolStatus;
+  /**
+   * Whether this resource is public (and must maintain the same entry ID across
+   * builds).
+   */
+  Symbol symbolStatus;
 
-    /**
-     * The resource's values for each configuration.
-     */
-    std::vector<std::unique_ptr<ResourceConfigValue>> values;
+  /**
+   * The resource's values for each configuration.
+   */
+  std::vector<std::unique_ptr<ResourceConfigValue>> values;
 
-    explicit ResourceEntry(const StringPiece& name) : name(name.toString()) { }
+  explicit ResourceEntry(const StringPiece& name) : name(name.toString()) {}
 
-    ResourceConfigValue* findValue(const ConfigDescription& config);
-    ResourceConfigValue* findValue(const ConfigDescription& config, const StringPiece& product);
-    ResourceConfigValue* findOrCreateValue(const ConfigDescription& config,
-                                           const StringPiece& product);
-    std::vector<ResourceConfigValue*> findAllValues(const ConfigDescription& config);
-    std::vector<ResourceConfigValue*> findValuesIf(
-            const std::function<bool(ResourceConfigValue*)>& f);
+  ResourceConfigValue* findValue(const ConfigDescription& config);
+  ResourceConfigValue* findValue(const ConfigDescription& config,
+                                 const StringPiece& product);
+  ResourceConfigValue* findOrCreateValue(const ConfigDescription& config,
+                                         const StringPiece& product);
+  std::vector<ResourceConfigValue*> findAllValues(
+      const ConfigDescription& config);
+  std::vector<ResourceConfigValue*> findValuesIf(
+      const std::function<bool(ResourceConfigValue*)>& f);
 
-
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceEntry);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceEntry);
 };
 
 /**
@@ -123,58 +126,53 @@
  * for this type.
  */
 class ResourceTableType {
-public:
-    /**
-     * The logical type of resource (string, drawable, layout, etc.).
-     */
-    const ResourceType type;
+ public:
+  /**
+   * The logical type of resource (string, drawable, layout, etc.).
+   */
+  const ResourceType type;
 
-    /**
-     * The type ID for this resource.
-     */
-    Maybe<uint8_t> id;
+  /**
+   * The type ID for this resource.
+   */
+  Maybe<uint8_t> id;
 
-    /**
-     * Whether this type is public (and must maintain the same
-     * type ID across builds).
-     */
-    Symbol symbolStatus;
+  /**
+   * Whether this type is public (and must maintain the same
+   * type ID across builds).
+   */
+  Symbol symbolStatus;
 
-    /**
-     * List of resources for this type.
-     */
-    std::vector<std::unique_ptr<ResourceEntry>> entries;
+  /**
+   * List of resources for this type.
+   */
+  std::vector<std::unique_ptr<ResourceEntry>> entries;
 
-    explicit ResourceTableType(const ResourceType type) : type(type) { }
+  explicit ResourceTableType(const ResourceType type) : type(type) {}
 
-    ResourceEntry* findEntry(const StringPiece& name);
-    ResourceEntry* findOrCreateEntry(const StringPiece& name);
+  ResourceEntry* findEntry(const StringPiece& name);
+  ResourceEntry* findOrCreateEntry(const StringPiece& name);
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceTableType);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceTableType);
 };
 
-enum class PackageType {
-    System,
-    Vendor,
-    App,
-    Dynamic
-};
+enum class PackageType { System, Vendor, App, Dynamic };
 
 class ResourceTablePackage {
-public:
-    PackageType type = PackageType::App;
-    Maybe<uint8_t> id;
-    std::string name;
+ public:
+  PackageType type = PackageType::App;
+  Maybe<uint8_t> id;
+  std::string name;
 
-    std::vector<std::unique_ptr<ResourceTableType>> types;
+  std::vector<std::unique_ptr<ResourceTableType>> types;
 
-    ResourceTablePackage() = default;
-    ResourceTableType* findType(ResourceType type);
-    ResourceTableType* findOrCreateType(const ResourceType type);
+  ResourceTablePackage() = default;
+  ResourceTableType* findType(ResourceType type);
+  ResourceTableType* findOrCreateType(const ResourceType type);
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceTablePackage);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceTablePackage);
 };
 
 /**
@@ -182,140 +180,129 @@
  * flattened into a binary resource table (resources.arsc).
  */
 class ResourceTable {
-public:
-    ResourceTable() = default;
+ public:
+  ResourceTable() = default;
 
-    enum class CollisionResult {
-        kKeepOriginal,
-        kConflict,
-        kTakeNew
-    };
+  enum class CollisionResult { kKeepOriginal, kConflict, kTakeNew };
 
-    using CollisionResolverFunc = std::function<CollisionResult(Value*, Value*)>;
+  using CollisionResolverFunc = std::function<CollisionResult(Value*, Value*)>;
 
-    /**
-     * When a collision of resources occurs, this method decides which value to keep.
-     */
-    static CollisionResult resolveValueCollision(Value* existing, Value* incoming);
+  /**
+   * When a collision of resources occurs, this method decides which value to
+   * keep.
+   */
+  static CollisionResult resolveValueCollision(Value* existing,
+                                               Value* incoming);
 
-    bool addResource(const ResourceNameRef& name,
-                     const ConfigDescription& config,
-                     const StringPiece& product,
-                     std::unique_ptr<Value> value,
-                     IDiagnostics* diag);
+  bool addResource(const ResourceNameRef& name, const ConfigDescription& config,
+                   const StringPiece& product, std::unique_ptr<Value> value,
+                   IDiagnostics* diag);
 
-    bool addResource(const ResourceNameRef& name,
-                     const ResourceId& resId,
-                     const ConfigDescription& config,
-                     const StringPiece& product,
-                     std::unique_ptr<Value> value,
-                     IDiagnostics* diag);
+  bool addResource(const ResourceNameRef& name, const ResourceId& resId,
+                   const ConfigDescription& config, const StringPiece& product,
+                   std::unique_ptr<Value> value, IDiagnostics* diag);
 
-    bool addFileReference(const ResourceNameRef& name,
-                              const ConfigDescription& config,
-                              const Source& source,
-                              const StringPiece& path,
-                              IDiagnostics* diag);
+  bool addFileReference(const ResourceNameRef& name,
+                        const ConfigDescription& config, const Source& source,
+                        const StringPiece& path, IDiagnostics* diag);
 
-    bool addFileReferenceAllowMangled(const ResourceNameRef& name,
-                                      const ConfigDescription& config,
-                                      const Source& source,
-                                      const StringPiece& path,
-                                      io::IFile* file,
-                                      IDiagnostics* diag);
-
-    /**
-     * Same as addResource, but doesn't verify the validity of the name. This is used
-     * when loading resources from an existing binary resource table that may have mangled
-     * names.
-     */
-    bool addResourceAllowMangled(const ResourceNameRef& name,
-                                 const ConfigDescription& config,
-                                 const StringPiece& product,
-                                 std::unique_ptr<Value> value,
-                                 IDiagnostics* diag);
-
-    bool addResourceAllowMangled(const ResourceNameRef& name,
-                                 const ResourceId& id,
-                                 const ConfigDescription& config,
-                                 const StringPiece& product,
-                                 std::unique_ptr<Value> value,
-                                 IDiagnostics* diag);
-
-    bool setSymbolState(const ResourceNameRef& name,
-                        const ResourceId& resId,
-                        const Symbol& symbol,
-                        IDiagnostics* diag);
-
-    bool setSymbolStateAllowMangled(const ResourceNameRef& name,
-                                    const ResourceId& resId,
-                                    const Symbol& symbol,
+  bool addFileReferenceAllowMangled(const ResourceNameRef& name,
+                                    const ConfigDescription& config,
+                                    const Source& source,
+                                    const StringPiece& path, io::IFile* file,
                                     IDiagnostics* diag);
 
-    struct SearchResult {
-        ResourceTablePackage* package;
-        ResourceTableType* type;
-        ResourceEntry* entry;
-    };
+  /**
+   * Same as addResource, but doesn't verify the validity of the name. This is
+   * used
+   * when loading resources from an existing binary resource table that may have
+   * mangled
+   * names.
+   */
+  bool addResourceAllowMangled(const ResourceNameRef& name,
+                               const ConfigDescription& config,
+                               const StringPiece& product,
+                               std::unique_ptr<Value> value,
+                               IDiagnostics* diag);
 
-    Maybe<SearchResult> findResource(const ResourceNameRef& name);
+  bool addResourceAllowMangled(const ResourceNameRef& name,
+                               const ResourceId& id,
+                               const ConfigDescription& config,
+                               const StringPiece& product,
+                               std::unique_ptr<Value> value,
+                               IDiagnostics* diag);
 
-    /**
-     * The string pool used by this resource table. Values that reference strings must use
-     * this pool to create their strings.
-     *
-     * NOTE: `stringPool` must come before `packages` so that it is destroyed after.
-     * When `string pool` references are destroyed (as they will be when `packages`
-     * is destroyed), they decrement a refCount, which would cause invalid
-     * memory access if the pool was already destroyed.
-     */
-    StringPool stringPool;
+  bool setSymbolState(const ResourceNameRef& name, const ResourceId& resId,
+                      const Symbol& symbol, IDiagnostics* diag);
 
-    /**
-     * The list of packages in this table, sorted alphabetically by package name.
-     */
-    std::vector<std::unique_ptr<ResourceTablePackage>> packages;
+  bool setSymbolStateAllowMangled(const ResourceNameRef& name,
+                                  const ResourceId& resId, const Symbol& symbol,
+                                  IDiagnostics* diag);
 
-    /**
-     * Returns the package struct with the given name, or nullptr if such a package does not
-     * exist. The empty string is a valid package and typically is used to represent the
-     * 'current' package before it is known to the ResourceTable.
-     */
-    ResourceTablePackage* findPackage(const StringPiece& name);
+  struct SearchResult {
+    ResourceTablePackage* package;
+    ResourceTableType* type;
+    ResourceEntry* entry;
+  };
 
-    ResourceTablePackage* findPackageById(uint8_t id);
+  Maybe<SearchResult> findResource(const ResourceNameRef& name);
 
-    ResourceTablePackage* createPackage(const StringPiece& name, Maybe<uint8_t> id = {});
+  /**
+   * The string pool used by this resource table. Values that reference strings
+   * must use
+   * this pool to create their strings.
+   *
+   * NOTE: `stringPool` must come before `packages` so that it is destroyed
+   * after.
+   * When `string pool` references are destroyed (as they will be when
+   * `packages`
+   * is destroyed), they decrement a refCount, which would cause invalid
+   * memory access if the pool was already destroyed.
+   */
+  StringPool stringPool;
 
-private:
-    ResourceTablePackage* findOrCreatePackage(const StringPiece& name);
+  /**
+   * The list of packages in this table, sorted alphabetically by package name.
+   */
+  std::vector<std::unique_ptr<ResourceTablePackage>> packages;
 
-    bool addResourceImpl(const ResourceNameRef& name,
-                         const ResourceId& resId,
-                         const ConfigDescription& config,
-                         const StringPiece& product,
-                         std::unique_ptr<Value> value,
-                         const char* validChars,
-                         const CollisionResolverFunc& conflictResolver,
-                         IDiagnostics* diag);
+  /**
+   * Returns the package struct with the given name, or nullptr if such a
+   * package does not
+   * exist. The empty string is a valid package and typically is used to
+   * represent the
+   * 'current' package before it is known to the ResourceTable.
+   */
+  ResourceTablePackage* findPackage(const StringPiece& name);
 
-    bool addFileReferenceImpl(const ResourceNameRef& name,
-                              const ConfigDescription& config,
-                              const Source& source,
-                              const StringPiece& path,
-                              io::IFile* file,
-                              const char* validChars,
-                              IDiagnostics* diag);
+  ResourceTablePackage* findPackageById(uint8_t id);
 
-    bool setSymbolStateImpl(const ResourceNameRef& name,
-                            const ResourceId& resId,
-                            const Symbol& symbol,
-                            const char* validChars,
+  ResourceTablePackage* createPackage(const StringPiece& name,
+                                      Maybe<uint8_t> id = {});
+
+ private:
+  ResourceTablePackage* findOrCreatePackage(const StringPiece& name);
+
+  bool addResourceImpl(const ResourceNameRef& name, const ResourceId& resId,
+                       const ConfigDescription& config,
+                       const StringPiece& product, std::unique_ptr<Value> value,
+                       const char* validChars,
+                       const CollisionResolverFunc& conflictResolver,
+                       IDiagnostics* diag);
+
+  bool addFileReferenceImpl(const ResourceNameRef& name,
+                            const ConfigDescription& config,
+                            const Source& source, const StringPiece& path,
+                            io::IFile* file, const char* validChars,
                             IDiagnostics* diag);
 
-    DISALLOW_COPY_AND_ASSIGN(ResourceTable);
+  bool setSymbolStateImpl(const ResourceNameRef& name, const ResourceId& resId,
+                          const Symbol& symbol, const char* validChars,
+                          IDiagnostics* diag);
+
+  DISALLOW_COPY_AND_ASSIGN(ResourceTable);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_TABLE_H
+#endif  // AAPT_RESOURCE_TABLE_H
diff --git a/tools/aapt2/ResourceTable_test.cpp b/tools/aapt2/ResourceTable_test.cpp
index 4db40a6..a64ad3e 100644
--- a/tools/aapt2/ResourceTable_test.cpp
+++ b/tools/aapt2/ResourceTable_test.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "Diagnostics.h"
 #include "ResourceTable.h"
+#include "Diagnostics.h"
 #include "ResourceValues.h"
 #include "test/Test.h"
 #include "util/Util.h"
@@ -27,124 +27,113 @@
 namespace aapt {
 
 TEST(ResourceTableTest, FailToAddResourceWithBadName) {
-    ResourceTable table;
+  ResourceTable table;
 
-    EXPECT_FALSE(table.addResource(
-            test::parseNameOrDie("android:id/hey,there"),
-            ConfigDescription{}, "",
-            test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
-            test::getDiagnostics()));
+  EXPECT_FALSE(table.addResource(
+      test::parseNameOrDie("android:id/hey,there"), ConfigDescription{}, "",
+      test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_FALSE(table.addResource(
-            test::parseNameOrDie("android:id/hey:there"),
-            ConfigDescription{}, "",
-            test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
-            test::getDiagnostics()));
+  EXPECT_FALSE(table.addResource(
+      test::parseNameOrDie("android:id/hey:there"), ConfigDescription{}, "",
+      test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
+      test::getDiagnostics()));
 }
 
 TEST(ResourceTableTest, AddOneResource) {
-    ResourceTable table;
+  ResourceTable table;
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/id"),
-            ConfigDescription{}, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 23u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/id"), ConfigDescription{}, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 23u).build(),
+      test::getDiagnostics()));
 
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
 }
 
 TEST(ResourceTableTest, AddMultipleResources) {
-    ResourceTable table;
+  ResourceTable table;
 
-    ConfigDescription config;
-    ConfigDescription languageConfig;
-    memcpy(languageConfig.language, "pl", sizeof(languageConfig.language));
+  ConfigDescription config;
+  ConfigDescription languageConfig;
+  memcpy(languageConfig.language, "pl", sizeof(languageConfig.language));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/layout_width"),
-            config, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 10u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/layout_width"), config, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 10u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/id"),
-            config, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 12u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/id"), config, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 12u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:string/ok"),
-            config, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 14u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/ok"), config, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 14u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:string/ok"),
-            languageConfig, "",
-            test::ValueBuilder<BinaryPrimitive>(android::Res_value{})
-                    .setSource("test/path/file.xml", 20u)
-                    .build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/ok"), languageConfig, "",
+      test::ValueBuilder<BinaryPrimitive>(android::Res_value{})
+          .setSource("test/path/file.xml", 20u)
+          .build(),
+      test::getDiagnostics()));
 
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/layout_width"));
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:string/ok"));
-    ASSERT_NE(nullptr, test::getValueForConfig<BinaryPrimitive>(&table, "android:string/ok",
-                                                                languageConfig));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/layout_width"));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:string/ok"));
+  ASSERT_NE(nullptr, test::getValueForConfig<BinaryPrimitive>(
+                         &table, "android:string/ok", languageConfig));
 }
 
 TEST(ResourceTableTest, OverrideWeakResourceValue) {
-    ResourceTable table;
+  ResourceTable table;
 
-    ASSERT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/foo"),
-            ConfigDescription{}, "",
-            util::make_unique<Attribute>(true),
-            test::getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/foo"), ConfigDescription{}, "",
+      util::make_unique<Attribute>(true), test::getDiagnostics()));
 
-    Attribute* attr = test::getValue<Attribute>(&table, "android:attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_TRUE(attr->isWeak());
+  Attribute* attr = test::getValue<Attribute>(&table, "android:attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_TRUE(attr->isWeak());
 
-    ASSERT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/foo"),
-            ConfigDescription{}, "",
-            util::make_unique<Attribute>(false),
-            test::getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/foo"), ConfigDescription{}, "",
+      util::make_unique<Attribute>(false), test::getDiagnostics()));
 
-    attr = test::getValue<Attribute>(&table, "android:attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_FALSE(attr->isWeak());
+  attr = test::getValue<Attribute>(&table, "android:attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_FALSE(attr->isWeak());
 }
 
 TEST(ResourceTableTest, ProductVaryingValues) {
-    ResourceTable table;
+  ResourceTable table;
 
-    EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
-                                  test::parseConfigOrDie("land"), "tablet",
-                                  util::make_unique<Id>(),
-                                  test::getDiagnostics()));
-    EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
-                                  test::parseConfigOrDie("land"), "phone",
-                                  util::make_unique<Id>(),
-                                  test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
+                                test::parseConfigOrDie("land"), "tablet",
+                                util::make_unique<Id>(),
+                                test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
+                                test::parseConfigOrDie("land"), "phone",
+                                util::make_unique<Id>(),
+                                test::getDiagnostics()));
 
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/foo",
-                                                             test::parseConfigOrDie("land"),
-                                                             "tablet"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/foo",
-                                                             test::parseConfigOrDie("land"),
-                                                             "phone"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/foo",
+                         test::parseConfigOrDie("land"), "tablet"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/foo",
+                         test::parseConfigOrDie("land"), "phone"));
 
-    Maybe<ResourceTable::SearchResult> sr = table.findResource(
-            test::parseNameOrDie("android:string/foo"));
-    AAPT_ASSERT_TRUE(sr);
-    std::vector<ResourceConfigValue*> values = sr.value().entry->findAllValues(
-            test::parseConfigOrDie("land"));
-    ASSERT_EQ(2u, values.size());
-    EXPECT_EQ(std::string("phone"), values[0]->product);
-    EXPECT_EQ(std::string("tablet"), values[1]->product);
+  Maybe<ResourceTable::SearchResult> sr =
+      table.findResource(test::parseNameOrDie("android:string/foo"));
+  AAPT_ASSERT_TRUE(sr);
+  std::vector<ResourceConfigValue*> values =
+      sr.value().entry->findAllValues(test::parseConfigOrDie("land"));
+  ASSERT_EQ(2u, values.size());
+  EXPECT_EQ(std::string("phone"), values[0]->product);
+  EXPECT_EQ(std::string("tablet"), values[1]->product);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 73a194e..b41be4b 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "NameMangler.h"
 #include "ResourceUtils.h"
+#include "NameMangler.h"
 #include "SdkConstants.h"
 #include "flatten/ResourceTypeExtensions.h"
 #include "util/Files.h"
@@ -27,188 +27,196 @@
 namespace aapt {
 namespace ResourceUtils {
 
-Maybe<ResourceName> toResourceName(const android::ResTable::resource_name& nameIn) {
-    ResourceName nameOut;
-    if (!nameIn.package) {
-        return {};
-    }
+Maybe<ResourceName> toResourceName(
+    const android::ResTable::resource_name& nameIn) {
+  ResourceName nameOut;
+  if (!nameIn.package) {
+    return {};
+  }
 
-    nameOut.package = util::utf16ToUtf8(StringPiece16(nameIn.package, nameIn.packageLen));
+  nameOut.package =
+      util::utf16ToUtf8(StringPiece16(nameIn.package, nameIn.packageLen));
 
-    const ResourceType* type;
-    if (nameIn.type) {
-        type = parseResourceType(util::utf16ToUtf8(StringPiece16(nameIn.type, nameIn.typeLen)));
-    } else if (nameIn.type8) {
-        type = parseResourceType(StringPiece(nameIn.type8, nameIn.typeLen));
-    } else {
-        return {};
-    }
+  const ResourceType* type;
+  if (nameIn.type) {
+    type = parseResourceType(
+        util::utf16ToUtf8(StringPiece16(nameIn.type, nameIn.typeLen)));
+  } else if (nameIn.type8) {
+    type = parseResourceType(StringPiece(nameIn.type8, nameIn.typeLen));
+  } else {
+    return {};
+  }
 
-    if (!type) {
-        return {};
-    }
+  if (!type) {
+    return {};
+  }
 
-    nameOut.type = *type;
+  nameOut.type = *type;
 
-    if (nameIn.name) {
-        nameOut.entry = util::utf16ToUtf8(StringPiece16(nameIn.name, nameIn.nameLen));
-    } else if (nameIn.name8) {
-        nameOut.entry = StringPiece(nameIn.name8, nameIn.nameLen).toString();
-    } else {
-        return {};
-    }
-    return nameOut;
+  if (nameIn.name) {
+    nameOut.entry =
+        util::utf16ToUtf8(StringPiece16(nameIn.name, nameIn.nameLen));
+  } else if (nameIn.name8) {
+    nameOut.entry = StringPiece(nameIn.name8, nameIn.nameLen).toString();
+  } else {
+    return {};
+  }
+  return nameOut;
 }
 
 bool extractResourceName(const StringPiece& str, StringPiece* outPackage,
                          StringPiece* outType, StringPiece* outEntry) {
-    bool hasPackageSeparator = false;
-    bool hasTypeSeparator = false;
-    const char* start = str.data();
-    const char* end = start + str.size();
-    const char* current = start;
-    while (current != end) {
-        if (outType->size() == 0 && *current == '/') {
-            hasTypeSeparator = true;
-            outType->assign(start, current - start);
-            start = current + 1;
-        } else if (outPackage->size() == 0 && *current == ':') {
-            hasPackageSeparator = true;
-            outPackage->assign(start, current - start);
-            start = current + 1;
-        }
-        current++;
+  bool hasPackageSeparator = false;
+  bool hasTypeSeparator = false;
+  const char* start = str.data();
+  const char* end = start + str.size();
+  const char* current = start;
+  while (current != end) {
+    if (outType->size() == 0 && *current == '/') {
+      hasTypeSeparator = true;
+      outType->assign(start, current - start);
+      start = current + 1;
+    } else if (outPackage->size() == 0 && *current == ':') {
+      hasPackageSeparator = true;
+      outPackage->assign(start, current - start);
+      start = current + 1;
     }
-    outEntry->assign(start, end - start);
+    current++;
+  }
+  outEntry->assign(start, end - start);
 
-    return !(hasPackageSeparator && outPackage->empty()) && !(hasTypeSeparator && outType->empty());
+  return !(hasPackageSeparator && outPackage->empty()) &&
+         !(hasTypeSeparator && outType->empty());
 }
 
-bool parseResourceName(const StringPiece& str, ResourceNameRef* outRef, bool* outPrivate) {
-    if (str.empty()) {
-        return false;
+bool parseResourceName(const StringPiece& str, ResourceNameRef* outRef,
+                       bool* outPrivate) {
+  if (str.empty()) {
+    return false;
+  }
+
+  size_t offset = 0;
+  bool priv = false;
+  if (str.data()[0] == '*') {
+    priv = true;
+    offset = 1;
+  }
+
+  StringPiece package;
+  StringPiece type;
+  StringPiece entry;
+  if (!extractResourceName(str.substr(offset, str.size() - offset), &package,
+                           &type, &entry)) {
+    return false;
+  }
+
+  const ResourceType* parsedType = parseResourceType(type);
+  if (!parsedType) {
+    return false;
+  }
+
+  if (entry.empty()) {
+    return false;
+  }
+
+  if (outRef) {
+    outRef->package = package;
+    outRef->type = *parsedType;
+    outRef->entry = entry;
+  }
+
+  if (outPrivate) {
+    *outPrivate = priv;
+  }
+  return true;
+}
+
+bool parseReference(const StringPiece& str, ResourceNameRef* outRef,
+                    bool* outCreate, bool* outPrivate) {
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  if (trimmedStr.empty()) {
+    return false;
+  }
+
+  bool create = false;
+  bool priv = false;
+  if (trimmedStr.data()[0] == '@') {
+    size_t offset = 1;
+    if (trimmedStr.data()[1] == '+') {
+      create = true;
+      offset += 1;
     }
 
-    size_t offset = 0;
-    bool priv = false;
-    if (str.data()[0] == '*') {
-        priv = true;
-        offset = 1;
+    ResourceNameRef name;
+    if (!parseResourceName(
+            trimmedStr.substr(offset, trimmedStr.size() - offset), &name,
+            &priv)) {
+      return false;
     }
 
-    StringPiece package;
-    StringPiece type;
-    StringPiece entry;
-    if (!extractResourceName(str.substr(offset, str.size() - offset), &package, &type, &entry)) {
-        return false;
+    if (create && priv) {
+      return false;
     }
 
-    const ResourceType* parsedType = parseResourceType(type);
-    if (!parsedType) {
-        return false;
-    }
-
-    if (entry.empty()) {
-        return false;
+    if (create && name.type != ResourceType::kId) {
+      return false;
     }
 
     if (outRef) {
-        outRef->package = package;
-        outRef->type = *parsedType;
-        outRef->entry = entry;
+      *outRef = name;
+    }
+
+    if (outCreate) {
+      *outCreate = create;
     }
 
     if (outPrivate) {
-        *outPrivate = priv;
+      *outPrivate = priv;
     }
     return true;
-}
-
-bool parseReference(const StringPiece& str, ResourceNameRef* outRef, bool* outCreate,
-                       bool* outPrivate) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    if (trimmedStr.empty()) {
-        return false;
-    }
-
-    bool create = false;
-    bool priv = false;
-    if (trimmedStr.data()[0] == '@') {
-        size_t offset = 1;
-        if (trimmedStr.data()[1] == '+') {
-            create = true;
-            offset += 1;
-        }
-
-        ResourceNameRef name;
-        if (!parseResourceName(trimmedStr.substr(offset, trimmedStr.size() - offset),
-                               &name, &priv)) {
-            return false;
-        }
-
-        if (create && priv) {
-            return false;
-        }
-
-        if (create && name.type != ResourceType::kId) {
-            return false;
-        }
-
-        if (outRef) {
-            *outRef = name;
-        }
-
-        if (outCreate) {
-            *outCreate = create;
-        }
-
-        if (outPrivate) {
-            *outPrivate = priv;
-        }
-        return true;
-    }
-    return false;
+  }
+  return false;
 }
 
 bool isReference(const StringPiece& str) {
-    return parseReference(str, nullptr, nullptr, nullptr);
+  return parseReference(str, nullptr, nullptr, nullptr);
 }
 
 bool parseAttributeReference(const StringPiece& str, ResourceNameRef* outRef) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    if (trimmedStr.empty()) {
-        return false;
-    }
-
-    if (*trimmedStr.data() == '?') {
-        StringPiece package;
-        StringPiece type;
-        StringPiece entry;
-        if (!extractResourceName(trimmedStr.substr(1, trimmedStr.size() - 1),
-                                 &package, &type, &entry)) {
-            return false;
-        }
-
-        if (!type.empty() && type != "attr") {
-            return false;
-        }
-
-        if (entry.empty()) {
-            return false;
-        }
-
-        if (outRef) {
-            outRef->package = package;
-            outRef->type = ResourceType::kAttr;
-            outRef->entry = entry;
-        }
-        return true;
-    }
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  if (trimmedStr.empty()) {
     return false;
+  }
+
+  if (*trimmedStr.data() == '?') {
+    StringPiece package;
+    StringPiece type;
+    StringPiece entry;
+    if (!extractResourceName(trimmedStr.substr(1, trimmedStr.size() - 1),
+                             &package, &type, &entry)) {
+      return false;
+    }
+
+    if (!type.empty() && type != "attr") {
+      return false;
+    }
+
+    if (entry.empty()) {
+      return false;
+    }
+
+    if (outRef) {
+      outRef->package = package;
+      outRef->type = ResourceType::kAttr;
+      outRef->entry = entry;
+    }
+    return true;
+  }
+  return false;
 }
 
 bool isAttributeReference(const StringPiece& str) {
-    return parseAttributeReference(str, nullptr);
+  return parseAttributeReference(str, nullptr);
 }
 
 /*
@@ -219,414 +227,421 @@
  * <[*]package>:[style/]<entry>
  * [[*]package:style/]<entry>
  */
-Maybe<Reference> parseStyleParentReference(const StringPiece& str, std::string* outError) {
-    if (str.empty()) {
-        return {};
+Maybe<Reference> parseStyleParentReference(const StringPiece& str,
+                                           std::string* outError) {
+  if (str.empty()) {
+    return {};
+  }
+
+  StringPiece name = str;
+
+  bool hasLeadingIdentifiers = false;
+  bool privateRef = false;
+
+  // Skip over these identifiers. A style's parent is a normal reference.
+  if (name.data()[0] == '@' || name.data()[0] == '?') {
+    hasLeadingIdentifiers = true;
+    name = name.substr(1, name.size() - 1);
+  }
+
+  if (name.data()[0] == '*') {
+    privateRef = true;
+    name = name.substr(1, name.size() - 1);
+  }
+
+  ResourceNameRef ref;
+  ref.type = ResourceType::kStyle;
+
+  StringPiece typeStr;
+  extractResourceName(name, &ref.package, &typeStr, &ref.entry);
+  if (!typeStr.empty()) {
+    // If we have a type, make sure it is a Style.
+    const ResourceType* parsedType = parseResourceType(typeStr);
+    if (!parsedType || *parsedType != ResourceType::kStyle) {
+      std::stringstream err;
+      err << "invalid resource type '" << typeStr << "' for parent of style";
+      *outError = err.str();
+      return {};
     }
+  }
 
-    StringPiece name = str;
+  if (!hasLeadingIdentifiers && ref.package.empty() && !typeStr.empty()) {
+    std::stringstream err;
+    err << "invalid parent reference '" << str << "'";
+    *outError = err.str();
+    return {};
+  }
 
-    bool hasLeadingIdentifiers = false;
-    bool privateRef = false;
-
-    // Skip over these identifiers. A style's parent is a normal reference.
-    if (name.data()[0] == '@' || name.data()[0] == '?') {
-        hasLeadingIdentifiers = true;
-        name = name.substr(1, name.size() - 1);
-    }
-
-    if (name.data()[0] == '*') {
-        privateRef = true;
-        name = name.substr(1, name.size() - 1);
-    }
-
-    ResourceNameRef ref;
-    ref.type = ResourceType::kStyle;
-
-    StringPiece typeStr;
-    extractResourceName(name, &ref.package, &typeStr, &ref.entry);
-    if (!typeStr.empty()) {
-        // If we have a type, make sure it is a Style.
-        const ResourceType* parsedType = parseResourceType(typeStr);
-        if (!parsedType || *parsedType != ResourceType::kStyle) {
-            std::stringstream err;
-            err << "invalid resource type '" << typeStr << "' for parent of style";
-            *outError = err.str();
-            return {};
-        }
-    }
-
-    if (!hasLeadingIdentifiers && ref.package.empty() && !typeStr.empty()) {
-        std::stringstream err;
-        err << "invalid parent reference '" << str << "'";
-        *outError = err.str();
-        return {};
-    }
-
-    Reference result(ref);
-    result.privateReference = privateRef;
-    return result;
+  Reference result(ref);
+  result.privateReference = privateRef;
+  return result;
 }
 
 Maybe<Reference> parseXmlAttributeName(const StringPiece& str) {
-    StringPiece trimmedStr = util::trimWhitespace(str);
-    const char* start = trimmedStr.data();
-    const char* const end = start + trimmedStr.size();
-    const char* p = start;
+  StringPiece trimmedStr = util::trimWhitespace(str);
+  const char* start = trimmedStr.data();
+  const char* const end = start + trimmedStr.size();
+  const char* p = start;
 
-    Reference ref;
-    if (p != end && *p == '*') {
-        ref.privateReference = true;
-        start++;
-        p++;
+  Reference ref;
+  if (p != end && *p == '*') {
+    ref.privateReference = true;
+    start++;
+    p++;
+  }
+
+  StringPiece package;
+  StringPiece name;
+  while (p != end) {
+    if (*p == ':') {
+      package = StringPiece(start, p - start);
+      name = StringPiece(p + 1, end - (p + 1));
+      break;
     }
+    p++;
+  }
 
-    StringPiece package;
-    StringPiece name;
-    while (p != end) {
-        if (*p == ':') {
-            package = StringPiece(start, p - start);
-            name = StringPiece(p + 1, end - (p + 1));
-            break;
-        }
-        p++;
-    }
-
-    ref.name = ResourceName(package.toString(), ResourceType::kAttr,
-                        name.empty() ? trimmedStr.toString() : name.toString());
-    return Maybe<Reference>(std::move(ref));
+  ref.name =
+      ResourceName(package.toString(), ResourceType::kAttr,
+                   name.empty() ? trimmedStr.toString() : name.toString());
+  return Maybe<Reference>(std::move(ref));
 }
 
-std::unique_ptr<Reference> tryParseReference(const StringPiece& str, bool* outCreate) {
-    ResourceNameRef ref;
-    bool privateRef = false;
-    if (parseReference(str, &ref, outCreate, &privateRef)) {
-        std::unique_ptr<Reference> value = util::make_unique<Reference>(ref);
-        value->privateReference = privateRef;
-        return value;
-    }
+std::unique_ptr<Reference> tryParseReference(const StringPiece& str,
+                                             bool* outCreate) {
+  ResourceNameRef ref;
+  bool privateRef = false;
+  if (parseReference(str, &ref, outCreate, &privateRef)) {
+    std::unique_ptr<Reference> value = util::make_unique<Reference>(ref);
+    value->privateReference = privateRef;
+    return value;
+  }
 
-    if (parseAttributeReference(str, &ref)) {
-        if (outCreate) {
-            *outCreate = false;
-        }
-        return util::make_unique<Reference>(ref, Reference::Type::kAttribute);
+  if (parseAttributeReference(str, &ref)) {
+    if (outCreate) {
+      *outCreate = false;
     }
-    return {};
+    return util::make_unique<Reference>(ref, Reference::Type::kAttribute);
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseNullOrEmpty(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    android::Res_value value = { };
-    if (trimmedStr == "@null") {
-        // TYPE_NULL with data set to 0 is interpreted by the runtime as an error.
-        // Instead we set the data type to TYPE_REFERENCE with a value of 0.
-        value.dataType = android::Res_value::TYPE_REFERENCE;
-    } else if (trimmedStr == "@empty") {
-        // TYPE_NULL with value of DATA_NULL_EMPTY is handled fine by the runtime.
-        value.dataType = android::Res_value::TYPE_NULL;
-        value.data = android::Res_value::DATA_NULL_EMPTY;
-    } else {
-        return {};
-    }
-    return util::make_unique<BinaryPrimitive>(value);
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  android::Res_value value = {};
+  if (trimmedStr == "@null") {
+    // TYPE_NULL with data set to 0 is interpreted by the runtime as an error.
+    // Instead we set the data type to TYPE_REFERENCE with a value of 0.
+    value.dataType = android::Res_value::TYPE_REFERENCE;
+  } else if (trimmedStr == "@empty") {
+    // TYPE_NULL with value of DATA_NULL_EMPTY is handled fine by the runtime.
+    value.dataType = android::Res_value::TYPE_NULL;
+    value.data = android::Res_value::DATA_NULL_EMPTY;
+  } else {
+    return {};
+  }
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseEnumSymbol(const Attribute* enumAttr,
                                                     const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    for (const Attribute::Symbol& symbol : enumAttr->symbols) {
-        // Enum symbols are stored as @package:id/symbol resources,
-        // so we need to match against the 'entry' part of the identifier.
-        const ResourceName& enumSymbolResourceName = symbol.symbol.name.value();
-        if (trimmedStr == enumSymbolResourceName.entry) {
-            android::Res_value value = { };
-            value.dataType = android::Res_value::TYPE_INT_DEC;
-            value.data = symbol.value;
-            return util::make_unique<BinaryPrimitive>(value);
-        }
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  for (const Attribute::Symbol& symbol : enumAttr->symbols) {
+    // Enum symbols are stored as @package:id/symbol resources,
+    // so we need to match against the 'entry' part of the identifier.
+    const ResourceName& enumSymbolResourceName = symbol.symbol.name.value();
+    if (trimmedStr == enumSymbolResourceName.entry) {
+      android::Res_value value = {};
+      value.dataType = android::Res_value::TYPE_INT_DEC;
+      value.data = symbol.value;
+      return util::make_unique<BinaryPrimitive>(value);
     }
-    return {};
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseFlagSymbol(const Attribute* flagAttr,
                                                     const StringPiece& str) {
-    android::Res_value flags = { };
-    flags.dataType = android::Res_value::TYPE_INT_HEX;
-    flags.data = 0u;
+  android::Res_value flags = {};
+  flags.dataType = android::Res_value::TYPE_INT_HEX;
+  flags.data = 0u;
 
-    if (util::trimWhitespace(str).empty()) {
-        // Empty string is a valid flag (0).
-        return util::make_unique<BinaryPrimitive>(flags);
-    }
-
-    for (StringPiece part : util::tokenize(str, '|')) {
-        StringPiece trimmedPart = util::trimWhitespace(part);
-
-        bool flagSet = false;
-        for (const Attribute::Symbol& symbol : flagAttr->symbols) {
-            // Flag symbols are stored as @package:id/symbol resources,
-            // so we need to match against the 'entry' part of the identifier.
-            const ResourceName& flagSymbolResourceName = symbol.symbol.name.value();
-            if (trimmedPart == flagSymbolResourceName.entry) {
-                flags.data |= symbol.value;
-                flagSet = true;
-                break;
-            }
-        }
-
-        if (!flagSet) {
-            return {};
-        }
-    }
+  if (util::trimWhitespace(str).empty()) {
+    // Empty string is a valid flag (0).
     return util::make_unique<BinaryPrimitive>(flags);
+  }
+
+  for (StringPiece part : util::tokenize(str, '|')) {
+    StringPiece trimmedPart = util::trimWhitespace(part);
+
+    bool flagSet = false;
+    for (const Attribute::Symbol& symbol : flagAttr->symbols) {
+      // Flag symbols are stored as @package:id/symbol resources,
+      // so we need to match against the 'entry' part of the identifier.
+      const ResourceName& flagSymbolResourceName = symbol.symbol.name.value();
+      if (trimmedPart == flagSymbolResourceName.entry) {
+        flags.data |= symbol.value;
+        flagSet = true;
+        break;
+      }
+    }
+
+    if (!flagSet) {
+      return {};
+    }
+  }
+  return util::make_unique<BinaryPrimitive>(flags);
 }
 
 static uint32_t parseHex(char c, bool* outError) {
-    if (c >= '0' && c <= '9') {
-        return c - '0';
-    } else if (c >= 'a' && c <= 'f') {
-        return c - 'a' + 0xa;
-    } else if (c >= 'A' && c <= 'F') {
-        return c - 'A' + 0xa;
-    } else {
-        *outError = true;
-        return 0xffffffffu;
-    }
+  if (c >= '0' && c <= '9') {
+    return c - '0';
+  } else if (c >= 'a' && c <= 'f') {
+    return c - 'a' + 0xa;
+  } else if (c >= 'A' && c <= 'F') {
+    return c - 'A' + 0xa;
+  } else {
+    *outError = true;
+    return 0xffffffffu;
+  }
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseColor(const StringPiece& str) {
-    StringPiece colorStr(util::trimWhitespace(str));
-    const char* start = colorStr.data();
-    const size_t len = colorStr.size();
-    if (len == 0 || start[0] != '#') {
-        return {};
-    }
+  StringPiece colorStr(util::trimWhitespace(str));
+  const char* start = colorStr.data();
+  const size_t len = colorStr.size();
+  if (len == 0 || start[0] != '#') {
+    return {};
+  }
 
-    android::Res_value value = { };
-    bool error = false;
-    if (len == 4) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_RGB4;
-        value.data = 0xff000000u;
-        value.data |= parseHex(start[1], &error) << 20;
-        value.data |= parseHex(start[1], &error) << 16;
-        value.data |= parseHex(start[2], &error) << 12;
-        value.data |= parseHex(start[2], &error) << 8;
-        value.data |= parseHex(start[3], &error) << 4;
-        value.data |= parseHex(start[3], &error);
-    } else if (len == 5) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB4;
-        value.data |= parseHex(start[1], &error) << 28;
-        value.data |= parseHex(start[1], &error) << 24;
-        value.data |= parseHex(start[2], &error) << 20;
-        value.data |= parseHex(start[2], &error) << 16;
-        value.data |= parseHex(start[3], &error) << 12;
-        value.data |= parseHex(start[3], &error) << 8;
-        value.data |= parseHex(start[4], &error) << 4;
-        value.data |= parseHex(start[4], &error);
-    } else if (len == 7) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_RGB8;
-        value.data = 0xff000000u;
-        value.data |= parseHex(start[1], &error) << 20;
-        value.data |= parseHex(start[2], &error) << 16;
-        value.data |= parseHex(start[3], &error) << 12;
-        value.data |= parseHex(start[4], &error) << 8;
-        value.data |= parseHex(start[5], &error) << 4;
-        value.data |= parseHex(start[6], &error);
-    } else if (len == 9) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB8;
-        value.data |= parseHex(start[1], &error) << 28;
-        value.data |= parseHex(start[2], &error) << 24;
-        value.data |= parseHex(start[3], &error) << 20;
-        value.data |= parseHex(start[4], &error) << 16;
-        value.data |= parseHex(start[5], &error) << 12;
-        value.data |= parseHex(start[6], &error) << 8;
-        value.data |= parseHex(start[7], &error) << 4;
-        value.data |= parseHex(start[8], &error);
-    } else {
-        return {};
-    }
-    return error ? std::unique_ptr<BinaryPrimitive>() : util::make_unique<BinaryPrimitive>(value);
+  android::Res_value value = {};
+  bool error = false;
+  if (len == 4) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_RGB4;
+    value.data = 0xff000000u;
+    value.data |= parseHex(start[1], &error) << 20;
+    value.data |= parseHex(start[1], &error) << 16;
+    value.data |= parseHex(start[2], &error) << 12;
+    value.data |= parseHex(start[2], &error) << 8;
+    value.data |= parseHex(start[3], &error) << 4;
+    value.data |= parseHex(start[3], &error);
+  } else if (len == 5) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB4;
+    value.data |= parseHex(start[1], &error) << 28;
+    value.data |= parseHex(start[1], &error) << 24;
+    value.data |= parseHex(start[2], &error) << 20;
+    value.data |= parseHex(start[2], &error) << 16;
+    value.data |= parseHex(start[3], &error) << 12;
+    value.data |= parseHex(start[3], &error) << 8;
+    value.data |= parseHex(start[4], &error) << 4;
+    value.data |= parseHex(start[4], &error);
+  } else if (len == 7) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_RGB8;
+    value.data = 0xff000000u;
+    value.data |= parseHex(start[1], &error) << 20;
+    value.data |= parseHex(start[2], &error) << 16;
+    value.data |= parseHex(start[3], &error) << 12;
+    value.data |= parseHex(start[4], &error) << 8;
+    value.data |= parseHex(start[5], &error) << 4;
+    value.data |= parseHex(start[6], &error);
+  } else if (len == 9) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB8;
+    value.data |= parseHex(start[1], &error) << 28;
+    value.data |= parseHex(start[2], &error) << 24;
+    value.data |= parseHex(start[3], &error) << 20;
+    value.data |= parseHex(start[4], &error) << 16;
+    value.data |= parseHex(start[5], &error) << 12;
+    value.data |= parseHex(start[6], &error) << 8;
+    value.data |= parseHex(start[7], &error) << 4;
+    value.data |= parseHex(start[8], &error);
+  } else {
+    return {};
+  }
+  return error ? std::unique_ptr<BinaryPrimitive>()
+               : util::make_unique<BinaryPrimitive>(value);
 }
 
 Maybe<bool> parseBool(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    if (trimmedStr == "true" || trimmedStr == "TRUE" || trimmedStr == "True") {
-        return Maybe<bool>(true);
-    } else if (trimmedStr == "false" || trimmedStr == "FALSE" || trimmedStr == "False") {
-        return Maybe<bool>(false);
-    }
-    return {};
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  if (trimmedStr == "true" || trimmedStr == "TRUE" || trimmedStr == "True") {
+    return Maybe<bool>(true);
+  } else if (trimmedStr == "false" || trimmedStr == "FALSE" ||
+             trimmedStr == "False") {
+    return Maybe<bool>(false);
+  }
+  return {};
 }
 
 Maybe<uint32_t> parseInt(const StringPiece& str) {
-    std::u16string str16 = util::utf8ToUtf16(str);
-    android::Res_value value;
-    if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        return value.data;
-    }
-    return {};
+  std::u16string str16 = util::utf8ToUtf16(str);
+  android::Res_value value;
+  if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    return value.data;
+  }
+  return {};
 }
 
 Maybe<ResourceId> parseResourceId(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
+  StringPiece trimmedStr(util::trimWhitespace(str));
 
-    std::u16string str16 = util::utf8ToUtf16(trimmedStr);
-    android::Res_value value;
-    if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        if (value.dataType == android::Res_value::TYPE_INT_HEX) {
-            ResourceId id(value.data);
-            if (id.isValid()) {
-                return id;
-            }
-        }
+  std::u16string str16 = util::utf8ToUtf16(trimmedStr);
+  android::Res_value value;
+  if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    if (value.dataType == android::Res_value::TYPE_INT_HEX) {
+      ResourceId id(value.data);
+      if (id.isValid()) {
+        return id;
+      }
     }
-    return {};
+  }
+  return {};
 }
 
 Maybe<int> parseSdkVersion(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
+  StringPiece trimmedStr(util::trimWhitespace(str));
 
-    std::u16string str16 = util::utf8ToUtf16(trimmedStr);
-    android::Res_value value;
-    if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        return static_cast<int>(value.data);
-    }
+  std::u16string str16 = util::utf8ToUtf16(trimmedStr);
+  android::Res_value value;
+  if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    return static_cast<int>(value.data);
+  }
 
-    // Try parsing the code name.
-    std::pair<StringPiece, int> entry = getDevelopmentSdkCodeNameAndVersion();
-    if (entry.first == trimmedStr) {
-        return entry.second;
-    }
-    return {};
+  // Try parsing the code name.
+  std::pair<StringPiece, int> entry = getDevelopmentSdkCodeNameAndVersion();
+  if (entry.first == trimmedStr) {
+    return entry.second;
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseBool(const StringPiece& str) {
-    if (Maybe<bool> maybeResult = parseBool(str)) {
-        android::Res_value value = {};
-        value.dataType = android::Res_value::TYPE_INT_BOOLEAN;
+  if (Maybe<bool> maybeResult = parseBool(str)) {
+    android::Res_value value = {};
+    value.dataType = android::Res_value::TYPE_INT_BOOLEAN;
 
-        if (maybeResult.value()) {
-            value.data = 0xffffffffu;
-        } else {
-            value.data = 0;
-        }
-        return util::make_unique<BinaryPrimitive>(value);
+    if (maybeResult.value()) {
+      value.data = 0xffffffffu;
+    } else {
+      value.data = 0;
     }
-    return {};
+    return util::make_unique<BinaryPrimitive>(value);
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseInt(const StringPiece& str) {
-    std::u16string str16 = util::utf8ToUtf16(str);
-    android::Res_value value;
-    if (!android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        return {};
-    }
-    return util::make_unique<BinaryPrimitive>(value);
+  std::u16string str16 = util::utf8ToUtf16(str);
+  android::Res_value value;
+  if (!android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    return {};
+  }
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseFloat(const StringPiece& str) {
-    std::u16string str16 = util::utf8ToUtf16(str);
-    android::Res_value value;
-    if (!android::ResTable::stringToFloat(str16.data(), str16.size(), &value)) {
-        return {};
-    }
-    return util::make_unique<BinaryPrimitive>(value);
+  std::u16string str16 = util::utf8ToUtf16(str);
+  android::Res_value value;
+  if (!android::ResTable::stringToFloat(str16.data(), str16.size(), &value)) {
+    return {};
+  }
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 uint32_t androidTypeToAttributeTypeMask(uint16_t type) {
-    switch (type) {
+  switch (type) {
     case android::Res_value::TYPE_NULL:
     case android::Res_value::TYPE_REFERENCE:
     case android::Res_value::TYPE_ATTRIBUTE:
     case android::Res_value::TYPE_DYNAMIC_REFERENCE:
-        return android::ResTable_map::TYPE_REFERENCE;
+      return android::ResTable_map::TYPE_REFERENCE;
 
     case android::Res_value::TYPE_STRING:
-        return android::ResTable_map::TYPE_STRING;
+      return android::ResTable_map::TYPE_STRING;
 
     case android::Res_value::TYPE_FLOAT:
-        return android::ResTable_map::TYPE_FLOAT;
+      return android::ResTable_map::TYPE_FLOAT;
 
     case android::Res_value::TYPE_DIMENSION:
-        return android::ResTable_map::TYPE_DIMENSION;
+      return android::ResTable_map::TYPE_DIMENSION;
 
     case android::Res_value::TYPE_FRACTION:
-        return android::ResTable_map::TYPE_FRACTION;
+      return android::ResTable_map::TYPE_FRACTION;
 
     case android::Res_value::TYPE_INT_DEC:
     case android::Res_value::TYPE_INT_HEX:
-        return android::ResTable_map::TYPE_INTEGER | android::ResTable_map::TYPE_ENUM
-                | android::ResTable_map::TYPE_FLAGS;
+      return android::ResTable_map::TYPE_INTEGER |
+             android::ResTable_map::TYPE_ENUM |
+             android::ResTable_map::TYPE_FLAGS;
 
     case android::Res_value::TYPE_INT_BOOLEAN:
-        return android::ResTable_map::TYPE_BOOLEAN;
+      return android::ResTable_map::TYPE_BOOLEAN;
 
     case android::Res_value::TYPE_INT_COLOR_ARGB8:
     case android::Res_value::TYPE_INT_COLOR_RGB8:
     case android::Res_value::TYPE_INT_COLOR_ARGB4:
     case android::Res_value::TYPE_INT_COLOR_RGB4:
-        return android::ResTable_map::TYPE_COLOR;
+      return android::ResTable_map::TYPE_COLOR;
 
     default:
-        return 0;
-    };
+      return 0;
+  };
 }
 
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& value,
-        uint32_t typeMask,
-        const std::function<void(const ResourceName&)>& onCreateReference) {
-    std::unique_ptr<BinaryPrimitive> nullOrEmpty = tryParseNullOrEmpty(value);
-    if (nullOrEmpty) {
-        return std::move(nullOrEmpty);
-    }
+    const StringPiece& value, uint32_t typeMask,
+    const std::function<void(const ResourceName&)>& onCreateReference) {
+  std::unique_ptr<BinaryPrimitive> nullOrEmpty = tryParseNullOrEmpty(value);
+  if (nullOrEmpty) {
+    return std::move(nullOrEmpty);
+  }
 
-    bool create = false;
-    std::unique_ptr<Reference> reference = tryParseReference(value, &create);
-    if (reference) {
-        if (create && onCreateReference) {
-            onCreateReference(reference->name.value());
-        }
-        return std::move(reference);
+  bool create = false;
+  std::unique_ptr<Reference> reference = tryParseReference(value, &create);
+  if (reference) {
+    if (create && onCreateReference) {
+      onCreateReference(reference->name.value());
     }
+    return std::move(reference);
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_COLOR) {
-        // Try parsing this as a color.
-        std::unique_ptr<BinaryPrimitive> color = tryParseColor(value);
-        if (color) {
-            return std::move(color);
-        }
+  if (typeMask & android::ResTable_map::TYPE_COLOR) {
+    // Try parsing this as a color.
+    std::unique_ptr<BinaryPrimitive> color = tryParseColor(value);
+    if (color) {
+      return std::move(color);
     }
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_BOOLEAN) {
-        // Try parsing this as a boolean.
-        std::unique_ptr<BinaryPrimitive> boolean = tryParseBool(value);
-        if (boolean) {
-            return std::move(boolean);
-        }
+  if (typeMask & android::ResTable_map::TYPE_BOOLEAN) {
+    // Try parsing this as a boolean.
+    std::unique_ptr<BinaryPrimitive> boolean = tryParseBool(value);
+    if (boolean) {
+      return std::move(boolean);
     }
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_INTEGER) {
-        // Try parsing this as an integer.
-        std::unique_ptr<BinaryPrimitive> integer = tryParseInt(value);
-        if (integer) {
-            return std::move(integer);
-        }
+  if (typeMask & android::ResTable_map::TYPE_INTEGER) {
+    // Try parsing this as an integer.
+    std::unique_ptr<BinaryPrimitive> integer = tryParseInt(value);
+    if (integer) {
+      return std::move(integer);
     }
+  }
 
-    const uint32_t floatMask = android::ResTable_map::TYPE_FLOAT
-            | android::ResTable_map::TYPE_DIMENSION | android::ResTable_map::TYPE_FRACTION;
-    if (typeMask & floatMask) {
-        // Try parsing this as a float.
-        std::unique_ptr<BinaryPrimitive> floatingPoint = tryParseFloat(value);
-        if (floatingPoint) {
-            if (typeMask & androidTypeToAttributeTypeMask(floatingPoint->value.dataType)) {
-                return std::move(floatingPoint);
-            }
-        }
+  const uint32_t floatMask = android::ResTable_map::TYPE_FLOAT |
+                             android::ResTable_map::TYPE_DIMENSION |
+                             android::ResTable_map::TYPE_FRACTION;
+  if (typeMask & floatMask) {
+    // Try parsing this as a float.
+    std::unique_ptr<BinaryPrimitive> floatingPoint = tryParseFloat(value);
+    if (floatingPoint) {
+      if (typeMask &
+          androidTypeToAttributeTypeMask(floatingPoint->value.dataType)) {
+        return std::move(floatingPoint);
+      }
     }
-    return {};
+  }
+  return {};
 }
 
 /**
@@ -634,48 +649,50 @@
  * allows.
  */
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& str, const Attribute* attr,
-        const std::function<void(const ResourceName&)>& onCreateReference) {
-    const uint32_t typeMask = attr->typeMask;
-    std::unique_ptr<Item> value = tryParseItemForAttribute(str, typeMask, onCreateReference);
-    if (value) {
-        return value;
-    }
+    const StringPiece& str, const Attribute* attr,
+    const std::function<void(const ResourceName&)>& onCreateReference) {
+  const uint32_t typeMask = attr->typeMask;
+  std::unique_ptr<Item> value =
+      tryParseItemForAttribute(str, typeMask, onCreateReference);
+  if (value) {
+    return value;
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_ENUM) {
-        // Try parsing this as an enum.
-        std::unique_ptr<BinaryPrimitive> enumValue = tryParseEnumSymbol(attr, str);
-        if (enumValue) {
-            return std::move(enumValue);
-        }
+  if (typeMask & android::ResTable_map::TYPE_ENUM) {
+    // Try parsing this as an enum.
+    std::unique_ptr<BinaryPrimitive> enumValue = tryParseEnumSymbol(attr, str);
+    if (enumValue) {
+      return std::move(enumValue);
     }
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_FLAGS) {
-        // Try parsing this as a flag.
-        std::unique_ptr<BinaryPrimitive> flagValue = tryParseFlagSymbol(attr, str);
-        if (flagValue) {
-            return std::move(flagValue);
-        }
+  if (typeMask & android::ResTable_map::TYPE_FLAGS) {
+    // Try parsing this as a flag.
+    std::unique_ptr<BinaryPrimitive> flagValue = tryParseFlagSymbol(attr, str);
+    if (flagValue) {
+      return std::move(flagValue);
     }
-    return {};
+  }
+  return {};
 }
 
-std::string buildResourceFileName(const ResourceFile& resFile, const NameMangler* mangler) {
-    std::stringstream out;
-    out << "res/" << resFile.name.type;
-    if (resFile.config != ConfigDescription{}) {
-        out << "-" << resFile.config;
-    }
-    out << "/";
+std::string buildResourceFileName(const ResourceFile& resFile,
+                                  const NameMangler* mangler) {
+  std::stringstream out;
+  out << "res/" << resFile.name.type;
+  if (resFile.config != ConfigDescription{}) {
+    out << "-" << resFile.config;
+  }
+  out << "/";
 
-    if (mangler && mangler->shouldMangle(resFile.name.package)) {
-        out << NameMangler::mangleEntry(resFile.name.package, resFile.name.entry);
-    } else {
-        out << resFile.name.entry;
-    }
-    out << file::getExtension(resFile.source.path);
-    return out.str();
+  if (mangler && mangler->shouldMangle(resFile.name.package)) {
+    out << NameMangler::mangleEntry(resFile.name.package, resFile.name.entry);
+  } else {
+    out << resFile.name.entry;
+  }
+  out << file::getExtension(resFile.source.path);
+  return out.str();
 }
 
-} // namespace ResourceUtils
-} // namespace aapt
+}  // namespace ResourceUtils
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceUtils.h b/tools/aapt2/ResourceUtils.h
index 555203b..cebe47c 100644
--- a/tools/aapt2/ResourceUtils.h
+++ b/tools/aapt2/ResourceUtils.h
@@ -41,15 +41,18 @@
                          StringPiece* outType, StringPiece* outEntry);
 
 /**
- * Returns true if the string was parsed as a resource name ([*][package:]type/name), with
- * `outResource` set to the parsed resource name and `outPrivate` set to true if a '*' prefix
+ * Returns true if the string was parsed as a resource name
+ * ([*][package:]type/name), with
+ * `outResource` set to the parsed resource name and `outPrivate` set to true if
+ * a '*' prefix
  * was present.
  */
 bool parseResourceName(const StringPiece& str, ResourceNameRef* outResource,
                        bool* outPrivate = nullptr);
 
 /*
- * Returns true if the string was parsed as a reference (@[+][package:]type/name), with
+ * Returns true if the string was parsed as a reference
+ * (@[+][package:]type/name), with
  * `outReference` set to the parsed reference.
  *
  * If '+' was present in the reference, `outCreate` is set to true.
@@ -59,28 +62,34 @@
                     bool* outCreate = nullptr, bool* outPrivate = nullptr);
 
 /*
- * Returns true if the string is in the form of a resource reference (@[+][package:]type/name).
+ * Returns true if the string is in the form of a resource reference
+ * (@[+][package:]type/name).
  */
 bool isReference(const StringPiece& str);
 
 /*
- * Returns true if the string was parsed as an attribute reference (?[package:][type/]name),
+ * Returns true if the string was parsed as an attribute reference
+ * (?[package:][type/]name),
  * with `outReference` set to the parsed reference.
  */
-bool parseAttributeReference(const StringPiece& str, ResourceNameRef* outReference);
+bool parseAttributeReference(const StringPiece& str,
+                             ResourceNameRef* outReference);
 
 /**
- * Returns true if the string is in the form of an attribute reference(?[package:][type/]name).
+ * Returns true if the string is in the form of an attribute
+ * reference(?[package:][type/]name).
  */
 bool isAttributeReference(const StringPiece& str);
 
 /**
  * Convert an android::ResTable::resource_name to an aapt::ResourceName struct.
  */
-Maybe<ResourceName> toResourceName(const android::ResTable::resource_name& name);
+Maybe<ResourceName> toResourceName(
+    const android::ResTable::resource_name& name);
 
 /**
- * Returns a boolean value if the string is equal to TRUE, true, True, FALSE, false, or False.
+ * Returns a boolean value if the string is equal to TRUE, true, True, FALSE,
+ * false, or False.
  */
 Maybe<bool> parseBool(const StringPiece& str);
 
@@ -100,18 +109,22 @@
 Maybe<int> parseSdkVersion(const StringPiece& str);
 
 /*
- * Returns a Reference, or None Maybe instance if the string `str` was parsed as a
+ * Returns a Reference, or None Maybe instance if the string `str` was parsed as
+ * a
  * valid reference to a style.
- * The format for a style parent is slightly more flexible than a normal reference:
+ * The format for a style parent is slightly more flexible than a normal
+ * reference:
  *
  * @[package:]style/<entry> or
  * ?[package:]style/<entry> or
  * <package>:[style/]<entry>
  */
-Maybe<Reference> parseStyleParentReference(const StringPiece& str, std::string* outError);
+Maybe<Reference> parseStyleParentReference(const StringPiece& str,
+                                           std::string* outError);
 
 /*
- * Returns a Reference if the string `str` was parsed as a valid XML attribute name.
+ * Returns a Reference if the string `str` was parsed as a valid XML attribute
+ * name.
  * The valid format for an XML attribute name is:
  *
  * package:entry
@@ -119,14 +132,18 @@
 Maybe<Reference> parseXmlAttributeName(const StringPiece& str);
 
 /*
- * Returns a Reference object if the string was parsed as a resource or attribute reference,
- * ( @[+][package:]type/name | ?[package:]type/name ) setting outCreate to true if
+ * Returns a Reference object if the string was parsed as a resource or
+ * attribute reference,
+ * ( @[+][package:]type/name | ?[package:]type/name ) setting outCreate to true
+ * if
  * the '+' was present in the string.
  */
-std::unique_ptr<Reference> tryParseReference(const StringPiece& str, bool* outCreate = nullptr);
+std::unique_ptr<Reference> tryParseReference(const StringPiece& str,
+                                             bool* outCreate = nullptr);
 
 /*
- * Returns a BinaryPrimitve object representing @null or @empty if the string was parsed
+ * Returns a BinaryPrimitve object representing @null or @empty if the string
+ * was parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseNullOrEmpty(const StringPiece& str);
@@ -138,13 +155,15 @@
 std::unique_ptr<BinaryPrimitive> tryParseColor(const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing a boolean if the string was parsed
+ * Returns a BinaryPrimitve object representing a boolean if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseBool(const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing an integer if the string was parsed
+ * Returns a BinaryPrimitve object representing an integer if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseInt(const StringPiece& str);
@@ -156,45 +175,51 @@
 std::unique_ptr<BinaryPrimitive> tryParseFloat(const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing an enum symbol if the string was parsed
+ * Returns a BinaryPrimitve object representing an enum symbol if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseEnumSymbol(const Attribute* enumAttr,
                                                     const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing a flag symbol if the string was parsed
+ * Returns a BinaryPrimitve object representing a flag symbol if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseFlagSymbol(const Attribute* enumAttr,
                                                     const StringPiece& str);
 /*
- * Try to convert a string to an Item for the given attribute. The attribute will
+ * Try to convert a string to an Item for the given attribute. The attribute
+ * will
  * restrict what values the string can be converted to.
  * The callback function onCreateReference is called when the parsed item is a
  * reference to an ID that must be created (@+id/foo).
  */
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& value, const Attribute* attr,
-        const std::function<void(const ResourceName&)>& onCreateReference = {});
+    const StringPiece& value, const Attribute* attr,
+    const std::function<void(const ResourceName&)>& onCreateReference = {});
 
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& value, uint32_t typeMask,
-        const std::function<void(const ResourceName&)>& onCreateReference = {});
+    const StringPiece& value, uint32_t typeMask,
+    const std::function<void(const ResourceName&)>& onCreateReference = {});
 
 uint32_t androidTypeToAttributeTypeMask(uint16_t type);
 
 /**
- * Returns a string path suitable for use within an APK. The path will look like:
+ * Returns a string path suitable for use within an APK. The path will look
+ * like:
  *
  * res/type[-config]/<name>.<ext>
  *
- * Then name may be mangled if a NameMangler is supplied (can be nullptr) and the package
+ * Then name may be mangled if a NameMangler is supplied (can be nullptr) and
+ * the package
  * requires mangling.
  */
-std::string buildResourceFileName(const ResourceFile& resFile, const NameMangler* mangler);
+std::string buildResourceFileName(const ResourceFile& resFile,
+                                  const NameMangler* mangler);
 
-} // namespace ResourceUtils
-} // namespace aapt
+}  // namespace ResourceUtils
+}  // namespace aapt
 
 #endif /* AAPT_RESOURCEUTILS_H */
diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp
index 894cfcf..eb62b1b 100644
--- a/tools/aapt2/ResourceUtils_test.cpp
+++ b/tools/aapt2/ResourceUtils_test.cpp
@@ -14,179 +14,188 @@
  * limitations under the License.
  */
 
-#include "Resource.h"
 #include "ResourceUtils.h"
+#include "Resource.h"
 #include "test/Test.h"
 
 namespace aapt {
 
 TEST(ResourceUtilsTest, ParseBool) {
-    EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("true"));
-    EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("TRUE"));
-    EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("True"));
-    EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("false"));
-    EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("FALSE"));
-    EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("False"));
+  EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("true"));
+  EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("TRUE"));
+  EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("True"));
+  EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("false"));
+  EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("FALSE"));
+  EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("False"));
 }
 
 TEST(ResourceUtilsTest, ParseResourceName) {
-    ResourceNameRef actual;
-    bool actualPriv = false;
-    EXPECT_TRUE(ResourceUtils::parseResourceName("android:color/foo", &actual, &actualPriv));
-    EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
-    EXPECT_FALSE(actualPriv);
+  ResourceNameRef actual;
+  bool actualPriv = false;
+  EXPECT_TRUE(ResourceUtils::parseResourceName("android:color/foo", &actual,
+                                               &actualPriv));
+  EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
+  EXPECT_FALSE(actualPriv);
 
-    EXPECT_TRUE(ResourceUtils::parseResourceName("color/foo", &actual, &actualPriv));
-    EXPECT_EQ(ResourceNameRef({}, ResourceType::kColor, "foo"), actual);
-    EXPECT_FALSE(actualPriv);
+  EXPECT_TRUE(
+      ResourceUtils::parseResourceName("color/foo", &actual, &actualPriv));
+  EXPECT_EQ(ResourceNameRef({}, ResourceType::kColor, "foo"), actual);
+  EXPECT_FALSE(actualPriv);
 
-    EXPECT_TRUE(ResourceUtils::parseResourceName("*android:color/foo", &actual, &actualPriv));
-    EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
-    EXPECT_TRUE(actualPriv);
+  EXPECT_TRUE(ResourceUtils::parseResourceName("*android:color/foo", &actual,
+                                               &actualPriv));
+  EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
+  EXPECT_TRUE(actualPriv);
 
-    EXPECT_FALSE(ResourceUtils::parseResourceName(StringPiece(), &actual, &actualPriv));
+  EXPECT_FALSE(
+      ResourceUtils::parseResourceName(StringPiece(), &actual, &actualPriv));
 }
 
 TEST(ResourceUtilsTest, ParseReferenceWithNoPackage) {
-    ResourceNameRef expected({}, ResourceType::kColor, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@color/foo", &actual, &create, &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected({}, ResourceType::kColor, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@color/foo", &actual, &create,
+                                            &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParseReferenceWithPackage) {
-    ResourceNameRef expected("android", ResourceType::kColor, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@android:color/foo", &actual, &create,
-                                                 &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kColor, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@android:color/foo", &actual,
+                                            &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParseReferenceWithSurroundingWhitespace) {
-    ResourceNameRef expected("android", ResourceType::kColor, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("\t @android:color/foo\n \n\t", &actual,
-                                                 &create, &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kColor, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("\t @android:color/foo\n \n\t",
+                                            &actual, &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParseAutoCreateIdReference) {
-    ResourceNameRef expected("android", ResourceType::kId, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@+android:id/foo", &actual, &create,
-                                                 &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_TRUE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kId, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@+android:id/foo", &actual,
+                                            &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_TRUE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParsePrivateReference) {
-    ResourceNameRef expected("android", ResourceType::kId, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@*android:id/foo", &actual, &create,
-                                                 &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_TRUE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kId, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@*android:id/foo", &actual,
+                                            &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_TRUE(privateRef);
 }
 
 TEST(ResourceUtilsTest, FailToParseAutoCreateNonIdReference) {
-    bool create = false;
-    bool privateRef = false;
-    ResourceNameRef actual;
-    EXPECT_FALSE(ResourceUtils::parseReference("@+android:color/foo", &actual, &create,
-                                                  &privateRef));
+  bool create = false;
+  bool privateRef = false;
+  ResourceNameRef actual;
+  EXPECT_FALSE(ResourceUtils::parseReference("@+android:color/foo", &actual,
+                                             &create, &privateRef));
 }
 
 TEST(ResourceUtilsTest, ParseAttributeReferences) {
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?android"));
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:foo"));
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?attr/foo"));
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:attr/foo"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?android"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:foo"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?attr/foo"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:attr/foo"));
 }
 
 TEST(ResourceUtilsTest, FailParseIncompleteReference) {
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?style/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:style/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:attr/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?attr/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?style/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:style/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:attr/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?attr/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?/foo"));
 }
 
 TEST(ResourceUtilsTest, ParseStyleParentReference) {
-    const ResourceName kAndroidStyleFooName("android", ResourceType::kStyle, "foo");
-    const ResourceName kStyleFooName({}, ResourceType::kStyle, "foo");
+  const ResourceName kAndroidStyleFooName("android", ResourceType::kStyle,
+                                          "foo");
+  const ResourceName kStyleFooName({}, ResourceType::kStyle, "foo");
 
-    std::string errStr;
-    Maybe<Reference> ref = ResourceUtils::parseStyleParentReference("@android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  std::string errStr;
+  Maybe<Reference> ref =
+      ResourceUtils::parseStyleParentReference("@android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("@style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("@style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("?android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("?android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("?style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("?style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("android:foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("android:foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("@android:foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("@android:foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("*android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
-    EXPECT_TRUE(ref.value().privateReference);
+  ref = ResourceUtils::parseStyleParentReference("*android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  EXPECT_TRUE(ref.value().privateReference);
 }
 
 TEST(ResourceUtilsTest, ParseEmptyFlag) {
-    std::unique_ptr<Attribute> attr = test::AttributeBuilder(false)
-            .setTypeMask(android::ResTable_map::TYPE_FLAGS)
-            .addItem("one", 0x01)
-            .addItem("two", 0x02)
-            .build();
+  std::unique_ptr<Attribute> attr =
+      test::AttributeBuilder(false)
+          .setTypeMask(android::ResTable_map::TYPE_FLAGS)
+          .addItem("one", 0x01)
+          .addItem("two", 0x02)
+          .build();
 
-    std::unique_ptr<BinaryPrimitive> result = ResourceUtils::tryParseFlagSymbol(attr.get(), "");
-    ASSERT_NE(nullptr, result);
-    EXPECT_EQ(0u, result->value.data);
+  std::unique_ptr<BinaryPrimitive> result =
+      ResourceUtils::tryParseFlagSymbol(attr.get(), "");
+  ASSERT_NE(nullptr, result);
+  EXPECT_EQ(0u, result->value.data);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 492155d..60590b6 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
+#include "ResourceValues.h"
 #include "Resource.h"
 #include "ResourceUtils.h"
-#include "ResourceValues.h"
 #include "ValueVisitor.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <androidfw/ResourceTypes.h>
+#include <algorithm>
 #include <limits>
 #include <set>
 
@@ -29,742 +29,745 @@
 
 template <typename Derived>
 void BaseValue<Derived>::accept(RawValueVisitor* visitor) {
-    visitor->visit(static_cast<Derived*>(this));
+  visitor->visit(static_cast<Derived*>(this));
 }
 
 template <typename Derived>
 void BaseItem<Derived>::accept(RawValueVisitor* visitor) {
-    visitor->visit(static_cast<Derived*>(this));
+  visitor->visit(static_cast<Derived*>(this));
 }
 
-RawString::RawString(const StringPool::Ref& ref) : value(ref) {
-}
+RawString::RawString(const StringPool::Ref& ref) : value(ref) {}
 
 bool RawString::equals(const Value* value) const {
-    const RawString* other = valueCast<RawString>(value);
-    if (!other) {
-        return false;
-    }
-    return *this->value == *other->value;
+  const RawString* other = valueCast<RawString>(value);
+  if (!other) {
+    return false;
+  }
+  return *this->value == *other->value;
 }
 
 RawString* RawString::clone(StringPool* newPool) const {
-    RawString* rs = new RawString(newPool->makeRef(*value));
-    rs->mComment = mComment;
-    rs->mSource = mSource;
-    return rs;
+  RawString* rs = new RawString(newPool->makeRef(*value));
+  rs->mComment = mComment;
+  rs->mSource = mSource;
+  return rs;
 }
 
 bool RawString::flatten(android::Res_value* outValue) const {
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data =
+      util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
+  return true;
 }
 
 void RawString::print(std::ostream* out) const {
-    *out << "(raw string) " << *value;
+  *out << "(raw string) " << *value;
 }
 
-Reference::Reference() : referenceType(Type::kResource) {
-}
+Reference::Reference() : referenceType(Type::kResource) {}
 
-Reference::Reference(const ResourceNameRef& n, Type t) :
-        name(n.toResourceName()), referenceType(t) {
-}
+Reference::Reference(const ResourceNameRef& n, Type t)
+    : name(n.toResourceName()), referenceType(t) {}
 
-Reference::Reference(const ResourceId& i, Type type) : id(i), referenceType(type) {
-}
+Reference::Reference(const ResourceId& i, Type type)
+    : id(i), referenceType(type) {}
 
-Reference::Reference(const ResourceNameRef& n, const ResourceId& i) :
-        name(n.toResourceName()), id(i), referenceType(Type::kResource) {
-}
+Reference::Reference(const ResourceNameRef& n, const ResourceId& i)
+    : name(n.toResourceName()), id(i), referenceType(Type::kResource) {}
 
 bool Reference::equals(const Value* value) const {
-    const Reference* other = valueCast<Reference>(value);
-    if (!other) {
-        return false;
-    }
-    return referenceType == other->referenceType && privateReference == other->privateReference &&
-            id == other->id && name == other->name;
+  const Reference* other = valueCast<Reference>(value);
+  if (!other) {
+    return false;
+  }
+  return referenceType == other->referenceType &&
+         privateReference == other->privateReference && id == other->id &&
+         name == other->name;
 }
 
 bool Reference::flatten(android::Res_value* outValue) const {
-    outValue->dataType = (referenceType == Reference::Type::kResource) ?
-            android::Res_value::TYPE_REFERENCE : android::Res_value::TYPE_ATTRIBUTE;
-    outValue->data = util::hostToDevice32(id ? id.value().id : 0);
-    return true;
+  outValue->dataType = (referenceType == Reference::Type::kResource)
+                           ? android::Res_value::TYPE_REFERENCE
+                           : android::Res_value::TYPE_ATTRIBUTE;
+  outValue->data = util::hostToDevice32(id ? id.value().id : 0);
+  return true;
 }
 
 Reference* Reference::clone(StringPool* /*newPool*/) const {
-    return new Reference(*this);
+  return new Reference(*this);
 }
 
 void Reference::print(std::ostream* out) const {
-    *out << "(reference) ";
-    if (referenceType == Reference::Type::kResource) {
-        *out << "@";
-        if (privateReference) {
-            *out << "*";
-        }
-    } else {
-        *out << "?";
+  *out << "(reference) ";
+  if (referenceType == Reference::Type::kResource) {
+    *out << "@";
+    if (privateReference) {
+      *out << "*";
     }
+  } else {
+    *out << "?";
+  }
 
-    if (name) {
-        *out << name.value();
-    }
+  if (name) {
+    *out << name.value();
+  }
 
-    if (id && !Res_INTERNALID(id.value().id)) {
-        *out << " " << id.value();
-    }
+  if (id && !Res_INTERNALID(id.value().id)) {
+    *out << " " << id.value();
+  }
 }
 
 bool Id::equals(const Value* value) const {
-    return valueCast<Id>(value) != nullptr;
+  return valueCast<Id>(value) != nullptr;
 }
 
 bool Id::flatten(android::Res_value* out) const {
-    out->dataType = android::Res_value::TYPE_INT_BOOLEAN;
-    out->data = util::hostToDevice32(0);
-    return true;
+  out->dataType = android::Res_value::TYPE_INT_BOOLEAN;
+  out->data = util::hostToDevice32(0);
+  return true;
 }
 
-Id* Id::clone(StringPool* /*newPool*/) const {
-    return new Id(*this);
-}
+Id* Id::clone(StringPool* /*newPool*/) const { return new Id(*this); }
 
-void Id::print(std::ostream* out) const {
-    *out << "(id)";
-}
+void Id::print(std::ostream* out) const { *out << "(id)"; }
 
-String::String(const StringPool::Ref& ref) : value(ref) {
-}
+String::String(const StringPool::Ref& ref) : value(ref) {}
 
 bool String::equals(const Value* value) const {
-    const String* other = valueCast<String>(value);
-    if (!other) {
-        return false;
-    }
-    return *this->value == *other->value;
+  const String* other = valueCast<String>(value);
+  if (!other) {
+    return false;
+  }
+  return *this->value == *other->value;
 }
 
 bool String::flatten(android::Res_value* outValue) const {
-    // Verify that our StringPool index is within encode-able limits.
-    if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
-        return false;
-    }
+  // Verify that our StringPool index is within encode-able limits.
+  if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
 
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data =
+      util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
+  return true;
 }
 
 String* String::clone(StringPool* newPool) const {
-    String* str = new String(newPool->makeRef(*value));
-    str->mComment = mComment;
-    str->mSource = mSource;
-    return str;
+  String* str = new String(newPool->makeRef(*value));
+  str->mComment = mComment;
+  str->mSource = mSource;
+  return str;
 }
 
 void String::print(std::ostream* out) const {
-    *out << "(string) \"" << *value << "\"";
+  *out << "(string) \"" << *value << "\"";
 }
 
-StyledString::StyledString(const StringPool::StyleRef& ref) : value(ref) {
-}
+StyledString::StyledString(const StringPool::StyleRef& ref) : value(ref) {}
 
 bool StyledString::equals(const Value* value) const {
-    const StyledString* other = valueCast<StyledString>(value);
-    if (!other) {
-        return false;
-    }
-
-    if (*this->value->str == *other->value->str) {
-        const std::vector<StringPool::Span>& spansA = this->value->spans;
-        const std::vector<StringPool::Span>& spansB = other->value->spans;
-        return std::equal(spansA.begin(), spansA.end(), spansB.begin(),
-                          [](const StringPool::Span& a, const StringPool::Span& b) -> bool {
-            return *a.name == *b.name && a.firstChar == b.firstChar && a.lastChar == b.lastChar;
-        });
-    }
+  const StyledString* other = valueCast<StyledString>(value);
+  if (!other) {
     return false;
+  }
+
+  if (*this->value->str == *other->value->str) {
+    const std::vector<StringPool::Span>& spansA = this->value->spans;
+    const std::vector<StringPool::Span>& spansB = other->value->spans;
+    return std::equal(
+        spansA.begin(), spansA.end(), spansB.begin(),
+        [](const StringPool::Span& a, const StringPool::Span& b) -> bool {
+          return *a.name == *b.name && a.firstChar == b.firstChar &&
+                 a.lastChar == b.lastChar;
+        });
+  }
+  return false;
 }
 
 bool StyledString::flatten(android::Res_value* outValue) const {
-    if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
-        return false;
-    }
+  if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
 
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data =
+      util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
+  return true;
 }
 
 StyledString* StyledString::clone(StringPool* newPool) const {
-    StyledString* str = new StyledString(newPool->makeRef(value));
-    str->mComment = mComment;
-    str->mSource = mSource;
-    return str;
+  StyledString* str = new StyledString(newPool->makeRef(value));
+  str->mComment = mComment;
+  str->mSource = mSource;
+  return str;
 }
 
 void StyledString::print(std::ostream* out) const {
-    *out << "(styled string) \"" << *value->str << "\"";
-    for (const StringPool::Span& span : value->spans) {
-        *out << " "<< *span.name << ":" << span.firstChar << "," << span.lastChar;
-    }
+  *out << "(styled string) \"" << *value->str << "\"";
+  for (const StringPool::Span& span : value->spans) {
+    *out << " " << *span.name << ":" << span.firstChar << "," << span.lastChar;
+  }
 }
 
-FileReference::FileReference(const StringPool::Ref& _path) : path(_path) {
-}
+FileReference::FileReference(const StringPool::Ref& _path) : path(_path) {}
 
 bool FileReference::equals(const Value* value) const {
-    const FileReference* other = valueCast<FileReference>(value);
-    if (!other) {
-        return false;
-    }
-    return *path == *other->path;
+  const FileReference* other = valueCast<FileReference>(value);
+  if (!other) {
+    return false;
+  }
+  return *path == *other->path;
 }
 
 bool FileReference::flatten(android::Res_value* outValue) const {
-    if (path.getIndex() > std::numeric_limits<uint32_t>::max()) {
-        return false;
-    }
+  if (path.getIndex() > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
 
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(path.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data = util::hostToDevice32(static_cast<uint32_t>(path.getIndex()));
+  return true;
 }
 
 FileReference* FileReference::clone(StringPool* newPool) const {
-    FileReference* fr = new FileReference(newPool->makeRef(*path));
-    fr->file = file;
-    fr->mComment = mComment;
-    fr->mSource = mSource;
-    return fr;
+  FileReference* fr = new FileReference(newPool->makeRef(*path));
+  fr->file = file;
+  fr->mComment = mComment;
+  fr->mSource = mSource;
+  return fr;
 }
 
 void FileReference::print(std::ostream* out) const {
-    *out << "(file) " << *path;
+  *out << "(file) " << *path;
 }
 
-BinaryPrimitive::BinaryPrimitive(const android::Res_value& val) : value(val) {
-}
+BinaryPrimitive::BinaryPrimitive(const android::Res_value& val) : value(val) {}
 
 BinaryPrimitive::BinaryPrimitive(uint8_t dataType, uint32_t data) {
-    value.dataType = dataType;
-    value.data = data;
+  value.dataType = dataType;
+  value.data = data;
 }
 
 bool BinaryPrimitive::equals(const Value* value) const {
-    const BinaryPrimitive* other = valueCast<BinaryPrimitive>(value);
-    if (!other) {
-        return false;
-    }
-    return this->value.dataType == other->value.dataType && this->value.data == other->value.data;
+  const BinaryPrimitive* other = valueCast<BinaryPrimitive>(value);
+  if (!other) {
+    return false;
+  }
+  return this->value.dataType == other->value.dataType &&
+         this->value.data == other->value.data;
 }
 
 bool BinaryPrimitive::flatten(android::Res_value* outValue) const {
-    outValue->dataType = value.dataType;
-    outValue->data = util::hostToDevice32(value.data);
-    return true;
+  outValue->dataType = value.dataType;
+  outValue->data = util::hostToDevice32(value.data);
+  return true;
 }
 
 BinaryPrimitive* BinaryPrimitive::clone(StringPool* /*newPool*/) const {
-    return new BinaryPrimitive(*this);
+  return new BinaryPrimitive(*this);
 }
 
 void BinaryPrimitive::print(std::ostream* out) const {
-    switch (value.dataType) {
-        case android::Res_value::TYPE_NULL:
-            *out << "(null)";
-            break;
-        case android::Res_value::TYPE_INT_DEC:
-            *out << "(integer) " << static_cast<int32_t>(value.data);
-            break;
-        case android::Res_value::TYPE_INT_HEX:
-            *out << "(integer) 0x" << std::hex << value.data << std::dec;
-            break;
-        case android::Res_value::TYPE_INT_BOOLEAN:
-            *out << "(boolean) " << (value.data != 0 ? "true" : "false");
-            break;
-        case android::Res_value::TYPE_INT_COLOR_ARGB8:
-        case android::Res_value::TYPE_INT_COLOR_RGB8:
-        case android::Res_value::TYPE_INT_COLOR_ARGB4:
-        case android::Res_value::TYPE_INT_COLOR_RGB4:
-            *out << "(color) #" << std::hex << value.data << std::dec;
-            break;
-        default:
-            *out << "(unknown 0x" << std::hex << (int) value.dataType << ") 0x"
-                 << std::hex << value.data << std::dec;
-            break;
-    }
+  switch (value.dataType) {
+    case android::Res_value::TYPE_NULL:
+      *out << "(null)";
+      break;
+    case android::Res_value::TYPE_INT_DEC:
+      *out << "(integer) " << static_cast<int32_t>(value.data);
+      break;
+    case android::Res_value::TYPE_INT_HEX:
+      *out << "(integer) 0x" << std::hex << value.data << std::dec;
+      break;
+    case android::Res_value::TYPE_INT_BOOLEAN:
+      *out << "(boolean) " << (value.data != 0 ? "true" : "false");
+      break;
+    case android::Res_value::TYPE_INT_COLOR_ARGB8:
+    case android::Res_value::TYPE_INT_COLOR_RGB8:
+    case android::Res_value::TYPE_INT_COLOR_ARGB4:
+    case android::Res_value::TYPE_INT_COLOR_RGB4:
+      *out << "(color) #" << std::hex << value.data << std::dec;
+      break;
+    default:
+      *out << "(unknown 0x" << std::hex << (int)value.dataType << ") 0x"
+           << std::hex << value.data << std::dec;
+      break;
+  }
 }
 
-Attribute::Attribute(bool w, uint32_t t) :
-        typeMask(t),
-        minInt(std::numeric_limits<int32_t>::min()),
-        maxInt(std::numeric_limits<int32_t>::max()) {
-    mWeak = w;
+Attribute::Attribute(bool w, uint32_t t)
+    : typeMask(t),
+      minInt(std::numeric_limits<int32_t>::min()),
+      maxInt(std::numeric_limits<int32_t>::max()) {
+  mWeak = w;
 }
 
 template <typename T>
 T* addPointer(T& val) {
-    return &val;
+  return &val;
 }
 
 bool Attribute::equals(const Value* value) const {
-    const Attribute* other = valueCast<Attribute>(value);
-    if (!other) {
-        return false;
-    }
+  const Attribute* other = valueCast<Attribute>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (symbols.size() != other->symbols.size()) {
-        return false;
-    }
+  if (symbols.size() != other->symbols.size()) {
+    return false;
+  }
 
-    if (typeMask != other->typeMask || minInt != other->minInt || maxInt != other->maxInt) {
-        return false;
-    }
+  if (typeMask != other->typeMask || minInt != other->minInt ||
+      maxInt != other->maxInt) {
+    return false;
+  }
 
-    std::vector<const Symbol*> sortedA;
-    std::transform(symbols.begin(), symbols.end(),
-                   std::back_inserter(sortedA), addPointer<const Symbol>);
-    std::sort(sortedA.begin(), sortedA.end(), [](const Symbol* a, const Symbol* b) -> bool {
-        return a->symbol.name < b->symbol.name;
-    });
+  std::vector<const Symbol*> sortedA;
+  std::transform(symbols.begin(), symbols.end(), std::back_inserter(sortedA),
+                 addPointer<const Symbol>);
+  std::sort(sortedA.begin(), sortedA.end(),
+            [](const Symbol* a, const Symbol* b) -> bool {
+              return a->symbol.name < b->symbol.name;
+            });
 
-    std::vector<const Symbol*> sortedB;
-    std::transform(other->symbols.begin(), other->symbols.end(),
-                   std::back_inserter(sortedB), addPointer<const Symbol>);
-    std::sort(sortedB.begin(), sortedB.end(), [](const Symbol* a, const Symbol* b) -> bool {
-        return a->symbol.name < b->symbol.name;
-    });
+  std::vector<const Symbol*> sortedB;
+  std::transform(other->symbols.begin(), other->symbols.end(),
+                 std::back_inserter(sortedB), addPointer<const Symbol>);
+  std::sort(sortedB.begin(), sortedB.end(),
+            [](const Symbol* a, const Symbol* b) -> bool {
+              return a->symbol.name < b->symbol.name;
+            });
 
-    return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
-                      [](const Symbol* a, const Symbol* b) -> bool {
-        return a->symbol.equals(&b->symbol) && a->value == b->value;
-    });
+  return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
+                    [](const Symbol* a, const Symbol* b) -> bool {
+                      return a->symbol.equals(&b->symbol) &&
+                             a->value == b->value;
+                    });
 }
 
 Attribute* Attribute::clone(StringPool* /*newPool*/) const {
-    return new Attribute(*this);
+  return new Attribute(*this);
 }
 
 void Attribute::printMask(std::ostream* out) const {
-    if (typeMask == android::ResTable_map::TYPE_ANY) {
-        *out << "any";
-        return;
-    }
+  if (typeMask == android::ResTable_map::TYPE_ANY) {
+    *out << "any";
+    return;
+  }
 
-    bool set = false;
-    if ((typeMask & android::ResTable_map::TYPE_REFERENCE) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "reference";
+  bool set = false;
+  if ((typeMask & android::ResTable_map::TYPE_REFERENCE) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "reference";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_STRING) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "string";
+  if ((typeMask & android::ResTable_map::TYPE_STRING) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "string";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_INTEGER) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "integer";
+  if ((typeMask & android::ResTable_map::TYPE_INTEGER) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "integer";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_BOOLEAN) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "boolean";
+  if ((typeMask & android::ResTable_map::TYPE_BOOLEAN) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "boolean";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_COLOR) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "color";
+  if ((typeMask & android::ResTable_map::TYPE_COLOR) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "color";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_FLOAT) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "float";
+  if ((typeMask & android::ResTable_map::TYPE_FLOAT) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "float";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_DIMENSION) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "dimension";
+  if ((typeMask & android::ResTable_map::TYPE_DIMENSION) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "dimension";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_FRACTION) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "fraction";
+  if ((typeMask & android::ResTable_map::TYPE_FRACTION) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "fraction";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_ENUM) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "enum";
+  if ((typeMask & android::ResTable_map::TYPE_ENUM) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "enum";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_FLAGS) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "flags";
+  if ((typeMask & android::ResTable_map::TYPE_FLAGS) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "flags";
+  }
 }
 
 void Attribute::print(std::ostream* out) const {
-    *out << "(attr) ";
-    printMask(out);
+  *out << "(attr) ";
+  printMask(out);
 
-    if (!symbols.empty()) {
-        *out << " [" << util::joiner(symbols, ", ") << "]";
-    }
+  if (!symbols.empty()) {
+    *out << " [" << util::joiner(symbols, ", ") << "]";
+  }
 
-    if (minInt != std::numeric_limits<int32_t>::min()) {
-        *out << " min=" << minInt;
-    }
+  if (minInt != std::numeric_limits<int32_t>::min()) {
+    *out << " min=" << minInt;
+  }
 
-    if (maxInt != std::numeric_limits<int32_t>::max()) {
-        *out << " max=" << maxInt;
-    }
+  if (maxInt != std::numeric_limits<int32_t>::max()) {
+    *out << " max=" << maxInt;
+  }
 
-    if (isWeak()) {
-        *out << " [weak]";
-    }
+  if (isWeak()) {
+    *out << " [weak]";
+  }
 }
 
-static void buildAttributeMismatchMessage(DiagMessage* msg, const Attribute* attr,
+static void buildAttributeMismatchMessage(DiagMessage* msg,
+                                          const Attribute* attr,
                                           const Item* value) {
-    *msg << "expected";
-    if (attr->typeMask & android::ResTable_map::TYPE_BOOLEAN) {
-        *msg << " boolean";
-    }
+  *msg << "expected";
+  if (attr->typeMask & android::ResTable_map::TYPE_BOOLEAN) {
+    *msg << " boolean";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_COLOR) {
-        *msg << " color";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_COLOR) {
+    *msg << " color";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_DIMENSION) {
-        *msg << " dimension";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_DIMENSION) {
+    *msg << " dimension";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_ENUM) {
-        *msg << " enum";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_ENUM) {
+    *msg << " enum";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_FLAGS) {
-        *msg << " flags";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_FLAGS) {
+    *msg << " flags";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_FLOAT) {
-        *msg << " float";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_FLOAT) {
+    *msg << " float";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_FRACTION) {
-        *msg << " fraction";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_FRACTION) {
+    *msg << " fraction";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_INTEGER) {
-        *msg << " integer";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_INTEGER) {
+    *msg << " integer";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_REFERENCE) {
-        *msg << " reference";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_REFERENCE) {
+    *msg << " reference";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_STRING) {
-        *msg << " string";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_STRING) {
+    *msg << " string";
+  }
 
-    *msg << " but got " << *value;
+  *msg << " but got " << *value;
 }
 
 bool Attribute::matches(const Item* item, DiagMessage* outMsg) const {
-    android::Res_value val = {};
-    item->flatten(&val);
+  android::Res_value val = {};
+  item->flatten(&val);
 
-    // Always allow references.
-    const uint32_t mask = typeMask | android::ResTable_map::TYPE_REFERENCE;
-    if (!(mask & ResourceUtils::androidTypeToAttributeTypeMask(val.dataType))) {
-        if (outMsg) {
-            buildAttributeMismatchMessage(outMsg, this, item);
-        }
-        return false;
-
-    } else if (ResourceUtils::androidTypeToAttributeTypeMask(val.dataType) &
-            android::ResTable_map::TYPE_INTEGER) {
-        if (static_cast<int32_t>(util::deviceToHost32(val.data)) < minInt) {
-            if (outMsg) {
-                *outMsg << *item << " is less than minimum integer " << minInt;
-            }
-            return false;
-        } else if (static_cast<int32_t>(util::deviceToHost32(val.data)) > maxInt) {
-            if (outMsg) {
-                *outMsg << *item << " is greater than maximum integer " << maxInt;
-            }
-            return false;
-        }
+  // Always allow references.
+  const uint32_t mask = typeMask | android::ResTable_map::TYPE_REFERENCE;
+  if (!(mask & ResourceUtils::androidTypeToAttributeTypeMask(val.dataType))) {
+    if (outMsg) {
+      buildAttributeMismatchMessage(outMsg, this, item);
     }
-    return true;
+    return false;
+
+  } else if (ResourceUtils::androidTypeToAttributeTypeMask(val.dataType) &
+             android::ResTable_map::TYPE_INTEGER) {
+    if (static_cast<int32_t>(util::deviceToHost32(val.data)) < minInt) {
+      if (outMsg) {
+        *outMsg << *item << " is less than minimum integer " << minInt;
+      }
+      return false;
+    } else if (static_cast<int32_t>(util::deviceToHost32(val.data)) > maxInt) {
+      if (outMsg) {
+        *outMsg << *item << " is greater than maximum integer " << maxInt;
+      }
+      return false;
+    }
+  }
+  return true;
 }
 
 bool Style::equals(const Value* value) const {
-    const Style* other = valueCast<Style>(value);
-    if (!other) {
-        return false;
-    }
-    if (bool(parent) != bool(other->parent) ||
-            (parent && other->parent && !parent.value().equals(&other->parent.value()))) {
-        return false;
-    }
+  const Style* other = valueCast<Style>(value);
+  if (!other) {
+    return false;
+  }
+  if (bool(parent) != bool(other->parent) ||
+      (parent && other->parent &&
+       !parent.value().equals(&other->parent.value()))) {
+    return false;
+  }
 
-    if (entries.size() != other->entries.size()) {
-        return false;
-    }
+  if (entries.size() != other->entries.size()) {
+    return false;
+  }
 
-    std::vector<const Entry*> sortedA;
-    std::transform(entries.begin(), entries.end(),
-                   std::back_inserter(sortedA), addPointer<const Entry>);
-    std::sort(sortedA.begin(), sortedA.end(), [](const Entry* a, const Entry* b) -> bool {
-        return a->key.name < b->key.name;
-    });
+  std::vector<const Entry*> sortedA;
+  std::transform(entries.begin(), entries.end(), std::back_inserter(sortedA),
+                 addPointer<const Entry>);
+  std::sort(sortedA.begin(), sortedA.end(),
+            [](const Entry* a, const Entry* b) -> bool {
+              return a->key.name < b->key.name;
+            });
 
-    std::vector<const Entry*> sortedB;
-    std::transform(other->entries.begin(), other->entries.end(),
-                   std::back_inserter(sortedB), addPointer<const Entry>);
-    std::sort(sortedB.begin(), sortedB.end(), [](const Entry* a, const Entry* b) -> bool {
-        return a->key.name < b->key.name;
-    });
+  std::vector<const Entry*> sortedB;
+  std::transform(other->entries.begin(), other->entries.end(),
+                 std::back_inserter(sortedB), addPointer<const Entry>);
+  std::sort(sortedB.begin(), sortedB.end(),
+            [](const Entry* a, const Entry* b) -> bool {
+              return a->key.name < b->key.name;
+            });
 
-    return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
-                      [](const Entry* a, const Entry* b) -> bool {
-        return a->key.equals(&b->key) && a->value->equals(b->value.get());
-    });
+  return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
+                    [](const Entry* a, const Entry* b) -> bool {
+                      return a->key.equals(&b->key) &&
+                             a->value->equals(b->value.get());
+                    });
 }
 
 Style* Style::clone(StringPool* newPool) const {
-    Style* style = new Style();
-    style->parent = parent;
-    style->parentInferred = parentInferred;
-    style->mComment = mComment;
-    style->mSource = mSource;
-    for (auto& entry : entries) {
-        style->entries.push_back(Entry{
-                entry.key,
-                std::unique_ptr<Item>(entry.value->clone(newPool))
-        });
-    }
-    return style;
+  Style* style = new Style();
+  style->parent = parent;
+  style->parentInferred = parentInferred;
+  style->mComment = mComment;
+  style->mSource = mSource;
+  for (auto& entry : entries) {
+    style->entries.push_back(
+        Entry{entry.key, std::unique_ptr<Item>(entry.value->clone(newPool))});
+  }
+  return style;
 }
 
 void Style::print(std::ostream* out) const {
-    *out << "(style) ";
-    if (parent && parent.value().name) {
-        if (parent.value().privateReference) {
-            *out << "*";
-        }
-        *out << parent.value().name.value();
+  *out << "(style) ";
+  if (parent && parent.value().name) {
+    if (parent.value().privateReference) {
+      *out << "*";
     }
-    *out << " ["
-        << util::joiner(entries, ", ")
-        << "]";
+    *out << parent.value().name.value();
+  }
+  *out << " [" << util::joiner(entries, ", ") << "]";
 }
 
-static ::std::ostream& operator<<(::std::ostream& out, const Style::Entry& value) {
-    if (value.key.name) {
-        out << value.key.name.value();
-    } else if (value.key.id) {
-        out << value.key.id.value();
-    } else {
-        out << "???";
-    }
-    out << " = ";
-    value.value->print(&out);
-    return out;
+static ::std::ostream& operator<<(::std::ostream& out,
+                                  const Style::Entry& value) {
+  if (value.key.name) {
+    out << value.key.name.value();
+  } else if (value.key.id) {
+    out << value.key.id.value();
+  } else {
+    out << "???";
+  }
+  out << " = ";
+  value.value->print(&out);
+  return out;
 }
 
 bool Array::equals(const Value* value) const {
-    const Array* other = valueCast<Array>(value);
-    if (!other) {
-        return false;
-    }
+  const Array* other = valueCast<Array>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (items.size() != other->items.size()) {
-        return false;
-    }
+  if (items.size() != other->items.size()) {
+    return false;
+  }
 
-    return std::equal(items.begin(), items.end(), other->items.begin(),
-                      [](const std::unique_ptr<Item>& a, const std::unique_ptr<Item>& b) -> bool {
-        return a->equals(b.get());
-    });
+  return std::equal(items.begin(), items.end(), other->items.begin(),
+                    [](const std::unique_ptr<Item>& a,
+                       const std::unique_ptr<Item>& b) -> bool {
+                      return a->equals(b.get());
+                    });
 }
 
 Array* Array::clone(StringPool* newPool) const {
-    Array* array = new Array();
-    array->mComment = mComment;
-    array->mSource = mSource;
-    for (auto& item : items) {
-        array->items.emplace_back(std::unique_ptr<Item>(item->clone(newPool)));
-    }
-    return array;
+  Array* array = new Array();
+  array->mComment = mComment;
+  array->mSource = mSource;
+  for (auto& item : items) {
+    array->items.emplace_back(std::unique_ptr<Item>(item->clone(newPool)));
+  }
+  return array;
 }
 
 void Array::print(std::ostream* out) const {
-    *out << "(array) ["
-        << util::joiner(items, ", ")
-        << "]";
+  *out << "(array) [" << util::joiner(items, ", ") << "]";
 }
 
 bool Plural::equals(const Value* value) const {
-    const Plural* other = valueCast<Plural>(value);
-    if (!other) {
-        return false;
-    }
+  const Plural* other = valueCast<Plural>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (values.size() != other->values.size()) {
-        return false;
-    }
+  if (values.size() != other->values.size()) {
+    return false;
+  }
 
-    return std::equal(values.begin(), values.end(), other->values.begin(),
-                      [](const std::unique_ptr<Item>& a, const std::unique_ptr<Item>& b) -> bool {
-        if (bool(a) != bool(b)) {
-            return false;
-        }
-        return bool(a) == bool(b) || a->equals(b.get());
-    });
+  return std::equal(values.begin(), values.end(), other->values.begin(),
+                    [](const std::unique_ptr<Item>& a,
+                       const std::unique_ptr<Item>& b) -> bool {
+                      if (bool(a) != bool(b)) {
+                        return false;
+                      }
+                      return bool(a) == bool(b) || a->equals(b.get());
+                    });
 }
 
 Plural* Plural::clone(StringPool* newPool) const {
-    Plural* p = new Plural();
-    p->mComment = mComment;
-    p->mSource = mSource;
-    const size_t count = values.size();
-    for (size_t i = 0; i < count; i++) {
-        if (values[i]) {
-            p->values[i] = std::unique_ptr<Item>(values[i]->clone(newPool));
-        }
+  Plural* p = new Plural();
+  p->mComment = mComment;
+  p->mSource = mSource;
+  const size_t count = values.size();
+  for (size_t i = 0; i < count; i++) {
+    if (values[i]) {
+      p->values[i] = std::unique_ptr<Item>(values[i]->clone(newPool));
     }
-    return p;
+  }
+  return p;
 }
 
 void Plural::print(std::ostream* out) const {
-    *out << "(plural)";
-    if (values[Zero]) {
-        *out << " zero=" << *values[Zero];
-    }
+  *out << "(plural)";
+  if (values[Zero]) {
+    *out << " zero=" << *values[Zero];
+  }
 
-    if (values[One]) {
-        *out << " one=" << *values[One];
-    }
+  if (values[One]) {
+    *out << " one=" << *values[One];
+  }
 
-    if (values[Two]) {
-        *out << " two=" << *values[Two];
-    }
+  if (values[Two]) {
+    *out << " two=" << *values[Two];
+  }
 
-    if (values[Few]) {
-        *out << " few=" << *values[Few];
-    }
+  if (values[Few]) {
+    *out << " few=" << *values[Few];
+  }
 
-    if (values[Many]) {
-        *out << " many=" << *values[Many];
-    }
+  if (values[Many]) {
+    *out << " many=" << *values[Many];
+  }
 }
 
-static ::std::ostream& operator<<(::std::ostream& out, const std::unique_ptr<Item>& item) {
-    return out << *item;
+static ::std::ostream& operator<<(::std::ostream& out,
+                                  const std::unique_ptr<Item>& item) {
+  return out << *item;
 }
 
 bool Styleable::equals(const Value* value) const {
-    const Styleable* other = valueCast<Styleable>(value);
-    if (!other) {
-        return false;
-    }
+  const Styleable* other = valueCast<Styleable>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (entries.size() != other->entries.size()) {
-        return false;
-    }
+  if (entries.size() != other->entries.size()) {
+    return false;
+  }
 
-    return std::equal(entries.begin(), entries.end(), other->entries.begin(),
-                      [](const Reference& a, const Reference& b) -> bool {
-        return a.equals(&b);
-    });
+  return std::equal(entries.begin(), entries.end(), other->entries.begin(),
+                    [](const Reference& a, const Reference& b) -> bool {
+                      return a.equals(&b);
+                    });
 }
 
 Styleable* Styleable::clone(StringPool* /*newPool*/) const {
-    return new Styleable(*this);
+  return new Styleable(*this);
 }
 
 void Styleable::print(std::ostream* out) const {
-    *out << "(styleable) " << " ["
-        << util::joiner(entries, ", ")
-        << "]";
+  *out << "(styleable) "
+       << " [" << util::joiner(entries, ", ") << "]";
 }
 
 bool operator<(const Reference& a, const Reference& b) {
-    int cmp = a.name.valueOrDefault({}).compare(b.name.valueOrDefault({}));
-    if (cmp != 0) return cmp < 0;
-    return a.id < b.id;
+  int cmp = a.name.valueOrDefault({}).compare(b.name.valueOrDefault({}));
+  if (cmp != 0) return cmp < 0;
+  return a.id < b.id;
 }
 
 bool operator==(const Reference& a, const Reference& b) {
-    return a.name == b.name && a.id == b.id;
+  return a.name == b.name && a.id == b.id;
 }
 
 bool operator!=(const Reference& a, const Reference& b) {
-    return a.name != b.name || a.id != b.id;
+  return a.name != b.name || a.id != b.id;
 }
 
 struct NameOnlyComparator {
-    bool operator()(const Reference& a, const Reference& b) const {
-        return a.name < b.name;
-    }
+  bool operator()(const Reference& a, const Reference& b) const {
+    return a.name < b.name;
+  }
 };
 
 void Styleable::mergeWith(Styleable* other) {
-    // Compare only names, because some References may already have their IDs assigned
-    // (framework IDs that don't change).
-    std::set<Reference, NameOnlyComparator> references;
-    references.insert(entries.begin(), entries.end());
-    references.insert(other->entries.begin(), other->entries.end());
-    entries.clear();
-    entries.reserve(references.size());
-    entries.insert(entries.end(), references.begin(), references.end());
+  // Compare only names, because some References may already have their IDs
+  // assigned
+  // (framework IDs that don't change).
+  std::set<Reference, NameOnlyComparator> references;
+  references.insert(entries.begin(), entries.end());
+  references.insert(other->entries.begin(), other->entries.end());
+  entries.clear();
+  entries.reserve(references.size());
+  entries.insert(entries.end(), references.begin(), references.end());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index 5e5d1f3..a28ffe5 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -23,8 +23,8 @@
 #include "io/File.h"
 #include "util/Maybe.h"
 
-#include <array>
 #include <androidfw/ResourceTypes.h>
+#include <array>
 #include <ostream>
 #include <vector>
 
@@ -40,84 +40,64 @@
  * but it is the simplest strategy.
  */
 struct Value {
-	virtual ~Value() = default;
+  virtual ~Value() = default;
 
-    /**
-     * Whether this value is weak and can be overridden without
-     * warning or error. Default is false.
-     */
-    bool isWeak() const {
-        return mWeak;
-    }
+  /**
+   * Whether this value is weak and can be overridden without
+   * warning or error. Default is false.
+   */
+  bool isWeak() const { return mWeak; }
 
-    void setWeak(bool val) {
-        mWeak = val;
-    }
+  void setWeak(bool val) { mWeak = val; }
 
-    // Whether the value is marked as translateable.
-    // This does not persist when flattened.
-    // It is only used during compilation phase.
-    void setTranslateable(bool val) {
-        mTranslateable = val;
-    }
+  // Whether the value is marked as translateable.
+  // This does not persist when flattened.
+  // It is only used during compilation phase.
+  void setTranslateable(bool val) { mTranslateable = val; }
 
-    // Default true.
-    bool isTranslateable() const {
-        return mTranslateable;
-    }
+  // Default true.
+  bool isTranslateable() const { return mTranslateable; }
 
-    /**
-     * Returns the source where this value was defined.
-     */
-    const Source& getSource() const {
-        return mSource;
-    }
+  /**
+   * Returns the source where this value was defined.
+   */
+  const Source& getSource() const { return mSource; }
 
-    void setSource(const Source& source) {
-        mSource = source;
-    }
+  void setSource(const Source& source) { mSource = source; }
 
-    void setSource(Source&& source) {
-        mSource = std::move(source);
-    }
+  void setSource(Source&& source) { mSource = std::move(source); }
 
-    /**
-     * Returns the comment that was associated with this resource.
-     */
-    const std::string& getComment() const {
-        return mComment;
-    }
+  /**
+   * Returns the comment that was associated with this resource.
+   */
+  const std::string& getComment() const { return mComment; }
 
-    void setComment(const StringPiece& str) {
-        mComment = str.toString();
-    }
+  void setComment(const StringPiece& str) { mComment = str.toString(); }
 
-    void setComment(std::string&& str) {
-        mComment = std::move(str);
-    }
+  void setComment(std::string&& str) { mComment = std::move(str); }
 
-    virtual bool equals(const Value* value) const = 0;
+  virtual bool equals(const Value* value) const = 0;
 
-    /**
-     * Calls the appropriate overload of ValueVisitor.
-     */
-    virtual void accept(RawValueVisitor* visitor) = 0;
+  /**
+   * Calls the appropriate overload of ValueVisitor.
+   */
+  virtual void accept(RawValueVisitor* visitor) = 0;
 
-    /**
-     * Clone the value.
-     */
-    virtual Value* clone(StringPool* newPool) const = 0;
+  /**
+   * Clone the value.
+   */
+  virtual Value* clone(StringPool* newPool) const = 0;
 
-    /**
-     * Human readable printout of this value.
-     */
-    virtual void print(std::ostream* out) const = 0;
+  /**
+   * Human readable printout of this value.
+   */
+  virtual void print(std::ostream* out) const = 0;
 
-protected:
-    Source mSource;
-    std::string mComment;
-    bool mWeak = false;
-    bool mTranslateable = true;
+ protected:
+  Source mSource;
+  std::string mComment;
+  bool mWeak = false;
+  bool mTranslateable = true;
 };
 
 /**
@@ -125,23 +105,24 @@
  */
 template <typename Derived>
 struct BaseValue : public Value {
-    void accept(RawValueVisitor* visitor) override;
+  void accept(RawValueVisitor* visitor) override;
 };
 
 /**
  * A resource item with a single value. This maps to android::ResTable_entry.
  */
 struct Item : public Value {
-    /**
-     * Clone the Item.
-     */
-    virtual Item* clone(StringPool* newPool) const override = 0;
+  /**
+   * Clone the Item.
+   */
+  virtual Item* clone(StringPool* newPool) const override = 0;
 
-    /**
-     * Fills in an android::Res_value structure with this Item's binary representation.
-     * Returns false if an error occurred.
-     */
-    virtual bool flatten(android::Res_value* outValue) const = 0;
+  /**
+   * Fills in an android::Res_value structure with this Item's binary
+   * representation.
+   * Returns false if an error occurred.
+   */
+  virtual bool flatten(android::Res_value* outValue) const = 0;
 };
 
 /**
@@ -149,35 +130,37 @@
  */
 template <typename Derived>
 struct BaseItem : public Item {
-    void accept(RawValueVisitor* visitor) override;
+  void accept(RawValueVisitor* visitor) override;
 };
 
 /**
- * A reference to another resource. This maps to android::Res_value::TYPE_REFERENCE.
+ * A reference to another resource. This maps to
+ * android::Res_value::TYPE_REFERENCE.
  *
- * A reference can be symbolic (with the name set to a valid resource name) or be
+ * A reference can be symbolic (with the name set to a valid resource name) or
+ * be
  * numeric (the id is set to a valid resource ID).
  */
 struct Reference : public BaseItem<Reference> {
-    enum class Type {
-        kResource,
-        kAttribute,
-    };
+  enum class Type {
+    kResource,
+    kAttribute,
+  };
 
-    Maybe<ResourceName> name;
-    Maybe<ResourceId> id;
-    Reference::Type referenceType;
-    bool privateReference = false;
+  Maybe<ResourceName> name;
+  Maybe<ResourceId> id;
+  Reference::Type referenceType;
+  bool privateReference = false;
 
-    Reference();
-    explicit Reference(const ResourceNameRef& n, Type type = Type::kResource);
-    explicit Reference(const ResourceId& i, Type type = Type::kResource);
-    explicit Reference(const ResourceNameRef& n, const ResourceId& i);
+  Reference();
+  explicit Reference(const ResourceNameRef& n, Type type = Type::kResource);
+  explicit Reference(const ResourceId& i, Type type = Type::kResource);
+  explicit Reference(const ResourceNameRef& n, const ResourceId& i);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    Reference* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  Reference* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 bool operator<(const Reference&, const Reference&);
@@ -187,11 +170,11 @@
  * An ID resource. Has no real value, just a place holder.
  */
 struct Id : public BaseItem<Id> {
-    Id() { mWeak = true; }
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* out) const override;
-    Id* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  Id() { mWeak = true; }
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* out) const override;
+  Id* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 /**
@@ -200,164 +183,157 @@
  * end up in the final resource table.
  */
 struct RawString : public BaseItem<RawString> {
-    StringPool::Ref value;
+  StringPool::Ref value;
 
-    explicit RawString(const StringPool::Ref& ref);
+  explicit RawString(const StringPool::Ref& ref);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    RawString* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  RawString* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct String : public BaseItem<String> {
-    StringPool::Ref value;
+  StringPool::Ref value;
 
-    explicit String(const StringPool::Ref& ref);
+  explicit String(const StringPool::Ref& ref);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    String* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  String* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct StyledString : public BaseItem<StyledString> {
-    StringPool::StyleRef value;
+  StringPool::StyleRef value;
 
-    explicit StyledString(const StringPool::StyleRef& ref);
+  explicit StyledString(const StringPool::StyleRef& ref);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    StyledString* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  StyledString* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct FileReference : public BaseItem<FileReference> {
-    StringPool::Ref path;
+  StringPool::Ref path;
 
-    /**
-     * A handle to the file object from which this file can be read.
-     */
-    io::IFile* file = nullptr;
+  /**
+   * A handle to the file object from which this file can be read.
+   */
+  io::IFile* file = nullptr;
 
-    FileReference() = default;
-    explicit FileReference(const StringPool::Ref& path);
+  FileReference() = default;
+  explicit FileReference(const StringPool::Ref& path);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    FileReference* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  FileReference* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 /**
  * Represents any other android::Res_value.
  */
 struct BinaryPrimitive : public BaseItem<BinaryPrimitive> {
-    android::Res_value value;
+  android::Res_value value;
 
-    BinaryPrimitive() = default;
-    explicit BinaryPrimitive(const android::Res_value& val);
-    BinaryPrimitive(uint8_t dataType, uint32_t data);
+  BinaryPrimitive() = default;
+  explicit BinaryPrimitive(const android::Res_value& val);
+  BinaryPrimitive(uint8_t dataType, uint32_t data);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    BinaryPrimitive* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  BinaryPrimitive* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Attribute : public BaseValue<Attribute> {
-    struct Symbol {
-        Reference symbol;
-        uint32_t value;
-    };
+  struct Symbol {
+    Reference symbol;
+    uint32_t value;
+  };
 
-    uint32_t typeMask;
-    int32_t minInt;
-    int32_t maxInt;
-    std::vector<Symbol> symbols;
+  uint32_t typeMask;
+  int32_t minInt;
+  int32_t maxInt;
+  std::vector<Symbol> symbols;
 
-    explicit Attribute(bool w, uint32_t t = 0u);
+  explicit Attribute(bool w, uint32_t t = 0u);
 
-    bool equals(const Value* value) const override;
-    Attribute* clone(StringPool* newPool) const override;
-    void printMask(std::ostream* out) const;
-    void print(std::ostream* out) const override;
-    bool matches(const Item* item, DiagMessage* outMsg) const;
+  bool equals(const Value* value) const override;
+  Attribute* clone(StringPool* newPool) const override;
+  void printMask(std::ostream* out) const;
+  void print(std::ostream* out) const override;
+  bool matches(const Item* item, DiagMessage* outMsg) const;
 };
 
 struct Style : public BaseValue<Style> {
-    struct Entry {
-        Reference key;
-        std::unique_ptr<Item> value;
-    };
+  struct Entry {
+    Reference key;
+    std::unique_ptr<Item> value;
+  };
 
-    Maybe<Reference> parent;
+  Maybe<Reference> parent;
 
-    /**
-     * If set to true, the parent was auto inferred from the
-     * style's name.
-     */
-    bool parentInferred = false;
+  /**
+   * If set to true, the parent was auto inferred from the
+   * style's name.
+   */
+  bool parentInferred = false;
 
-    std::vector<Entry> entries;
+  std::vector<Entry> entries;
 
-    bool equals(const Value* value) const override;
-    Style* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  Style* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Array : public BaseValue<Array> {
-    std::vector<std::unique_ptr<Item>> items;
+  std::vector<std::unique_ptr<Item>> items;
 
-    bool equals(const Value* value) const override;
-    Array* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  Array* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Plural : public BaseValue<Plural> {
-    enum {
-        Zero = 0,
-        One,
-        Two,
-        Few,
-        Many,
-        Other,
-        Count
-    };
+  enum { Zero = 0, One, Two, Few, Many, Other, Count };
 
-    std::array<std::unique_ptr<Item>, Count> values;
+  std::array<std::unique_ptr<Item>, Count> values;
 
-    bool equals(const Value* value) const override;
-    Plural* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  Plural* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Styleable : public BaseValue<Styleable> {
-    std::vector<Reference> entries;
+  std::vector<Reference> entries;
 
-    bool equals(const Value* value) const override;
-    Styleable* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
-    void mergeWith(Styleable* styleable);
+  bool equals(const Value* value) const override;
+  Styleable* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
+  void mergeWith(Styleable* styleable);
 };
 
 /**
  * Stream operator for printing Value objects.
  */
 inline ::std::ostream& operator<<(::std::ostream& out, const Value& value) {
-    value.print(&out);
-    return out;
+  value.print(&out);
+  return out;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const Attribute::Symbol& s) {
-    if (s.symbol.name) {
-        out << s.symbol.name.value().entry;
-    } else {
-        out << "???";
-    }
-    return out << "=" << s.value;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const Attribute::Symbol& s) {
+  if (s.symbol.name) {
+    out << s.symbol.name.value().entry;
+  } else {
+    out << "???";
+  }
+  return out << "=" << s.value;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_VALUES_H
+#endif  // AAPT_RESOURCE_VALUES_H
diff --git a/tools/aapt2/Resource_test.cpp b/tools/aapt2/Resource_test.cpp
index 06cddc7..4b6b122 100644
--- a/tools/aapt2/Resource_test.cpp
+++ b/tools/aapt2/Resource_test.cpp
@@ -20,96 +20,96 @@
 namespace aapt {
 
 TEST(ResourceTypeTest, ParseResourceTypes) {
-    const ResourceType* type = parseResourceType("anim");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAnim);
+  const ResourceType* type = parseResourceType("anim");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAnim);
 
-    type = parseResourceType("animator");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAnimator);
+  type = parseResourceType("animator");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAnimator);
 
-    type = parseResourceType("array");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kArray);
+  type = parseResourceType("array");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kArray);
 
-    type = parseResourceType("attr");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAttr);
+  type = parseResourceType("attr");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAttr);
 
-    type = parseResourceType("^attr-private");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAttrPrivate);
+  type = parseResourceType("^attr-private");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAttrPrivate);
 
-    type = parseResourceType("bool");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kBool);
+  type = parseResourceType("bool");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kBool);
 
-    type = parseResourceType("color");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kColor);
+  type = parseResourceType("color");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kColor);
 
-    type = parseResourceType("dimen");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kDimen);
+  type = parseResourceType("dimen");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kDimen);
 
-    type = parseResourceType("drawable");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kDrawable);
+  type = parseResourceType("drawable");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kDrawable);
 
-    type = parseResourceType("fraction");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kFraction);
+  type = parseResourceType("fraction");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kFraction);
 
-    type = parseResourceType("id");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kId);
+  type = parseResourceType("id");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kId);
 
-    type = parseResourceType("integer");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kInteger);
+  type = parseResourceType("integer");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kInteger);
 
-    type = parseResourceType("interpolator");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kInterpolator);
+  type = parseResourceType("interpolator");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kInterpolator);
 
-    type = parseResourceType("layout");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kLayout);
+  type = parseResourceType("layout");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kLayout);
 
-    type = parseResourceType("menu");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kMenu);
+  type = parseResourceType("menu");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kMenu);
 
-    type = parseResourceType("mipmap");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kMipmap);
+  type = parseResourceType("mipmap");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kMipmap);
 
-    type = parseResourceType("plurals");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kPlurals);
+  type = parseResourceType("plurals");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kPlurals);
 
-    type = parseResourceType("raw");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kRaw);
+  type = parseResourceType("raw");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kRaw);
 
-    type = parseResourceType("string");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kString);
+  type = parseResourceType("string");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kString);
 
-    type = parseResourceType("style");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kStyle);
+  type = parseResourceType("style");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kStyle);
 
-    type = parseResourceType("transition");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kTransition);
+  type = parseResourceType("transition");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kTransition);
 
-    type = parseResourceType("xml");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kXml);
+  type = parseResourceType("xml");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kXml);
 
-    type = parseResourceType("blahaha");
-    EXPECT_EQ(type, nullptr);
+  type = parseResourceType("blahaha");
+  EXPECT_EQ(type, nullptr);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index ccf0383..75375da 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -27,719 +27,721 @@
 static int sDevelopmentSdkLevel = 26;
 
 static const std::vector<std::pair<uint16_t, size_t>> sAttrIdMap = {
-    { 0x021c, 1 },
-    { 0x021d, 2 },
-    { 0x0269, SDK_CUPCAKE },
-    { 0x028d, SDK_DONUT },
-    { 0x02ad, SDK_ECLAIR },
-    { 0x02b3, SDK_ECLAIR_0_1 },
-    { 0x02b5, SDK_ECLAIR_MR1 },
-    { 0x02bd, SDK_FROYO },
-    { 0x02cb, SDK_GINGERBREAD },
-    { 0x0361, SDK_HONEYCOMB },
-    { 0x0363, SDK_HONEYCOMB_MR1 },
-    { 0x0366, SDK_HONEYCOMB_MR2 },
-    { 0x03a6, SDK_ICE_CREAM_SANDWICH },
-    { 0x03ae, SDK_JELLY_BEAN },
-    { 0x03cc, SDK_JELLY_BEAN_MR1 },
-    { 0x03da, SDK_JELLY_BEAN_MR2 },
-    { 0x03f1, SDK_KITKAT },
-    { 0x03f6, SDK_KITKAT_WATCH },
-    { 0x04ce, SDK_LOLLIPOP },
+    {0x021c, 1},
+    {0x021d, 2},
+    {0x0269, SDK_CUPCAKE},
+    {0x028d, SDK_DONUT},
+    {0x02ad, SDK_ECLAIR},
+    {0x02b3, SDK_ECLAIR_0_1},
+    {0x02b5, SDK_ECLAIR_MR1},
+    {0x02bd, SDK_FROYO},
+    {0x02cb, SDK_GINGERBREAD},
+    {0x0361, SDK_HONEYCOMB},
+    {0x0363, SDK_HONEYCOMB_MR1},
+    {0x0366, SDK_HONEYCOMB_MR2},
+    {0x03a6, SDK_ICE_CREAM_SANDWICH},
+    {0x03ae, SDK_JELLY_BEAN},
+    {0x03cc, SDK_JELLY_BEAN_MR1},
+    {0x03da, SDK_JELLY_BEAN_MR2},
+    {0x03f1, SDK_KITKAT},
+    {0x03f6, SDK_KITKAT_WATCH},
+    {0x04ce, SDK_LOLLIPOP},
 };
 
-static bool lessEntryId(const std::pair<uint16_t, size_t>& p, uint16_t entryId) {
-    return p.first < entryId;
+static bool lessEntryId(const std::pair<uint16_t, size_t>& p,
+                        uint16_t entryId) {
+  return p.first < entryId;
 }
 
 size_t findAttributeSdkLevel(const ResourceId& id) {
-    if (id.packageId() != 0x01 && id.typeId() != 0x01) {
-        return 0;
-    }
-    auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(), id.entryId(), lessEntryId);
-    if (iter == sAttrIdMap.end()) {
-        return SDK_LOLLIPOP_MR1;
-    }
-    return iter->second;
+  if (id.packageId() != 0x01 && id.typeId() != 0x01) {
+    return 0;
+  }
+  auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(),
+                               id.entryId(), lessEntryId);
+  if (iter == sAttrIdMap.end()) {
+    return SDK_LOLLIPOP_MR1;
+  }
+  return iter->second;
 }
 
 static const std::unordered_map<std::string, size_t> sAttrMap = {
-    { "marqueeRepeatLimit", 2 },
-    { "windowNoDisplay", 3 },
-    { "backgroundDimEnabled", 3 },
-    { "inputType", 3 },
-    { "isDefault", 3 },
-    { "windowDisablePreview", 3 },
-    { "privateImeOptions", 3 },
-    { "editorExtras", 3 },
-    { "settingsActivity", 3 },
-    { "fastScrollEnabled", 3 },
-    { "reqTouchScreen", 3 },
-    { "reqKeyboardType", 3 },
-    { "reqHardKeyboard", 3 },
-    { "reqNavigation", 3 },
-    { "windowSoftInputMode", 3 },
-    { "imeFullscreenBackground", 3 },
-    { "noHistory", 3 },
-    { "headerDividersEnabled", 3 },
-    { "footerDividersEnabled", 3 },
-    { "candidatesTextStyleSpans", 3 },
-    { "smoothScrollbar", 3 },
-    { "reqFiveWayNav", 3 },
-    { "keyBackground", 3 },
-    { "keyTextSize", 3 },
-    { "labelTextSize", 3 },
-    { "keyTextColor", 3 },
-    { "keyPreviewLayout", 3 },
-    { "keyPreviewOffset", 3 },
-    { "keyPreviewHeight", 3 },
-    { "verticalCorrection", 3 },
-    { "popupLayout", 3 },
-    { "state_long_pressable", 3 },
-    { "keyWidth", 3 },
-    { "keyHeight", 3 },
-    { "horizontalGap", 3 },
-    { "verticalGap", 3 },
-    { "rowEdgeFlags", 3 },
-    { "codes", 3 },
-    { "popupKeyboard", 3 },
-    { "popupCharacters", 3 },
-    { "keyEdgeFlags", 3 },
-    { "isModifier", 3 },
-    { "isSticky", 3 },
-    { "isRepeatable", 3 },
-    { "iconPreview", 3 },
-    { "keyOutputText", 3 },
-    { "keyLabel", 3 },
-    { "keyIcon", 3 },
-    { "keyboardMode", 3 },
-    { "isScrollContainer", 3 },
-    { "fillEnabled", 3 },
-    { "updatePeriodMillis", 3 },
-    { "initialLayout", 3 },
-    { "voiceSearchMode", 3 },
-    { "voiceLanguageModel", 3 },
-    { "voicePromptText", 3 },
-    { "voiceLanguage", 3 },
-    { "voiceMaxResults", 3 },
-    { "bottomOffset", 3 },
-    { "topOffset", 3 },
-    { "allowSingleTap", 3 },
-    { "handle", 3 },
-    { "content", 3 },
-    { "animateOnClick", 3 },
-    { "configure", 3 },
-    { "hapticFeedbackEnabled", 3 },
-    { "innerRadius", 3 },
-    { "thickness", 3 },
-    { "sharedUserLabel", 3 },
-    { "dropDownWidth", 3 },
-    { "dropDownAnchor", 3 },
-    { "imeOptions", 3 },
-    { "imeActionLabel", 3 },
-    { "imeActionId", 3 },
-    { "imeExtractEnterAnimation", 3 },
-    { "imeExtractExitAnimation", 3 },
-    { "tension", 4 },
-    { "extraTension", 4 },
-    { "anyDensity", 4 },
-    { "searchSuggestThreshold", 4 },
-    { "includeInGlobalSearch", 4 },
-    { "onClick", 4 },
-    { "targetSdkVersion", 4 },
-    { "maxSdkVersion", 4 },
-    { "testOnly", 4 },
-    { "contentDescription", 4 },
-    { "gestureStrokeWidth", 4 },
-    { "gestureColor", 4 },
-    { "uncertainGestureColor", 4 },
-    { "fadeOffset", 4 },
-    { "fadeDuration", 4 },
-    { "gestureStrokeType", 4 },
-    { "gestureStrokeLengthThreshold", 4 },
-    { "gestureStrokeSquarenessThreshold", 4 },
-    { "gestureStrokeAngleThreshold", 4 },
-    { "eventsInterceptionEnabled", 4 },
-    { "fadeEnabled", 4 },
-    { "backupAgent", 4 },
-    { "allowBackup", 4 },
-    { "glEsVersion", 4 },
-    { "queryAfterZeroResults", 4 },
-    { "dropDownHeight", 4 },
-    { "smallScreens", 4 },
-    { "normalScreens", 4 },
-    { "largeScreens", 4 },
-    { "progressBarStyleInverse", 4 },
-    { "progressBarStyleSmallInverse", 4 },
-    { "progressBarStyleLargeInverse", 4 },
-    { "searchSettingsDescription", 4 },
-    { "textColorPrimaryInverseDisableOnly", 4 },
-    { "autoUrlDetect", 4 },
-    { "resizeable", 4 },
-    { "required", 5 },
-    { "accountType", 5 },
-    { "contentAuthority", 5 },
-    { "userVisible", 5 },
-    { "windowShowWallpaper", 5 },
-    { "wallpaperOpenEnterAnimation", 5 },
-    { "wallpaperOpenExitAnimation", 5 },
-    { "wallpaperCloseEnterAnimation", 5 },
-    { "wallpaperCloseExitAnimation", 5 },
-    { "wallpaperIntraOpenEnterAnimation", 5 },
-    { "wallpaperIntraOpenExitAnimation", 5 },
-    { "wallpaperIntraCloseEnterAnimation", 5 },
-    { "wallpaperIntraCloseExitAnimation", 5 },
-    { "supportsUploading", 5 },
-    { "killAfterRestore", 5 },
-    { "restoreNeedsApplication", 5 },
-    { "smallIcon", 5 },
-    { "accountPreferences", 5 },
-    { "textAppearanceSearchResultSubtitle", 5 },
-    { "textAppearanceSearchResultTitle", 5 },
-    { "summaryColumn", 5 },
-    { "detailColumn", 5 },
-    { "detailSocialSummary", 5 },
-    { "thumbnail", 5 },
-    { "detachWallpaper", 5 },
-    { "finishOnCloseSystemDialogs", 5 },
-    { "scrollbarFadeDuration", 5 },
-    { "scrollbarDefaultDelayBeforeFade", 5 },
-    { "fadeScrollbars", 5 },
-    { "colorBackgroundCacheHint", 5 },
-    { "dropDownHorizontalOffset", 5 },
-    { "dropDownVerticalOffset", 5 },
-    { "quickContactBadgeStyleWindowSmall", 6 },
-    { "quickContactBadgeStyleWindowMedium", 6 },
-    { "quickContactBadgeStyleWindowLarge", 6 },
-    { "quickContactBadgeStyleSmallWindowSmall", 6 },
-    { "quickContactBadgeStyleSmallWindowMedium", 6 },
-    { "quickContactBadgeStyleSmallWindowLarge", 6 },
-    { "author", 7 },
-    { "autoStart", 7 },
-    { "expandableListViewWhiteStyle", 8 },
-    { "installLocation", 8 },
-    { "vmSafeMode", 8 },
-    { "webTextViewStyle", 8 },
-    { "restoreAnyVersion", 8 },
-    { "tabStripLeft", 8 },
-    { "tabStripRight", 8 },
-    { "tabStripEnabled", 8 },
-    { "logo", 9 },
-    { "xlargeScreens", 9 },
-    { "immersive", 9 },
-    { "overScrollMode", 9 },
-    { "overScrollHeader", 9 },
-    { "overScrollFooter", 9 },
-    { "filterTouchesWhenObscured", 9 },
-    { "textSelectHandleLeft", 9 },
-    { "textSelectHandleRight", 9 },
-    { "textSelectHandle", 9 },
-    { "textSelectHandleWindowStyle", 9 },
-    { "popupAnimationStyle", 9 },
-    { "screenSize", 9 },
-    { "screenDensity", 9 },
-    { "allContactsName", 11 },
-    { "windowActionBar", 11 },
-    { "actionBarStyle", 11 },
-    { "navigationMode", 11 },
-    { "displayOptions", 11 },
-    { "subtitle", 11 },
-    { "customNavigationLayout", 11 },
-    { "hardwareAccelerated", 11 },
-    { "measureWithLargestChild", 11 },
-    { "animateFirstView", 11 },
-    { "dropDownSpinnerStyle", 11 },
-    { "actionDropDownStyle", 11 },
-    { "actionButtonStyle", 11 },
-    { "showAsAction", 11 },
-    { "previewImage", 11 },
-    { "actionModeBackground", 11 },
-    { "actionModeCloseDrawable", 11 },
-    { "windowActionModeOverlay", 11 },
-    { "valueFrom", 11 },
-    { "valueTo", 11 },
-    { "valueType", 11 },
-    { "propertyName", 11 },
-    { "ordering", 11 },
-    { "fragment", 11 },
-    { "windowActionBarOverlay", 11 },
-    { "fragmentOpenEnterAnimation", 11 },
-    { "fragmentOpenExitAnimation", 11 },
-    { "fragmentCloseEnterAnimation", 11 },
-    { "fragmentCloseExitAnimation", 11 },
-    { "fragmentFadeEnterAnimation", 11 },
-    { "fragmentFadeExitAnimation", 11 },
-    { "actionBarSize", 11 },
-    { "imeSubtypeLocale", 11 },
-    { "imeSubtypeMode", 11 },
-    { "imeSubtypeExtraValue", 11 },
-    { "splitMotionEvents", 11 },
-    { "listChoiceBackgroundIndicator", 11 },
-    { "spinnerMode", 11 },
-    { "animateLayoutChanges", 11 },
-    { "actionBarTabStyle", 11 },
-    { "actionBarTabBarStyle", 11 },
-    { "actionBarTabTextStyle", 11 },
-    { "actionOverflowButtonStyle", 11 },
-    { "actionModeCloseButtonStyle", 11 },
-    { "titleTextStyle", 11 },
-    { "subtitleTextStyle", 11 },
-    { "iconifiedByDefault", 11 },
-    { "actionLayout", 11 },
-    { "actionViewClass", 11 },
-    { "activatedBackgroundIndicator", 11 },
-    { "state_activated", 11 },
-    { "listPopupWindowStyle", 11 },
-    { "popupMenuStyle", 11 },
-    { "textAppearanceLargePopupMen", 11 },
-    { "textAppearanceSmallPopupMen", 11 },
-    { "breadCrumbTitle", 11 },
-    { "breadCrumbShortTitle", 11 },
-    { "listDividerAlertDialog", 11 },
-    { "textColorAlertDialogListItem", 11 },
-    { "loopViews", 11 },
-    { "dialogTheme", 11 },
-    { "alertDialogTheme", 11 },
-    { "dividerVertical", 11 },
-    { "homeAsUpIndicator", 11 },
-    { "enterFadeDuration", 11 },
-    { "exitFadeDuration", 11 },
-    { "selectableItemBackground", 11 },
-    { "autoAdvanceViewId", 11 },
-    { "useIntrinsicSizeAsMinimum", 11 },
-    { "actionModeCutDrawable", 11 },
-    { "actionModeCopyDrawable", 11 },
-    { "actionModePasteDrawable", 11 },
-    { "textEditPasteWindowLayout", 11 },
-    { "textEditNoPasteWindowLayout", 11 },
-    { "textIsSelectable", 11 },
-    { "windowEnableSplitTouch", 11 },
-    { "indeterminateProgressStyle", 11 },
-    { "progressBarPadding", 11 },
-    { "animationResolution", 11 },
-    { "state_accelerated", 11 },
-    { "baseline", 11 },
-    { "homeLayout", 11 },
-    { "opacity", 11 },
-    { "alpha", 11 },
-    { "transformPivotX", 11 },
-    { "transformPivotY", 11 },
-    { "translationX", 11 },
-    { "translationY", 11 },
-    { "scaleX", 11 },
-    { "scaleY", 11 },
-    { "rotation", 11 },
-    { "rotationX", 11 },
-    { "rotationY", 11 },
-    { "showDividers", 11 },
-    { "dividerPadding", 11 },
-    { "borderlessButtonStyle", 11 },
-    { "dividerHorizontal", 11 },
-    { "itemPadding", 11 },
-    { "buttonBarStyle", 11 },
-    { "buttonBarButtonStyle", 11 },
-    { "segmentedButtonStyle", 11 },
-    { "staticWallpaperPreview", 11 },
-    { "allowParallelSyncs", 11 },
-    { "isAlwaysSyncable", 11 },
-    { "verticalScrollbarPosition", 11 },
-    { "fastScrollAlwaysVisible", 11 },
-    { "fastScrollThumbDrawable", 11 },
-    { "fastScrollPreviewBackgroundLeft", 11 },
-    { "fastScrollPreviewBackgroundRight", 11 },
-    { "fastScrollTrackDrawable", 11 },
-    { "fastScrollOverlayPosition", 11 },
-    { "customTokens", 11 },
-    { "nextFocusForward", 11 },
-    { "firstDayOfWeek", 11 },
-    { "showWeekNumber", 11 },
-    { "minDate", 11 },
-    { "maxDate", 11 },
-    { "shownWeekCount", 11 },
-    { "selectedWeekBackgroundColor", 11 },
-    { "focusedMonthDateColor", 11 },
-    { "unfocusedMonthDateColor", 11 },
-    { "weekNumberColor", 11 },
-    { "weekSeparatorLineColor", 11 },
-    { "selectedDateVerticalBar", 11 },
-    { "weekDayTextAppearance", 11 },
-    { "dateTextAppearance", 11 },
-    { "solidColor", 11 },
-    { "spinnersShown", 11 },
-    { "calendarViewShown", 11 },
-    { "state_multiline", 11 },
-    { "detailsElementBackground", 11 },
-    { "textColorHighlightInverse", 11 },
-    { "textColorLinkInverse", 11 },
-    { "editTextColor", 11 },
-    { "editTextBackground", 11 },
-    { "horizontalScrollViewStyle", 11 },
-    { "layerType", 11 },
-    { "alertDialogIcon", 11 },
-    { "windowMinWidthMajor", 11 },
-    { "windowMinWidthMinor", 11 },
-    { "queryHint", 11 },
-    { "fastScrollTextColor", 11 },
-    { "largeHeap", 11 },
-    { "windowCloseOnTouchOutside", 11 },
-    { "datePickerStyle", 11 },
-    { "calendarViewStyle", 11 },
-    { "textEditSidePasteWindowLayout", 11 },
-    { "textEditSideNoPasteWindowLayout", 11 },
-    { "actionMenuTextAppearance", 11 },
-    { "actionMenuTextColor", 11 },
-    { "textCursorDrawable", 12 },
-    { "resizeMode", 12 },
-    { "requiresSmallestWidthDp", 12 },
-    { "compatibleWidthLimitDp", 12 },
-    { "largestWidthLimitDp", 12 },
-    { "state_hovered", 13 },
-    { "state_drag_can_accept", 13 },
-    { "state_drag_hovered", 13 },
-    { "stopWithTask", 13 },
-    { "switchTextOn", 13 },
-    { "switchTextOff", 13 },
-    { "switchPreferenceStyle", 13 },
-    { "switchTextAppearance", 13 },
-    { "track", 13 },
-    { "switchMinWidth", 13 },
-    { "switchPadding", 13 },
-    { "thumbTextPadding", 13 },
-    { "textSuggestionsWindowStyle", 13 },
-    { "textEditSuggestionItemLayout", 13 },
-    { "rowCount", 13 },
-    { "rowOrderPreserved", 13 },
-    { "columnCount", 13 },
-    { "columnOrderPreserved", 13 },
-    { "useDefaultMargins", 13 },
-    { "alignmentMode", 13 },
-    { "layout_row", 13 },
-    { "layout_rowSpan", 13 },
-    { "layout_columnSpan", 13 },
-    { "actionModeSelectAllDrawable", 13 },
-    { "isAuxiliary", 13 },
-    { "accessibilityEventTypes", 13 },
-    { "packageNames", 13 },
-    { "accessibilityFeedbackType", 13 },
-    { "notificationTimeout", 13 },
-    { "accessibilityFlags", 13 },
-    { "canRetrieveWindowContent", 13 },
-    { "listPreferredItemHeightLarge", 13 },
-    { "listPreferredItemHeightSmall", 13 },
-    { "actionBarSplitStyle", 13 },
-    { "actionProviderClass", 13 },
-    { "backgroundStacked", 13 },
-    { "backgroundSplit", 13 },
-    { "textAllCaps", 13 },
-    { "colorPressedHighlight", 13 },
-    { "colorLongPressedHighlight", 13 },
-    { "colorFocusedHighlight", 13 },
-    { "colorActivatedHighlight", 13 },
-    { "colorMultiSelectHighlight", 13 },
-    { "drawableStart", 13 },
-    { "drawableEnd", 13 },
-    { "actionModeStyle", 13 },
-    { "minResizeWidth", 13 },
-    { "minResizeHeight", 13 },
-    { "actionBarWidgetTheme", 13 },
-    { "uiOptions", 13 },
-    { "subtypeLocale", 13 },
-    { "subtypeExtraValue", 13 },
-    { "actionBarDivider", 13 },
-    { "actionBarItemBackground", 13 },
-    { "actionModeSplitBackground", 13 },
-    { "textAppearanceListItem", 13 },
-    { "textAppearanceListItemSmall", 13 },
-    { "targetDescriptions", 13 },
-    { "directionDescriptions", 13 },
-    { "overridesImplicitlyEnabledSubtype", 13 },
-    { "listPreferredItemPaddingLeft", 13 },
-    { "listPreferredItemPaddingRight", 13 },
-    { "requiresFadingEdge", 13 },
-    { "publicKey", 13 },
-    { "parentActivityName", 16 },
-    { "isolatedProcess", 16 },
-    { "importantForAccessibility", 16 },
-    { "keyboardLayout", 16 },
-    { "fontFamily", 16 },
-    { "mediaRouteButtonStyle", 16 },
-    { "mediaRouteTypes", 16 },
-    { "supportsRtl", 17 },
-    { "textDirection", 17 },
-    { "textAlignment", 17 },
-    { "layoutDirection", 17 },
-    { "paddingStart", 17 },
-    { "paddingEnd", 17 },
-    { "layout_marginStart", 17 },
-    { "layout_marginEnd", 17 },
-    { "layout_toStartOf", 17 },
-    { "layout_toEndOf", 17 },
-    { "layout_alignStart", 17 },
-    { "layout_alignEnd", 17 },
-    { "layout_alignParentStart", 17 },
-    { "layout_alignParentEnd", 17 },
-    { "listPreferredItemPaddingStart", 17 },
-    { "listPreferredItemPaddingEnd", 17 },
-    { "singleUser", 17 },
-    { "presentationTheme", 17 },
-    { "subtypeId", 17 },
-    { "initialKeyguardLayout", 17 },
-    { "widgetCategory", 17 },
-    { "permissionGroupFlags", 17 },
-    { "labelFor", 17 },
-    { "permissionFlags", 17 },
-    { "checkedTextViewStyle", 17 },
-    { "showOnLockScreen", 17 },
-    { "format12Hour", 17 },
-    { "format24Hour", 17 },
-    { "timeZone", 17 },
-    { "mipMap", 18 },
-    { "mirrorForRtl", 18 },
-    { "windowOverscan", 18 },
-    { "requiredForAllUsers", 18 },
-    { "indicatorStart", 18 },
-    { "indicatorEnd", 18 },
-    { "childIndicatorStart", 18 },
-    { "childIndicatorEnd", 18 },
-    { "restrictedAccountType", 18 },
-    { "requiredAccountType", 18 },
-    { "canRequestTouchExplorationMode", 18 },
-    { "canRequestEnhancedWebAccessibility", 18 },
-    { "canRequestFilterKeyEvents", 18 },
-    { "layoutMode", 18 },
-    { "keySet", 19 },
-    { "targetId", 19 },
-    { "fromScene", 19 },
-    { "toScene", 19 },
-    { "transition", 19 },
-    { "transitionOrdering", 19 },
-    { "fadingMode", 19 },
-    { "startDelay", 19 },
-    { "ssp", 19 },
-    { "sspPrefix", 19 },
-    { "sspPattern", 19 },
-    { "addPrintersActivity", 19 },
-    { "vendor", 19 },
-    { "category", 19 },
-    { "isAsciiCapable", 19 },
-    { "autoMirrored", 19 },
-    { "supportsSwitchingToNextInputMethod", 19 },
-    { "requireDeviceUnlock", 19 },
-    { "apduServiceBanner", 19 },
-    { "accessibilityLiveRegion", 19 },
-    { "windowTranslucentStatus", 19 },
-    { "windowTranslucentNavigation", 19 },
-    { "advancedPrintOptionsActivity", 19 },
-    { "banner", 20 },
-    { "windowSwipeToDismiss", 20 },
-    { "isGame", 20 },
-    { "allowEmbedded", 20 },
-    { "setupActivity", 20 },
-    { "fastScrollStyle", 21 },
-    { "windowContentTransitions", 21 },
-    { "windowContentTransitionManager", 21 },
-    { "translationZ", 21 },
-    { "tintMode", 21 },
-    { "controlX1", 21 },
-    { "controlY1", 21 },
-    { "controlX2", 21 },
-    { "controlY2", 21 },
-    { "transitionName", 21 },
-    { "transitionGroup", 21 },
-    { "viewportWidth", 21 },
-    { "viewportHeight", 21 },
-    { "fillColor", 21 },
-    { "pathData", 21 },
-    { "strokeColor", 21 },
-    { "strokeWidth", 21 },
-    { "trimPathStart", 21 },
-    { "trimPathEnd", 21 },
-    { "trimPathOffset", 21 },
-    { "strokeLineCap", 21 },
-    { "strokeLineJoin", 21 },
-    { "strokeMiterLimit", 21 },
-    { "colorControlNormal", 21 },
-    { "colorControlActivated", 21 },
-    { "colorButtonNormal", 21 },
-    { "colorControlHighlight", 21 },
-    { "persistableMode", 21 },
-    { "titleTextAppearance", 21 },
-    { "subtitleTextAppearance", 21 },
-    { "slideEdge", 21 },
-    { "actionBarTheme", 21 },
-    { "textAppearanceListItemSecondary", 21 },
-    { "colorPrimary", 21 },
-    { "colorPrimaryDark", 21 },
-    { "colorAccent", 21 },
-    { "nestedScrollingEnabled", 21 },
-    { "windowEnterTransition", 21 },
-    { "windowExitTransition", 21 },
-    { "windowSharedElementEnterTransition", 21 },
-    { "windowSharedElementExitTransition", 21 },
-    { "windowAllowReturnTransitionOverlap", 21 },
-    { "windowAllowEnterTransitionOverlap", 21 },
-    { "sessionService", 21 },
-    { "stackViewStyle", 21 },
-    { "switchStyle", 21 },
-    { "elevation", 21 },
-    { "excludeId", 21 },
-    { "excludeClass", 21 },
-    { "hideOnContentScroll", 21 },
-    { "actionOverflowMenuStyle", 21 },
-    { "documentLaunchMode", 21 },
-    { "maxRecents", 21 },
-    { "autoRemoveFromRecents", 21 },
-    { "stateListAnimator", 21 },
-    { "toId", 21 },
-    { "fromId", 21 },
-    { "reversible", 21 },
-    { "splitTrack", 21 },
-    { "targetName", 21 },
-    { "excludeName", 21 },
-    { "matchOrder", 21 },
-    { "windowDrawsSystemBarBackgrounds", 21 },
-    { "statusBarColor", 21 },
-    { "navigationBarColor", 21 },
-    { "contentInsetStart", 21 },
-    { "contentInsetEnd", 21 },
-    { "contentInsetLeft", 21 },
-    { "contentInsetRight", 21 },
-    { "paddingMode", 21 },
-    { "layout_rowWeight", 21 },
-    { "layout_columnWeight", 21 },
-    { "translateX", 21 },
-    { "translateY", 21 },
-    { "selectableItemBackgroundBorderless", 21 },
-    { "elegantTextHeight", 21 },
-    { "searchKeyphraseId", 21 },
-    { "searchKeyphrase", 21 },
-    { "searchKeyphraseSupportedLocales", 21 },
-    { "windowTransitionBackgroundFadeDuration", 21 },
-    { "overlapAnchor", 21 },
-    { "progressTint", 21 },
-    { "progressTintMode", 21 },
-    { "progressBackgroundTint", 21 },
-    { "progressBackgroundTintMode", 21 },
-    { "secondaryProgressTint", 21 },
-    { "secondaryProgressTintMode", 21 },
-    { "indeterminateTint", 21 },
-    { "indeterminateTintMode", 21 },
-    { "backgroundTint", 21 },
-    { "backgroundTintMode", 21 },
-    { "foregroundTint", 21 },
-    { "foregroundTintMode", 21 },
-    { "buttonTint", 21 },
-    { "buttonTintMode", 21 },
-    { "thumbTint", 21 },
-    { "thumbTintMode", 21 },
-    { "fullBackupOnly", 21 },
-    { "propertyXName", 21 },
-    { "propertyYName", 21 },
-    { "relinquishTaskIdentity", 21 },
-    { "tileModeX", 21 },
-    { "tileModeY", 21 },
-    { "actionModeShareDrawable", 21 },
-    { "actionModeFindDrawable", 21 },
-    { "actionModeWebSearchDrawable", 21 },
-    { "transitionVisibilityMode", 21 },
-    { "minimumHorizontalAngle", 21 },
-    { "minimumVerticalAngle", 21 },
-    { "maximumAngle", 21 },
-    { "searchViewStyle", 21 },
-    { "closeIcon", 21 },
-    { "goIcon", 21 },
-    { "searchIcon", 21 },
-    { "voiceIcon", 21 },
-    { "commitIcon", 21 },
-    { "suggestionRowLayout", 21 },
-    { "queryBackground", 21 },
-    { "submitBackground", 21 },
-    { "buttonBarPositiveButtonStyle", 21 },
-    { "buttonBarNeutralButtonStyle", 21 },
-    { "buttonBarNegativeButtonStyle", 21 },
-    { "popupElevation", 21 },
-    { "actionBarPopupTheme", 21 },
-    { "multiArch", 21 },
-    { "touchscreenBlocksFocus", 21 },
-    { "windowElevation", 21 },
-    { "launchTaskBehindTargetAnimation", 21 },
-    { "launchTaskBehindSourceAnimation", 21 },
-    { "restrictionType", 21 },
-    { "dayOfWeekBackground", 21 },
-    { "dayOfWeekTextAppearance", 21 },
-    { "headerMonthTextAppearance", 21 },
-    { "headerDayOfMonthTextAppearance", 21 },
-    { "headerYearTextAppearance", 21 },
-    { "yearListItemTextAppearance", 21 },
-    { "yearListSelectorColor", 21 },
-    { "calendarTextColor", 21 },
-    { "recognitionService", 21 },
-    { "timePickerStyle", 21 },
-    { "timePickerDialogTheme", 21 },
-    { "headerTimeTextAppearance", 21 },
-    { "headerAmPmTextAppearance", 21 },
-    { "numbersTextColor", 21 },
-    { "numbersBackgroundColor", 21 },
-    { "numbersSelectorColor", 21 },
-    { "amPmTextColor", 21 },
-    { "amPmBackgroundColor", 21 },
-    { "searchKeyphraseRecognitionFlags", 21 },
-    { "checkMarkTint", 21 },
-    { "checkMarkTintMode", 21 },
-    { "popupTheme", 21 },
-    { "toolbarStyle", 21 },
-    { "windowClipToOutline", 21 },
-    { "datePickerDialogTheme", 21 },
-    { "showText", 21 },
-    { "windowReturnTransition", 21 },
-    { "windowReenterTransition", 21 },
-    { "windowSharedElementReturnTransition", 21 },
-    { "windowSharedElementReenterTransition", 21 },
-    { "resumeWhilePausing", 21 },
-    { "datePickerMode", 21 },
-    { "timePickerMode", 21 },
-    { "inset", 21 },
-    { "letterSpacing", 21 },
-    { "fontFeatureSettings", 21 },
-    { "outlineProvider", 21 },
-    { "contentAgeHint", 21 },
-    { "country", 21 },
-    { "windowSharedElementsUseOverlay", 21 },
-    { "reparent", 21 },
-    { "reparentWithOverlay", 21 },
-    { "ambientShadowAlpha", 21 },
-    { "spotShadowAlpha", 21 },
-    { "navigationIcon", 21 },
-    { "navigationContentDescription", 21 },
-    { "fragmentExitTransition", 21 },
-    { "fragmentEnterTransition", 21 },
-    { "fragmentSharedElementEnterTransition", 21 },
-    { "fragmentReturnTransition", 21 },
-    { "fragmentSharedElementReturnTransition", 21 },
-    { "fragmentReenterTransition", 21 },
-    { "fragmentAllowEnterTransitionOverlap", 21 },
-    { "fragmentAllowReturnTransitionOverlap", 21 },
-    { "patternPathData", 21 },
-    { "strokeAlpha", 21 },
-    { "fillAlpha", 21 },
-    { "windowActivityTransitions", 21 },
-    { "colorEdgeEffect", 21 }
-};
+    {"marqueeRepeatLimit", 2},
+    {"windowNoDisplay", 3},
+    {"backgroundDimEnabled", 3},
+    {"inputType", 3},
+    {"isDefault", 3},
+    {"windowDisablePreview", 3},
+    {"privateImeOptions", 3},
+    {"editorExtras", 3},
+    {"settingsActivity", 3},
+    {"fastScrollEnabled", 3},
+    {"reqTouchScreen", 3},
+    {"reqKeyboardType", 3},
+    {"reqHardKeyboard", 3},
+    {"reqNavigation", 3},
+    {"windowSoftInputMode", 3},
+    {"imeFullscreenBackground", 3},
+    {"noHistory", 3},
+    {"headerDividersEnabled", 3},
+    {"footerDividersEnabled", 3},
+    {"candidatesTextStyleSpans", 3},
+    {"smoothScrollbar", 3},
+    {"reqFiveWayNav", 3},
+    {"keyBackground", 3},
+    {"keyTextSize", 3},
+    {"labelTextSize", 3},
+    {"keyTextColor", 3},
+    {"keyPreviewLayout", 3},
+    {"keyPreviewOffset", 3},
+    {"keyPreviewHeight", 3},
+    {"verticalCorrection", 3},
+    {"popupLayout", 3},
+    {"state_long_pressable", 3},
+    {"keyWidth", 3},
+    {"keyHeight", 3},
+    {"horizontalGap", 3},
+    {"verticalGap", 3},
+    {"rowEdgeFlags", 3},
+    {"codes", 3},
+    {"popupKeyboard", 3},
+    {"popupCharacters", 3},
+    {"keyEdgeFlags", 3},
+    {"isModifier", 3},
+    {"isSticky", 3},
+    {"isRepeatable", 3},
+    {"iconPreview", 3},
+    {"keyOutputText", 3},
+    {"keyLabel", 3},
+    {"keyIcon", 3},
+    {"keyboardMode", 3},
+    {"isScrollContainer", 3},
+    {"fillEnabled", 3},
+    {"updatePeriodMillis", 3},
+    {"initialLayout", 3},
+    {"voiceSearchMode", 3},
+    {"voiceLanguageModel", 3},
+    {"voicePromptText", 3},
+    {"voiceLanguage", 3},
+    {"voiceMaxResults", 3},
+    {"bottomOffset", 3},
+    {"topOffset", 3},
+    {"allowSingleTap", 3},
+    {"handle", 3},
+    {"content", 3},
+    {"animateOnClick", 3},
+    {"configure", 3},
+    {"hapticFeedbackEnabled", 3},
+    {"innerRadius", 3},
+    {"thickness", 3},
+    {"sharedUserLabel", 3},
+    {"dropDownWidth", 3},
+    {"dropDownAnchor", 3},
+    {"imeOptions", 3},
+    {"imeActionLabel", 3},
+    {"imeActionId", 3},
+    {"imeExtractEnterAnimation", 3},
+    {"imeExtractExitAnimation", 3},
+    {"tension", 4},
+    {"extraTension", 4},
+    {"anyDensity", 4},
+    {"searchSuggestThreshold", 4},
+    {"includeInGlobalSearch", 4},
+    {"onClick", 4},
+    {"targetSdkVersion", 4},
+    {"maxSdkVersion", 4},
+    {"testOnly", 4},
+    {"contentDescription", 4},
+    {"gestureStrokeWidth", 4},
+    {"gestureColor", 4},
+    {"uncertainGestureColor", 4},
+    {"fadeOffset", 4},
+    {"fadeDuration", 4},
+    {"gestureStrokeType", 4},
+    {"gestureStrokeLengthThreshold", 4},
+    {"gestureStrokeSquarenessThreshold", 4},
+    {"gestureStrokeAngleThreshold", 4},
+    {"eventsInterceptionEnabled", 4},
+    {"fadeEnabled", 4},
+    {"backupAgent", 4},
+    {"allowBackup", 4},
+    {"glEsVersion", 4},
+    {"queryAfterZeroResults", 4},
+    {"dropDownHeight", 4},
+    {"smallScreens", 4},
+    {"normalScreens", 4},
+    {"largeScreens", 4},
+    {"progressBarStyleInverse", 4},
+    {"progressBarStyleSmallInverse", 4},
+    {"progressBarStyleLargeInverse", 4},
+    {"searchSettingsDescription", 4},
+    {"textColorPrimaryInverseDisableOnly", 4},
+    {"autoUrlDetect", 4},
+    {"resizeable", 4},
+    {"required", 5},
+    {"accountType", 5},
+    {"contentAuthority", 5},
+    {"userVisible", 5},
+    {"windowShowWallpaper", 5},
+    {"wallpaperOpenEnterAnimation", 5},
+    {"wallpaperOpenExitAnimation", 5},
+    {"wallpaperCloseEnterAnimation", 5},
+    {"wallpaperCloseExitAnimation", 5},
+    {"wallpaperIntraOpenEnterAnimation", 5},
+    {"wallpaperIntraOpenExitAnimation", 5},
+    {"wallpaperIntraCloseEnterAnimation", 5},
+    {"wallpaperIntraCloseExitAnimation", 5},
+    {"supportsUploading", 5},
+    {"killAfterRestore", 5},
+    {"restoreNeedsApplication", 5},
+    {"smallIcon", 5},
+    {"accountPreferences", 5},
+    {"textAppearanceSearchResultSubtitle", 5},
+    {"textAppearanceSearchResultTitle", 5},
+    {"summaryColumn", 5},
+    {"detailColumn", 5},
+    {"detailSocialSummary", 5},
+    {"thumbnail", 5},
+    {"detachWallpaper", 5},
+    {"finishOnCloseSystemDialogs", 5},
+    {"scrollbarFadeDuration", 5},
+    {"scrollbarDefaultDelayBeforeFade", 5},
+    {"fadeScrollbars", 5},
+    {"colorBackgroundCacheHint", 5},
+    {"dropDownHorizontalOffset", 5},
+    {"dropDownVerticalOffset", 5},
+    {"quickContactBadgeStyleWindowSmall", 6},
+    {"quickContactBadgeStyleWindowMedium", 6},
+    {"quickContactBadgeStyleWindowLarge", 6},
+    {"quickContactBadgeStyleSmallWindowSmall", 6},
+    {"quickContactBadgeStyleSmallWindowMedium", 6},
+    {"quickContactBadgeStyleSmallWindowLarge", 6},
+    {"author", 7},
+    {"autoStart", 7},
+    {"expandableListViewWhiteStyle", 8},
+    {"installLocation", 8},
+    {"vmSafeMode", 8},
+    {"webTextViewStyle", 8},
+    {"restoreAnyVersion", 8},
+    {"tabStripLeft", 8},
+    {"tabStripRight", 8},
+    {"tabStripEnabled", 8},
+    {"logo", 9},
+    {"xlargeScreens", 9},
+    {"immersive", 9},
+    {"overScrollMode", 9},
+    {"overScrollHeader", 9},
+    {"overScrollFooter", 9},
+    {"filterTouchesWhenObscured", 9},
+    {"textSelectHandleLeft", 9},
+    {"textSelectHandleRight", 9},
+    {"textSelectHandle", 9},
+    {"textSelectHandleWindowStyle", 9},
+    {"popupAnimationStyle", 9},
+    {"screenSize", 9},
+    {"screenDensity", 9},
+    {"allContactsName", 11},
+    {"windowActionBar", 11},
+    {"actionBarStyle", 11},
+    {"navigationMode", 11},
+    {"displayOptions", 11},
+    {"subtitle", 11},
+    {"customNavigationLayout", 11},
+    {"hardwareAccelerated", 11},
+    {"measureWithLargestChild", 11},
+    {"animateFirstView", 11},
+    {"dropDownSpinnerStyle", 11},
+    {"actionDropDownStyle", 11},
+    {"actionButtonStyle", 11},
+    {"showAsAction", 11},
+    {"previewImage", 11},
+    {"actionModeBackground", 11},
+    {"actionModeCloseDrawable", 11},
+    {"windowActionModeOverlay", 11},
+    {"valueFrom", 11},
+    {"valueTo", 11},
+    {"valueType", 11},
+    {"propertyName", 11},
+    {"ordering", 11},
+    {"fragment", 11},
+    {"windowActionBarOverlay", 11},
+    {"fragmentOpenEnterAnimation", 11},
+    {"fragmentOpenExitAnimation", 11},
+    {"fragmentCloseEnterAnimation", 11},
+    {"fragmentCloseExitAnimation", 11},
+    {"fragmentFadeEnterAnimation", 11},
+    {"fragmentFadeExitAnimation", 11},
+    {"actionBarSize", 11},
+    {"imeSubtypeLocale", 11},
+    {"imeSubtypeMode", 11},
+    {"imeSubtypeExtraValue", 11},
+    {"splitMotionEvents", 11},
+    {"listChoiceBackgroundIndicator", 11},
+    {"spinnerMode", 11},
+    {"animateLayoutChanges", 11},
+    {"actionBarTabStyle", 11},
+    {"actionBarTabBarStyle", 11},
+    {"actionBarTabTextStyle", 11},
+    {"actionOverflowButtonStyle", 11},
+    {"actionModeCloseButtonStyle", 11},
+    {"titleTextStyle", 11},
+    {"subtitleTextStyle", 11},
+    {"iconifiedByDefault", 11},
+    {"actionLayout", 11},
+    {"actionViewClass", 11},
+    {"activatedBackgroundIndicator", 11},
+    {"state_activated", 11},
+    {"listPopupWindowStyle", 11},
+    {"popupMenuStyle", 11},
+    {"textAppearanceLargePopupMen", 11},
+    {"textAppearanceSmallPopupMen", 11},
+    {"breadCrumbTitle", 11},
+    {"breadCrumbShortTitle", 11},
+    {"listDividerAlertDialog", 11},
+    {"textColorAlertDialogListItem", 11},
+    {"loopViews", 11},
+    {"dialogTheme", 11},
+    {"alertDialogTheme", 11},
+    {"dividerVertical", 11},
+    {"homeAsUpIndicator", 11},
+    {"enterFadeDuration", 11},
+    {"exitFadeDuration", 11},
+    {"selectableItemBackground", 11},
+    {"autoAdvanceViewId", 11},
+    {"useIntrinsicSizeAsMinimum", 11},
+    {"actionModeCutDrawable", 11},
+    {"actionModeCopyDrawable", 11},
+    {"actionModePasteDrawable", 11},
+    {"textEditPasteWindowLayout", 11},
+    {"textEditNoPasteWindowLayout", 11},
+    {"textIsSelectable", 11},
+    {"windowEnableSplitTouch", 11},
+    {"indeterminateProgressStyle", 11},
+    {"progressBarPadding", 11},
+    {"animationResolution", 11},
+    {"state_accelerated", 11},
+    {"baseline", 11},
+    {"homeLayout", 11},
+    {"opacity", 11},
+    {"alpha", 11},
+    {"transformPivotX", 11},
+    {"transformPivotY", 11},
+    {"translationX", 11},
+    {"translationY", 11},
+    {"scaleX", 11},
+    {"scaleY", 11},
+    {"rotation", 11},
+    {"rotationX", 11},
+    {"rotationY", 11},
+    {"showDividers", 11},
+    {"dividerPadding", 11},
+    {"borderlessButtonStyle", 11},
+    {"dividerHorizontal", 11},
+    {"itemPadding", 11},
+    {"buttonBarStyle", 11},
+    {"buttonBarButtonStyle", 11},
+    {"segmentedButtonStyle", 11},
+    {"staticWallpaperPreview", 11},
+    {"allowParallelSyncs", 11},
+    {"isAlwaysSyncable", 11},
+    {"verticalScrollbarPosition", 11},
+    {"fastScrollAlwaysVisible", 11},
+    {"fastScrollThumbDrawable", 11},
+    {"fastScrollPreviewBackgroundLeft", 11},
+    {"fastScrollPreviewBackgroundRight", 11},
+    {"fastScrollTrackDrawable", 11},
+    {"fastScrollOverlayPosition", 11},
+    {"customTokens", 11},
+    {"nextFocusForward", 11},
+    {"firstDayOfWeek", 11},
+    {"showWeekNumber", 11},
+    {"minDate", 11},
+    {"maxDate", 11},
+    {"shownWeekCount", 11},
+    {"selectedWeekBackgroundColor", 11},
+    {"focusedMonthDateColor", 11},
+    {"unfocusedMonthDateColor", 11},
+    {"weekNumberColor", 11},
+    {"weekSeparatorLineColor", 11},
+    {"selectedDateVerticalBar", 11},
+    {"weekDayTextAppearance", 11},
+    {"dateTextAppearance", 11},
+    {"solidColor", 11},
+    {"spinnersShown", 11},
+    {"calendarViewShown", 11},
+    {"state_multiline", 11},
+    {"detailsElementBackground", 11},
+    {"textColorHighlightInverse", 11},
+    {"textColorLinkInverse", 11},
+    {"editTextColor", 11},
+    {"editTextBackground", 11},
+    {"horizontalScrollViewStyle", 11},
+    {"layerType", 11},
+    {"alertDialogIcon", 11},
+    {"windowMinWidthMajor", 11},
+    {"windowMinWidthMinor", 11},
+    {"queryHint", 11},
+    {"fastScrollTextColor", 11},
+    {"largeHeap", 11},
+    {"windowCloseOnTouchOutside", 11},
+    {"datePickerStyle", 11},
+    {"calendarViewStyle", 11},
+    {"textEditSidePasteWindowLayout", 11},
+    {"textEditSideNoPasteWindowLayout", 11},
+    {"actionMenuTextAppearance", 11},
+    {"actionMenuTextColor", 11},
+    {"textCursorDrawable", 12},
+    {"resizeMode", 12},
+    {"requiresSmallestWidthDp", 12},
+    {"compatibleWidthLimitDp", 12},
+    {"largestWidthLimitDp", 12},
+    {"state_hovered", 13},
+    {"state_drag_can_accept", 13},
+    {"state_drag_hovered", 13},
+    {"stopWithTask", 13},
+    {"switchTextOn", 13},
+    {"switchTextOff", 13},
+    {"switchPreferenceStyle", 13},
+    {"switchTextAppearance", 13},
+    {"track", 13},
+    {"switchMinWidth", 13},
+    {"switchPadding", 13},
+    {"thumbTextPadding", 13},
+    {"textSuggestionsWindowStyle", 13},
+    {"textEditSuggestionItemLayout", 13},
+    {"rowCount", 13},
+    {"rowOrderPreserved", 13},
+    {"columnCount", 13},
+    {"columnOrderPreserved", 13},
+    {"useDefaultMargins", 13},
+    {"alignmentMode", 13},
+    {"layout_row", 13},
+    {"layout_rowSpan", 13},
+    {"layout_columnSpan", 13},
+    {"actionModeSelectAllDrawable", 13},
+    {"isAuxiliary", 13},
+    {"accessibilityEventTypes", 13},
+    {"packageNames", 13},
+    {"accessibilityFeedbackType", 13},
+    {"notificationTimeout", 13},
+    {"accessibilityFlags", 13},
+    {"canRetrieveWindowContent", 13},
+    {"listPreferredItemHeightLarge", 13},
+    {"listPreferredItemHeightSmall", 13},
+    {"actionBarSplitStyle", 13},
+    {"actionProviderClass", 13},
+    {"backgroundStacked", 13},
+    {"backgroundSplit", 13},
+    {"textAllCaps", 13},
+    {"colorPressedHighlight", 13},
+    {"colorLongPressedHighlight", 13},
+    {"colorFocusedHighlight", 13},
+    {"colorActivatedHighlight", 13},
+    {"colorMultiSelectHighlight", 13},
+    {"drawableStart", 13},
+    {"drawableEnd", 13},
+    {"actionModeStyle", 13},
+    {"minResizeWidth", 13},
+    {"minResizeHeight", 13},
+    {"actionBarWidgetTheme", 13},
+    {"uiOptions", 13},
+    {"subtypeLocale", 13},
+    {"subtypeExtraValue", 13},
+    {"actionBarDivider", 13},
+    {"actionBarItemBackground", 13},
+    {"actionModeSplitBackground", 13},
+    {"textAppearanceListItem", 13},
+    {"textAppearanceListItemSmall", 13},
+    {"targetDescriptions", 13},
+    {"directionDescriptions", 13},
+    {"overridesImplicitlyEnabledSubtype", 13},
+    {"listPreferredItemPaddingLeft", 13},
+    {"listPreferredItemPaddingRight", 13},
+    {"requiresFadingEdge", 13},
+    {"publicKey", 13},
+    {"parentActivityName", 16},
+    {"isolatedProcess", 16},
+    {"importantForAccessibility", 16},
+    {"keyboardLayout", 16},
+    {"fontFamily", 16},
+    {"mediaRouteButtonStyle", 16},
+    {"mediaRouteTypes", 16},
+    {"supportsRtl", 17},
+    {"textDirection", 17},
+    {"textAlignment", 17},
+    {"layoutDirection", 17},
+    {"paddingStart", 17},
+    {"paddingEnd", 17},
+    {"layout_marginStart", 17},
+    {"layout_marginEnd", 17},
+    {"layout_toStartOf", 17},
+    {"layout_toEndOf", 17},
+    {"layout_alignStart", 17},
+    {"layout_alignEnd", 17},
+    {"layout_alignParentStart", 17},
+    {"layout_alignParentEnd", 17},
+    {"listPreferredItemPaddingStart", 17},
+    {"listPreferredItemPaddingEnd", 17},
+    {"singleUser", 17},
+    {"presentationTheme", 17},
+    {"subtypeId", 17},
+    {"initialKeyguardLayout", 17},
+    {"widgetCategory", 17},
+    {"permissionGroupFlags", 17},
+    {"labelFor", 17},
+    {"permissionFlags", 17},
+    {"checkedTextViewStyle", 17},
+    {"showOnLockScreen", 17},
+    {"format12Hour", 17},
+    {"format24Hour", 17},
+    {"timeZone", 17},
+    {"mipMap", 18},
+    {"mirrorForRtl", 18},
+    {"windowOverscan", 18},
+    {"requiredForAllUsers", 18},
+    {"indicatorStart", 18},
+    {"indicatorEnd", 18},
+    {"childIndicatorStart", 18},
+    {"childIndicatorEnd", 18},
+    {"restrictedAccountType", 18},
+    {"requiredAccountType", 18},
+    {"canRequestTouchExplorationMode", 18},
+    {"canRequestEnhancedWebAccessibility", 18},
+    {"canRequestFilterKeyEvents", 18},
+    {"layoutMode", 18},
+    {"keySet", 19},
+    {"targetId", 19},
+    {"fromScene", 19},
+    {"toScene", 19},
+    {"transition", 19},
+    {"transitionOrdering", 19},
+    {"fadingMode", 19},
+    {"startDelay", 19},
+    {"ssp", 19},
+    {"sspPrefix", 19},
+    {"sspPattern", 19},
+    {"addPrintersActivity", 19},
+    {"vendor", 19},
+    {"category", 19},
+    {"isAsciiCapable", 19},
+    {"autoMirrored", 19},
+    {"supportsSwitchingToNextInputMethod", 19},
+    {"requireDeviceUnlock", 19},
+    {"apduServiceBanner", 19},
+    {"accessibilityLiveRegion", 19},
+    {"windowTranslucentStatus", 19},
+    {"windowTranslucentNavigation", 19},
+    {"advancedPrintOptionsActivity", 19},
+    {"banner", 20},
+    {"windowSwipeToDismiss", 20},
+    {"isGame", 20},
+    {"allowEmbedded", 20},
+    {"setupActivity", 20},
+    {"fastScrollStyle", 21},
+    {"windowContentTransitions", 21},
+    {"windowContentTransitionManager", 21},
+    {"translationZ", 21},
+    {"tintMode", 21},
+    {"controlX1", 21},
+    {"controlY1", 21},
+    {"controlX2", 21},
+    {"controlY2", 21},
+    {"transitionName", 21},
+    {"transitionGroup", 21},
+    {"viewportWidth", 21},
+    {"viewportHeight", 21},
+    {"fillColor", 21},
+    {"pathData", 21},
+    {"strokeColor", 21},
+    {"strokeWidth", 21},
+    {"trimPathStart", 21},
+    {"trimPathEnd", 21},
+    {"trimPathOffset", 21},
+    {"strokeLineCap", 21},
+    {"strokeLineJoin", 21},
+    {"strokeMiterLimit", 21},
+    {"colorControlNormal", 21},
+    {"colorControlActivated", 21},
+    {"colorButtonNormal", 21},
+    {"colorControlHighlight", 21},
+    {"persistableMode", 21},
+    {"titleTextAppearance", 21},
+    {"subtitleTextAppearance", 21},
+    {"slideEdge", 21},
+    {"actionBarTheme", 21},
+    {"textAppearanceListItemSecondary", 21},
+    {"colorPrimary", 21},
+    {"colorPrimaryDark", 21},
+    {"colorAccent", 21},
+    {"nestedScrollingEnabled", 21},
+    {"windowEnterTransition", 21},
+    {"windowExitTransition", 21},
+    {"windowSharedElementEnterTransition", 21},
+    {"windowSharedElementExitTransition", 21},
+    {"windowAllowReturnTransitionOverlap", 21},
+    {"windowAllowEnterTransitionOverlap", 21},
+    {"sessionService", 21},
+    {"stackViewStyle", 21},
+    {"switchStyle", 21},
+    {"elevation", 21},
+    {"excludeId", 21},
+    {"excludeClass", 21},
+    {"hideOnContentScroll", 21},
+    {"actionOverflowMenuStyle", 21},
+    {"documentLaunchMode", 21},
+    {"maxRecents", 21},
+    {"autoRemoveFromRecents", 21},
+    {"stateListAnimator", 21},
+    {"toId", 21},
+    {"fromId", 21},
+    {"reversible", 21},
+    {"splitTrack", 21},
+    {"targetName", 21},
+    {"excludeName", 21},
+    {"matchOrder", 21},
+    {"windowDrawsSystemBarBackgrounds", 21},
+    {"statusBarColor", 21},
+    {"navigationBarColor", 21},
+    {"contentInsetStart", 21},
+    {"contentInsetEnd", 21},
+    {"contentInsetLeft", 21},
+    {"contentInsetRight", 21},
+    {"paddingMode", 21},
+    {"layout_rowWeight", 21},
+    {"layout_columnWeight", 21},
+    {"translateX", 21},
+    {"translateY", 21},
+    {"selectableItemBackgroundBorderless", 21},
+    {"elegantTextHeight", 21},
+    {"searchKeyphraseId", 21},
+    {"searchKeyphrase", 21},
+    {"searchKeyphraseSupportedLocales", 21},
+    {"windowTransitionBackgroundFadeDuration", 21},
+    {"overlapAnchor", 21},
+    {"progressTint", 21},
+    {"progressTintMode", 21},
+    {"progressBackgroundTint", 21},
+    {"progressBackgroundTintMode", 21},
+    {"secondaryProgressTint", 21},
+    {"secondaryProgressTintMode", 21},
+    {"indeterminateTint", 21},
+    {"indeterminateTintMode", 21},
+    {"backgroundTint", 21},
+    {"backgroundTintMode", 21},
+    {"foregroundTint", 21},
+    {"foregroundTintMode", 21},
+    {"buttonTint", 21},
+    {"buttonTintMode", 21},
+    {"thumbTint", 21},
+    {"thumbTintMode", 21},
+    {"fullBackupOnly", 21},
+    {"propertyXName", 21},
+    {"propertyYName", 21},
+    {"relinquishTaskIdentity", 21},
+    {"tileModeX", 21},
+    {"tileModeY", 21},
+    {"actionModeShareDrawable", 21},
+    {"actionModeFindDrawable", 21},
+    {"actionModeWebSearchDrawable", 21},
+    {"transitionVisibilityMode", 21},
+    {"minimumHorizontalAngle", 21},
+    {"minimumVerticalAngle", 21},
+    {"maximumAngle", 21},
+    {"searchViewStyle", 21},
+    {"closeIcon", 21},
+    {"goIcon", 21},
+    {"searchIcon", 21},
+    {"voiceIcon", 21},
+    {"commitIcon", 21},
+    {"suggestionRowLayout", 21},
+    {"queryBackground", 21},
+    {"submitBackground", 21},
+    {"buttonBarPositiveButtonStyle", 21},
+    {"buttonBarNeutralButtonStyle", 21},
+    {"buttonBarNegativeButtonStyle", 21},
+    {"popupElevation", 21},
+    {"actionBarPopupTheme", 21},
+    {"multiArch", 21},
+    {"touchscreenBlocksFocus", 21},
+    {"windowElevation", 21},
+    {"launchTaskBehindTargetAnimation", 21},
+    {"launchTaskBehindSourceAnimation", 21},
+    {"restrictionType", 21},
+    {"dayOfWeekBackground", 21},
+    {"dayOfWeekTextAppearance", 21},
+    {"headerMonthTextAppearance", 21},
+    {"headerDayOfMonthTextAppearance", 21},
+    {"headerYearTextAppearance", 21},
+    {"yearListItemTextAppearance", 21},
+    {"yearListSelectorColor", 21},
+    {"calendarTextColor", 21},
+    {"recognitionService", 21},
+    {"timePickerStyle", 21},
+    {"timePickerDialogTheme", 21},
+    {"headerTimeTextAppearance", 21},
+    {"headerAmPmTextAppearance", 21},
+    {"numbersTextColor", 21},
+    {"numbersBackgroundColor", 21},
+    {"numbersSelectorColor", 21},
+    {"amPmTextColor", 21},
+    {"amPmBackgroundColor", 21},
+    {"searchKeyphraseRecognitionFlags", 21},
+    {"checkMarkTint", 21},
+    {"checkMarkTintMode", 21},
+    {"popupTheme", 21},
+    {"toolbarStyle", 21},
+    {"windowClipToOutline", 21},
+    {"datePickerDialogTheme", 21},
+    {"showText", 21},
+    {"windowReturnTransition", 21},
+    {"windowReenterTransition", 21},
+    {"windowSharedElementReturnTransition", 21},
+    {"windowSharedElementReenterTransition", 21},
+    {"resumeWhilePausing", 21},
+    {"datePickerMode", 21},
+    {"timePickerMode", 21},
+    {"inset", 21},
+    {"letterSpacing", 21},
+    {"fontFeatureSettings", 21},
+    {"outlineProvider", 21},
+    {"contentAgeHint", 21},
+    {"country", 21},
+    {"windowSharedElementsUseOverlay", 21},
+    {"reparent", 21},
+    {"reparentWithOverlay", 21},
+    {"ambientShadowAlpha", 21},
+    {"spotShadowAlpha", 21},
+    {"navigationIcon", 21},
+    {"navigationContentDescription", 21},
+    {"fragmentExitTransition", 21},
+    {"fragmentEnterTransition", 21},
+    {"fragmentSharedElementEnterTransition", 21},
+    {"fragmentReturnTransition", 21},
+    {"fragmentSharedElementReturnTransition", 21},
+    {"fragmentReenterTransition", 21},
+    {"fragmentAllowEnterTransitionOverlap", 21},
+    {"fragmentAllowReturnTransitionOverlap", 21},
+    {"patternPathData", 21},
+    {"strokeAlpha", 21},
+    {"fillAlpha", 21},
+    {"windowActivityTransitions", 21},
+    {"colorEdgeEffect", 21}};
 
 size_t findAttributeSdkLevel(const ResourceName& name) {
-    if (name.package != "android" && name.type != ResourceType::kAttr) {
-        return 0;
-    }
+  if (name.package != "android" && name.type != ResourceType::kAttr) {
+    return 0;
+  }
 
-    auto iter = sAttrMap.find(name.entry);
-    if (iter != sAttrMap.end()) {
-        return iter->second;
-    }
-    return SDK_LOLLIPOP_MR1;
+  auto iter = sAttrMap.find(name.entry);
+  if (iter != sAttrMap.end()) {
+    return iter->second;
+  }
+  return SDK_LOLLIPOP_MR1;
 }
 
 std::pair<StringPiece, int> getDevelopmentSdkCodeNameAndVersion() {
-    return std::make_pair(StringPiece(sDevelopmentSdkCodeName), sDevelopmentSdkLevel);
+  return std::make_pair(StringPiece(sDevelopmentSdkCodeName),
+                        sDevelopmentSdkLevel);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index c9dbdca..bd17fe4 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -24,33 +24,33 @@
 namespace aapt {
 
 enum {
-    SDK_CUPCAKE = 3,
-    SDK_DONUT = 4,
-    SDK_ECLAIR = 5,
-    SDK_ECLAIR_0_1 = 6,
-    SDK_ECLAIR_MR1 = 7,
-    SDK_FROYO = 8,
-    SDK_GINGERBREAD = 9,
-    SDK_GINGERBREAD_MR1 = 10,
-    SDK_HONEYCOMB = 11,
-    SDK_HONEYCOMB_MR1 = 12,
-    SDK_HONEYCOMB_MR2 = 13,
-    SDK_ICE_CREAM_SANDWICH = 14,
-    SDK_ICE_CREAM_SANDWICH_MR1 = 15,
-    SDK_JELLY_BEAN = 16,
-    SDK_JELLY_BEAN_MR1 = 17,
-    SDK_JELLY_BEAN_MR2 = 18,
-    SDK_KITKAT = 19,
-    SDK_KITKAT_WATCH = 20,
-    SDK_LOLLIPOP = 21,
-    SDK_LOLLIPOP_MR1 = 22,
-    SDK_MARSHMALLOW = 23,
+  SDK_CUPCAKE = 3,
+  SDK_DONUT = 4,
+  SDK_ECLAIR = 5,
+  SDK_ECLAIR_0_1 = 6,
+  SDK_ECLAIR_MR1 = 7,
+  SDK_FROYO = 8,
+  SDK_GINGERBREAD = 9,
+  SDK_GINGERBREAD_MR1 = 10,
+  SDK_HONEYCOMB = 11,
+  SDK_HONEYCOMB_MR1 = 12,
+  SDK_HONEYCOMB_MR2 = 13,
+  SDK_ICE_CREAM_SANDWICH = 14,
+  SDK_ICE_CREAM_SANDWICH_MR1 = 15,
+  SDK_JELLY_BEAN = 16,
+  SDK_JELLY_BEAN_MR1 = 17,
+  SDK_JELLY_BEAN_MR2 = 18,
+  SDK_KITKAT = 19,
+  SDK_KITKAT_WATCH = 20,
+  SDK_LOLLIPOP = 21,
+  SDK_LOLLIPOP_MR1 = 22,
+  SDK_MARSHMALLOW = 23,
 };
 
 size_t findAttributeSdkLevel(const ResourceId& id);
 size_t findAttributeSdkLevel(const ResourceName& name);
 std::pair<StringPiece, int> getDevelopmentSdkCodeNameAndVersion();
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_SDK_CONSTANTS_H
+#endif  // AAPT_SDK_CONSTANTS_H
diff --git a/tools/aapt2/SdkConstants_test.cpp b/tools/aapt2/SdkConstants_test.cpp
index e81f412..3b70acb 100644
--- a/tools/aapt2/SdkConstants_test.cpp
+++ b/tools/aapt2/SdkConstants_test.cpp
@@ -21,18 +21,18 @@
 namespace aapt {
 
 TEST(SdkConstantsTest, FirstAttributeIsSdk1) {
-    EXPECT_EQ(1u, findAttributeSdkLevel(ResourceId(0x01010000)));
+  EXPECT_EQ(1u, findAttributeSdkLevel(ResourceId(0x01010000)));
 }
 
 TEST(SdkConstantsTest, AllAttributesAfterLollipopAreLollipopMR1) {
-    EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010103f7)));
-    EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010104ce)));
+  EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010103f7)));
+  EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010104ce)));
 
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104cf)));
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d8)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104cf)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d8)));
 
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d9)));
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x0101ffff)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d9)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x0101ffff)));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Source.h b/tools/aapt2/Source.h
index 8a1021d..422b361 100644
--- a/tools/aapt2/Source.h
+++ b/tools/aapt2/Source.h
@@ -30,20 +30,19 @@
  * showing errors.
  */
 struct Source {
-    std::string path;
-    Maybe<size_t> line;
+  std::string path;
+  Maybe<size_t> line;
 
-    Source() = default;
+  Source() = default;
 
-    inline Source(const StringPiece& path) : path(path.toString()) {  // NOLINT(implicit)
-    }
+  inline Source(const StringPiece& path)
+      : path(path.toString()) {  // NOLINT(implicit)
+  }
 
-    inline Source(const StringPiece& path, size_t line) : path(path.toString()), line(line) {
-    }
+  inline Source(const StringPiece& path, size_t line)
+      : path(path.toString()), line(line) {}
 
-    inline Source withLine(size_t line) const {
-        return Source(path, line);
-    }
+  inline Source withLine(size_t line) const { return Source(path, line); }
 };
 
 //
@@ -51,30 +50,30 @@
 //
 
 inline ::std::ostream& operator<<(::std::ostream& out, const Source& source) {
-    out << source.path;
-    if (source.line) {
-        out << ":" << source.line.value();
-    }
-    return out;
+  out << source.path;
+  if (source.line) {
+    out << ":" << source.line.value();
+  }
+  return out;
 }
 
 inline bool operator==(const Source& lhs, const Source& rhs) {
-    return lhs.path == rhs.path && lhs.line == rhs.line;
+  return lhs.path == rhs.path && lhs.line == rhs.line;
 }
 
 inline bool operator<(const Source& lhs, const Source& rhs) {
-    int cmp = lhs.path.compare(rhs.path);
-    if (cmp < 0) return true;
-    if (cmp > 0) return false;
-    if (lhs.line) {
-        if (rhs.line) {
-            return lhs.line.value() < rhs.line.value();
-        }
-        return false;
+  int cmp = lhs.path.compare(rhs.path);
+  if (cmp < 0) return true;
+  if (cmp > 0) return false;
+  if (lhs.line) {
+    if (rhs.line) {
+      return lhs.line.value() < rhs.line.value();
     }
-    return bool(rhs.line);
+    return false;
+  }
+  return bool(rhs.line);
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_SOURCE_H
+#endif  // AAPT_SOURCE_H
diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp
index fe4b967..a167a6a 100644
--- a/tools/aapt2/StringPool.cpp
+++ b/tools/aapt2/StringPool.cpp
@@ -19,395 +19,400 @@
 #include "util/StringPiece.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <androidfw/ResourceTypes.h>
+#include <algorithm>
 #include <memory>
 #include <string>
 
 namespace aapt {
 
-StringPool::Ref::Ref() : mEntry(nullptr) {
-}
+StringPool::Ref::Ref() : mEntry(nullptr) {}
 
 StringPool::Ref::Ref(const StringPool::Ref& rhs) : mEntry(rhs.mEntry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::Ref::Ref(StringPool::Entry* entry) : mEntry(entry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::Ref::~Ref() {
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
 }
 
 StringPool::Ref& StringPool::Ref::operator=(const StringPool::Ref& rhs) {
-    if (rhs.mEntry != nullptr) {
-        rhs.mEntry->ref++;
-    }
+  if (rhs.mEntry != nullptr) {
+    rhs.mEntry->ref++;
+  }
 
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
-    mEntry = rhs.mEntry;
-    return *this;
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
+  mEntry = rhs.mEntry;
+  return *this;
 }
 
 const std::string* StringPool::Ref::operator->() const {
-    return &mEntry->value;
+  return &mEntry->value;
 }
 
-const std::string& StringPool::Ref::operator*() const {
-    return mEntry->value;
-}
+const std::string& StringPool::Ref::operator*() const { return mEntry->value; }
 
-size_t StringPool::Ref::getIndex() const {
-    return mEntry->index;
-}
+size_t StringPool::Ref::getIndex() const { return mEntry->index; }
 
 const StringPool::Context& StringPool::Ref::getContext() const {
-    return mEntry->context;
+  return mEntry->context;
 }
 
-StringPool::StyleRef::StyleRef() : mEntry(nullptr) {
-}
+StringPool::StyleRef::StyleRef() : mEntry(nullptr) {}
 
-StringPool::StyleRef::StyleRef(const StringPool::StyleRef& rhs) : mEntry(rhs.mEntry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+StringPool::StyleRef::StyleRef(const StringPool::StyleRef& rhs)
+    : mEntry(rhs.mEntry) {
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::StyleRef::StyleRef(StringPool::StyleEntry* entry) : mEntry(entry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::StyleRef::~StyleRef() {
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
 }
 
-StringPool::StyleRef& StringPool::StyleRef::operator=(const StringPool::StyleRef& rhs) {
-    if (rhs.mEntry != nullptr) {
-        rhs.mEntry->ref++;
-    }
+StringPool::StyleRef& StringPool::StyleRef::operator=(
+    const StringPool::StyleRef& rhs) {
+  if (rhs.mEntry != nullptr) {
+    rhs.mEntry->ref++;
+  }
 
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
-    mEntry = rhs.mEntry;
-    return *this;
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
+  mEntry = rhs.mEntry;
+  return *this;
 }
 
 const StringPool::StyleEntry* StringPool::StyleRef::operator->() const {
-    return mEntry;
+  return mEntry;
 }
 
 const StringPool::StyleEntry& StringPool::StyleRef::operator*() const {
-    return *mEntry;
+  return *mEntry;
 }
 
-size_t StringPool::StyleRef::getIndex() const {
-    return mEntry->str.getIndex();
-}
+size_t StringPool::StyleRef::getIndex() const { return mEntry->str.getIndex(); }
 
 const StringPool::Context& StringPool::StyleRef::getContext() const {
-    return mEntry->str.getContext();
+  return mEntry->str.getContext();
 }
 
 StringPool::Ref StringPool::makeRef(const StringPiece& str) {
-    return makeRefImpl(str, Context{}, true);
+  return makeRefImpl(str, Context{}, true);
 }
 
-StringPool::Ref StringPool::makeRef(const StringPiece& str, const Context& context) {
-    return makeRefImpl(str, context, true);
+StringPool::Ref StringPool::makeRef(const StringPiece& str,
+                                    const Context& context) {
+  return makeRefImpl(str, context, true);
 }
 
-StringPool::Ref StringPool::makeRefImpl(const StringPiece& str, const Context& context,
-        bool unique) {
-    if (unique) {
-        auto iter = mIndexedStrings.find(str);
-        if (iter != std::end(mIndexedStrings)) {
-            return Ref(iter->second);
-        }
+StringPool::Ref StringPool::makeRefImpl(const StringPiece& str,
+                                        const Context& context, bool unique) {
+  if (unique) {
+    auto iter = mIndexedStrings.find(str);
+    if (iter != std::end(mIndexedStrings)) {
+      return Ref(iter->second);
     }
+  }
 
-    Entry* entry = new Entry();
-    entry->value = str.toString();
-    entry->context = context;
-    entry->index = mStrings.size();
-    entry->ref = 0;
-    mStrings.emplace_back(entry);
-    mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
-    return Ref(entry);
+  Entry* entry = new Entry();
+  entry->value = str.toString();
+  entry->context = context;
+  entry->index = mStrings.size();
+  entry->ref = 0;
+  mStrings.emplace_back(entry);
+  mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
+  return Ref(entry);
 }
 
 StringPool::StyleRef StringPool::makeRef(const StyleString& str) {
-    return makeRef(str, Context{});
+  return makeRef(str, Context{});
 }
 
-StringPool::StyleRef StringPool::makeRef(const StyleString& str, const Context& context) {
-    Entry* entry = new Entry();
-    entry->value = str.str;
-    entry->context = context;
-    entry->index = mStrings.size();
-    entry->ref = 0;
-    mStrings.emplace_back(entry);
-    mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
+StringPool::StyleRef StringPool::makeRef(const StyleString& str,
+                                         const Context& context) {
+  Entry* entry = new Entry();
+  entry->value = str.str;
+  entry->context = context;
+  entry->index = mStrings.size();
+  entry->ref = 0;
+  mStrings.emplace_back(entry);
+  mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
 
-    StyleEntry* styleEntry = new StyleEntry();
-    styleEntry->str = Ref(entry);
-    for (const aapt::Span& span : str.spans) {
-        styleEntry->spans.emplace_back(Span{ makeRef(span.name), span.firstChar, span.lastChar });
-    }
-    styleEntry->ref = 0;
-    mStyles.emplace_back(styleEntry);
-    return StyleRef(styleEntry);
+  StyleEntry* styleEntry = new StyleEntry();
+  styleEntry->str = Ref(entry);
+  for (const aapt::Span& span : str.spans) {
+    styleEntry->spans.emplace_back(
+        Span{makeRef(span.name), span.firstChar, span.lastChar});
+  }
+  styleEntry->ref = 0;
+  mStyles.emplace_back(styleEntry);
+  return StyleRef(styleEntry);
 }
 
 StringPool::StyleRef StringPool::makeRef(const StyleRef& ref) {
-    Entry* entry = new Entry();
-    entry->value = *ref.mEntry->str;
-    entry->context = ref.mEntry->str.mEntry->context;
-    entry->index = mStrings.size();
-    entry->ref = 0;
-    mStrings.emplace_back(entry);
-    mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
+  Entry* entry = new Entry();
+  entry->value = *ref.mEntry->str;
+  entry->context = ref.mEntry->str.mEntry->context;
+  entry->index = mStrings.size();
+  entry->ref = 0;
+  mStrings.emplace_back(entry);
+  mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
 
-    StyleEntry* styleEntry = new StyleEntry();
-    styleEntry->str = Ref(entry);
-    for (const Span& span : ref.mEntry->spans) {
-        styleEntry->spans.emplace_back(Span{ makeRef(*span.name), span.firstChar, span.lastChar });
-    }
-    styleEntry->ref = 0;
-    mStyles.emplace_back(styleEntry);
-    return StyleRef(styleEntry);
+  StyleEntry* styleEntry = new StyleEntry();
+  styleEntry->str = Ref(entry);
+  for (const Span& span : ref.mEntry->spans) {
+    styleEntry->spans.emplace_back(
+        Span{makeRef(*span.name), span.firstChar, span.lastChar});
+  }
+  styleEntry->ref = 0;
+  mStyles.emplace_back(styleEntry);
+  return StyleRef(styleEntry);
 }
 
 void StringPool::merge(StringPool&& pool) {
-    mIndexedStrings.insert(pool.mIndexedStrings.begin(), pool.mIndexedStrings.end());
-    pool.mIndexedStrings.clear();
-    std::move(pool.mStrings.begin(), pool.mStrings.end(), std::back_inserter(mStrings));
-    pool.mStrings.clear();
-    std::move(pool.mStyles.begin(), pool.mStyles.end(), std::back_inserter(mStyles));
-    pool.mStyles.clear();
+  mIndexedStrings.insert(pool.mIndexedStrings.begin(),
+                         pool.mIndexedStrings.end());
+  pool.mIndexedStrings.clear();
+  std::move(pool.mStrings.begin(), pool.mStrings.end(),
+            std::back_inserter(mStrings));
+  pool.mStrings.clear();
+  std::move(pool.mStyles.begin(), pool.mStyles.end(),
+            std::back_inserter(mStyles));
+  pool.mStyles.clear();
 
-    // Assign the indices.
-    const size_t len = mStrings.size();
-    for (size_t index = 0; index < len; index++) {
-        mStrings[index]->index = index;
-    }
+  // Assign the indices.
+  const size_t len = mStrings.size();
+  for (size_t index = 0; index < len; index++) {
+    mStrings[index]->index = index;
+  }
 }
 
 void StringPool::hintWillAdd(size_t stringCount, size_t styleCount) {
-    mStrings.reserve(mStrings.size() + stringCount);
-    mStyles.reserve(mStyles.size() + styleCount);
+  mStrings.reserve(mStrings.size() + stringCount);
+  mStyles.reserve(mStyles.size() + styleCount);
 }
 
 void StringPool::prune() {
-    const auto iterEnd = std::end(mIndexedStrings);
-    auto indexIter = std::begin(mIndexedStrings);
-    while (indexIter != iterEnd) {
-        if (indexIter->second->ref <= 0) {
-            indexIter = mIndexedStrings.erase(indexIter);
-        } else {
-            ++indexIter;
-        }
+  const auto iterEnd = std::end(mIndexedStrings);
+  auto indexIter = std::begin(mIndexedStrings);
+  while (indexIter != iterEnd) {
+    if (indexIter->second->ref <= 0) {
+      indexIter = mIndexedStrings.erase(indexIter);
+    } else {
+      ++indexIter;
     }
+  }
 
-    auto endIter2 = std::remove_if(std::begin(mStrings), std::end(mStrings),
-            [](const std::unique_ptr<Entry>& entry) -> bool {
-                return entry->ref <= 0;
-            }
-    );
+  auto endIter2 =
+      std::remove_if(std::begin(mStrings), std::end(mStrings),
+                     [](const std::unique_ptr<Entry>& entry) -> bool {
+                       return entry->ref <= 0;
+                     });
 
-    auto endIter3 = std::remove_if(std::begin(mStyles), std::end(mStyles),
-            [](const std::unique_ptr<StyleEntry>& entry) -> bool {
-                return entry->ref <= 0;
-            }
-    );
+  auto endIter3 =
+      std::remove_if(std::begin(mStyles), std::end(mStyles),
+                     [](const std::unique_ptr<StyleEntry>& entry) -> bool {
+                       return entry->ref <= 0;
+                     });
 
-    // Remove the entries at the end or else we'll be accessing
-    // a deleted string from the StyleEntry.
-    mStrings.erase(endIter2, std::end(mStrings));
-    mStyles.erase(endIter3, std::end(mStyles));
+  // Remove the entries at the end or else we'll be accessing
+  // a deleted string from the StyleEntry.
+  mStrings.erase(endIter2, std::end(mStrings));
+  mStyles.erase(endIter3, std::end(mStyles));
 
-    // Reassign the indices.
-    const size_t len = mStrings.size();
-    for (size_t index = 0; index < len; index++) {
-        mStrings[index]->index = index;
-    }
+  // Reassign the indices.
+  const size_t len = mStrings.size();
+  for (size_t index = 0; index < len; index++) {
+    mStrings[index]->index = index;
+  }
 }
 
-void StringPool::sort(const std::function<bool(const Entry&, const Entry&)>& cmp) {
-    std::sort(std::begin(mStrings), std::end(mStrings),
-            [&cmp](const std::unique_ptr<Entry>& a, const std::unique_ptr<Entry>& b) -> bool {
-                return cmp(*a, *b);
-            }
-    );
+void StringPool::sort(
+    const std::function<bool(const Entry&, const Entry&)>& cmp) {
+  std::sort(
+      std::begin(mStrings), std::end(mStrings),
+      [&cmp](const std::unique_ptr<Entry>& a,
+             const std::unique_ptr<Entry>& b) -> bool { return cmp(*a, *b); });
 
-    // Assign the indices.
-    const size_t len = mStrings.size();
-    for (size_t index = 0; index < len; index++) {
-        mStrings[index]->index = index;
-    }
+  // Assign the indices.
+  const size_t len = mStrings.size();
+  for (size_t index = 0; index < len; index++) {
+    mStrings[index]->index = index;
+  }
 
-    // Reorder the styles.
-    std::sort(std::begin(mStyles), std::end(mStyles),
+  // Reorder the styles.
+  std::sort(std::begin(mStyles), std::end(mStyles),
             [](const std::unique_ptr<StyleEntry>& lhs,
                const std::unique_ptr<StyleEntry>& rhs) -> bool {
-                return lhs->str.getIndex() < rhs->str.getIndex();
-            }
-    );
+              return lhs->str.getIndex() < rhs->str.getIndex();
+            });
 }
 
 template <typename T>
 static T* encodeLength(T* data, size_t length) {
-    static_assert(std::is_integral<T>::value, "wat.");
+  static_assert(std::is_integral<T>::value, "wat.");
 
-    constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
-    constexpr size_t kMaxSize = kMask - 1;
-    if (length > kMaxSize) {
-        *data++ = kMask | (kMaxSize & (length >> (sizeof(T) * 8)));
-    }
-    *data++ = length;
-    return data;
+  constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
+  constexpr size_t kMaxSize = kMask - 1;
+  if (length > kMaxSize) {
+    *data++ = kMask | (kMaxSize & (length >> (sizeof(T) * 8)));
+  }
+  *data++ = length;
+  return data;
 }
 
 template <typename T>
 static size_t encodedLengthUnits(size_t length) {
-    static_assert(std::is_integral<T>::value, "wat.");
+  static_assert(std::is_integral<T>::value, "wat.");
 
-    constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
-    constexpr size_t kMaxSize = kMask - 1;
-    return length > kMaxSize ? 2 : 1;
+  constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
+  constexpr size_t kMaxSize = kMask - 1;
+  return length > kMaxSize ? 2 : 1;
 }
 
-
 bool StringPool::flatten(BigBuffer* out, const StringPool& pool, bool utf8) {
-    const size_t startIndex = out->size();
-    android::ResStringPool_header* header = out->nextBlock<android::ResStringPool_header>();
-    header->header.type = android::RES_STRING_POOL_TYPE;
-    header->header.headerSize = sizeof(*header);
-    header->stringCount = pool.size();
+  const size_t startIndex = out->size();
+  android::ResStringPool_header* header =
+      out->nextBlock<android::ResStringPool_header>();
+  header->header.type = android::RES_STRING_POOL_TYPE;
+  header->header.headerSize = sizeof(*header);
+  header->stringCount = pool.size();
+  if (utf8) {
+    header->flags |= android::ResStringPool_header::UTF8_FLAG;
+  }
+
+  uint32_t* indices =
+      pool.size() != 0 ? out->nextBlock<uint32_t>(pool.size()) : nullptr;
+
+  uint32_t* styleIndices = nullptr;
+  if (!pool.mStyles.empty()) {
+    header->styleCount = pool.mStyles.back()->str.getIndex() + 1;
+    styleIndices = out->nextBlock<uint32_t>(header->styleCount);
+  }
+
+  const size_t beforeStringsIndex = out->size();
+  header->stringsStart = beforeStringsIndex - startIndex;
+
+  for (const auto& entry : pool) {
+    *indices = out->size() - beforeStringsIndex;
+    indices++;
+
     if (utf8) {
-        header->flags |= android::ResStringPool_header::UTF8_FLAG;
+      const std::string& encoded = entry->value;
+      const ssize_t utf16Length = utf8_to_utf16_length(
+          reinterpret_cast<const uint8_t*>(entry->value.data()),
+          entry->value.size());
+      assert(utf16Length >= 0);
+
+      const size_t totalSize = encodedLengthUnits<char>(utf16Length) +
+                               encodedLengthUnits<char>(encoded.length()) +
+                               encoded.size() + 1;
+
+      char* data = out->nextBlock<char>(totalSize);
+
+      // First encode the UTF16 string length.
+      data = encodeLength(data, utf16Length);
+
+      // Now encode the size of the real UTF8 string.
+      data = encodeLength(data, encoded.length());
+      strncpy(data, encoded.data(), encoded.size());
+
+    } else {
+      const std::u16string encoded = util::utf8ToUtf16(entry->value);
+      const ssize_t utf16Length = encoded.size();
+
+      // Total number of 16-bit words to write.
+      const size_t totalSize =
+          encodedLengthUnits<char16_t>(utf16Length) + encoded.size() + 1;
+
+      char16_t* data = out->nextBlock<char16_t>(totalSize);
+
+      // Encode the actual UTF16 string length.
+      data = encodeLength(data, utf16Length);
+      const size_t byteLength = encoded.size() * sizeof(char16_t);
+
+      // NOTE: For some reason, strncpy16(data, entry->value.data(),
+      // entry->value.size())
+      // truncates the string.
+      memcpy(data, encoded.data(), byteLength);
+
+      // The null-terminating character is already here due to the block of data
+      // being set
+      // to 0s on allocation.
+    }
+  }
+
+  out->align4();
+
+  if (!pool.mStyles.empty()) {
+    const size_t beforeStylesIndex = out->size();
+    header->stylesStart = beforeStylesIndex - startIndex;
+
+    size_t currentIndex = 0;
+    for (const auto& entry : pool.mStyles) {
+      while (entry->str.getIndex() > currentIndex) {
+        styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
+
+        uint32_t* spanOffset = out->nextBlock<uint32_t>();
+        *spanOffset = android::ResStringPool_span::END;
+      }
+      styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
+
+      android::ResStringPool_span* span =
+          out->nextBlock<android::ResStringPool_span>(entry->spans.size());
+      for (const auto& s : entry->spans) {
+        span->name.index = s.name.getIndex();
+        span->firstChar = s.firstChar;
+        span->lastChar = s.lastChar;
+        span++;
+      }
+
+      uint32_t* spanEnd = out->nextBlock<uint32_t>();
+      *spanEnd = android::ResStringPool_span::END;
     }
 
-    uint32_t* indices = pool.size() != 0 ? out->nextBlock<uint32_t>(pool.size()) : nullptr;
-
-    uint32_t* styleIndices = nullptr;
-    if (!pool.mStyles.empty()) {
-        header->styleCount = pool.mStyles.back()->str.getIndex() + 1;
-        styleIndices = out->nextBlock<uint32_t>(header->styleCount);
-    }
-
-    const size_t beforeStringsIndex = out->size();
-    header->stringsStart = beforeStringsIndex - startIndex;
-
-    for (const auto& entry : pool) {
-        *indices = out->size() - beforeStringsIndex;
-        indices++;
-
-        if (utf8) {
-            const std::string& encoded = entry->value;
-            const ssize_t utf16Length = utf8_to_utf16_length(
-                    reinterpret_cast<const uint8_t*>(entry->value.data()), entry->value.size());
-            assert(utf16Length >= 0);
-
-            const size_t totalSize = encodedLengthUnits<char>(utf16Length)
-                    + encodedLengthUnits<char>(encoded.length())
-                    + encoded.size() + 1;
-
-            char* data = out->nextBlock<char>(totalSize);
-
-            // First encode the UTF16 string length.
-            data = encodeLength(data, utf16Length);
-
-            // Now encode the size of the real UTF8 string.
-            data = encodeLength(data, encoded.length());
-            strncpy(data, encoded.data(), encoded.size());
-
-        } else {
-            const std::u16string encoded = util::utf8ToUtf16(entry->value);
-            const ssize_t utf16Length = encoded.size();
-
-            // Total number of 16-bit words to write.
-            const size_t totalSize = encodedLengthUnits<char16_t>(utf16Length) + encoded.size() + 1;
-
-            char16_t* data = out->nextBlock<char16_t>(totalSize);
-
-            // Encode the actual UTF16 string length.
-            data = encodeLength(data, utf16Length);
-            const size_t byteLength = encoded.size() * sizeof(char16_t);
-
-            // NOTE: For some reason, strncpy16(data, entry->value.data(), entry->value.size())
-            // truncates the string.
-            memcpy(data, encoded.data(), byteLength);
-
-            // The null-terminating character is already here due to the block of data being set
-            // to 0s on allocation.
-        }
-    }
-
+    // The error checking code in the platform looks for an entire
+    // ResStringPool_span structure worth of 0xFFFFFFFF at the end
+    // of the style block, so fill in the remaining 2 32bit words
+    // with 0xFFFFFFFF.
+    const size_t paddingLength = sizeof(android::ResStringPool_span) -
+                                 sizeof(android::ResStringPool_span::name);
+    uint8_t* padding = out->nextBlock<uint8_t>(paddingLength);
+    memset(padding, 0xff, paddingLength);
     out->align4();
-
-    if (!pool.mStyles.empty()) {
-        const size_t beforeStylesIndex = out->size();
-        header->stylesStart = beforeStylesIndex - startIndex;
-
-        size_t currentIndex = 0;
-        for (const auto& entry : pool.mStyles) {
-            while (entry->str.getIndex() > currentIndex) {
-                styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
-
-                uint32_t* spanOffset = out->nextBlock<uint32_t>();
-                *spanOffset = android::ResStringPool_span::END;
-            }
-            styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
-
-            android::ResStringPool_span* span =
-                    out->nextBlock<android::ResStringPool_span>(entry->spans.size());
-            for (const auto& s : entry->spans) {
-                span->name.index = s.name.getIndex();
-                span->firstChar = s.firstChar;
-                span->lastChar = s.lastChar;
-                span++;
-            }
-
-            uint32_t* spanEnd = out->nextBlock<uint32_t>();
-            *spanEnd = android::ResStringPool_span::END;
-        }
-
-        // The error checking code in the platform looks for an entire
-        // ResStringPool_span structure worth of 0xFFFFFFFF at the end
-        // of the style block, so fill in the remaining 2 32bit words
-        // with 0xFFFFFFFF.
-        const size_t paddingLength = sizeof(android::ResStringPool_span)
-                - sizeof(android::ResStringPool_span::name);
-        uint8_t* padding = out->nextBlock<uint8_t>(paddingLength);
-        memset(padding, 0xff, paddingLength);
-        out->align4();
-    }
-    header->header.size = out->size() - startIndex;
-    return true;
+  }
+  header->header.size = out->size() - startIndex;
+  return true;
 }
 
 bool StringPool::flattenUtf8(BigBuffer* out, const StringPool& pool) {
-    return flatten(out, pool, true);
+  return flatten(out, pool, true);
 }
 
 bool StringPool::flattenUtf16(BigBuffer* out, const StringPool& pool) {
-    return flatten(out, pool, false);
+  return flatten(out, pool, false);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/StringPool.h b/tools/aapt2/StringPool.h
index 13545be..05c26e7 100644
--- a/tools/aapt2/StringPool.h
+++ b/tools/aapt2/StringPool.h
@@ -17,207 +17,205 @@
 #ifndef AAPT_STRING_POOL_H
 #define AAPT_STRING_POOL_H
 
-#include "util/BigBuffer.h"
 #include "ConfigDescription.h"
+#include "util/BigBuffer.h"
 #include "util/StringPiece.h"
 
 #include <functional>
-#include <unordered_map>
 #include <memory>
 #include <string>
+#include <unordered_map>
 #include <vector>
 
 namespace aapt {
 
 struct Span {
-    std::string name;
-    uint32_t firstChar;
-    uint32_t lastChar;
+  std::string name;
+  uint32_t firstChar;
+  uint32_t lastChar;
 };
 
 struct StyleString {
-    std::string str;
-    std::vector<Span> spans;
+  std::string str;
+  std::vector<Span> spans;
 };
 
 class StringPool {
-public:
-    struct Context {
-        uint32_t priority;
-        ConfigDescription config;
-    };
+ public:
+  struct Context {
+    uint32_t priority;
+    ConfigDescription config;
+  };
 
-    class Entry;
+  class Entry;
 
-    class Ref {
-    public:
-        Ref();
-        Ref(const Ref&);
-        ~Ref();
+  class Ref {
+   public:
+    Ref();
+    Ref(const Ref&);
+    ~Ref();
 
-        Ref& operator=(const Ref& rhs);
-        const std::string* operator->() const;
-        const std::string& operator*() const;
+    Ref& operator=(const Ref& rhs);
+    const std::string* operator->() const;
+    const std::string& operator*() const;
 
-        size_t getIndex() const;
-        const Context& getContext() const;
+    size_t getIndex() const;
+    const Context& getContext() const;
 
-    private:
-        friend class StringPool;
+   private:
+    friend class StringPool;
 
-        explicit Ref(Entry* entry);
+    explicit Ref(Entry* entry);
 
-        Entry* mEntry;
-    };
+    Entry* mEntry;
+  };
 
-    class StyleEntry;
+  class StyleEntry;
 
-    class StyleRef {
-    public:
-        StyleRef();
-        StyleRef(const StyleRef&);
-        ~StyleRef();
+  class StyleRef {
+   public:
+    StyleRef();
+    StyleRef(const StyleRef&);
+    ~StyleRef();
 
-        StyleRef& operator=(const StyleRef& rhs);
-        const StyleEntry* operator->() const;
-        const StyleEntry& operator*() const;
+    StyleRef& operator=(const StyleRef& rhs);
+    const StyleEntry* operator->() const;
+    const StyleEntry& operator*() const;
 
-        size_t getIndex() const;
-        const Context& getContext() const;
+    size_t getIndex() const;
+    const Context& getContext() const;
 
-    private:
-        friend class StringPool;
+   private:
+    friend class StringPool;
 
-        explicit StyleRef(StyleEntry* entry);
+    explicit StyleRef(StyleEntry* entry);
 
-        StyleEntry* mEntry;
-    };
+    StyleEntry* mEntry;
+  };
 
-    class Entry {
-    public:
-        std::string value;
-        Context context;
-        size_t index;
+  class Entry {
+   public:
+    std::string value;
+    Context context;
+    size_t index;
 
-    private:
-        friend class StringPool;
-        friend class Ref;
+   private:
+    friend class StringPool;
+    friend class Ref;
 
-        int ref;
-    };
+    int ref;
+  };
 
-    struct Span {
-        Ref name;
-        uint32_t firstChar;
-        uint32_t lastChar;
-    };
+  struct Span {
+    Ref name;
+    uint32_t firstChar;
+    uint32_t lastChar;
+  };
 
-    class StyleEntry {
-    public:
-        Ref str;
-        std::vector<Span> spans;
+  class StyleEntry {
+   public:
+    Ref str;
+    std::vector<Span> spans;
 
-    private:
-        friend class StringPool;
-        friend class StyleRef;
+   private:
+    friend class StringPool;
+    friend class StyleRef;
 
-        int ref;
-    };
+    int ref;
+  };
 
-    using const_iterator = std::vector<std::unique_ptr<Entry>>::const_iterator;
+  using const_iterator = std::vector<std::unique_ptr<Entry>>::const_iterator;
 
-    static bool flattenUtf8(BigBuffer* out, const StringPool& pool);
-    static bool flattenUtf16(BigBuffer* out, const StringPool& pool);
+  static bool flattenUtf8(BigBuffer* out, const StringPool& pool);
+  static bool flattenUtf16(BigBuffer* out, const StringPool& pool);
 
-    StringPool() = default;
-    StringPool(const StringPool&) = delete;
+  StringPool() = default;
+  StringPool(const StringPool&) = delete;
 
-    /**
-     * Adds a string to the pool, unless it already exists. Returns
-     * a reference to the string in the pool.
-     */
-    Ref makeRef(const StringPiece& str);
+  /**
+   * Adds a string to the pool, unless it already exists. Returns
+   * a reference to the string in the pool.
+   */
+  Ref makeRef(const StringPiece& str);
 
-    /**
-     * Adds a string to the pool, unless it already exists, with a context
-     * object that can be used when sorting the string pool. Returns
-     * a reference to the string in the pool.
-     */
-    Ref makeRef(const StringPiece& str, const Context& context);
+  /**
+   * Adds a string to the pool, unless it already exists, with a context
+   * object that can be used when sorting the string pool. Returns
+   * a reference to the string in the pool.
+   */
+  Ref makeRef(const StringPiece& str, const Context& context);
 
-    /**
-     * Adds a style to the string pool and returns a reference to it.
-     */
-    StyleRef makeRef(const StyleString& str);
+  /**
+   * Adds a style to the string pool and returns a reference to it.
+   */
+  StyleRef makeRef(const StyleString& str);
 
-    /**
-     * Adds a style to the string pool with a context object that
-     * can be used when sorting the string pool. Returns a reference
-     * to the style in the string pool.
-     */
-    StyleRef makeRef(const StyleString& str, const Context& context);
+  /**
+   * Adds a style to the string pool with a context object that
+   * can be used when sorting the string pool. Returns a reference
+   * to the style in the string pool.
+   */
+  StyleRef makeRef(const StyleString& str, const Context& context);
 
-    /**
-     * Adds a style from another string pool. Returns a reference to the
-     * style in the string pool.
-     */
-    StyleRef makeRef(const StyleRef& ref);
+  /**
+   * Adds a style from another string pool. Returns a reference to the
+   * style in the string pool.
+   */
+  StyleRef makeRef(const StyleRef& ref);
 
-    /**
-     * Moves pool into this one without coalescing strings. When this
-     * function returns, pool will be empty.
-     */
-    void merge(StringPool&& pool);
+  /**
+   * Moves pool into this one without coalescing strings. When this
+   * function returns, pool will be empty.
+   */
+  void merge(StringPool&& pool);
 
-    /**
-     * Retuns the number of strings in the table.
-     */
-    inline size_t size() const;
+  /**
+   * Retuns the number of strings in the table.
+   */
+  inline size_t size() const;
 
-    /**
-     * Reserves space for strings and styles as an optimization.
-     */
-    void hintWillAdd(size_t stringCount, size_t styleCount);
+  /**
+   * Reserves space for strings and styles as an optimization.
+   */
+  void hintWillAdd(size_t stringCount, size_t styleCount);
 
-    /**
-     * Sorts the strings according to some comparison function.
-     */
-    void sort(const std::function<bool(const Entry&, const Entry&)>& cmp);
+  /**
+   * Sorts the strings according to some comparison function.
+   */
+  void sort(const std::function<bool(const Entry&, const Entry&)>& cmp);
 
-    /**
-     * Removes any strings that have no references.
-     */
-    void prune();
+  /**
+   * Removes any strings that have no references.
+   */
+  void prune();
 
-private:
-    friend const_iterator begin(const StringPool& pool);
-    friend const_iterator end(const StringPool& pool);
+ private:
+  friend const_iterator begin(const StringPool& pool);
+  friend const_iterator end(const StringPool& pool);
 
-    static bool flatten(BigBuffer* out, const StringPool& pool, bool utf8);
+  static bool flatten(BigBuffer* out, const StringPool& pool, bool utf8);
 
-    Ref makeRefImpl(const StringPiece& str, const Context& context, bool unique);
+  Ref makeRefImpl(const StringPiece& str, const Context& context, bool unique);
 
-    std::vector<std::unique_ptr<Entry>> mStrings;
-    std::vector<std::unique_ptr<StyleEntry>> mStyles;
-    std::unordered_multimap<StringPiece, Entry*> mIndexedStrings;
+  std::vector<std::unique_ptr<Entry>> mStrings;
+  std::vector<std::unique_ptr<StyleEntry>> mStyles;
+  std::unordered_multimap<StringPiece, Entry*> mIndexedStrings;
 };
 
 //
 // Inline implementation
 //
 
-inline size_t StringPool::size() const {
-    return mStrings.size();
-}
+inline size_t StringPool::size() const { return mStrings.size(); }
 
 inline StringPool::const_iterator begin(const StringPool& pool) {
-    return pool.mStrings.begin();
+  return pool.mStrings.begin();
 }
 
 inline StringPool::const_iterator end(const StringPool& pool) {
-    return pool.mStrings.end();
+  return pool.mStrings.end();
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_STRING_POOL_H
+#endif  // AAPT_STRING_POOL_H
diff --git a/tools/aapt2/StringPool_test.cpp b/tools/aapt2/StringPool_test.cpp
index 1367af7..2a7e1dd 100644
--- a/tools/aapt2/StringPool_test.cpp
+++ b/tools/aapt2/StringPool_test.cpp
@@ -23,246 +23,245 @@
 namespace aapt {
 
 TEST(StringPoolTest, InsertOneString) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("wut");
-    EXPECT_EQ(*ref, "wut");
+  StringPool::Ref ref = pool.makeRef("wut");
+  EXPECT_EQ(*ref, "wut");
 }
 
 TEST(StringPoolTest, InsertTwoUniqueStrings) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("wut");
-    StringPool::Ref ref2 = pool.makeRef("hey");
+  StringPool::Ref ref = pool.makeRef("wut");
+  StringPool::Ref ref2 = pool.makeRef("hey");
 
-    EXPECT_EQ(*ref, "wut");
-    EXPECT_EQ(*ref2, "hey");
+  EXPECT_EQ(*ref, "wut");
+  EXPECT_EQ(*ref2, "hey");
 }
 
 TEST(StringPoolTest, DoNotInsertNewDuplicateString) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("wut");
-    StringPool::Ref ref2 = pool.makeRef("wut");
+  StringPool::Ref ref = pool.makeRef("wut");
+  StringPool::Ref ref2 = pool.makeRef("wut");
 
-    EXPECT_EQ(*ref, "wut");
-    EXPECT_EQ(*ref2, "wut");
-    EXPECT_EQ(1u, pool.size());
+  EXPECT_EQ(*ref, "wut");
+  EXPECT_EQ(*ref2, "wut");
+  EXPECT_EQ(1u, pool.size());
 }
 
 TEST(StringPoolTest, MaintainInsertionOrderIndex) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("z");
-    StringPool::Ref ref2 = pool.makeRef("a");
-    StringPool::Ref ref3 = pool.makeRef("m");
+  StringPool::Ref ref = pool.makeRef("z");
+  StringPool::Ref ref2 = pool.makeRef("a");
+  StringPool::Ref ref3 = pool.makeRef("m");
 
-    EXPECT_EQ(0u, ref.getIndex());
-    EXPECT_EQ(1u, ref2.getIndex());
-    EXPECT_EQ(2u, ref3.getIndex());
+  EXPECT_EQ(0u, ref.getIndex());
+  EXPECT_EQ(1u, ref2.getIndex());
+  EXPECT_EQ(2u, ref3.getIndex());
 }
 
 TEST(StringPoolTest, PruneStringsWithNoReferences) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref refA = pool.makeRef("foo");
-    {
-        StringPool::Ref ref = pool.makeRef("wut");
-        EXPECT_EQ(*ref, "wut");
-        EXPECT_EQ(2u, pool.size());
-    }
-    StringPool::Ref refB = pool.makeRef("bar");
-
-    EXPECT_EQ(3u, pool.size());
-    pool.prune();
+  StringPool::Ref refA = pool.makeRef("foo");
+  {
+    StringPool::Ref ref = pool.makeRef("wut");
+    EXPECT_EQ(*ref, "wut");
     EXPECT_EQ(2u, pool.size());
-    StringPool::const_iterator iter = begin(pool);
-    EXPECT_EQ((*iter)->value, "foo");
-    EXPECT_LT((*iter)->index, 2u);
-    ++iter;
-    EXPECT_EQ((*iter)->value, "bar");
-    EXPECT_LT((*iter)->index, 2u);
+  }
+  StringPool::Ref refB = pool.makeRef("bar");
+
+  EXPECT_EQ(3u, pool.size());
+  pool.prune();
+  EXPECT_EQ(2u, pool.size());
+  StringPool::const_iterator iter = begin(pool);
+  EXPECT_EQ((*iter)->value, "foo");
+  EXPECT_LT((*iter)->index, 2u);
+  ++iter;
+  EXPECT_EQ((*iter)->value, "bar");
+  EXPECT_LT((*iter)->index, 2u);
 }
 
 TEST(StringPoolTest, SortAndMaintainIndexesInReferences) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("z");
-    StringPool::StyleRef ref2 = pool.makeRef(StyleString{ {"a"} });
-    StringPool::Ref ref3 = pool.makeRef("m");
+  StringPool::Ref ref = pool.makeRef("z");
+  StringPool::StyleRef ref2 = pool.makeRef(StyleString{{"a"}});
+  StringPool::Ref ref3 = pool.makeRef("m");
 
-    EXPECT_EQ(*ref, "z");
-    EXPECT_EQ(0u, ref.getIndex());
+  EXPECT_EQ(*ref, "z");
+  EXPECT_EQ(0u, ref.getIndex());
 
-    EXPECT_EQ(*(ref2->str), "a");
-    EXPECT_EQ(1u, ref2.getIndex());
+  EXPECT_EQ(*(ref2->str), "a");
+  EXPECT_EQ(1u, ref2.getIndex());
 
-    EXPECT_EQ(*ref3, "m");
-    EXPECT_EQ(2u, ref3.getIndex());
+  EXPECT_EQ(*ref3, "m");
+  EXPECT_EQ(2u, ref3.getIndex());
 
-    pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
-        return a.value < b.value;
-    });
+  pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+    return a.value < b.value;
+  });
 
+  EXPECT_EQ(*ref, "z");
+  EXPECT_EQ(2u, ref.getIndex());
 
-    EXPECT_EQ(*ref, "z");
-    EXPECT_EQ(2u, ref.getIndex());
+  EXPECT_EQ(*(ref2->str), "a");
+  EXPECT_EQ(0u, ref2.getIndex());
 
-    EXPECT_EQ(*(ref2->str), "a");
-    EXPECT_EQ(0u, ref2.getIndex());
-
-    EXPECT_EQ(*ref3, "m");
-    EXPECT_EQ(1u, ref3.getIndex());
+  EXPECT_EQ(*ref3, "m");
+  EXPECT_EQ(1u, ref3.getIndex());
 }
 
 TEST(StringPoolTest, SortAndStillDedupe) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("z");
-    StringPool::Ref ref2 = pool.makeRef("a");
-    StringPool::Ref ref3 = pool.makeRef("m");
+  StringPool::Ref ref = pool.makeRef("z");
+  StringPool::Ref ref2 = pool.makeRef("a");
+  StringPool::Ref ref3 = pool.makeRef("m");
 
-    pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
-        return a.value < b.value;
-    });
+  pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+    return a.value < b.value;
+  });
 
-    StringPool::Ref ref4 = pool.makeRef("z");
-    StringPool::Ref ref5 = pool.makeRef("a");
-    StringPool::Ref ref6 = pool.makeRef("m");
+  StringPool::Ref ref4 = pool.makeRef("z");
+  StringPool::Ref ref5 = pool.makeRef("a");
+  StringPool::Ref ref6 = pool.makeRef("m");
 
-    EXPECT_EQ(ref4.getIndex(), ref.getIndex());
-    EXPECT_EQ(ref5.getIndex(), ref2.getIndex());
-    EXPECT_EQ(ref6.getIndex(), ref3.getIndex());
+  EXPECT_EQ(ref4.getIndex(), ref.getIndex());
+  EXPECT_EQ(ref5.getIndex(), ref2.getIndex());
+  EXPECT_EQ(ref6.getIndex(), ref3.getIndex());
 }
 
 TEST(StringPoolTest, AddStyles) {
-    StringPool pool;
+  StringPool pool;
 
-    StyleString str {
-        { "android" },
-        {
-            Span{ { "b" }, 2, 6 }
-        }
-    };
+  StyleString str{{"android"}, {Span{{"b"}, 2, 6}}};
 
-    StringPool::StyleRef ref = pool.makeRef(str);
+  StringPool::StyleRef ref = pool.makeRef(str);
 
-    EXPECT_EQ(0u, ref.getIndex());
-    EXPECT_EQ(std::string("android"), *(ref->str));
-    ASSERT_EQ(1u, ref->spans.size());
+  EXPECT_EQ(0u, ref.getIndex());
+  EXPECT_EQ(std::string("android"), *(ref->str));
+  ASSERT_EQ(1u, ref->spans.size());
 
-    const StringPool::Span& span = ref->spans.front();
-    EXPECT_EQ(*(span.name), "b");
-    EXPECT_EQ(2u, span.firstChar);
-    EXPECT_EQ(6u, span.lastChar);
+  const StringPool::Span& span = ref->spans.front();
+  EXPECT_EQ(*(span.name), "b");
+  EXPECT_EQ(2u, span.firstChar);
+  EXPECT_EQ(6u, span.lastChar);
 }
 
 TEST(StringPoolTest, DoNotDedupeStyleWithSameStringAsNonStyle) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("android");
+  StringPool::Ref ref = pool.makeRef("android");
 
-    StyleString str { { "android" } };
-    StringPool::StyleRef styleRef = pool.makeRef(str);
+  StyleString str{{"android"}};
+  StringPool::StyleRef styleRef = pool.makeRef(str);
 
-    EXPECT_NE(ref.getIndex(), styleRef.getIndex());
+  EXPECT_NE(ref.getIndex(), styleRef.getIndex());
 }
 
 TEST(StringPoolTest, FlattenEmptyStringPoolUtf8) {
-    using namespace android; // For NO_ERROR on Windows.
+  using namespace android;  // For NO_ERROR on Windows.
 
-    StringPool pool;
-    BigBuffer buffer(1024);
-    StringPool::flattenUtf8(&buffer, pool);
+  StringPool pool;
+  BigBuffer buffer(1024);
+  StringPool::flattenUtf8(&buffer, pool);
 
-    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-    ResStringPool test;
-    ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+  std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+  ResStringPool test;
+  ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
 }
 
 TEST(StringPoolTest, FlattenOddCharactersUtf16) {
-    using namespace android; // For NO_ERROR on Windows.
+  using namespace android;  // For NO_ERROR on Windows.
 
-    StringPool pool;
-    pool.makeRef("\u093f");
-    BigBuffer buffer(1024);
-    StringPool::flattenUtf16(&buffer, pool);
+  StringPool pool;
+  pool.makeRef("\u093f");
+  BigBuffer buffer(1024);
+  StringPool::flattenUtf16(&buffer, pool);
 
-    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-    ResStringPool test;
-    ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
-    size_t len = 0;
-    const char16_t* str = test.stringAt(0, &len);
-    EXPECT_EQ(1u, len);
-    EXPECT_EQ(u'\u093f', *str);
-    EXPECT_EQ(0u, str[1]);
+  std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+  ResStringPool test;
+  ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+  size_t len = 0;
+  const char16_t* str = test.stringAt(0, &len);
+  EXPECT_EQ(1u, len);
+  EXPECT_EQ(u'\u093f', *str);
+  EXPECT_EQ(0u, str[1]);
 }
 
-constexpr const char* sLongString = "バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限します。メール、SMSや、同期を使 用するその他のアプリは、起動しても更新されないことがあります。バッテリーセーバーは端末の充電中は自動的にOFFになります。";
+constexpr const char* sLongString =
+    "バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑"
+    "え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限"
+    "します。メール、SMSや、同期を使 "
+    "用するその他のアプリは、起動しても更新されないことがあります。バッテリーセ"
+    "ーバーは端末の充電中は自動的にOFFになります。";
 
 TEST(StringPoolTest, Flatten) {
-    using namespace android; // For NO_ERROR on Windows.
+  using namespace android;  // For NO_ERROR on Windows.
 
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref1 = pool.makeRef("hello");
-    StringPool::Ref ref2 = pool.makeRef("goodbye");
-    StringPool::Ref ref3 = pool.makeRef(sLongString);
-    StringPool::Ref ref4 = pool.makeRef("");
-    StringPool::StyleRef ref5 = pool.makeRef(StyleString{
-            { "style" },
-            { Span{ { "b" }, 0, 1 }, Span{ { "i" }, 2, 3 } }
-    });
+  StringPool::Ref ref1 = pool.makeRef("hello");
+  StringPool::Ref ref2 = pool.makeRef("goodbye");
+  StringPool::Ref ref3 = pool.makeRef(sLongString);
+  StringPool::Ref ref4 = pool.makeRef("");
+  StringPool::StyleRef ref5 = pool.makeRef(
+      StyleString{{"style"}, {Span{{"b"}, 0, 1}, Span{{"i"}, 2, 3}}});
 
-    EXPECT_EQ(0u, ref1.getIndex());
-    EXPECT_EQ(1u, ref2.getIndex());
-    EXPECT_EQ(2u, ref3.getIndex());
-    EXPECT_EQ(3u, ref4.getIndex());
-    EXPECT_EQ(4u, ref5.getIndex());
+  EXPECT_EQ(0u, ref1.getIndex());
+  EXPECT_EQ(1u, ref2.getIndex());
+  EXPECT_EQ(2u, ref3.getIndex());
+  EXPECT_EQ(3u, ref4.getIndex());
+  EXPECT_EQ(4u, ref5.getIndex());
 
-    BigBuffer buffers[2] = { BigBuffer(1024), BigBuffer(1024) };
-    StringPool::flattenUtf8(&buffers[0], pool);
-    StringPool::flattenUtf16(&buffers[1], pool);
+  BigBuffer buffers[2] = {BigBuffer(1024), BigBuffer(1024)};
+  StringPool::flattenUtf8(&buffers[0], pool);
+  StringPool::flattenUtf16(&buffers[1], pool);
 
-    // Test both UTF-8 and UTF-16 buffers.
-    for (const BigBuffer& buffer : buffers) {
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+  // Test both UTF-8 and UTF-16 buffers.
+  for (const BigBuffer& buffer : buffers) {
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
 
-        ResStringPool test;
-        ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+    ResStringPool test;
+    ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
 
-        EXPECT_EQ(std::string("hello"), util::getString(test, 0));
-        EXPECT_EQ(StringPiece16(u"hello"), util::getString16(test, 0));
+    EXPECT_EQ(std::string("hello"), util::getString(test, 0));
+    EXPECT_EQ(StringPiece16(u"hello"), util::getString16(test, 0));
 
-        EXPECT_EQ(std::string("goodbye"), util::getString(test, 1));
-        EXPECT_EQ(StringPiece16(u"goodbye"), util::getString16(test, 1));
+    EXPECT_EQ(std::string("goodbye"), util::getString(test, 1));
+    EXPECT_EQ(StringPiece16(u"goodbye"), util::getString16(test, 1));
 
-        EXPECT_EQ(StringPiece(sLongString), util::getString(test, 2));
-        EXPECT_EQ(util::utf8ToUtf16(sLongString), util::getString16(test, 2).toString());
+    EXPECT_EQ(StringPiece(sLongString), util::getString(test, 2));
+    EXPECT_EQ(util::utf8ToUtf16(sLongString),
+              util::getString16(test, 2).toString());
 
-        size_t len;
-        EXPECT_TRUE(test.stringAt(3, &len) != nullptr || test.string8At(3, &len) != nullptr);
+    size_t len;
+    EXPECT_TRUE(test.stringAt(3, &len) != nullptr ||
+                test.string8At(3, &len) != nullptr);
 
-        EXPECT_EQ(std::string("style"), util::getString(test, 4));
-        EXPECT_EQ(StringPiece16(u"style"), util::getString16(test, 4));
+    EXPECT_EQ(std::string("style"), util::getString(test, 4));
+    EXPECT_EQ(StringPiece16(u"style"), util::getString16(test, 4));
 
-        const ResStringPool_span* span = test.styleAt(4);
-        ASSERT_NE(nullptr, span);
-        EXPECT_EQ(std::string("b"), util::getString(test, span->name.index));
-        EXPECT_EQ(StringPiece16(u"b"), util::getString16(test, span->name.index));
-        EXPECT_EQ(0u, span->firstChar);
-        EXPECT_EQ(1u, span->lastChar);
-        span++;
+    const ResStringPool_span* span = test.styleAt(4);
+    ASSERT_NE(nullptr, span);
+    EXPECT_EQ(std::string("b"), util::getString(test, span->name.index));
+    EXPECT_EQ(StringPiece16(u"b"), util::getString16(test, span->name.index));
+    EXPECT_EQ(0u, span->firstChar);
+    EXPECT_EQ(1u, span->lastChar);
+    span++;
 
-        ASSERT_NE(ResStringPool_span::END, span->name.index);
-        EXPECT_EQ(std::string("i"), util::getString(test, span->name.index));
-        EXPECT_EQ(StringPiece16(u"i"), util::getString16(test, span->name.index));
-        EXPECT_EQ(2u, span->firstChar);
-        EXPECT_EQ(3u, span->lastChar);
-        span++;
+    ASSERT_NE(ResStringPool_span::END, span->name.index);
+    EXPECT_EQ(std::string("i"), util::getString(test, span->name.index));
+    EXPECT_EQ(StringPiece16(u"i"), util::getString16(test, span->name.index));
+    EXPECT_EQ(2u, span->firstChar);
+    EXPECT_EQ(3u, span->lastChar);
+    span++;
 
-        EXPECT_EQ(ResStringPool_span::END, span->name.index);
-    }
+    EXPECT_EQ(ResStringPool_span::END, span->name.index);
+  }
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ValueVisitor.h b/tools/aapt2/ValueVisitor.h
index 9dc6a9c..121c337 100644
--- a/tools/aapt2/ValueVisitor.h
+++ b/tools/aapt2/ValueVisitor.h
@@ -17,91 +17,94 @@
 #ifndef AAPT_VALUE_VISITOR_H
 #define AAPT_VALUE_VISITOR_H
 
-#include "ResourceValues.h"
 #include "ResourceTable.h"
+#include "ResourceValues.h"
 
 namespace aapt {
 
 /**
- * Visits a value and invokes the appropriate method based on its type. Does not traverse
+ * Visits a value and invokes the appropriate method based on its type. Does not
+ * traverse
  * into compound types. Use ValueVisitor for that.
  */
 struct RawValueVisitor {
-    virtual ~RawValueVisitor() = default;
+  virtual ~RawValueVisitor() = default;
 
-    virtual void visitItem(Item* value) {}
-    virtual void visit(Reference* value) { visitItem(value); }
-    virtual void visit(RawString* value) { visitItem(value); }
-    virtual void visit(String* value) { visitItem(value); }
-    virtual void visit(StyledString* value) { visitItem(value); }
-    virtual void visit(FileReference* value) { visitItem(value); }
-    virtual void visit(Id* value) { visitItem(value); }
-    virtual void visit(BinaryPrimitive* value) { visitItem(value); }
+  virtual void visitItem(Item* value) {}
+  virtual void visit(Reference* value) { visitItem(value); }
+  virtual void visit(RawString* value) { visitItem(value); }
+  virtual void visit(String* value) { visitItem(value); }
+  virtual void visit(StyledString* value) { visitItem(value); }
+  virtual void visit(FileReference* value) { visitItem(value); }
+  virtual void visit(Id* value) { visitItem(value); }
+  virtual void visit(BinaryPrimitive* value) { visitItem(value); }
 
-    virtual void visit(Attribute* value) {}
-    virtual void visit(Style* value) {}
-    virtual void visit(Array* value) {}
-    virtual void visit(Plural* value) {}
-    virtual void visit(Styleable* value) {}
+  virtual void visit(Attribute* value) {}
+  virtual void visit(Style* value) {}
+  virtual void visit(Array* value) {}
+  virtual void visit(Plural* value) {}
+  virtual void visit(Styleable* value) {}
 };
 
 // NOLINT, do not add parentheses around T.
-#define DECL_VISIT_COMPOUND_VALUE(T) \
-    virtual void visit(T* value) { /* NOLINT */ \
-        visitSubValues(value); \
-    }
+#define DECL_VISIT_COMPOUND_VALUE(T)          \
+  virtual void visit(T* value) { /* NOLINT */ \
+    visitSubValues(value);                    \
+  }
 
 /**
- * Visits values, and if they are compound values, visits the components as well.
+ * Visits values, and if they are compound values, visits the components as
+ * well.
  */
 struct ValueVisitor : public RawValueVisitor {
-    // The compiler will think we're hiding an overload, when we actually intend
-    // to call into RawValueVisitor. This will expose the visit methods in the super
-    // class so the compiler knows we are trying to call them.
-    using RawValueVisitor::visit;
+  // The compiler will think we're hiding an overload, when we actually intend
+  // to call into RawValueVisitor. This will expose the visit methods in the
+  // super
+  // class so the compiler knows we are trying to call them.
+  using RawValueVisitor::visit;
 
-    void visitSubValues(Attribute* attribute) {
-        for (Attribute::Symbol& symbol : attribute->symbols) {
-            visit(&symbol.symbol);
-        }
+  void visitSubValues(Attribute* attribute) {
+    for (Attribute::Symbol& symbol : attribute->symbols) {
+      visit(&symbol.symbol);
+    }
+  }
+
+  void visitSubValues(Style* style) {
+    if (style->parent) {
+      visit(&style->parent.value());
     }
 
-    void visitSubValues(Style* style) {
-        if (style->parent) {
-            visit(&style->parent.value());
-        }
-
-        for (Style::Entry& entry : style->entries) {
-            visit(&entry.key);
-            entry.value->accept(this);
-        }
+    for (Style::Entry& entry : style->entries) {
+      visit(&entry.key);
+      entry.value->accept(this);
     }
+  }
 
-    void visitSubValues(Array* array) {
-        for (std::unique_ptr<Item>& item : array->items) {
-            item->accept(this);
-        }
+  void visitSubValues(Array* array) {
+    for (std::unique_ptr<Item>& item : array->items) {
+      item->accept(this);
     }
+  }
 
-    void visitSubValues(Plural* plural) {
-        for (std::unique_ptr<Item>& item : plural->values) {
-            if (item) {
-                item->accept(this);
-            }
-        }
+  void visitSubValues(Plural* plural) {
+    for (std::unique_ptr<Item>& item : plural->values) {
+      if (item) {
+        item->accept(this);
+      }
     }
+  }
 
-    void visitSubValues(Styleable* styleable) {
-        for (Reference& reference : styleable->entries) {
-            visit(&reference);
-        }
+  void visitSubValues(Styleable* styleable) {
+    for (Reference& reference : styleable->entries) {
+      visit(&reference);
     }
+  }
 
-    DECL_VISIT_COMPOUND_VALUE(Attribute);
-    DECL_VISIT_COMPOUND_VALUE(Style);
-    DECL_VISIT_COMPOUND_VALUE(Array);
-    DECL_VISIT_COMPOUND_VALUE(Plural);
-    DECL_VISIT_COMPOUND_VALUE(Styleable);
+  DECL_VISIT_COMPOUND_VALUE(Attribute);
+  DECL_VISIT_COMPOUND_VALUE(Style);
+  DECL_VISIT_COMPOUND_VALUE(Array);
+  DECL_VISIT_COMPOUND_VALUE(Plural);
+  DECL_VISIT_COMPOUND_VALUE(Styleable);
 };
 
 /**
@@ -109,11 +112,9 @@
  */
 template <typename T>
 struct DynCastVisitor : public RawValueVisitor {
-    T* value = nullptr;
+  T* value = nullptr;
 
-    void visit(T* v) override {
-        value = v;
-    }
+  void visit(T* v) override { value = v; }
 };
 
 /**
@@ -121,16 +122,14 @@
  */
 template <>
 struct DynCastVisitor<Item> : public RawValueVisitor {
-    Item* value = nullptr;
+  Item* value = nullptr;
 
-    void visitItem(Item* item) override {
-        value = item;
-    }
+  void visitItem(Item* item) override { value = item; }
 };
 
 template <typename T>
 const T* valueCast(const Value* value) {
-    return valueCast<T>(const_cast<Value*>(value));
+  return valueCast<T>(const_cast<Value*>(value));
 }
 
 /**
@@ -139,30 +138,32 @@
  */
 template <typename T>
 T* valueCast(Value* value) {
-    if (!value) {
-        return nullptr;
-    }
-    DynCastVisitor<T> visitor;
-    value->accept(&visitor);
-    return visitor.value;
+  if (!value) {
+    return nullptr;
+  }
+  DynCastVisitor<T> visitor;
+  value->accept(&visitor);
+  return visitor.value;
 }
 
-inline void visitAllValuesInPackage(ResourceTablePackage* pkg, RawValueVisitor* visitor) {
-    for (auto& type : pkg->types) {
-        for (auto& entry : type->entries) {
-            for (auto& configValue : entry->values) {
-                configValue->value->accept(visitor);
-            }
-        }
+inline void visitAllValuesInPackage(ResourceTablePackage* pkg,
+                                    RawValueVisitor* visitor) {
+  for (auto& type : pkg->types) {
+    for (auto& entry : type->entries) {
+      for (auto& configValue : entry->values) {
+        configValue->value->accept(visitor);
+      }
     }
+  }
 }
 
-inline void visitAllValuesInTable(ResourceTable* table, RawValueVisitor* visitor) {
-    for (auto& pkg : table->packages) {
-        visitAllValuesInPackage(pkg.get(), visitor);
-    }
+inline void visitAllValuesInTable(ResourceTable* table,
+                                  RawValueVisitor* visitor) {
+  for (auto& pkg : table->packages) {
+    visitAllValuesInPackage(pkg.get(), visitor);
+  }
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_VALUE_VISITOR_H
+#endif  // AAPT_VALUE_VISITOR_H
diff --git a/tools/aapt2/ValueVisitor_test.cpp b/tools/aapt2/ValueVisitor_test.cpp
index 54e9fcd..ed9c7f6 100644
--- a/tools/aapt2/ValueVisitor_test.cpp
+++ b/tools/aapt2/ValueVisitor_test.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceValues.h"
 #include "ValueVisitor.h"
+#include "ResourceValues.h"
 #include "test/Test.h"
 #include "util/Util.h"
 
@@ -24,63 +24,63 @@
 namespace aapt {
 
 struct SingleReferenceVisitor : public ValueVisitor {
-    using ValueVisitor::visit;
+  using ValueVisitor::visit;
 
-    Reference* visited = nullptr;
+  Reference* visited = nullptr;
 
-    void visit(Reference* ref) override {
-        visited = ref;
-    }
+  void visit(Reference* ref) override { visited = ref; }
 };
 
 struct StyleVisitor : public ValueVisitor {
-    using ValueVisitor::visit;
+  using ValueVisitor::visit;
 
-    std::list<Reference*> visitedRefs;
-    Style* visitedStyle = nullptr;
+  std::list<Reference*> visitedRefs;
+  Style* visitedStyle = nullptr;
 
-    void visit(Reference* ref) override {
-        visitedRefs.push_back(ref);
-    }
+  void visit(Reference* ref) override { visitedRefs.push_back(ref); }
 
-    void visit(Style* style) override {
-        visitedStyle = style;
-        ValueVisitor::visit(style);
-    }
+  void visit(Style* style) override {
+    visitedStyle = style;
+    ValueVisitor::visit(style);
+  }
 };
 
 TEST(ValueVisitorTest, VisitsReference) {
-    Reference ref(ResourceName{"android", ResourceType::kAttr, "foo"});
-    SingleReferenceVisitor visitor;
-    ref.accept(&visitor);
+  Reference ref(ResourceName{"android", ResourceType::kAttr, "foo"});
+  SingleReferenceVisitor visitor;
+  ref.accept(&visitor);
 
-    EXPECT_EQ(visitor.visited, &ref);
+  EXPECT_EQ(visitor.visited, &ref);
 }
 
 TEST(ValueVisitorTest, VisitsReferencesInStyle) {
-    std::unique_ptr<Style> style = test::StyleBuilder()
-            .setParent("android:style/foo")
-            .addItem("android:attr/one", test::buildReference("android:id/foo"))
-            .build();
+  std::unique_ptr<Style> style =
+      test::StyleBuilder()
+          .setParent("android:style/foo")
+          .addItem("android:attr/one", test::buildReference("android:id/foo"))
+          .build();
 
-    StyleVisitor visitor;
-    style->accept(&visitor);
+  StyleVisitor visitor;
+  style->accept(&visitor);
 
-    ASSERT_EQ(style.get(), visitor.visitedStyle);
+  ASSERT_EQ(style.get(), visitor.visitedStyle);
 
-    // Entry attribute references, plus the parent reference, plus one value reference.
-    ASSERT_EQ(style->entries.size() + 2, visitor.visitedRefs.size());
+  // Entry attribute references, plus the parent reference, plus one value
+  // reference.
+  ASSERT_EQ(style->entries.size() + 2, visitor.visitedRefs.size());
 }
 
 TEST(ValueVisitorTest, ValueCast) {
-    std::unique_ptr<Reference> ref = test::buildReference("android:color/white");
-    EXPECT_NE(valueCast<Reference>(ref.get()), nullptr);
+  std::unique_ptr<Reference> ref = test::buildReference("android:color/white");
+  EXPECT_NE(valueCast<Reference>(ref.get()), nullptr);
 
-    std::unique_ptr<Style> style = test::StyleBuilder()
-            .addItem("android:attr/foo", test::buildReference("android:color/black"))
-            .build();
-    EXPECT_NE(valueCast<Style>(style.get()), nullptr);
-    EXPECT_EQ(valueCast<Reference>(style.get()), nullptr);
+  std::unique_ptr<Style> style =
+      test::StyleBuilder()
+          .addItem("android:attr/foo",
+                   test::buildReference("android:color/black"))
+          .build();
+  EXPECT_NE(valueCast<Style>(style.get()), nullptr);
+  EXPECT_EQ(valueCast<Reference>(style.get()), nullptr);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Compile.cpp b/tools/aapt2/compile/Compile.cpp
index dbd8062..d001228 100644
--- a/tools/aapt2/compile/Compile.cpp
+++ b/tools/aapt2/compile/Compile.cpp
@@ -33,8 +33,8 @@
 #include "xml/XmlDom.h"
 #include "xml/XmlPullParser.h"
 
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 #include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 
 #include <android-base/errors.h>
 #include <android-base/file.h>
@@ -48,16 +48,18 @@
 namespace aapt {
 
 struct ResourcePathData {
-    Source source;
-    std::string resourceDir;
-    std::string name;
-    std::string extension;
+  Source source;
+  std::string resourceDir;
+  std::string name;
+  std::string extension;
 
-    // Original config str. We keep this because when we parse the config, we may add on
-    // version qualifiers. We want to preserve the original input so the output is easily
-    // computed before hand.
-    std::string configStr;
-    ConfigDescription config;
+  // Original config str. We keep this because when we parse the config, we may
+  // add on
+  // version qualifiers. We want to preserve the original input so the output is
+  // easily
+  // computed before hand.
+  std::string configStr;
+  ConfigDescription config;
 };
 
 /**
@@ -66,696 +68,735 @@
  */
 static Maybe<ResourcePathData> extractResourcePathData(const std::string& path,
                                                        std::string* outError) {
-    std::vector<std::string> parts = util::split(path, file::sDirSep);
-    if (parts.size() < 2) {
-        if (outError) *outError = "bad resource path";
-        return {};
+  std::vector<std::string> parts = util::split(path, file::sDirSep);
+  if (parts.size() < 2) {
+    if (outError) *outError = "bad resource path";
+    return {};
+  }
+
+  std::string& dir = parts[parts.size() - 2];
+  StringPiece dirStr = dir;
+
+  StringPiece configStr;
+  ConfigDescription config;
+  size_t dashPos = dir.find('-');
+  if (dashPos != std::string::npos) {
+    configStr = dirStr.substr(dashPos + 1, dir.size() - (dashPos + 1));
+    if (!ConfigDescription::parse(configStr, &config)) {
+      if (outError) {
+        std::stringstream errStr;
+        errStr << "invalid configuration '" << configStr << "'";
+        *outError = errStr.str();
+      }
+      return {};
     }
+    dirStr = dirStr.substr(0, dashPos);
+  }
 
-    std::string& dir = parts[parts.size() - 2];
-    StringPiece dirStr = dir;
+  std::string& filename = parts[parts.size() - 1];
+  StringPiece name = filename;
+  StringPiece extension;
+  size_t dotPos = filename.find('.');
+  if (dotPos != std::string::npos) {
+    extension = name.substr(dotPos + 1, filename.size() - (dotPos + 1));
+    name = name.substr(0, dotPos);
+  }
 
-    StringPiece configStr;
-    ConfigDescription config;
-    size_t dashPos = dir.find('-');
-    if (dashPos != std::string::npos) {
-        configStr = dirStr.substr(dashPos + 1, dir.size() - (dashPos + 1));
-        if (!ConfigDescription::parse(configStr, &config)) {
-            if (outError) {
-                std::stringstream errStr;
-                errStr << "invalid configuration '" << configStr << "'";
-                *outError = errStr.str();
-            }
-            return {};
-        }
-        dirStr = dirStr.substr(0, dashPos);
-    }
-
-    std::string& filename = parts[parts.size() - 1];
-    StringPiece name = filename;
-    StringPiece extension;
-    size_t dotPos = filename.find('.');
-    if (dotPos != std::string::npos) {
-        extension = name.substr(dotPos + 1, filename.size() - (dotPos + 1));
-        name = name.substr(0, dotPos);
-    }
-
-    return ResourcePathData{
-            Source(path),
-            dirStr.toString(),
-            name.toString(),
-            extension.toString(),
-            configStr.toString(),
-            config
-    };
+  return ResourcePathData{Source(path),         dirStr.toString(),
+                          name.toString(),      extension.toString(),
+                          configStr.toString(), config};
 }
 
 struct CompileOptions {
-    std::string outputPath;
-    Maybe<std::string> resDir;
-    bool pseudolocalize = false;
-    bool legacyMode = false;
-    bool verbose = false;
+  std::string outputPath;
+  Maybe<std::string> resDir;
+  bool pseudolocalize = false;
+  bool legacyMode = false;
+  bool verbose = false;
 };
 
 static std::string buildIntermediateFilename(const ResourcePathData& data) {
-    std::stringstream name;
-    name << data.resourceDir;
-    if (!data.configStr.empty()) {
-        name << "-" << data.configStr;
-    }
-    name << "_" << data.name;
-    if (!data.extension.empty()) {
-        name << "." << data.extension;
-    }
-    name << ".flat";
-    return name.str();
+  std::stringstream name;
+  name << data.resourceDir;
+  if (!data.configStr.empty()) {
+    name << "-" << data.configStr;
+  }
+  name << "_" << data.name;
+  if (!data.extension.empty()) {
+    name << "." << data.extension;
+  }
+  name << ".flat";
+  return name.str();
 }
 
 static bool isHidden(const StringPiece& filename) {
-    return util::stringStartsWith(filename, ".");
+  return util::stringStartsWith(filename, ".");
 }
 
 /**
  * Walks the res directory structure, looking for resource files.
  */
-static bool loadInputFilesFromDir(IAaptContext* context, const CompileOptions& options,
+static bool loadInputFilesFromDir(IAaptContext* context,
+                                  const CompileOptions& options,
                                   std::vector<ResourcePathData>* outPathData) {
-    const std::string& rootDir = options.resDir.value();
-    std::unique_ptr<DIR, decltype(closedir)*> d(opendir(rootDir.data()), closedir);
-    if (!d) {
-        context->getDiagnostics()->error(DiagMessage() << strerror(errno));
+  const std::string& rootDir = options.resDir.value();
+  std::unique_ptr<DIR, decltype(closedir)*> d(opendir(rootDir.data()),
+                                              closedir);
+  if (!d) {
+    context->getDiagnostics()->error(DiagMessage() << strerror(errno));
+    return false;
+  }
+
+  while (struct dirent* entry = readdir(d.get())) {
+    if (isHidden(entry->d_name)) {
+      continue;
+    }
+
+    std::string prefixPath = rootDir;
+    file::appendPath(&prefixPath, entry->d_name);
+
+    if (file::getFileType(prefixPath) != file::FileType::kDirectory) {
+      continue;
+    }
+
+    std::unique_ptr<DIR, decltype(closedir)*> subDir(opendir(prefixPath.data()),
+                                                     closedir);
+    if (!subDir) {
+      context->getDiagnostics()->error(DiagMessage() << strerror(errno));
+      return false;
+    }
+
+    while (struct dirent* leafEntry = readdir(subDir.get())) {
+      if (isHidden(leafEntry->d_name)) {
+        continue;
+      }
+
+      std::string fullPath = prefixPath;
+      file::appendPath(&fullPath, leafEntry->d_name);
+
+      std::string errStr;
+      Maybe<ResourcePathData> pathData =
+          extractResourcePathData(fullPath, &errStr);
+      if (!pathData) {
+        context->getDiagnostics()->error(DiagMessage() << errStr);
         return false;
+      }
+
+      outPathData->push_back(std::move(pathData.value()));
     }
-
-    while (struct dirent* entry = readdir(d.get())) {
-        if (isHidden(entry->d_name)) {
-            continue;
-        }
-
-        std::string prefixPath = rootDir;
-        file::appendPath(&prefixPath, entry->d_name);
-
-        if (file::getFileType(prefixPath) != file::FileType::kDirectory) {
-            continue;
-        }
-
-        std::unique_ptr<DIR, decltype(closedir)*> subDir(opendir(prefixPath.data()), closedir);
-        if (!subDir) {
-            context->getDiagnostics()->error(DiagMessage() << strerror(errno));
-            return false;
-        }
-
-        while (struct dirent* leafEntry = readdir(subDir.get())) {
-            if (isHidden(leafEntry->d_name)) {
-                continue;
-            }
-
-            std::string fullPath = prefixPath;
-            file::appendPath(&fullPath, leafEntry->d_name);
-
-            std::string errStr;
-            Maybe<ResourcePathData> pathData = extractResourcePathData(fullPath, &errStr);
-            if (!pathData) {
-                context->getDiagnostics()->error(DiagMessage() << errStr);
-                return false;
-            }
-
-            outPathData->push_back(std::move(pathData.value()));
-        }
-    }
-    return true;
+  }
+  return true;
 }
 
 static bool compileTable(IAaptContext* context, const CompileOptions& options,
-                         const ResourcePathData& pathData, IArchiveWriter* writer,
+                         const ResourcePathData& pathData,
+                         IArchiveWriter* writer,
                          const std::string& outputPath) {
-    ResourceTable table;
-    {
-        std::ifstream fin(pathData.source.path, std::ifstream::binary);
-        if (!fin) {
-            context->getDiagnostics()->error(DiagMessage(pathData.source) << strerror(errno));
-            return false;
-        }
-
-
-        // Parse the values file from XML.
-        xml::XmlPullParser xmlParser(fin);
-
-        ResourceParserOptions parserOptions;
-        parserOptions.errorOnPositionalArguments = !options.legacyMode;
-
-        // If the filename includes donottranslate, then the default translatable is false.
-        parserOptions.translatable = pathData.name.find("donottranslate") == std::string::npos;
-
-        ResourceParser resParser(context->getDiagnostics(), &table, pathData.source,
-                                 pathData.config, parserOptions);
-        if (!resParser.parse(&xmlParser)) {
-            return false;
-        }
-
-        fin.close();
+  ResourceTable table;
+  {
+    std::ifstream fin(pathData.source.path, std::ifstream::binary);
+    if (!fin) {
+      context->getDiagnostics()->error(DiagMessage(pathData.source)
+                                       << strerror(errno));
+      return false;
     }
 
-    if (options.pseudolocalize) {
-        // Generate pseudo-localized strings (en-XA and ar-XB).
-        // These are created as weak symbols, and are only generated from default configuration
-        // strings and plurals.
-        PseudolocaleGenerator pseudolocaleGenerator;
-        if (!pseudolocaleGenerator.consume(context, &table)) {
-            return false;
-        }
+    // Parse the values file from XML.
+    xml::XmlPullParser xmlParser(fin);
+
+    ResourceParserOptions parserOptions;
+    parserOptions.errorOnPositionalArguments = !options.legacyMode;
+
+    // If the filename includes donottranslate, then the default translatable is
+    // false.
+    parserOptions.translatable =
+        pathData.name.find("donottranslate") == std::string::npos;
+
+    ResourceParser resParser(context->getDiagnostics(), &table, pathData.source,
+                             pathData.config, parserOptions);
+    if (!resParser.parse(&xmlParser)) {
+      return false;
     }
 
-    // Ensure we have the compilation package at least.
-    table.createPackage(context->getCompilationPackage());
+    fin.close();
+  }
 
-    // Assign an ID to any package that has resources.
-    for (auto& pkg : table.packages) {
-        if (!pkg->id) {
-            // If no package ID was set while parsing (public identifiers), auto assign an ID.
-            pkg->id = context->getPackageId();
-        }
+  if (options.pseudolocalize) {
+    // Generate pseudo-localized strings (en-XA and ar-XB).
+    // These are created as weak symbols, and are only generated from default
+    // configuration
+    // strings and plurals.
+    PseudolocaleGenerator pseudolocaleGenerator;
+    if (!pseudolocaleGenerator.consume(context, &table)) {
+      return false;
     }
+  }
 
-    // Create the file/zip entry.
-    if (!writer->startEntry(outputPath, 0)) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open");
-        return false;
+  // Ensure we have the compilation package at least.
+  table.createPackage(context->getCompilationPackage());
+
+  // Assign an ID to any package that has resources.
+  for (auto& pkg : table.packages) {
+    if (!pkg->id) {
+      // If no package ID was set while parsing (public identifiers), auto
+      // assign an ID.
+      pkg->id = context->getPackageId();
     }
+  }
 
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
+  // Create the file/zip entry.
+  if (!writer->startEntry(outputPath, 0)) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to open");
+    return false;
+  }
 
-        std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(&table);
-        if (!pbTable->SerializeToZeroCopyStream(&copyingAdaptor)) {
-            context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write");
-            return false;
-        }
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+
+    std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(&table);
+    if (!pbTable->SerializeToZeroCopyStream(&copyingAdaptor)) {
+      context->getDiagnostics()->error(DiagMessage(outputPath)
+                                       << "failed to write");
+      return false;
     }
+  }
 
-    if (!writer->finishEntry()) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to finish entry");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to finish entry");
+    return false;
+  }
+  return true;
 }
 
-static bool writeHeaderAndBufferToWriter(const StringPiece& outputPath, const ResourceFile& file,
-                                         const BigBuffer& buffer, IArchiveWriter* writer,
+static bool writeHeaderAndBufferToWriter(const StringPiece& outputPath,
+                                         const ResourceFile& file,
+                                         const BigBuffer& buffer,
+                                         IArchiveWriter* writer,
                                          IDiagnostics* diag) {
-    // Start the entry so we can write the header.
-    if (!writer->startEntry(outputPath, 0)) {
-        diag->error(DiagMessage(outputPath) << "failed to open file");
-        return false;
+  // Start the entry so we can write the header.
+  if (!writer->startEntry(outputPath, 0)) {
+    diag->error(DiagMessage(outputPath) << "failed to open file");
+    return false;
+  }
+
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+    CompiledFileOutputStream outputStream(&copyingAdaptor);
+
+    // Number of CompiledFiles.
+    outputStream.WriteLittleEndian32(1);
+
+    std::unique_ptr<pb::CompiledFile> compiledFile =
+        serializeCompiledFileToPb(file);
+    outputStream.WriteCompiledFile(compiledFile.get());
+    outputStream.WriteData(&buffer);
+
+    if (outputStream.HadError()) {
+      diag->error(DiagMessage(outputPath) << "failed to write data");
+      return false;
     }
+  }
 
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
-        CompiledFileOutputStream outputStream(&copyingAdaptor);
-
-        // Number of CompiledFiles.
-        outputStream.WriteLittleEndian32(1);
-
-        std::unique_ptr<pb::CompiledFile> compiledFile = serializeCompiledFileToPb(file);
-        outputStream.WriteCompiledFile(compiledFile.get());
-        outputStream.WriteData(&buffer);
-
-        if (outputStream.HadError()) {
-            diag->error(DiagMessage(outputPath) << "failed to write data");
-            return false;
-        }
-    }
-
-    if (!writer->finishEntry()) {
-        diag->error(DiagMessage(outputPath) << "failed to finish writing data");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    diag->error(DiagMessage(outputPath) << "failed to finish writing data");
+    return false;
+  }
+  return true;
 }
 
-static bool writeHeaderAndMmapToWriter(const StringPiece& outputPath, const ResourceFile& file,
-                                       const android::FileMap& map, IArchiveWriter* writer,
+static bool writeHeaderAndMmapToWriter(const StringPiece& outputPath,
+                                       const ResourceFile& file,
+                                       const android::FileMap& map,
+                                       IArchiveWriter* writer,
                                        IDiagnostics* diag) {
-    // Start the entry so we can write the header.
-    if (!writer->startEntry(outputPath, 0)) {
-        diag->error(DiagMessage(outputPath) << "failed to open file");
-        return false;
+  // Start the entry so we can write the header.
+  if (!writer->startEntry(outputPath, 0)) {
+    diag->error(DiagMessage(outputPath) << "failed to open file");
+    return false;
+  }
+
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+    CompiledFileOutputStream outputStream(&copyingAdaptor);
+
+    // Number of CompiledFiles.
+    outputStream.WriteLittleEndian32(1);
+
+    std::unique_ptr<pb::CompiledFile> compiledFile =
+        serializeCompiledFileToPb(file);
+    outputStream.WriteCompiledFile(compiledFile.get());
+    outputStream.WriteData(map.getDataPtr(), map.getDataLength());
+
+    if (outputStream.HadError()) {
+      diag->error(DiagMessage(outputPath) << "failed to write data");
+      return false;
     }
+  }
 
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
-        CompiledFileOutputStream outputStream(&copyingAdaptor);
-
-        // Number of CompiledFiles.
-        outputStream.WriteLittleEndian32(1);
-
-        std::unique_ptr<pb::CompiledFile> compiledFile = serializeCompiledFileToPb(file);
-        outputStream.WriteCompiledFile(compiledFile.get());
-        outputStream.WriteData(map.getDataPtr(), map.getDataLength());
-
-        if (outputStream.HadError()) {
-            diag->error(DiagMessage(outputPath) << "failed to write data");
-            return false;
-        }
-    }
-
-    if (!writer->finishEntry()) {
-        diag->error(DiagMessage(outputPath) << "failed to finish writing data");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    diag->error(DiagMessage(outputPath) << "failed to finish writing data");
+    return false;
+  }
+  return true;
 }
 
-static bool flattenXmlToOutStream(IAaptContext* context, const StringPiece& outputPath,
+static bool flattenXmlToOutStream(IAaptContext* context,
+                                  const StringPiece& outputPath,
                                   xml::XmlResource* xmlRes,
                                   CompiledFileOutputStream* out) {
-    BigBuffer buffer(1024);
-    XmlFlattenerOptions xmlFlattenerOptions;
-    xmlFlattenerOptions.keepRawValues = true;
-    XmlFlattener flattener(&buffer, xmlFlattenerOptions);
-    if (!flattener.consume(context, xmlRes)) {
-        return false;
-    }
+  BigBuffer buffer(1024);
+  XmlFlattenerOptions xmlFlattenerOptions;
+  xmlFlattenerOptions.keepRawValues = true;
+  XmlFlattener flattener(&buffer, xmlFlattenerOptions);
+  if (!flattener.consume(context, xmlRes)) {
+    return false;
+  }
 
-    std::unique_ptr<pb::CompiledFile> pbCompiledFile = serializeCompiledFileToPb(xmlRes->file);
-    out->WriteCompiledFile(pbCompiledFile.get());
-    out->WriteData(&buffer);
+  std::unique_ptr<pb::CompiledFile> pbCompiledFile =
+      serializeCompiledFileToPb(xmlRes->file);
+  out->WriteCompiledFile(pbCompiledFile.get());
+  out->WriteData(&buffer);
 
-    if (out->HadError()) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write data");
-        return false;
-    }
-    return true;
+  if (out->HadError()) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to write data");
+    return false;
+  }
+  return true;
 }
 
 static bool compileXml(IAaptContext* context, const CompileOptions& options,
                        const ResourcePathData& pathData, IArchiveWriter* writer,
                        const std::string& outputPath) {
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage(pathData.source) << "compiling XML");
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                    << "compiling XML");
+  }
+
+  std::unique_ptr<xml::XmlResource> xmlRes;
+  {
+    std::ifstream fin(pathData.source.path, std::ifstream::binary);
+    if (!fin) {
+      context->getDiagnostics()->error(DiagMessage(pathData.source)
+                                       << strerror(errno));
+      return false;
     }
 
-    std::unique_ptr<xml::XmlResource> xmlRes;
-    {
-        std::ifstream fin(pathData.source.path, std::ifstream::binary);
-        if (!fin) {
-            context->getDiagnostics()->error(DiagMessage(pathData.source) << strerror(errno));
-            return false;
-        }
+    xmlRes = xml::inflate(&fin, context->getDiagnostics(), pathData.source);
 
-        xmlRes = xml::inflate(&fin, context->getDiagnostics(), pathData.source);
+    fin.close();
+  }
 
-        fin.close();
+  if (!xmlRes) {
+    return false;
+  }
+
+  xmlRes->file.name =
+      ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
+  xmlRes->file.config = pathData.config;
+  xmlRes->file.source = pathData.source;
+
+  // Collect IDs that are defined here.
+  XmlIdCollector collector;
+  if (!collector.consume(context, xmlRes.get())) {
+    return false;
+  }
+
+  // Look for and process any <aapt:attr> tags and create sub-documents.
+  InlineXmlFormatParser inlineXmlFormatParser;
+  if (!inlineXmlFormatParser.consume(context, xmlRes.get())) {
+    return false;
+  }
+
+  // Start the entry so we can write the header.
+  if (!writer->startEntry(outputPath, 0)) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to open file");
+    return false;
+  }
+
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+    CompiledFileOutputStream outputStream(&copyingAdaptor);
+
+    std::vector<std::unique_ptr<xml::XmlResource>>& inlineDocuments =
+        inlineXmlFormatParser.getExtractedInlineXmlDocuments();
+
+    // Number of CompiledFiles.
+    outputStream.WriteLittleEndian32(1 + inlineDocuments.size());
+
+    if (!flattenXmlToOutStream(context, outputPath, xmlRes.get(),
+                               &outputStream)) {
+      return false;
     }
 
-    if (!xmlRes) {
+    for (auto& inlineXmlDoc : inlineDocuments) {
+      if (!flattenXmlToOutStream(context, outputPath, inlineXmlDoc.get(),
+                                 &outputStream)) {
         return false;
+      }
     }
+  }
 
-    xmlRes->file.name = ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
-    xmlRes->file.config = pathData.config;
-    xmlRes->file.source = pathData.source;
-
-    // Collect IDs that are defined here.
-    XmlIdCollector collector;
-    if (!collector.consume(context, xmlRes.get())) {
-        return false;
-    }
-
-    // Look for and process any <aapt:attr> tags and create sub-documents.
-    InlineXmlFormatParser inlineXmlFormatParser;
-    if (!inlineXmlFormatParser.consume(context, xmlRes.get())) {
-        return false;
-    }
-
-    // Start the entry so we can write the header.
-    if (!writer->startEntry(outputPath, 0)) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open file");
-        return false;
-    }
-
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
-        CompiledFileOutputStream outputStream(&copyingAdaptor);
-
-        std::vector<std::unique_ptr<xml::XmlResource>>& inlineDocuments =
-                inlineXmlFormatParser.getExtractedInlineXmlDocuments();
-
-        // Number of CompiledFiles.
-        outputStream.WriteLittleEndian32(1 + inlineDocuments.size());
-
-        if (!flattenXmlToOutStream(context, outputPath, xmlRes.get(), &outputStream)) {
-            return false;
-        }
-
-        for (auto& inlineXmlDoc : inlineDocuments) {
-            if (!flattenXmlToOutStream(context, outputPath, inlineXmlDoc.get(), &outputStream)) {
-                return false;
-            }
-        }
-    }
-
-    if (!writer->finishEntry()) {
-        context->getDiagnostics()->error(DiagMessage(outputPath)
-                                         << "failed to finish writing data");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to finish writing data");
+    return false;
+  }
+  return true;
 }
 
 class BigBufferOutputStream : public io::OutputStream {
-public:
-    explicit BigBufferOutputStream(BigBuffer* buffer) : mBuffer(buffer) {
-    }
+ public:
+  explicit BigBufferOutputStream(BigBuffer* buffer) : mBuffer(buffer) {}
 
-    bool Next(void** data, int* len) override {
-        size_t count;
-        *data = mBuffer->nextBlock(&count);
-        *len = static_cast<int>(count);
-        return true;
-    }
+  bool Next(void** data, int* len) override {
+    size_t count;
+    *data = mBuffer->nextBlock(&count);
+    *len = static_cast<int>(count);
+    return true;
+  }
 
-    void BackUp(int count) override {
-        mBuffer->backUp(count);
-    }
+  void BackUp(int count) override { mBuffer->backUp(count); }
 
-    int64_t ByteCount() const override {
-        return mBuffer->size();
-    }
+  int64_t ByteCount() const override { return mBuffer->size(); }
 
-    bool HadError() const override {
-        return false;
-    }
+  bool HadError() const override { return false; }
 
-private:
-    BigBuffer* mBuffer;
+ private:
+  BigBuffer* mBuffer;
 
-    DISALLOW_COPY_AND_ASSIGN(BigBufferOutputStream);
+  DISALLOW_COPY_AND_ASSIGN(BigBufferOutputStream);
 };
 
 static bool compilePng(IAaptContext* context, const CompileOptions& options,
                        const ResourcePathData& pathData, IArchiveWriter* writer,
                        const std::string& outputPath) {
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage(pathData.source) << "compiling PNG");
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                    << "compiling PNG");
+  }
+
+  BigBuffer buffer(4096);
+  ResourceFile resFile;
+  resFile.name =
+      ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
+  resFile.config = pathData.config;
+  resFile.source = pathData.source;
+
+  {
+    std::string content;
+    if (!android::base::ReadFileToString(pathData.source.path, &content)) {
+      context->getDiagnostics()->error(
+          DiagMessage(pathData.source)
+          << android::base::SystemErrorCodeToString(errno));
+      return false;
     }
 
-    BigBuffer buffer(4096);
-    ResourceFile resFile;
-    resFile.name = ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
-    resFile.config = pathData.config;
-    resFile.source = pathData.source;
+    BigBuffer crunchedPngBuffer(4096);
+    BigBufferOutputStream crunchedPngBufferOut(&crunchedPngBuffer);
 
-    {
-        std::string content;
-        if (!android::base::ReadFileToString(pathData.source.path, &content)) {
-            context->getDiagnostics()->error(DiagMessage(pathData.source)
-                                             << android::base::SystemErrorCodeToString(errno));
-            return false;
-        }
-
-        BigBuffer crunchedPngBuffer(4096);
-        BigBufferOutputStream crunchedPngBufferOut(&crunchedPngBuffer);
-
-        // Ensure that we only keep the chunks we care about if we end up
-        // using the original PNG instead of the crunched one.
-        PngChunkFilter pngChunkFilter(content);
-        std::unique_ptr<Image> image = readPng(context, &pngChunkFilter);
-        if (!image) {
-            return false;
-        }
-
-        std::unique_ptr<NinePatch> ninePatch;
-        if (pathData.extension == "9.png") {
-            std::string err;
-            ninePatch = NinePatch::create(image->rows.get(), image->width, image->height, &err);
-            if (!ninePatch) {
-                context->getDiagnostics()->error(DiagMessage() << err);
-                return false;
-            }
-
-            // Remove the 1px border around the NinePatch.
-            // Basically the row array is shifted up by 1, and the length is treated
-            // as height - 2.
-            // For each row, shift the array to the left by 1, and treat the length as width - 2.
-            image->width -= 2;
-            image->height -= 2;
-            memmove(image->rows.get(), image->rows.get() + 1, image->height * sizeof(uint8_t**));
-            for (int32_t h = 0; h < image->height; h++) {
-                memmove(image->rows[h], image->rows[h] + 4, image->width * 4);
-            }
-
-            if (context->verbose()) {
-                context->getDiagnostics()->note(DiagMessage(pathData.source)
-                                                << "9-patch: " << *ninePatch);
-            }
-        }
-
-        // Write the crunched PNG.
-        if (!writePng(context, image.get(), ninePatch.get(), &crunchedPngBufferOut, {})) {
-            return false;
-        }
-
-        if (ninePatch != nullptr
-                || crunchedPngBufferOut.ByteCount() <= pngChunkFilter.ByteCount()) {
-            // No matter what, we must use the re-encoded PNG, even if it is larger.
-            // 9-patch images must be re-encoded since their borders are stripped.
-            buffer.appendBuffer(std::move(crunchedPngBuffer));
-        } else {
-            // The re-encoded PNG is larger than the original, and there is
-            // no mandatory transformation. Use the original.
-            if (context->verbose()) {
-                context->getDiagnostics()->note(DiagMessage(pathData.source)
-                                                << "original PNG is smaller than crunched PNG"
-                                                << ", using original");
-            }
-
-            PngChunkFilter pngChunkFilterAgain(content);
-            BigBuffer filteredPngBuffer(4096);
-            BigBufferOutputStream filteredPngBufferOut(&filteredPngBuffer);
-            io::copy(&filteredPngBufferOut, &pngChunkFilterAgain);
-            buffer.appendBuffer(std::move(filteredPngBuffer));
-        }
-
-        if (context->verbose()) {
-            // For debugging only, use the legacy PNG cruncher and compare the resulting file sizes.
-            // This will help catch exotic cases where the new code may generate larger PNGs.
-            std::stringstream legacyStream(content);
-            BigBuffer legacyBuffer(4096);
-            Png png(context->getDiagnostics());
-            if (!png.process(pathData.source, &legacyStream, &legacyBuffer, {})) {
-                return false;
-            }
-
-            context->getDiagnostics()->note(DiagMessage(pathData.source)
-                                            << "legacy=" << legacyBuffer.size()
-                                            << " new=" << buffer.size());
-        }
+    // Ensure that we only keep the chunks we care about if we end up
+    // using the original PNG instead of the crunched one.
+    PngChunkFilter pngChunkFilter(content);
+    std::unique_ptr<Image> image = readPng(context, &pngChunkFilter);
+    if (!image) {
+      return false;
     }
 
-    if (!writeHeaderAndBufferToWriter(outputPath, resFile, buffer, writer,
-                                      context->getDiagnostics())) {
+    std::unique_ptr<NinePatch> ninePatch;
+    if (pathData.extension == "9.png") {
+      std::string err;
+      ninePatch = NinePatch::create(image->rows.get(), image->width,
+                                    image->height, &err);
+      if (!ninePatch) {
+        context->getDiagnostics()->error(DiagMessage() << err);
         return false;
+      }
+
+      // Remove the 1px border around the NinePatch.
+      // Basically the row array is shifted up by 1, and the length is treated
+      // as height - 2.
+      // For each row, shift the array to the left by 1, and treat the length as
+      // width - 2.
+      image->width -= 2;
+      image->height -= 2;
+      memmove(image->rows.get(), image->rows.get() + 1,
+              image->height * sizeof(uint8_t**));
+      for (int32_t h = 0; h < image->height; h++) {
+        memmove(image->rows[h], image->rows[h] + 4, image->width * 4);
+      }
+
+      if (context->verbose()) {
+        context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                        << "9-patch: " << *ninePatch);
+      }
     }
-    return true;
+
+    // Write the crunched PNG.
+    if (!writePng(context, image.get(), ninePatch.get(), &crunchedPngBufferOut,
+                  {})) {
+      return false;
+    }
+
+    if (ninePatch != nullptr ||
+        crunchedPngBufferOut.ByteCount() <= pngChunkFilter.ByteCount()) {
+      // No matter what, we must use the re-encoded PNG, even if it is larger.
+      // 9-patch images must be re-encoded since their borders are stripped.
+      buffer.appendBuffer(std::move(crunchedPngBuffer));
+    } else {
+      // The re-encoded PNG is larger than the original, and there is
+      // no mandatory transformation. Use the original.
+      if (context->verbose()) {
+        context->getDiagnostics()->note(
+            DiagMessage(pathData.source)
+            << "original PNG is smaller than crunched PNG"
+            << ", using original");
+      }
+
+      PngChunkFilter pngChunkFilterAgain(content);
+      BigBuffer filteredPngBuffer(4096);
+      BigBufferOutputStream filteredPngBufferOut(&filteredPngBuffer);
+      io::copy(&filteredPngBufferOut, &pngChunkFilterAgain);
+      buffer.appendBuffer(std::move(filteredPngBuffer));
+    }
+
+    if (context->verbose()) {
+      // For debugging only, use the legacy PNG cruncher and compare the
+      // resulting file sizes.
+      // This will help catch exotic cases where the new code may generate
+      // larger PNGs.
+      std::stringstream legacyStream(content);
+      BigBuffer legacyBuffer(4096);
+      Png png(context->getDiagnostics());
+      if (!png.process(pathData.source, &legacyStream, &legacyBuffer, {})) {
+        return false;
+      }
+
+      context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                      << "legacy=" << legacyBuffer.size()
+                                      << " new=" << buffer.size());
+    }
+  }
+
+  if (!writeHeaderAndBufferToWriter(outputPath, resFile, buffer, writer,
+                                    context->getDiagnostics())) {
+    return false;
+  }
+  return true;
 }
 
 static bool compileFile(IAaptContext* context, const CompileOptions& options,
-                        const ResourcePathData& pathData, IArchiveWriter* writer,
-                        const std::string& outputPath) {
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage(pathData.source) << "compiling file");
-    }
+                        const ResourcePathData& pathData,
+                        IArchiveWriter* writer, const std::string& outputPath) {
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                    << "compiling file");
+  }
 
-    BigBuffer buffer(256);
-    ResourceFile resFile;
-    resFile.name = ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
-    resFile.config = pathData.config;
-    resFile.source = pathData.source;
+  BigBuffer buffer(256);
+  ResourceFile resFile;
+  resFile.name =
+      ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
+  resFile.config = pathData.config;
+  resFile.source = pathData.source;
 
-    std::string errorStr;
-    Maybe<android::FileMap> f = file::mmapPath(pathData.source.path, &errorStr);
-    if (!f) {
-        context->getDiagnostics()->error(DiagMessage(pathData.source) << errorStr);
-        return false;
-    }
+  std::string errorStr;
+  Maybe<android::FileMap> f = file::mmapPath(pathData.source.path, &errorStr);
+  if (!f) {
+    context->getDiagnostics()->error(DiagMessage(pathData.source) << errorStr);
+    return false;
+  }
 
-    if (!writeHeaderAndMmapToWriter(outputPath, resFile, f.value(), writer,
-                                    context->getDiagnostics())) {
-        return false;
-    }
-    return true;
+  if (!writeHeaderAndMmapToWriter(outputPath, resFile, f.value(), writer,
+                                  context->getDiagnostics())) {
+    return false;
+  }
+  return true;
 }
 
 class CompileContext : public IAaptContext {
-public:
-    void setVerbose(bool val) {
-        mVerbose = val;
-    }
+ public:
+  void setVerbose(bool val) { mVerbose = val; }
 
-    bool verbose() override {
-        return mVerbose;
-    }
+  bool verbose() override { return mVerbose; }
 
-    IDiagnostics* getDiagnostics() override {
-       return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-       abort();
-       return nullptr;
-    }
+  NameMangler* getNameMangler() override {
+    abort();
+    return nullptr;
+  }
 
-    const std::string& getCompilationPackage() override {
-        static std::string empty;
-        return empty;
-    }
+  const std::string& getCompilationPackage() override {
+    static std::string empty;
+    return empty;
+  }
 
-    uint8_t getPackageId() override {
-       return 0x0;
-    }
+  uint8_t getPackageId() override { return 0x0; }
 
-    SymbolTable* getExternalSymbols() override {
-       abort();
-       return nullptr;
-    }
+  SymbolTable* getExternalSymbols() override {
+    abort();
+    return nullptr;
+  }
 
-    int getMinSdkVersion() override {
-        return 0;
-    }
+  int getMinSdkVersion() override { return 0; }
 
-private:
-    StdErrDiagnostics mDiagnostics;
-    bool mVerbose = false;
-
+ private:
+  StdErrDiagnostics mDiagnostics;
+  bool mVerbose = false;
 };
 
 /**
- * Entry point for compilation phase. Parses arguments and dispatches to the correct steps.
+ * Entry point for compilation phase. Parses arguments and dispatches to the
+ * correct steps.
  */
 int compile(const std::vector<StringPiece>& args) {
-    CompileContext context;
-    CompileOptions options;
+  CompileContext context;
+  CompileOptions options;
 
-    bool verbose = false;
-    Flags flags = Flags()
-            .requiredFlag("-o", "Output path", &options.outputPath)
-            .optionalFlag("--dir", "Directory to scan for resources", &options.resDir)
-            .optionalSwitch("--pseudo-localize", "Generate resources for pseudo-locales "
-                            "(en-XA and ar-XB)", &options.pseudolocalize)
-            .optionalSwitch("--legacy", "Treat errors that used to be valid in AAPT as warnings",
-                            &options.legacyMode)
-            .optionalSwitch("-v", "Enables verbose logging", &verbose);
-    if (!flags.parse("aapt2 compile", args, &std::cerr)) {
-        return 1;
+  bool verbose = false;
+  Flags flags =
+      Flags()
+          .requiredFlag("-o", "Output path", &options.outputPath)
+          .optionalFlag("--dir", "Directory to scan for resources",
+                        &options.resDir)
+          .optionalSwitch("--pseudo-localize",
+                          "Generate resources for pseudo-locales "
+                          "(en-XA and ar-XB)",
+                          &options.pseudolocalize)
+          .optionalSwitch(
+              "--legacy",
+              "Treat errors that used to be valid in AAPT as warnings",
+              &options.legacyMode)
+          .optionalSwitch("-v", "Enables verbose logging", &verbose);
+  if (!flags.parse("aapt2 compile", args, &std::cerr)) {
+    return 1;
+  }
+
+  context.setVerbose(verbose);
+
+  std::unique_ptr<IArchiveWriter> archiveWriter;
+
+  std::vector<ResourcePathData> inputData;
+  if (options.resDir) {
+    if (!flags.getArgs().empty()) {
+      // Can't have both files and a resource directory.
+      context.getDiagnostics()->error(DiagMessage()
+                                      << "files given but --dir specified");
+      flags.usage("aapt2 compile", &std::cerr);
+      return 1;
     }
 
-    context.setVerbose(verbose);
+    if (!loadInputFilesFromDir(&context, options, &inputData)) {
+      return 1;
+    }
 
-    std::unique_ptr<IArchiveWriter> archiveWriter;
+    archiveWriter = createZipFileArchiveWriter(context.getDiagnostics(),
+                                               options.outputPath);
 
-    std::vector<ResourcePathData> inputData;
-    if (options.resDir) {
-        if (!flags.getArgs().empty()) {
-            // Can't have both files and a resource directory.
-            context.getDiagnostics()->error(DiagMessage() << "files given but --dir specified");
-            flags.usage("aapt2 compile", &std::cerr);
-            return 1;
-        }
+  } else {
+    inputData.reserve(flags.getArgs().size());
 
-        if (!loadInputFilesFromDir(&context, options, &inputData)) {
-            return 1;
-        }
+    // Collect data from the path for each input file.
+    for (const std::string& arg : flags.getArgs()) {
+      std::string errorStr;
+      if (Maybe<ResourcePathData> pathData =
+              extractResourcePathData(arg, &errorStr)) {
+        inputData.push_back(std::move(pathData.value()));
+      } else {
+        context.getDiagnostics()->error(DiagMessage() << errorStr << " (" << arg
+                                                      << ")");
+        return 1;
+      }
+    }
 
-        archiveWriter = createZipFileArchiveWriter(context.getDiagnostics(), options.outputPath);
+    archiveWriter = createDirectoryArchiveWriter(context.getDiagnostics(),
+                                                 options.outputPath);
+  }
+
+  if (!archiveWriter) {
+    return false;
+  }
+
+  bool error = false;
+  for (ResourcePathData& pathData : inputData) {
+    if (options.verbose) {
+      context.getDiagnostics()->note(DiagMessage(pathData.source)
+                                     << "processing");
+    }
+
+    if (pathData.resourceDir == "values") {
+      // Overwrite the extension.
+      pathData.extension = "arsc";
+
+      const std::string outputFilename = buildIntermediateFilename(pathData);
+      if (!compileTable(&context, options, pathData, archiveWriter.get(),
+                        outputFilename)) {
+        error = true;
+      }
 
     } else {
-        inputData.reserve(flags.getArgs().size());
-
-        // Collect data from the path for each input file.
-        for (const std::string& arg : flags.getArgs()) {
-            std::string errorStr;
-            if (Maybe<ResourcePathData> pathData = extractResourcePathData(arg, &errorStr)) {
-                inputData.push_back(std::move(pathData.value()));
-            } else {
-                context.getDiagnostics()->error(DiagMessage() << errorStr << " (" << arg << ")");
-                return 1;
+      const std::string outputFilename = buildIntermediateFilename(pathData);
+      if (const ResourceType* type = parseResourceType(pathData.resourceDir)) {
+        if (*type != ResourceType::kRaw) {
+          if (pathData.extension == "xml") {
+            if (!compileXml(&context, options, pathData, archiveWriter.get(),
+                            outputFilename)) {
+              error = true;
             }
-        }
-
-        archiveWriter = createDirectoryArchiveWriter(context.getDiagnostics(), options.outputPath);
-    }
-
-    if (!archiveWriter) {
-        return false;
-    }
-
-    bool error = false;
-    for (ResourcePathData& pathData : inputData) {
-        if (options.verbose) {
-            context.getDiagnostics()->note(DiagMessage(pathData.source) << "processing");
-        }
-
-        if (pathData.resourceDir == "values") {
-            // Overwrite the extension.
-            pathData.extension = "arsc";
-
-            const std::string outputFilename = buildIntermediateFilename(pathData);
-            if (!compileTable(&context, options, pathData, archiveWriter.get(), outputFilename)) {
-                error = true;
+          } else if (pathData.extension == "png" ||
+                     pathData.extension == "9.png") {
+            if (!compilePng(&context, options, pathData, archiveWriter.get(),
+                            outputFilename)) {
+              error = true;
             }
-
+          } else {
+            if (!compileFile(&context, options, pathData, archiveWriter.get(),
+                             outputFilename)) {
+              error = true;
+            }
+          }
         } else {
-            const std::string outputFilename = buildIntermediateFilename(pathData);
-            if (const ResourceType* type = parseResourceType(pathData.resourceDir)) {
-                if (*type != ResourceType::kRaw) {
-                    if (pathData.extension == "xml") {
-                        if (!compileXml(&context, options, pathData, archiveWriter.get(),
-                                        outputFilename)) {
-                            error = true;
-                        }
-                    } else if (pathData.extension == "png" || pathData.extension == "9.png") {
-                        if (!compilePng(&context, options, pathData, archiveWriter.get(),
-                                        outputFilename)) {
-                            error = true;
-                        }
-                    } else {
-                        if (!compileFile(&context, options, pathData, archiveWriter.get(),
-                                         outputFilename)) {
-                            error = true;
-                        }
-                    }
-                } else {
-                    if (!compileFile(&context, options, pathData, archiveWriter.get(),
-                                     outputFilename)) {
-                        error = true;
-                    }
-                }
-            } else {
-                context.getDiagnostics()->error(
-                        DiagMessage() << "invalid file path '" << pathData.source << "'");
-                error = true;
-            }
+          if (!compileFile(&context, options, pathData, archiveWriter.get(),
+                           outputFilename)) {
+            error = true;
+          }
         }
+      } else {
+        context.getDiagnostics()->error(
+            DiagMessage() << "invalid file path '" << pathData.source << "'");
+        error = true;
+      }
     }
+  }
 
-    if (error) {
-        return 1;
-    }
-    return 0;
+  if (error) {
+    return 1;
+  }
+  return 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/IdAssigner.cpp b/tools/aapt2/compile/IdAssigner.cpp
index 4a3f1e1..73eb066 100644
--- a/tools/aapt2/compile/IdAssigner.cpp
+++ b/tools/aapt2/compile/IdAssigner.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceTable.h"
 #include "compile/IdAssigner.h"
+#include "ResourceTable.h"
 #include "process/IResourceTableConsumer.h"
 #include "util/Util.h"
 
@@ -25,178 +25,192 @@
 namespace aapt {
 
 /**
- * Assigns the intended ID to the ResourceTablePackage, ResourceTableType, and ResourceEntry,
+ * Assigns the intended ID to the ResourceTablePackage, ResourceTableType, and
+ * ResourceEntry,
  * as long as there is no existing ID or the ID is the same.
  */
-static bool assignId(IDiagnostics* diag, const ResourceId& id, const ResourceName& name,
-                     ResourceTablePackage* pkg, ResourceTableType* type, ResourceEntry* entry) {
-    if (pkg->id.value() == id.packageId()) {
-        if (!type->id || type->id.value() == id.typeId()) {
-            type->id = id.typeId();
+static bool assignId(IDiagnostics* diag, const ResourceId& id,
+                     const ResourceName& name, ResourceTablePackage* pkg,
+                     ResourceTableType* type, ResourceEntry* entry) {
+  if (pkg->id.value() == id.packageId()) {
+    if (!type->id || type->id.value() == id.typeId()) {
+      type->id = id.typeId();
 
-            if (!entry->id || entry->id.value() == id.entryId()) {
-                entry->id = id.entryId();
-                return true;
-            }
-        }
+      if (!entry->id || entry->id.value() == id.entryId()) {
+        entry->id = id.entryId();
+        return true;
+      }
     }
+  }
 
-    const ResourceId existingId(pkg->id.value(),
-                                type->id ? type->id.value() : 0,
-                                entry->id ? entry->id.value() : 0);
-    diag->error(DiagMessage() << "can't assign ID " << id
-                << " to resource " << name
-                << " with conflicting ID " << existingId);
-    return false;
+  const ResourceId existingId(pkg->id.value(), type->id ? type->id.value() : 0,
+                              entry->id ? entry->id.value() : 0);
+  diag->error(DiagMessage() << "can't assign ID " << id << " to resource "
+                            << name << " with conflicting ID " << existingId);
+  return false;
 }
 
 bool IdAssigner::consume(IAaptContext* context, ResourceTable* table) {
-    std::map<ResourceId, ResourceName> assignedIds;
+  std::map<ResourceId, ResourceName> assignedIds;
 
-    for (auto& package : table->packages) {
-        assert(package->id && "packages must have manually assigned IDs");
+  for (auto& package : table->packages) {
+    assert(package->id && "packages must have manually assigned IDs");
 
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                const ResourceName name(package->name, type->type, entry->name);
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        const ResourceName name(package->name, type->type, entry->name);
 
-                if (mAssignedIdMap) {
-                    // Assign the pre-assigned stable ID meant for this resource.
-                    const auto iter = mAssignedIdMap->find(name);
-                    if (iter != mAssignedIdMap->end()) {
-                        const ResourceId assignedId = iter->second;
-                        const bool result = assignId(context->getDiagnostics(), assignedId, name,
-                                                     package.get(), type.get(), entry.get());
-                        if (!result) {
-                            return false;
-                        }
-                    }
-                }
-
-                if (package->id && type->id && entry->id) {
-                    // If the ID is set for this resource, then reserve it.
-                    ResourceId resourceId(package->id.value(), type->id.value(), entry->id.value());
-                    auto result = assignedIds.insert({ resourceId, name });
-                    const ResourceName& existingName = result.first->second;
-                    if (!result.second) {
-                        context->getDiagnostics()->error(DiagMessage() << "resource " << name
-                                                         << " has same ID "
-                                                         << resourceId
-                                                         << " as " << existingName);
-                        return false;
-                    }
-                }
+        if (mAssignedIdMap) {
+          // Assign the pre-assigned stable ID meant for this resource.
+          const auto iter = mAssignedIdMap->find(name);
+          if (iter != mAssignedIdMap->end()) {
+            const ResourceId assignedId = iter->second;
+            const bool result =
+                assignId(context->getDiagnostics(), assignedId, name,
+                         package.get(), type.get(), entry.get());
+            if (!result) {
+              return false;
             }
+          }
         }
-    }
 
-    if (mAssignedIdMap) {
-        // Reserve all the IDs mentioned in the stable ID map. That way we won't assign
-        // IDs that were listed in the map if they don't exist in the table.
-        for (const auto& stableIdEntry : *mAssignedIdMap) {
-            const ResourceName& preAssignedName = stableIdEntry.first;
-            const ResourceId& preAssignedId = stableIdEntry.second;
-            auto result = assignedIds.insert({ preAssignedId, preAssignedName });
-            const ResourceName& existingName = result.first->second;
-            if (!result.second && existingName != preAssignedName) {
-                context->getDiagnostics()->error(DiagMessage() << "stable ID " << preAssignedId
-                                                 << " for resource " << preAssignedName
-                                                 << " is already taken by resource "
-                                                 << existingName);
-                return false;
-            }
+        if (package->id && type->id && entry->id) {
+          // If the ID is set for this resource, then reserve it.
+          ResourceId resourceId(package->id.value(), type->id.value(),
+                                entry->id.value());
+          auto result = assignedIds.insert({resourceId, name});
+          const ResourceName& existingName = result.first->second;
+          if (!result.second) {
+            context->getDiagnostics()->error(
+                DiagMessage() << "resource " << name << " has same ID "
+                              << resourceId << " as " << existingName);
+            return false;
+          }
         }
+      }
     }
+  }
 
-    // Assign any resources without IDs the next available ID. Gaps will be filled if possible,
-    // unless those IDs have been reserved.
+  if (mAssignedIdMap) {
+    // Reserve all the IDs mentioned in the stable ID map. That way we won't
+    // assign
+    // IDs that were listed in the map if they don't exist in the table.
+    for (const auto& stableIdEntry : *mAssignedIdMap) {
+      const ResourceName& preAssignedName = stableIdEntry.first;
+      const ResourceId& preAssignedId = stableIdEntry.second;
+      auto result = assignedIds.insert({preAssignedId, preAssignedName});
+      const ResourceName& existingName = result.first->second;
+      if (!result.second && existingName != preAssignedName) {
+        context->getDiagnostics()->error(
+            DiagMessage() << "stable ID " << preAssignedId << " for resource "
+                          << preAssignedName << " is already taken by resource "
+                          << existingName);
+        return false;
+      }
+    }
+  }
 
-    const auto assignedIdsIterEnd = assignedIds.end();
-    for (auto& package : table->packages) {
-        assert(package->id && "packages must have manually assigned IDs");
+  // Assign any resources without IDs the next available ID. Gaps will be filled
+  // if possible,
+  // unless those IDs have been reserved.
 
-        // Build a half filled ResourceId object, which will be used to find the closest matching
-        // reserved ID in the assignedId map. From that point the next available type ID can be
-        // found.
-        ResourceId resourceId(package->id.value(), 0, 0);
-        uint8_t nextExpectedTypeId = 1;
+  const auto assignedIdsIterEnd = assignedIds.end();
+  for (auto& package : table->packages) {
+    assert(package->id && "packages must have manually assigned IDs");
 
-        // Find the closest matching ResourceId that is <= the one with only the package set.
-        auto nextTypeIter = assignedIds.lower_bound(resourceId);
-        for (auto& type : package->types) {
-            if (!type->id) {
-                // We need to assign a type ID. Iterate over the reserved IDs until we find
-                // some type ID that is a distance of 2 greater than the last one we've seen.
-                // That means there is an available type ID between these reserved IDs.
-                while (nextTypeIter != assignedIdsIterEnd) {
-                    if (nextTypeIter->first.packageId() != package->id.value()) {
-                        break;
-                    }
+    // Build a half filled ResourceId object, which will be used to find the
+    // closest matching
+    // reserved ID in the assignedId map. From that point the next available
+    // type ID can be
+    // found.
+    ResourceId resourceId(package->id.value(), 0, 0);
+    uint8_t nextExpectedTypeId = 1;
 
-                    const uint8_t typeId = nextTypeIter->first.typeId();
-                    if (typeId > nextExpectedTypeId) {
-                        // There is a gap in the type IDs, so use the missing one.
-                        type->id = nextExpectedTypeId++;
-                        break;
-                    }
+    // Find the closest matching ResourceId that is <= the one with only the
+    // package set.
+    auto nextTypeIter = assignedIds.lower_bound(resourceId);
+    for (auto& type : package->types) {
+      if (!type->id) {
+        // We need to assign a type ID. Iterate over the reserved IDs until we
+        // find
+        // some type ID that is a distance of 2 greater than the last one we've
+        // seen.
+        // That means there is an available type ID between these reserved IDs.
+        while (nextTypeIter != assignedIdsIterEnd) {
+          if (nextTypeIter->first.packageId() != package->id.value()) {
+            break;
+          }
 
-                    // Set our expectation to be the next type ID after the reserved one we
-                    // just saw.
-                    nextExpectedTypeId = typeId + 1;
+          const uint8_t typeId = nextTypeIter->first.typeId();
+          if (typeId > nextExpectedTypeId) {
+            // There is a gap in the type IDs, so use the missing one.
+            type->id = nextExpectedTypeId++;
+            break;
+          }
 
-                    // Move to the next reserved ID.
-                    ++nextTypeIter;
-                }
+          // Set our expectation to be the next type ID after the reserved one
+          // we
+          // just saw.
+          nextExpectedTypeId = typeId + 1;
 
-                if (!type->id) {
-                    // We must have hit the end of the reserved IDs and not found a gap.
-                    // That means the next ID is available.
-                    type->id = nextExpectedTypeId++;
-                }
-            }
-
-            resourceId = ResourceId(package->id.value(), type->id.value(), 0);
-            uint16_t nextExpectedEntryId = 0;
-
-            // Find the closest matching ResourceId that is <= the one with only the package
-            // and type set.
-            auto nextEntryIter = assignedIds.lower_bound(resourceId);
-            for (auto& entry : type->entries) {
-                if (!entry->id) {
-                    // We need to assign an entry ID. Iterate over the reserved IDs until we find
-                    // some entry ID that is a distance of 2 greater than the last one we've seen.
-                    // That means there is an available entry ID between these reserved IDs.
-                    while (nextEntryIter != assignedIdsIterEnd) {
-                        if (nextEntryIter->first.packageId() != package->id.value() ||
-                                nextEntryIter->first.typeId() != type->id.value()) {
-                            break;
-                        }
-
-                        const uint16_t entryId = nextEntryIter->first.entryId();
-                        if (entryId > nextExpectedEntryId) {
-                            // There is a gap in the entry IDs, so use the missing one.
-                            entry->id = nextExpectedEntryId++;
-                            break;
-                        }
-
-                        // Set our expectation to be the next type ID after the reserved one we
-                        // just saw.
-                        nextExpectedEntryId = entryId + 1;
-
-                        // Move to the next reserved entry ID.
-                        ++nextEntryIter;
-                    }
-
-                    if (!entry->id) {
-                        // We must have hit the end of the reserved IDs and not found a gap.
-                        // That means the next ID is available.
-                        entry->id = nextExpectedEntryId++;
-                    }
-                }
-            }
+          // Move to the next reserved ID.
+          ++nextTypeIter;
         }
+
+        if (!type->id) {
+          // We must have hit the end of the reserved IDs and not found a gap.
+          // That means the next ID is available.
+          type->id = nextExpectedTypeId++;
+        }
+      }
+
+      resourceId = ResourceId(package->id.value(), type->id.value(), 0);
+      uint16_t nextExpectedEntryId = 0;
+
+      // Find the closest matching ResourceId that is <= the one with only the
+      // package
+      // and type set.
+      auto nextEntryIter = assignedIds.lower_bound(resourceId);
+      for (auto& entry : type->entries) {
+        if (!entry->id) {
+          // We need to assign an entry ID. Iterate over the reserved IDs until
+          // we find
+          // some entry ID that is a distance of 2 greater than the last one
+          // we've seen.
+          // That means there is an available entry ID between these reserved
+          // IDs.
+          while (nextEntryIter != assignedIdsIterEnd) {
+            if (nextEntryIter->first.packageId() != package->id.value() ||
+                nextEntryIter->first.typeId() != type->id.value()) {
+              break;
+            }
+
+            const uint16_t entryId = nextEntryIter->first.entryId();
+            if (entryId > nextExpectedEntryId) {
+              // There is a gap in the entry IDs, so use the missing one.
+              entry->id = nextExpectedEntryId++;
+              break;
+            }
+
+            // Set our expectation to be the next type ID after the reserved one
+            // we
+            // just saw.
+            nextExpectedEntryId = entryId + 1;
+
+            // Move to the next reserved entry ID.
+            ++nextEntryIter;
+          }
+
+          if (!entry->id) {
+            // We must have hit the end of the reserved IDs and not found a gap.
+            // That means the next ID is available.
+            entry->id = nextExpectedEntryId++;
+          }
+        }
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/IdAssigner.h b/tools/aapt2/compile/IdAssigner.h
index 06cd5e3..d399064 100644
--- a/tools/aapt2/compile/IdAssigner.h
+++ b/tools/aapt2/compile/IdAssigner.h
@@ -26,22 +26,22 @@
 namespace aapt {
 
 /**
- * Assigns IDs to each resource in the table, respecting existing IDs and filling in gaps
+ * Assigns IDs to each resource in the table, respecting existing IDs and
+ * filling in gaps
  * in between fixed ID assignments.
  */
 class IdAssigner : public IResourceTableConsumer {
-public:
-    IdAssigner() = default;
-    explicit IdAssigner(const std::unordered_map<ResourceName, ResourceId>* map) :
-            mAssignedIdMap(map) {
-    }
+ public:
+  IdAssigner() = default;
+  explicit IdAssigner(const std::unordered_map<ResourceName, ResourceId>* map)
+      : mAssignedIdMap(map) {}
 
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 
-private:
-    const std::unordered_map<ResourceName, ResourceId>* mAssignedIdMap = nullptr;
+ private:
+  const std::unordered_map<ResourceName, ResourceId>* mAssignedIdMap = nullptr;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_IDASSIGNER_H */
diff --git a/tools/aapt2/compile/IdAssigner_test.cpp b/tools/aapt2/compile/IdAssigner_test.cpp
index d21fcba..ff7bf5c 100644
--- a/tools/aapt2/compile/IdAssigner_test.cpp
+++ b/tools/aapt2/compile/IdAssigner_test.cpp
@@ -22,154 +22,163 @@
 ::testing::AssertionResult verifyIds(ResourceTable* table);
 
 TEST(IdAssignerTest, AssignIds) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/foo")
-            .addSimple("android:attr/bar")
-            .addSimple("android:id/foo")
-            .setPackageId("android", 0x01)
-            .build();
+  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+                                             .addSimple("android:attr/foo")
+                                             .addSimple("android:attr/bar")
+                                             .addSimple("android:id/foo")
+                                             .setPackageId("android", 0x01)
+                                             .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    IdAssigner assigner;
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  IdAssigner assigner;
 
-    ASSERT_TRUE(assigner.consume(context.get(), table.get()));
-    ASSERT_TRUE(verifyIds(table.get()));
+  ASSERT_TRUE(assigner.consume(context.get(), table.get()));
+  ASSERT_TRUE(verifyIds(table.get()));
 }
 
 TEST(IdAssignerTest, AssignIdsWithReservedIds) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:id/foo", ResourceId(0x01010000))
-            .addSimple("android:dimen/two")
-            .addSimple("android:integer/three")
-            .addSimple("android:string/five")
-            .addSimple("android:attr/fun", ResourceId(0x01040000))
-            .addSimple("android:attr/foo", ResourceId(0x01040006))
-            .addSimple("android:attr/bar")
-            .addSimple("android:attr/baz")
-            .addSimple("app:id/biz")
-            .setPackageId("android", 0x01)
-            .setPackageId("app", 0x7f)
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:id/foo", ResourceId(0x01010000))
+          .addSimple("android:dimen/two")
+          .addSimple("android:integer/three")
+          .addSimple("android:string/five")
+          .addSimple("android:attr/fun", ResourceId(0x01040000))
+          .addSimple("android:attr/foo", ResourceId(0x01040006))
+          .addSimple("android:attr/bar")
+          .addSimple("android:attr/baz")
+          .addSimple("app:id/biz")
+          .setPackageId("android", 0x01)
+          .setPackageId("app", 0x7f)
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    IdAssigner assigner;
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  IdAssigner assigner;
 
-    ASSERT_TRUE(assigner.consume(context.get(), table.get()));
-    ASSERT_TRUE(verifyIds(table.get()));
+  ASSERT_TRUE(assigner.consume(context.get(), table.get()));
+  ASSERT_TRUE(verifyIds(table.get()));
 
-    Maybe<ResourceTable::SearchResult> maybeResult;
+  Maybe<ResourceTable::SearchResult> maybeResult;
 
-    // Expect to fill in the gaps between 0x0101XXXX and 0x0104XXXX.
+  // Expect to fill in the gaps between 0x0101XXXX and 0x0104XXXX.
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:dimen/two"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint8_t>(2), maybeResult.value().type->id);
+  maybeResult = table->findResource(test::parseNameOrDie("android:dimen/two"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint8_t>(2), maybeResult.value().type->id);
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:integer/three"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint8_t>(3), maybeResult.value().type->id);
+  maybeResult =
+      table->findResource(test::parseNameOrDie("android:integer/three"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint8_t>(3), maybeResult.value().type->id);
 
-    // Expect to bypass the reserved 0x0104XXXX IDs and use the next 0x0105XXXX IDs.
+  // Expect to bypass the reserved 0x0104XXXX IDs and use the next 0x0105XXXX
+  // IDs.
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:string/five"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint8_t>(5), maybeResult.value().type->id);
+  maybeResult =
+      table->findResource(test::parseNameOrDie("android:string/five"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint8_t>(5), maybeResult.value().type->id);
 
-    // Expect to fill in the gaps between 0x01040000 and 0x01040006.
+  // Expect to fill in the gaps between 0x01040000 and 0x01040006.
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:attr/bar"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint16_t>(1), maybeResult.value().entry->id);
+  maybeResult = table->findResource(test::parseNameOrDie("android:attr/bar"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint16_t>(1), maybeResult.value().entry->id);
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:attr/baz"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint16_t>(2), maybeResult.value().entry->id);
+  maybeResult = table->findResource(test::parseNameOrDie("android:attr/baz"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint16_t>(2), maybeResult.value().entry->id);
 }
 
 TEST(IdAssignerTest, FailWhenNonUniqueIdsAssigned) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/foo", ResourceId(0x01040006))
-            .addSimple("android:attr/bar", ResourceId(0x01040006))
-            .setPackageId("android", 0x01)
-            .setPackageId("app", 0x7f)
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:attr/foo", ResourceId(0x01040006))
+          .addSimple("android:attr/bar", ResourceId(0x01040006))
+          .setPackageId("android", 0x01)
+          .setPackageId("app", 0x7f)
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    IdAssigner assigner;
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  IdAssigner assigner;
 
-    ASSERT_FALSE(assigner.consume(context.get(), table.get()));
+  ASSERT_FALSE(assigner.consume(context.get(), table.get()));
 }
 
 TEST(IdAssignerTest, AssignIdsWithIdMap) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/foo")
-            .addSimple("android:attr/bar")
-            .setPackageId("android", 0x01)
-            .build();
+  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+                                             .addSimple("android:attr/foo")
+                                             .addSimple("android:attr/bar")
+                                             .setPackageId("android", 0x01)
+                                             .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unordered_map<ResourceName, ResourceId> idMap = {
-            { test::parseNameOrDie("android:attr/foo"), ResourceId(0x01010002) } };
-    IdAssigner assigner(&idMap);
-    ASSERT_TRUE(assigner.consume(context.get(), table.get()));
-    ASSERT_TRUE(verifyIds(table.get()));
-    Maybe<ResourceTable::SearchResult> result = table->findResource(
-            test::parseNameOrDie("android:attr/foo"));
-    AAPT_ASSERT_TRUE(result);
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unordered_map<ResourceName, ResourceId> idMap = {
+      {test::parseNameOrDie("android:attr/foo"), ResourceId(0x01010002)}};
+  IdAssigner assigner(&idMap);
+  ASSERT_TRUE(assigner.consume(context.get(), table.get()));
+  ASSERT_TRUE(verifyIds(table.get()));
+  Maybe<ResourceTable::SearchResult> result =
+      table->findResource(test::parseNameOrDie("android:attr/foo"));
+  AAPT_ASSERT_TRUE(result);
 
-    const ResourceTable::SearchResult& searchResult = result.value();
-    EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.package->id);
-    EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.type->id);
-    EXPECT_EQ(make_value<uint16_t>(0x0002), searchResult.entry->id);
+  const ResourceTable::SearchResult& searchResult = result.value();
+  EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.package->id);
+  EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.type->id);
+  EXPECT_EQ(make_value<uint16_t>(0x0002), searchResult.entry->id);
 }
 
 ::testing::AssertionResult verifyIds(ResourceTable* table) {
-    std::set<uint8_t> packageIds;
-    for (auto& package : table->packages) {
-        if (!package->id) {
-            return ::testing::AssertionFailure() << "package " << package->name << " has no ID";
-        }
-
-        if (!packageIds.insert(package->id.value()).second) {
-            return ::testing::AssertionFailure() << "package " << package->name
-                    << " has non-unique ID " << std::hex << (int) package->id.value() << std::dec;
-        }
+  std::set<uint8_t> packageIds;
+  for (auto& package : table->packages) {
+    if (!package->id) {
+      return ::testing::AssertionFailure() << "package " << package->name
+                                           << " has no ID";
     }
 
-    for (auto& package : table->packages) {
-        std::set<uint8_t> typeIds;
-        for (auto& type : package->types) {
-            if (!type->id) {
-                return ::testing::AssertionFailure() << "type " << type->type << " of package "
-                        << package->name << " has no ID";
-            }
-
-            if (!typeIds.insert(type->id.value()).second) {
-                return ::testing::AssertionFailure() << "type " << type->type
-                        << " of package " << package->name << " has non-unique ID "
-                        << std::hex << (int) type->id.value() << std::dec;
-            }
-        }
-
-
-        for (auto& type : package->types) {
-            std::set<uint16_t> entryIds;
-            for (auto& entry : type->entries) {
-                if (!entry->id) {
-                    return ::testing::AssertionFailure() << "entry " << entry->name << " of type "
-                            << type->type << " of package " << package->name << " has no ID";
-                }
-
-                if (!entryIds.insert(entry->id.value()).second) {
-                    return ::testing::AssertionFailure() << "entry " << entry->name
-                            << " of type " << type->type << " of package " << package->name
-                            << " has non-unique ID "
-                            << std::hex << (int) entry->id.value() << std::dec;
-                }
-            }
-        }
+    if (!packageIds.insert(package->id.value()).second) {
+      return ::testing::AssertionFailure()
+             << "package " << package->name << " has non-unique ID " << std::hex
+             << (int)package->id.value() << std::dec;
     }
-    return ::testing::AssertionSuccess() << "all IDs are unique and assigned";
+  }
+
+  for (auto& package : table->packages) {
+    std::set<uint8_t> typeIds;
+    for (auto& type : package->types) {
+      if (!type->id) {
+        return ::testing::AssertionFailure() << "type " << type->type
+                                             << " of package " << package->name
+                                             << " has no ID";
+      }
+
+      if (!typeIds.insert(type->id.value()).second) {
+        return ::testing::AssertionFailure()
+               << "type " << type->type << " of package " << package->name
+               << " has non-unique ID " << std::hex << (int)type->id.value()
+               << std::dec;
+      }
+    }
+
+    for (auto& type : package->types) {
+      std::set<uint16_t> entryIds;
+      for (auto& entry : type->entries) {
+        if (!entry->id) {
+          return ::testing::AssertionFailure()
+                 << "entry " << entry->name << " of type " << type->type
+                 << " of package " << package->name << " has no ID";
+        }
+
+        if (!entryIds.insert(entry->id.value()).second) {
+          return ::testing::AssertionFailure()
+                 << "entry " << entry->name << " of type " << type->type
+                 << " of package " << package->name << " has non-unique ID "
+                 << std::hex << (int)entry->id.value() << std::dec;
+        }
+      }
+    }
+  }
+  return ::testing::AssertionSuccess() << "all IDs are unique and assigned";
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Image.h b/tools/aapt2/compile/Image.h
index fda6a3a..4cf2ea7 100644
--- a/tools/aapt2/compile/Image.h
+++ b/tools/aapt2/compile/Image.h
@@ -29,173 +29,180 @@
  * An in-memory image, loaded from disk, with pixels in RGBA_8888 format.
  */
 class Image {
-public:
-    explicit Image() = default;
+ public:
+  explicit Image() = default;
 
-    /**
-     * A `height` sized array of pointers, where each element points to a
-     * `width` sized row of RGBA_8888 pixels.
-     */
-    std::unique_ptr<uint8_t*[]> rows;
+  /**
+   * A `height` sized array of pointers, where each element points to a
+   * `width` sized row of RGBA_8888 pixels.
+   */
+  std::unique_ptr<uint8_t* []> rows;
 
-    /**
-     * The width of the image in RGBA_8888 pixels. This is int32_t because of 9-patch data
-     * format limitations.
-     */
-    int32_t width = 0;
+  /**
+   * The width of the image in RGBA_8888 pixels. This is int32_t because of
+   * 9-patch data
+   * format limitations.
+   */
+  int32_t width = 0;
 
-    /**
-     * The height of the image in RGBA_8888 pixels. This is int32_t because of 9-patch data
-     * format limitations.
-     */
-    int32_t height = 0;
+  /**
+   * The height of the image in RGBA_8888 pixels. This is int32_t because of
+   * 9-patch data
+   * format limitations.
+   */
+  int32_t height = 0;
 
-    /**
-     * Buffer to the raw image data stored sequentially.
-     * Use `rows` to access the data on a row-by-row basis.
-     */
-    std::unique_ptr<uint8_t[]> data;
+  /**
+   * Buffer to the raw image data stored sequentially.
+   * Use `rows` to access the data on a row-by-row basis.
+   */
+  std::unique_ptr<uint8_t[]> data;
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(Image);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Image);
 };
 
 /**
- * A range of pixel values, starting at 'start' and ending before 'end' exclusive. Or rather [a, b).
+ * A range of pixel values, starting at 'start' and ending before 'end'
+ * exclusive. Or rather [a, b).
  */
 struct Range {
-    int32_t start = 0;
-    int32_t end = 0;
+  int32_t start = 0;
+  int32_t end = 0;
 
-    explicit Range() = default;
-    inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {
-    }
+  explicit Range() = default;
+  inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {}
 };
 
 inline bool operator==(const Range& left, const Range& right) {
-    return left.start == right.start && left.end == right.end;
+  return left.start == right.start && left.end == right.end;
 }
 
 /**
- * Inset lengths from all edges of a rectangle. `left` and `top` are measured from the left and top
- * edges, while `right` and `bottom` are measured from the right and bottom edges, respectively.
+ * Inset lengths from all edges of a rectangle. `left` and `top` are measured
+ * from the left and top
+ * edges, while `right` and `bottom` are measured from the right and bottom
+ * edges, respectively.
  */
 struct Bounds {
-    int32_t left = 0;
-    int32_t top = 0;
-    int32_t right = 0;
-    int32_t bottom = 0;
+  int32_t left = 0;
+  int32_t top = 0;
+  int32_t right = 0;
+  int32_t bottom = 0;
 
-    explicit Bounds() = default;
-    inline explicit Bounds(int32_t l, int32_t t, int32_t r, int32_t b) :
-            left(l), top(t), right(r), bottom(b) {
-    }
+  explicit Bounds() = default;
+  inline explicit Bounds(int32_t l, int32_t t, int32_t r, int32_t b)
+      : left(l), top(t), right(r), bottom(b) {}
 
-    bool nonZero() const;
+  bool nonZero() const;
 };
 
 inline bool Bounds::nonZero() const {
-    return left != 0 || top != 0 || right != 0 || bottom != 0;
+  return left != 0 || top != 0 || right != 0 || bottom != 0;
 }
 
 inline bool operator==(const Bounds& left, const Bounds& right) {
-    return left.left == right.left && left.top == right.top &&
-            left.right == right.right && left.bottom == right.bottom;
+  return left.left == right.left && left.top == right.top &&
+         left.right == right.right && left.bottom == right.bottom;
 }
 
 /**
- * Contains 9-patch data from a source image. All measurements exclude the 1px border of the
+ * Contains 9-patch data from a source image. All measurements exclude the 1px
+ * border of the
  * source 9-patch image.
  */
 class NinePatch {
-public:
-    static std::unique_ptr<NinePatch> create(uint8_t** rows,
-                                             const int32_t width, const int32_t height,
-                                             std::string* errOut);
+ public:
+  static std::unique_ptr<NinePatch> create(uint8_t** rows, const int32_t width,
+                                           const int32_t height,
+                                           std::string* errOut);
 
-    /**
-     * Packs the RGBA_8888 data pointed to by pixel into a uint32_t
-     * with format 0xAARRGGBB (the way 9-patch expects it).
-     */
-    static uint32_t packRGBA(const uint8_t* pixel);
+  /**
+   * Packs the RGBA_8888 data pointed to by pixel into a uint32_t
+   * with format 0xAARRGGBB (the way 9-patch expects it).
+   */
+  static uint32_t packRGBA(const uint8_t* pixel);
 
-    /**
-     * 9-patch content padding/insets. All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     */
-    Bounds padding;
+  /**
+   * 9-patch content padding/insets. All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   */
+  Bounds padding;
 
-    /**
-     * Optical layout bounds/insets. This overrides the padding for
-     * layout purposes. All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     * See https://developer.android.com/about/versions/android-4.3.html#OpticalBounds
-     */
-    Bounds layoutBounds;
+  /**
+   * Optical layout bounds/insets. This overrides the padding for
+   * layout purposes. All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   * See
+   * https://developer.android.com/about/versions/android-4.3.html#OpticalBounds
+   */
+  Bounds layoutBounds;
 
-    /**
-     * Outline of the image, calculated based on opacity.
-     */
-    Bounds outline;
+  /**
+   * Outline of the image, calculated based on opacity.
+   */
+  Bounds outline;
 
-    /**
-     * The computed radius of the outline. If non-zero, the outline is a rounded-rect.
-     */
-    float outlineRadius = 0.0f;
+  /**
+   * The computed radius of the outline. If non-zero, the outline is a
+   * rounded-rect.
+   */
+  float outlineRadius = 0.0f;
 
-    /**
-     * The largest alpha value within the outline.
-     */
-    uint32_t outlineAlpha = 0x000000ffu;
+  /**
+   * The largest alpha value within the outline.
+   */
+  uint32_t outlineAlpha = 0x000000ffu;
 
-    /**
-     * Horizontal regions of the image that are stretchable.
-     * All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     */
-    std::vector<Range> horizontalStretchRegions;
+  /**
+   * Horizontal regions of the image that are stretchable.
+   * All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   */
+  std::vector<Range> horizontalStretchRegions;
 
-    /**
-     * Vertical regions of the image that are stretchable.
-     * All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     */
-    std::vector<Range> verticalStretchRegions;
+  /**
+   * Vertical regions of the image that are stretchable.
+   * All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   */
+  std::vector<Range> verticalStretchRegions;
 
-    /**
-     * The colors within each region, fixed or stretchable.
-     * For w*h regions, the color of region (x,y) is addressable
-     * via index y*w + x.
-     */
-    std::vector<uint32_t> regionColors;
+  /**
+   * The colors within each region, fixed or stretchable.
+   * For w*h regions, the color of region (x,y) is addressable
+   * via index y*w + x.
+   */
+  std::vector<uint32_t> regionColors;
 
-    /**
-     * Returns serialized data containing the original basic 9-patch meta data.
-     * Optical layout bounds and round rect outline data must be serialized
-     * separately using serializeOpticalLayoutBounds() and serializeRoundedRectOutline().
-     */
-    std::unique_ptr<uint8_t[]> serializeBase(size_t* outLen) const;
+  /**
+   * Returns serialized data containing the original basic 9-patch meta data.
+   * Optical layout bounds and round rect outline data must be serialized
+   * separately using serializeOpticalLayoutBounds() and
+   * serializeRoundedRectOutline().
+   */
+  std::unique_ptr<uint8_t[]> serializeBase(size_t* outLen) const;
 
-    /**
-     * Serializes the layout bounds.
-     */
-    std::unique_ptr<uint8_t[]> serializeLayoutBounds(size_t* outLen) const;
+  /**
+   * Serializes the layout bounds.
+   */
+  std::unique_ptr<uint8_t[]> serializeLayoutBounds(size_t* outLen) const;
 
-    /**
-     * Serializes the rounded-rect outline.
-     */
-    std::unique_ptr<uint8_t[]> serializeRoundedRectOutline(size_t* outLen) const;
+  /**
+   * Serializes the rounded-rect outline.
+   */
+  std::unique_ptr<uint8_t[]> serializeRoundedRectOutline(size_t* outLen) const;
 
-private:
-    explicit NinePatch() = default;
+ private:
+  explicit NinePatch() = default;
 
-    DISALLOW_COPY_AND_ASSIGN(NinePatch);
+  DISALLOW_COPY_AND_ASSIGN(NinePatch);
 };
 
 ::std::ostream& operator<<(::std::ostream& out, const Range& range);
 ::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds);
 ::std::ostream& operator<<(::std::ostream& out, const NinePatch& ninePatch);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_IMAGE_H */
diff --git a/tools/aapt2/compile/InlineXmlFormatParser.cpp b/tools/aapt2/compile/InlineXmlFormatParser.cpp
index f965bff..56f72b5 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser.cpp
+++ b/tools/aapt2/compile/InlineXmlFormatParser.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+#include "compile/InlineXmlFormatParser.h"
 #include "Debug.h"
 #include "ResourceUtils.h"
-#include "compile/InlineXmlFormatParser.h"
 #include "util/Util.h"
 #include "xml/XmlDom.h"
 #include "xml/XmlUtil.h"
@@ -33,158 +33,172 @@
  * XML Visitor that will find all <aapt:attr> elements for extraction.
  */
 class Visitor : public xml::PackageAwareVisitor {
-public:
-    using xml::PackageAwareVisitor::visit;
+ public:
+  using xml::PackageAwareVisitor::visit;
 
-    struct InlineDeclaration {
-        xml::Element* el;
-        std::string attrNamespaceUri;
-        std::string attrName;
-    };
+  struct InlineDeclaration {
+    xml::Element* el;
+    std::string attrNamespaceUri;
+    std::string attrName;
+  };
 
-    explicit Visitor(IAaptContext* context, xml::XmlResource* xmlResource) :
-            mContext(context), mXmlResource(xmlResource) {
+  explicit Visitor(IAaptContext* context, xml::XmlResource* xmlResource)
+      : mContext(context), mXmlResource(xmlResource) {}
+
+  void visit(xml::Element* el) override {
+    if (el->namespaceUri != xml::kSchemaAapt || el->name != "attr") {
+      xml::PackageAwareVisitor::visit(el);
+      return;
     }
 
-    void visit(xml::Element* el) override {
-        if (el->namespaceUri != xml::kSchemaAapt || el->name != "attr") {
-            xml::PackageAwareVisitor::visit(el);
-            return;
-        }
+    const Source& src = mXmlResource->file.source.withLine(el->lineNumber);
 
-        const Source& src = mXmlResource->file.source.withLine(el->lineNumber);
-
-        xml::Attribute* attr = el->findAttribute({}, "name");
-        if (!attr) {
-            mContext->getDiagnostics()->error(DiagMessage(src) << "missing 'name' attribute");
-            mError = true;
-            return;
-        }
-
-        Maybe<Reference> ref = ResourceUtils::parseXmlAttributeName(attr->value);
-        if (!ref) {
-            mContext->getDiagnostics()->error(DiagMessage(src) << "invalid XML attribute '"
-                                              << attr->value << "'");
-            mError = true;
-            return;
-        }
-
-        const ResourceName& name = ref.value().name.value();
-
-        // Use an empty string for the compilation package because we don't want to default to
-        // the local package if the user specified name="style" or something. This should just
-        // be the default namespace.
-        Maybe<xml::ExtractedPackage> maybePkg = transformPackageAlias(name.package, {});
-        if (!maybePkg) {
-            mContext->getDiagnostics()->error(DiagMessage(src) << "invalid namespace prefix '"
-                                              << name.package << "'");
-            mError = true;
-            return;
-        }
-
-        const xml::ExtractedPackage& pkg = maybePkg.value();
-        const bool privateNamespace = pkg.privateNamespace || ref.value().privateReference;
-
-        InlineDeclaration decl;
-        decl.el = el;
-        decl.attrName = name.entry;
-        if (!pkg.package.empty()) {
-            decl.attrNamespaceUri = xml::buildPackageNamespace(pkg.package, privateNamespace);
-        }
-
-        mInlineDeclarations.push_back(std::move(decl));
+    xml::Attribute* attr = el->findAttribute({}, "name");
+    if (!attr) {
+      mContext->getDiagnostics()->error(DiagMessage(src)
+                                        << "missing 'name' attribute");
+      mError = true;
+      return;
     }
 
-    const std::vector<InlineDeclaration>& getInlineDeclarations() const {
-        return mInlineDeclarations;
+    Maybe<Reference> ref = ResourceUtils::parseXmlAttributeName(attr->value);
+    if (!ref) {
+      mContext->getDiagnostics()->error(
+          DiagMessage(src) << "invalid XML attribute '" << attr->value << "'");
+      mError = true;
+      return;
     }
 
-    bool hasError() const {
-        return mError;
+    const ResourceName& name = ref.value().name.value();
+
+    // Use an empty string for the compilation package because we don't want to
+    // default to
+    // the local package if the user specified name="style" or something. This
+    // should just
+    // be the default namespace.
+    Maybe<xml::ExtractedPackage> maybePkg =
+        transformPackageAlias(name.package, {});
+    if (!maybePkg) {
+      mContext->getDiagnostics()->error(DiagMessage(src)
+                                        << "invalid namespace prefix '"
+                                        << name.package << "'");
+      mError = true;
+      return;
     }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(Visitor);
+    const xml::ExtractedPackage& pkg = maybePkg.value();
+    const bool privateNamespace =
+        pkg.privateNamespace || ref.value().privateReference;
 
-    IAaptContext* mContext;
-    xml::XmlResource* mXmlResource;
-    std::vector<InlineDeclaration> mInlineDeclarations;
-    bool mError = false;
+    InlineDeclaration decl;
+    decl.el = el;
+    decl.attrName = name.entry;
+    if (!pkg.package.empty()) {
+      decl.attrNamespaceUri =
+          xml::buildPackageNamespace(pkg.package, privateNamespace);
+    }
+
+    mInlineDeclarations.push_back(std::move(decl));
+  }
+
+  const std::vector<InlineDeclaration>& getInlineDeclarations() const {
+    return mInlineDeclarations;
+  }
+
+  bool hasError() const { return mError; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Visitor);
+
+  IAaptContext* mContext;
+  xml::XmlResource* mXmlResource;
+  std::vector<InlineDeclaration> mInlineDeclarations;
+  bool mError = false;
 };
 
-} // namespace
+}  // namespace
 
-bool InlineXmlFormatParser::consume(IAaptContext* context, xml::XmlResource* doc) {
-    Visitor visitor(context, doc);
-    doc->root->accept(&visitor);
-    if (visitor.hasError()) {
+bool InlineXmlFormatParser::consume(IAaptContext* context,
+                                    xml::XmlResource* doc) {
+  Visitor visitor(context, doc);
+  doc->root->accept(&visitor);
+  if (visitor.hasError()) {
+    return false;
+  }
+
+  size_t nameSuffixCounter = 0;
+  for (const Visitor::InlineDeclaration& decl :
+       visitor.getInlineDeclarations()) {
+    auto newDoc = util::make_unique<xml::XmlResource>();
+    newDoc->file.config = doc->file.config;
+    newDoc->file.source = doc->file.source.withLine(decl.el->lineNumber);
+    newDoc->file.name = doc->file.name;
+
+    // Modify the new entry name. We need to suffix the entry with a number to
+    // avoid
+    // local collisions, then mangle it with the empty package, such that it
+    // won't show up
+    // in R.java.
+
+    newDoc->file.name.entry = NameMangler::mangleEntry(
+        {}, newDoc->file.name.entry + "__" + std::to_string(nameSuffixCounter));
+
+    // Extracted elements must be the only child of <aapt:attr>.
+    // Make sure there is one root node in the children (ignore empty text).
+    for (auto& child : decl.el->children) {
+      const Source childSource = doc->file.source.withLine(child->lineNumber);
+      if (xml::Text* t = xml::nodeCast<xml::Text>(child.get())) {
+        if (!util::trimWhitespace(t->text).empty()) {
+          context->getDiagnostics()->error(
+              DiagMessage(childSource)
+              << "can't extract text into its own resource");
+          return false;
+        }
+      } else if (newDoc->root) {
+        context->getDiagnostics()->error(
+            DiagMessage(childSource)
+            << "inline XML resources must have a single root");
         return false;
+      } else {
+        newDoc->root = std::move(child);
+        newDoc->root->parent = nullptr;
+      }
     }
 
-    size_t nameSuffixCounter = 0;
-    for (const Visitor::InlineDeclaration& decl : visitor.getInlineDeclarations()) {
-        auto newDoc = util::make_unique<xml::XmlResource>();
-        newDoc->file.config = doc->file.config;
-        newDoc->file.source = doc->file.source.withLine(decl.el->lineNumber);
-        newDoc->file.name = doc->file.name;
-
-        // Modify the new entry name. We need to suffix the entry with a number to avoid
-        // local collisions, then mangle it with the empty package, such that it won't show up
-        // in R.java.
-
-        newDoc->file.name.entry = NameMangler::mangleEntry(
-                {}, newDoc->file.name.entry + "__" + std::to_string(nameSuffixCounter));
-
-        // Extracted elements must be the only child of <aapt:attr>.
-        // Make sure there is one root node in the children (ignore empty text).
-        for (auto& child : decl.el->children) {
-            const Source childSource = doc->file.source.withLine(child->lineNumber);
-            if (xml::Text* t = xml::nodeCast<xml::Text>(child.get())) {
-                if (!util::trimWhitespace(t->text).empty()) {
-                    context->getDiagnostics()->error(DiagMessage(childSource)
-                                                     << "can't extract text into its own resource");
-                    return false;
-                }
-            } else if (newDoc->root) {
-                context->getDiagnostics()->error(DiagMessage(childSource)
-                                                 << "inline XML resources must have a single root");
-                return false;
-            } else {
-                newDoc->root = std::move(child);
-                newDoc->root->parent = nullptr;
-            }
-        }
-
-        // Walk up and find the parent element.
-        xml::Node* node = decl.el;
-        xml::Element* parentEl = nullptr;
-        while (node->parent && (parentEl = xml::nodeCast<xml::Element>(node->parent)) == nullptr) {
-            node = node->parent;
-        }
-
-        if (!parentEl) {
-            context->getDiagnostics()->error(DiagMessage(newDoc->file.source)
-                                             << "no suitable parent for inheriting attribute");
-            return false;
-        }
-
-        // Add the inline attribute to the parent.
-        parentEl->attributes.push_back(xml::Attribute{
-                decl.attrNamespaceUri, decl.attrName, "@" + newDoc->file.name.toString() });
-
-        // Delete the subtree.
-        for (auto iter = parentEl->children.begin(); iter != parentEl->children.end(); ++iter) {
-            if (iter->get() == node) {
-                parentEl->children.erase(iter);
-                break;
-            }
-        }
-
-        mQueue.push_back(std::move(newDoc));
-
-        nameSuffixCounter++;
+    // Walk up and find the parent element.
+    xml::Node* node = decl.el;
+    xml::Element* parentEl = nullptr;
+    while (node->parent &&
+           (parentEl = xml::nodeCast<xml::Element>(node->parent)) == nullptr) {
+      node = node->parent;
     }
-    return true;
+
+    if (!parentEl) {
+      context->getDiagnostics()->error(
+          DiagMessage(newDoc->file.source)
+          << "no suitable parent for inheriting attribute");
+      return false;
+    }
+
+    // Add the inline attribute to the parent.
+    parentEl->attributes.push_back(
+        xml::Attribute{decl.attrNamespaceUri, decl.attrName,
+                       "@" + newDoc->file.name.toString()});
+
+    // Delete the subtree.
+    for (auto iter = parentEl->children.begin();
+         iter != parentEl->children.end(); ++iter) {
+      if (iter->get() == node) {
+        parentEl->children.erase(iter);
+        break;
+      }
+    }
+
+    mQueue.push_back(std::move(newDoc));
+
+    nameSuffixCounter++;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/InlineXmlFormatParser.h b/tools/aapt2/compile/InlineXmlFormatParser.h
index 69065fd..cd8794b 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser.h
+++ b/tools/aapt2/compile/InlineXmlFormatParser.h
@@ -41,25 +41,28 @@
  *   </aapt:attr>
  * </animated-vector>
  *
- * The <vector> will be extracted into its own XML file and <animated-vector> will
- * gain an attribute 'android:drawable' set to a reference to the extracted <vector> resource.
+ * The <vector> will be extracted into its own XML file and <animated-vector>
+ * will
+ * gain an attribute 'android:drawable' set to a reference to the extracted
+ * <vector> resource.
  */
 class InlineXmlFormatParser : public IXmlResourceConsumer {
-public:
-    explicit InlineXmlFormatParser() = default;
+ public:
+  explicit InlineXmlFormatParser() = default;
 
-    bool consume(IAaptContext* context, xml::XmlResource* doc) override;
+  bool consume(IAaptContext* context, xml::XmlResource* doc) override;
 
-    std::vector<std::unique_ptr<xml::XmlResource>>& getExtractedInlineXmlDocuments() {
-        return mQueue;
-    }
+  std::vector<std::unique_ptr<xml::XmlResource>>&
+  getExtractedInlineXmlDocuments() {
+    return mQueue;
+  }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(InlineXmlFormatParser);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InlineXmlFormatParser);
 
-    std::vector<std::unique_ptr<xml::XmlResource>> mQueue;
+  std::vector<std::unique_ptr<xml::XmlResource>> mQueue;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_INLINEXMLFORMATPARSER_H */
diff --git a/tools/aapt2/compile/InlineXmlFormatParser_test.cpp b/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
index 8d62210..4adb21c 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
+++ b/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
@@ -20,22 +20,22 @@
 namespace aapt {
 
 TEST(InlineXmlFormatParserTest, PassThrough) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
       <View xmlns:android="http://schemas.android.com/apk/res/android">
         <View android:text="hey">
           <View android:id="hi" />
         </View>
       </View>)EOF");
 
-    InlineXmlFormatParser parser;
-    ASSERT_TRUE(parser.consume(context.get(), doc.get()));
-    EXPECT_EQ(0u, parser.getExtractedInlineXmlDocuments().size());
+  InlineXmlFormatParser parser;
+  ASSERT_TRUE(parser.consume(context.get(), doc.get()));
+  EXPECT_EQ(0u, parser.getExtractedInlineXmlDocuments().size());
 }
 
 TEST(InlineXmlFormatParserTest, ExtractOneXmlResource) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
       <View1 xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:aapt="http://schemas.android.com/aapt">
         <aapt:attr name="android:text">
@@ -45,47 +45,48 @@
         </aapt:attr>
       </View1>)EOF");
 
-    doc->file.name = test::parseNameOrDie("layout/main");
+  doc->file.name = test::parseNameOrDie("layout/main");
 
-    InlineXmlFormatParser parser;
-    ASSERT_TRUE(parser.consume(context.get(), doc.get()));
+  InlineXmlFormatParser parser;
+  ASSERT_TRUE(parser.consume(context.get(), doc.get()));
 
-    // One XML resource should have been extracted.
-    EXPECT_EQ(1u, parser.getExtractedInlineXmlDocuments().size());
+  // One XML resource should have been extracted.
+  EXPECT_EQ(1u, parser.getExtractedInlineXmlDocuments().size());
 
-    xml::Element* el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
+  xml::Element* el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
 
-    EXPECT_EQ("View1", el->name);
+  EXPECT_EQ("View1", el->name);
 
-    // The <aapt:attr> tag should be extracted.
-    EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
+  // The <aapt:attr> tag should be extracted.
+  EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
 
-    // The 'android:text' attribute should be set with a reference.
-    xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "text");
-    ASSERT_NE(nullptr, attr);
+  // The 'android:text' attribute should be set with a reference.
+  xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "text");
+  ASSERT_NE(nullptr, attr);
 
-    ResourceNameRef nameRef;
-    ASSERT_TRUE(ResourceUtils::parseReference(attr->value, &nameRef));
+  ResourceNameRef nameRef;
+  ASSERT_TRUE(ResourceUtils::parseReference(attr->value, &nameRef));
 
-    xml::XmlResource* extractedDoc = parser.getExtractedInlineXmlDocuments()[0].get();
-    ASSERT_NE(nullptr, extractedDoc);
+  xml::XmlResource* extractedDoc =
+      parser.getExtractedInlineXmlDocuments()[0].get();
+  ASSERT_NE(nullptr, extractedDoc);
 
-    // Make sure the generated reference is correct.
-    EXPECT_EQ(nameRef.package, extractedDoc->file.name.package);
-    EXPECT_EQ(nameRef.type, extractedDoc->file.name.type);
-    EXPECT_EQ(nameRef.entry, extractedDoc->file.name.entry);
+  // Make sure the generated reference is correct.
+  EXPECT_EQ(nameRef.package, extractedDoc->file.name.package);
+  EXPECT_EQ(nameRef.type, extractedDoc->file.name.type);
+  EXPECT_EQ(nameRef.entry, extractedDoc->file.name.entry);
 
-    // Verify the structure of the extracted XML.
-    el = xml::findRootElement(extractedDoc);
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ("View2", el->name);
-    EXPECT_NE(nullptr, el->findChild({}, "View3"));
+  // Verify the structure of the extracted XML.
+  el = xml::findRootElement(extractedDoc);
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ("View2", el->name);
+  EXPECT_NE(nullptr, el->findChild({}, "View3"));
 }
 
 TEST(InlineXmlFormatParserTest, ExtractTwoXmlResources) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
       <View1 xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:aapt="http://schemas.android.com/aapt">
         <aapt:attr name="android:text">
@@ -99,40 +100,43 @@
         </aapt:attr>
       </View1>)EOF");
 
-    doc->file.name = test::parseNameOrDie("layout/main");
+  doc->file.name = test::parseNameOrDie("layout/main");
 
-    InlineXmlFormatParser parser;
-    ASSERT_TRUE(parser.consume(context.get(), doc.get()));
-    ASSERT_EQ(2u, parser.getExtractedInlineXmlDocuments().size());
+  InlineXmlFormatParser parser;
+  ASSERT_TRUE(parser.consume(context.get(), doc.get()));
+  ASSERT_EQ(2u, parser.getExtractedInlineXmlDocuments().size());
 
-    xml::Element* el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
+  xml::Element* el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
 
-    EXPECT_EQ("View1", el->name);
+  EXPECT_EQ("View1", el->name);
 
-    xml::Attribute* attrText = el->findAttribute(xml::kSchemaAndroid, "text");
-    ASSERT_NE(nullptr, attrText);
+  xml::Attribute* attrText = el->findAttribute(xml::kSchemaAndroid, "text");
+  ASSERT_NE(nullptr, attrText);
 
-    xml::Attribute* attrDrawable = el->findAttribute(xml::kSchemaAndroid, "drawable");
-    ASSERT_NE(nullptr, attrDrawable);
+  xml::Attribute* attrDrawable =
+      el->findAttribute(xml::kSchemaAndroid, "drawable");
+  ASSERT_NE(nullptr, attrDrawable);
 
-    // The two extracted resources should have different names.
-    EXPECT_NE(attrText->value, attrDrawable->value);
+  // The two extracted resources should have different names.
+  EXPECT_NE(attrText->value, attrDrawable->value);
 
-    // The child <aapt:attr> elements should be gone.
-    EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
+  // The child <aapt:attr> elements should be gone.
+  EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
 
-    xml::XmlResource* extractedDocText = parser.getExtractedInlineXmlDocuments()[0].get();
-    ASSERT_NE(nullptr, extractedDocText);
-    el = xml::findRootElement(extractedDocText);
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ("View2", el->name);
+  xml::XmlResource* extractedDocText =
+      parser.getExtractedInlineXmlDocuments()[0].get();
+  ASSERT_NE(nullptr, extractedDocText);
+  el = xml::findRootElement(extractedDocText);
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ("View2", el->name);
 
-    xml::XmlResource* extractedDocDrawable = parser.getExtractedInlineXmlDocuments()[1].get();
-    ASSERT_NE(nullptr, extractedDocDrawable);
-    el = xml::findRootElement(extractedDocDrawable);
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ("vector", el->name);
+  xml::XmlResource* extractedDocDrawable =
+      parser.getExtractedInlineXmlDocuments()[1].get();
+  ASSERT_NE(nullptr, extractedDocDrawable);
+  el = xml::findRootElement(extractedDocDrawable);
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ("vector", el->name);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/NinePatch.cpp b/tools/aapt2/compile/NinePatch.cpp
index 0fc1c5d..8842eb7 100644
--- a/tools/aapt2/compile/NinePatch.cpp
+++ b/tools/aapt2/compile/NinePatch.cpp
@@ -28,7 +28,7 @@
 // Colors in the format 0xAARRGGBB (the way 9-patch expects it).
 constexpr static const uint32_t kColorOpaqueWhite = 0xffffffffu;
 constexpr static const uint32_t kColorOpaqueBlack = 0xff000000u;
-constexpr static const uint32_t kColorOpaqueRed   = 0xffff0000u;
+constexpr static const uint32_t kColorOpaqueRed = 0xffff0000u;
 
 constexpr static const uint32_t kPrimaryColor = kColorOpaqueBlack;
 constexpr static const uint32_t kSecondaryColor = kColorOpaqueRed;
@@ -46,35 +46,37 @@
  * but we need to ensure consistency throughout the image.
  */
 class ColorValidator {
-public:
-    virtual ~ColorValidator() = default;
+ public:
+  virtual ~ColorValidator() = default;
 
-    /**
-     * Returns true if the color specified is a neutral color
-     * (no padding, stretching, or optical bounds).
-     */
-    virtual bool isNeutralColor(uint32_t color) const = 0;
+  /**
+   * Returns true if the color specified is a neutral color
+   * (no padding, stretching, or optical bounds).
+   */
+  virtual bool isNeutralColor(uint32_t color) const = 0;
 
-    /**
-     * Returns true if the color is either a neutral color
-     * or one denoting padding, stretching, or optical bounds.
-     */
-    bool isValidColor(uint32_t color) const {
-        switch (color) {
-        case kPrimaryColor:
-        case kSecondaryColor:
-            return true;
-        }
-        return isNeutralColor(color);
+  /**
+   * Returns true if the color is either a neutral color
+   * or one denoting padding, stretching, or optical bounds.
+   */
+  bool isValidColor(uint32_t color) const {
+    switch (color) {
+      case kPrimaryColor:
+      case kSecondaryColor:
+        return true;
     }
+    return isNeutralColor(color);
+  }
 };
 
 // Walks an ImageLine and records Ranges of primary and secondary colors.
-// The primary color is black and is used to denote a padding or stretching range,
+// The primary color is black and is used to denote a padding or stretching
+// range,
 // depending on which border we're iterating over.
 // The secondary color is red and is used to denote optical bounds.
 //
-// An ImageLine is a templated-interface that would look something like this if it
+// An ImageLine is a templated-interface that would look something like this if
+// it
 // were polymorphic:
 //
 // class ImageLine {
@@ -87,590 +89,604 @@
 static bool fillRanges(const ImageLine* imageLine,
                        const ColorValidator* colorValidator,
                        std::vector<Range>* primaryRanges,
-                       std::vector<Range>* secondaryRanges,
-                       std::string* err) {
-    const int32_t length = imageLine->getLength();
+                       std::vector<Range>* secondaryRanges, std::string* err) {
+  const int32_t length = imageLine->getLength();
 
-    uint32_t lastColor = 0xffffffffu;
-    for (int32_t idx = 1; idx < length - 1; idx++) {
-        const uint32_t color = imageLine->getColor(idx);
-        if (!colorValidator->isValidColor(color)) {
-            *err = "found an invalid color";
-            return false;
-        }
-
-        if (color != lastColor) {
-            // We are ending a range. Which range?
-            // note: encode the x offset without the final 1 pixel border.
-            if (lastColor == kPrimaryColor) {
-                primaryRanges->back().end = idx - 1;
-            } else if (lastColor == kSecondaryColor) {
-                secondaryRanges->back().end = idx - 1;
-            }
-
-            // We are starting a range. Which range?
-            // note: encode the x offset without the final 1 pixel border.
-            if (color == kPrimaryColor) {
-                primaryRanges->push_back(Range(idx - 1, length - 2));
-            } else if (color == kSecondaryColor) {
-                secondaryRanges->push_back(Range(idx - 1, length - 2));
-            }
-            lastColor = color;
-        }
+  uint32_t lastColor = 0xffffffffu;
+  for (int32_t idx = 1; idx < length - 1; idx++) {
+    const uint32_t color = imageLine->getColor(idx);
+    if (!colorValidator->isValidColor(color)) {
+      *err = "found an invalid color";
+      return false;
     }
-    return true;
+
+    if (color != lastColor) {
+      // We are ending a range. Which range?
+      // note: encode the x offset without the final 1 pixel border.
+      if (lastColor == kPrimaryColor) {
+        primaryRanges->back().end = idx - 1;
+      } else if (lastColor == kSecondaryColor) {
+        secondaryRanges->back().end = idx - 1;
+      }
+
+      // We are starting a range. Which range?
+      // note: encode the x offset without the final 1 pixel border.
+      if (color == kPrimaryColor) {
+        primaryRanges->push_back(Range(idx - 1, length - 2));
+      } else if (color == kSecondaryColor) {
+        secondaryRanges->push_back(Range(idx - 1, length - 2));
+      }
+      lastColor = color;
+    }
+  }
+  return true;
 }
 
 /**
- * Iterates over a row in an image. Implements the templated ImageLine interface.
+ * Iterates over a row in an image. Implements the templated ImageLine
+ * interface.
  */
 class HorizontalImageLine {
-public:
-    explicit HorizontalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
-                                 int32_t length) :
-            mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {
-    }
+ public:
+  explicit HorizontalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
+                               int32_t length)
+      : mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {}
 
-    inline int32_t getLength() const {
-        return mLength;
-    }
+  inline int32_t getLength() const { return mLength; }
 
-    inline uint32_t getColor(int32_t idx) const {
-        return NinePatch::packRGBA(mRows[mYOffset] + (idx + mXOffset) * 4);
-    }
+  inline uint32_t getColor(int32_t idx) const {
+    return NinePatch::packRGBA(mRows[mYOffset] + (idx + mXOffset) * 4);
+  }
 
-private:
-    uint8_t** mRows;
-    int32_t mXOffset, mYOffset, mLength;
+ private:
+  uint8_t** mRows;
+  int32_t mXOffset, mYOffset, mLength;
 
-    DISALLOW_COPY_AND_ASSIGN(HorizontalImageLine);
+  DISALLOW_COPY_AND_ASSIGN(HorizontalImageLine);
 };
 
 /**
- * Iterates over a column in an image. Implements the templated ImageLine interface.
+ * Iterates over a column in an image. Implements the templated ImageLine
+ * interface.
  */
 class VerticalImageLine {
-public:
-    explicit VerticalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
-                               int32_t length) :
-            mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {
-    }
+ public:
+  explicit VerticalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
+                             int32_t length)
+      : mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {}
 
-    inline int32_t getLength() const {
-        return mLength;
-    }
+  inline int32_t getLength() const { return mLength; }
 
-    inline uint32_t getColor(int32_t idx) const {
-        return NinePatch::packRGBA(mRows[mYOffset + idx] + (mXOffset * 4));
-    }
+  inline uint32_t getColor(int32_t idx) const {
+    return NinePatch::packRGBA(mRows[mYOffset + idx] + (mXOffset * 4));
+  }
 
-private:
-    uint8_t** mRows;
-    int32_t mXOffset, mYOffset, mLength;
+ private:
+  uint8_t** mRows;
+  int32_t mXOffset, mYOffset, mLength;
 
-    DISALLOW_COPY_AND_ASSIGN(VerticalImageLine);
+  DISALLOW_COPY_AND_ASSIGN(VerticalImageLine);
 };
 
 class DiagonalImageLine {
-public:
-    explicit DiagonalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
-                               int32_t xStep, int32_t yStep, int32_t length) :
-            mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mXStep(xStep), mYStep(yStep),
-            mLength(length) {
-    }
+ public:
+  explicit DiagonalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
+                             int32_t xStep, int32_t yStep, int32_t length)
+      : mRows(rows),
+        mXOffset(xOffset),
+        mYOffset(yOffset),
+        mXStep(xStep),
+        mYStep(yStep),
+        mLength(length) {}
 
-    inline int32_t getLength() const {
-        return mLength;
-    }
+  inline int32_t getLength() const { return mLength; }
 
-    inline uint32_t getColor(int32_t idx) const {
-        return NinePatch::packRGBA(
-                mRows[mYOffset + (idx * mYStep)] + ((idx + mXOffset) * mXStep) * 4);
-    }
+  inline uint32_t getColor(int32_t idx) const {
+    return NinePatch::packRGBA(mRows[mYOffset + (idx * mYStep)] +
+                               ((idx + mXOffset) * mXStep) * 4);
+  }
 
-private:
-    uint8_t** mRows;
-    int32_t mXOffset, mYOffset, mXStep, mYStep, mLength;
+ private:
+  uint8_t** mRows;
+  int32_t mXOffset, mYOffset, mXStep, mYStep, mLength;
 
-    DISALLOW_COPY_AND_ASSIGN(DiagonalImageLine);
+  DISALLOW_COPY_AND_ASSIGN(DiagonalImageLine);
 };
 
 class TransparentNeutralColorValidator : public ColorValidator {
-public:
-    bool isNeutralColor(uint32_t color) const override {
-        return getAlpha(color) == 0;
-    }
+ public:
+  bool isNeutralColor(uint32_t color) const override {
+    return getAlpha(color) == 0;
+  }
 };
 
 class WhiteNeutralColorValidator : public ColorValidator {
-public:
-    bool isNeutralColor(uint32_t color) const override {
-        return color == kColorOpaqueWhite;
-    }
+ public:
+  bool isNeutralColor(uint32_t color) const override {
+    return color == kColorOpaqueWhite;
+  }
 };
 
 inline static uint32_t getAlpha(uint32_t color) {
-    return (color & 0xff000000u) >> 24;
+  return (color & 0xff000000u) >> 24;
 }
 
 static bool populateBounds(const std::vector<Range>& padding,
                            const std::vector<Range>& layoutBounds,
                            const std::vector<Range>& stretchRegions,
-                           const int32_t length,
-                           int32_t* paddingStart, int32_t* paddingEnd,
-                           int32_t* layoutStart, int32_t* layoutEnd,
-                           const StringPiece& edgeName,
+                           const int32_t length, int32_t* paddingStart,
+                           int32_t* paddingEnd, int32_t* layoutStart,
+                           int32_t* layoutEnd, const StringPiece& edgeName,
                            std::string* err) {
-    if (padding.size() > 1) {
+  if (padding.size() > 1) {
+    std::stringstream errStream;
+    errStream << "too many padding sections on " << edgeName << " border";
+    *err = errStream.str();
+    return false;
+  }
+
+  *paddingStart = 0;
+  *paddingEnd = 0;
+  if (!padding.empty()) {
+    const Range& range = padding.front();
+    *paddingStart = range.start;
+    *paddingEnd = length - range.end;
+  } else if (!stretchRegions.empty()) {
+    // No padding was defined. Compute the padding from the first and last
+    // stretch regions.
+    *paddingStart = stretchRegions.front().start;
+    *paddingEnd = length - stretchRegions.back().end;
+  }
+
+  if (layoutBounds.size() > 2) {
+    std::stringstream errStream;
+    errStream << "too many layout bounds sections on " << edgeName << " border";
+    *err = errStream.str();
+    return false;
+  }
+
+  *layoutStart = 0;
+  *layoutEnd = 0;
+  if (layoutBounds.size() >= 1) {
+    const Range& range = layoutBounds.front();
+    // If there is only one layout bound segment, it might not start at 0, but
+    // then it should
+    // end at length.
+    if (range.start != 0 && range.end != length) {
+      std::stringstream errStream;
+      errStream << "layout bounds on " << edgeName
+                << " border must start at edge";
+      *err = errStream.str();
+      return false;
+    }
+    *layoutStart = range.end;
+
+    if (layoutBounds.size() >= 2) {
+      const Range& range = layoutBounds.back();
+      if (range.end != length) {
         std::stringstream errStream;
-        errStream << "too many padding sections on " << edgeName << " border";
+        errStream << "layout bounds on " << edgeName
+                  << " border must start at edge";
         *err = errStream.str();
         return false;
+      }
+      *layoutEnd = length - range.start;
     }
-
-    *paddingStart = 0;
-    *paddingEnd = 0;
-    if (!padding.empty()) {
-        const Range& range = padding.front();
-        *paddingStart = range.start;
-        *paddingEnd = length - range.end;
-    } else if (!stretchRegions.empty()) {
-        // No padding was defined. Compute the padding from the first and last
-        // stretch regions.
-        *paddingStart = stretchRegions.front().start;
-        *paddingEnd = length - stretchRegions.back().end;
-    }
-
-    if (layoutBounds.size() > 2) {
-        std::stringstream errStream;
-        errStream << "too many layout bounds sections on " << edgeName << " border";
-        *err = errStream.str();
-        return false;
-    }
-
-    *layoutStart = 0;
-    *layoutEnd = 0;
-    if (layoutBounds.size() >= 1) {
-        const Range& range = layoutBounds.front();
-        // If there is only one layout bound segment, it might not start at 0, but then it should
-        // end at length.
-        if (range.start != 0 && range.end != length) {
-            std::stringstream errStream;
-            errStream << "layout bounds on " << edgeName << " border must start at edge";
-            *err = errStream.str();
-            return false;
-        }
-        *layoutStart = range.end;
-
-        if (layoutBounds.size() >= 2) {
-            const Range& range = layoutBounds.back();
-            if (range.end != length) {
-                std::stringstream errStream;
-                errStream << "layout bounds on " << edgeName << " border must start at edge";
-                *err = errStream.str();
-                return false;
-            }
-            *layoutEnd = length - range.start;
-        }
-    }
-    return true;
+  }
+  return true;
 }
 
-static int32_t calculateSegmentCount(const std::vector<Range>& stretchRegions, int32_t length) {
-    if (stretchRegions.size() == 0) {
-        return 0;
-    }
+static int32_t calculateSegmentCount(const std::vector<Range>& stretchRegions,
+                                     int32_t length) {
+  if (stretchRegions.size() == 0) {
+    return 0;
+  }
 
-    const bool startIsFixed = stretchRegions.front().start != 0;
-    const bool endIsFixed = stretchRegions.back().end != length;
-    int32_t modifier = 0;
-    if (startIsFixed && endIsFixed) {
-        modifier = 1;
-    } else if (!startIsFixed && !endIsFixed) {
-        modifier = -1;
-    }
-    return static_cast<int32_t>(stretchRegions.size()) * 2 + modifier;
+  const bool startIsFixed = stretchRegions.front().start != 0;
+  const bool endIsFixed = stretchRegions.back().end != length;
+  int32_t modifier = 0;
+  if (startIsFixed && endIsFixed) {
+    modifier = 1;
+  } else if (!startIsFixed && !endIsFixed) {
+    modifier = -1;
+  }
+  return static_cast<int32_t>(stretchRegions.size()) * 2 + modifier;
 }
 
 static uint32_t getRegionColor(uint8_t** rows, const Bounds& region) {
-    // Sample the first pixel to compare against.
-    const uint32_t expectedColor = NinePatch::packRGBA(rows[region.top] + region.left * 4);
-    for (int32_t y = region.top; y < region.bottom; y++) {
-        const uint8_t* row = rows[y];
-        for (int32_t x = region.left; x < region.right; x++) {
-            const uint32_t color = NinePatch::packRGBA(row + x * 4);
-            if (getAlpha(color) == 0) {
-                // The color is transparent.
-                // If the expectedColor is not transparent, NO_COLOR.
-                if (getAlpha(expectedColor) != 0) {
-                    return android::Res_png_9patch::NO_COLOR;
-                }
-            } else if (color != expectedColor) {
-                return android::Res_png_9patch::NO_COLOR;
-            }
+  // Sample the first pixel to compare against.
+  const uint32_t expectedColor =
+      NinePatch::packRGBA(rows[region.top] + region.left * 4);
+  for (int32_t y = region.top; y < region.bottom; y++) {
+    const uint8_t* row = rows[y];
+    for (int32_t x = region.left; x < region.right; x++) {
+      const uint32_t color = NinePatch::packRGBA(row + x * 4);
+      if (getAlpha(color) == 0) {
+        // The color is transparent.
+        // If the expectedColor is not transparent, NO_COLOR.
+        if (getAlpha(expectedColor) != 0) {
+          return android::Res_png_9patch::NO_COLOR;
         }
+      } else if (color != expectedColor) {
+        return android::Res_png_9patch::NO_COLOR;
+      }
     }
+  }
 
-    if (getAlpha(expectedColor) == 0) {
-        return android::Res_png_9patch::TRANSPARENT_COLOR;
-    }
-    return expectedColor;
+  if (getAlpha(expectedColor) == 0) {
+    return android::Res_png_9patch::TRANSPARENT_COLOR;
+  }
+  return expectedColor;
 }
 
-// Fills outColors with each 9-patch section's colour. If the whole section is transparent,
-// it gets the special TRANSPARENT colour. If the whole section is the same colour, it is assigned
+// Fills outColors with each 9-patch section's colour. If the whole section is
+// transparent,
+// it gets the special TRANSPARENT colour. If the whole section is the same
+// colour, it is assigned
 // that colour. Otherwise it gets the special NO_COLOR colour.
 //
-// Note that the rows contain the 9-patch 1px border, and the indices in the stretch regions are
-// already offset to exclude the border. This means that each time the rows are accessed,
+// Note that the rows contain the 9-patch 1px border, and the indices in the
+// stretch regions are
+// already offset to exclude the border. This means that each time the rows are
+// accessed,
 // the indices must be offset by 1.
 //
 // width and height also include the 9-patch 1px border.
-static void calculateRegionColors(uint8_t** rows,
-                                  const std::vector<Range>& horizontalStretchRegions,
-                                  const std::vector<Range>& verticalStretchRegions,
-                                  const int32_t width, const int32_t height,
-                                  std::vector<uint32_t>* outColors) {
-    int32_t nextTop = 0;
-    Bounds bounds;
-    auto rowIter = verticalStretchRegions.begin();
-    while (nextTop != height) {
-        if (rowIter != verticalStretchRegions.end()) {
-            if (nextTop != rowIter->start) {
-                // This is a fixed segment.
-                // Offset the bounds by 1 to accommodate the border.
-                bounds.top = nextTop + 1;
-                bounds.bottom = rowIter->start + 1;
-                nextTop = rowIter->start;
-            } else {
-                // This is a stretchy segment.
-                // Offset the bounds by 1 to accommodate the border.
-                bounds.top = rowIter->start + 1;
-                bounds.bottom = rowIter->end + 1;
-                nextTop = rowIter->end;
-                ++rowIter;
-            }
-        } else {
-            // This is the end, fixed section.
-            // Offset the bounds by 1 to accommodate the border.
-            bounds.top = nextTop + 1;
-            bounds.bottom = height + 1;
-            nextTop = height;
-         }
-
-        int32_t nextLeft = 0;
-        auto colIter = horizontalStretchRegions.begin();
-        while (nextLeft != width) {
-            if (colIter != horizontalStretchRegions.end()) {
-                if (nextLeft != colIter->start) {
-                    // This is a fixed segment.
-                    // Offset the bounds by 1 to accommodate the border.
-                    bounds.left = nextLeft + 1;
-                    bounds.right = colIter->start + 1;
-                    nextLeft = colIter->start;
-                } else {
-                    // This is a stretchy segment.
-                    // Offset the bounds by 1 to accommodate the border.
-                    bounds.left = colIter->start + 1;
-                    bounds.right = colIter->end + 1;
-                    nextLeft = colIter->end;
-                    ++colIter;
-                }
-            } else {
-                // This is the end, fixed section.
-                // Offset the bounds by 1 to accommodate the border.
-                bounds.left = nextLeft + 1;
-                bounds.right = width + 1;
-                nextLeft = width;
-            }
-            outColors->push_back(getRegionColor(rows, bounds));
-        }
+static void calculateRegionColors(
+    uint8_t** rows, const std::vector<Range>& horizontalStretchRegions,
+    const std::vector<Range>& verticalStretchRegions, const int32_t width,
+    const int32_t height, std::vector<uint32_t>* outColors) {
+  int32_t nextTop = 0;
+  Bounds bounds;
+  auto rowIter = verticalStretchRegions.begin();
+  while (nextTop != height) {
+    if (rowIter != verticalStretchRegions.end()) {
+      if (nextTop != rowIter->start) {
+        // This is a fixed segment.
+        // Offset the bounds by 1 to accommodate the border.
+        bounds.top = nextTop + 1;
+        bounds.bottom = rowIter->start + 1;
+        nextTop = rowIter->start;
+      } else {
+        // This is a stretchy segment.
+        // Offset the bounds by 1 to accommodate the border.
+        bounds.top = rowIter->start + 1;
+        bounds.bottom = rowIter->end + 1;
+        nextTop = rowIter->end;
+        ++rowIter;
+      }
+    } else {
+      // This is the end, fixed section.
+      // Offset the bounds by 1 to accommodate the border.
+      bounds.top = nextTop + 1;
+      bounds.bottom = height + 1;
+      nextTop = height;
     }
+
+    int32_t nextLeft = 0;
+    auto colIter = horizontalStretchRegions.begin();
+    while (nextLeft != width) {
+      if (colIter != horizontalStretchRegions.end()) {
+        if (nextLeft != colIter->start) {
+          // This is a fixed segment.
+          // Offset the bounds by 1 to accommodate the border.
+          bounds.left = nextLeft + 1;
+          bounds.right = colIter->start + 1;
+          nextLeft = colIter->start;
+        } else {
+          // This is a stretchy segment.
+          // Offset the bounds by 1 to accommodate the border.
+          bounds.left = colIter->start + 1;
+          bounds.right = colIter->end + 1;
+          nextLeft = colIter->end;
+          ++colIter;
+        }
+      } else {
+        // This is the end, fixed section.
+        // Offset the bounds by 1 to accommodate the border.
+        bounds.left = nextLeft + 1;
+        bounds.right = width + 1;
+        nextLeft = width;
+      }
+      outColors->push_back(getRegionColor(rows, bounds));
+    }
+  }
 }
 
-// Calculates the insets of a row/column of pixels based on where the largest alpha value begins
+// Calculates the insets of a row/column of pixels based on where the largest
+// alpha value begins
 // (on both sides).
 template <typename ImageLine>
-static void findOutlineInsets(const ImageLine* imageLine, int32_t* outStart, int32_t* outEnd) {
-    *outStart = 0;
-    *outEnd = 0;
+static void findOutlineInsets(const ImageLine* imageLine, int32_t* outStart,
+                              int32_t* outEnd) {
+  *outStart = 0;
+  *outEnd = 0;
 
-    const int32_t length = imageLine->getLength();
-    if (length < 3) {
-        return;
-    }
-
-    // If the length is odd, we want both sides to process the center pixel,
-    // so we use two different midpoints (to account for < and <= in the different loops).
-    const int32_t mid2 = length / 2;
-    const int32_t mid1 = mid2 + (length % 2);
-
-    uint32_t maxAlpha = 0;
-    for (int32_t i = 0; i < mid1 && maxAlpha != 0xff; i++) {
-        uint32_t alpha = getAlpha(imageLine->getColor(i));
-        if (alpha > maxAlpha) {
-            maxAlpha = alpha;
-            *outStart = i;
-        }
-    }
-
-    maxAlpha = 0;
-    for (int32_t i = length - 1; i >= mid2 && maxAlpha != 0xff; i--) {
-        uint32_t alpha = getAlpha(imageLine->getColor(i));
-        if (alpha > maxAlpha) {
-            maxAlpha = alpha;
-            *outEnd = length - (i + 1);
-        }
-    }
+  const int32_t length = imageLine->getLength();
+  if (length < 3) {
     return;
+  }
+
+  // If the length is odd, we want both sides to process the center pixel,
+  // so we use two different midpoints (to account for < and <= in the different
+  // loops).
+  const int32_t mid2 = length / 2;
+  const int32_t mid1 = mid2 + (length % 2);
+
+  uint32_t maxAlpha = 0;
+  for (int32_t i = 0; i < mid1 && maxAlpha != 0xff; i++) {
+    uint32_t alpha = getAlpha(imageLine->getColor(i));
+    if (alpha > maxAlpha) {
+      maxAlpha = alpha;
+      *outStart = i;
+    }
+  }
+
+  maxAlpha = 0;
+  for (int32_t i = length - 1; i >= mid2 && maxAlpha != 0xff; i--) {
+    uint32_t alpha = getAlpha(imageLine->getColor(i));
+    if (alpha > maxAlpha) {
+      maxAlpha = alpha;
+      *outEnd = length - (i + 1);
+    }
+  }
+  return;
 }
 
 template <typename ImageLine>
 static uint32_t findMaxAlpha(const ImageLine* imageLine) {
-    const int32_t length = imageLine->getLength();
-    uint32_t maxAlpha = 0;
-    for (int32_t idx = 0; idx < length && maxAlpha != 0xff; idx++) {
-        uint32_t alpha = getAlpha(imageLine->getColor(idx));
-        if (alpha > maxAlpha) {
-            maxAlpha = alpha;
-        }
+  const int32_t length = imageLine->getLength();
+  uint32_t maxAlpha = 0;
+  for (int32_t idx = 0; idx < length && maxAlpha != 0xff; idx++) {
+    uint32_t alpha = getAlpha(imageLine->getColor(idx));
+    if (alpha > maxAlpha) {
+      maxAlpha = alpha;
     }
-    return maxAlpha;
+  }
+  return maxAlpha;
 }
 
 // Pack the pixels in as 0xAARRGGBB (as 9-patch expects it).
 uint32_t NinePatch::packRGBA(const uint8_t* pixel) {
-    return (pixel[3] << 24) | (pixel[0] << 16) | (pixel[1] << 8) | pixel[2];
+  return (pixel[3] << 24) | (pixel[0] << 16) | (pixel[1] << 8) | pixel[2];
 }
 
 std::unique_ptr<NinePatch> NinePatch::create(uint8_t** rows,
-                                             const int32_t width, const int32_t height,
+                                             const int32_t width,
+                                             const int32_t height,
                                              std::string* err) {
-    if (width < 3 || height < 3) {
-        *err = "image must be at least 3x3 (1x1 image with 1 pixel border)";
-        return {};
-    }
+  if (width < 3 || height < 3) {
+    *err = "image must be at least 3x3 (1x1 image with 1 pixel border)";
+    return {};
+  }
 
-    std::vector<Range> horizontalPadding;
-    std::vector<Range> horizontalOpticalBounds;
-    std::vector<Range> verticalPadding;
-    std::vector<Range> verticalOpticalBounds;
-    std::vector<Range> unexpectedRanges;
-    std::unique_ptr<ColorValidator> colorValidator;
+  std::vector<Range> horizontalPadding;
+  std::vector<Range> horizontalOpticalBounds;
+  std::vector<Range> verticalPadding;
+  std::vector<Range> verticalOpticalBounds;
+  std::vector<Range> unexpectedRanges;
+  std::unique_ptr<ColorValidator> colorValidator;
 
-    if (rows[0][3] == 0) {
-        colorValidator = util::make_unique<TransparentNeutralColorValidator>();
-    } else if (packRGBA(rows[0]) == kColorOpaqueWhite) {
-        colorValidator = util::make_unique<WhiteNeutralColorValidator>();
-    } else {
-        *err = "top-left corner pixel must be either opaque white or transparent";
-        return {};
-    }
+  if (rows[0][3] == 0) {
+    colorValidator = util::make_unique<TransparentNeutralColorValidator>();
+  } else if (packRGBA(rows[0]) == kColorOpaqueWhite) {
+    colorValidator = util::make_unique<WhiteNeutralColorValidator>();
+  } else {
+    *err = "top-left corner pixel must be either opaque white or transparent";
+    return {};
+  }
 
-    // Private constructor, can't use make_unique.
-    auto ninePatch = std::unique_ptr<NinePatch>(new NinePatch());
+  // Private constructor, can't use make_unique.
+  auto ninePatch = std::unique_ptr<NinePatch>(new NinePatch());
 
-    HorizontalImageLine topRow(rows, 0, 0, width);
-    if (!fillRanges(&topRow, colorValidator.get(), &ninePatch->horizontalStretchRegions,
-                    &unexpectedRanges, err)) {
-        return {};
-    }
+  HorizontalImageLine topRow(rows, 0, 0, width);
+  if (!fillRanges(&topRow, colorValidator.get(),
+                  &ninePatch->horizontalStretchRegions, &unexpectedRanges,
+                  err)) {
+    return {};
+  }
 
-    if (!unexpectedRanges.empty()) {
-        const Range& range = unexpectedRanges[0];
-        std::stringstream errStream;
-        errStream << "found unexpected optical bounds (red pixel) on top border "
-                << "at x=" << range.start + 1;
-        *err = errStream.str();
-        return {};
-    }
+  if (!unexpectedRanges.empty()) {
+    const Range& range = unexpectedRanges[0];
+    std::stringstream errStream;
+    errStream << "found unexpected optical bounds (red pixel) on top border "
+              << "at x=" << range.start + 1;
+    *err = errStream.str();
+    return {};
+  }
 
-    VerticalImageLine leftCol(rows, 0, 0, height);
-    if (!fillRanges(&leftCol, colorValidator.get(), &ninePatch->verticalStretchRegions,
-                    &unexpectedRanges, err)) {
-        return {};
-    }
+  VerticalImageLine leftCol(rows, 0, 0, height);
+  if (!fillRanges(&leftCol, colorValidator.get(),
+                  &ninePatch->verticalStretchRegions, &unexpectedRanges, err)) {
+    return {};
+  }
 
-    if (!unexpectedRanges.empty()) {
-        const Range& range = unexpectedRanges[0];
-        std::stringstream errStream;
-        errStream << "found unexpected optical bounds (red pixel) on left border "
-                << "at y=" << range.start + 1;
-        return {};
-    }
+  if (!unexpectedRanges.empty()) {
+    const Range& range = unexpectedRanges[0];
+    std::stringstream errStream;
+    errStream << "found unexpected optical bounds (red pixel) on left border "
+              << "at y=" << range.start + 1;
+    return {};
+  }
 
-    HorizontalImageLine bottomRow(rows, 0, height - 1, width);
-    if (!fillRanges(&bottomRow, colorValidator.get(), &horizontalPadding,
-                    &horizontalOpticalBounds, err)) {
-        return {};
-    }
+  HorizontalImageLine bottomRow(rows, 0, height - 1, width);
+  if (!fillRanges(&bottomRow, colorValidator.get(), &horizontalPadding,
+                  &horizontalOpticalBounds, err)) {
+    return {};
+  }
 
-    if (!populateBounds(horizontalPadding, horizontalOpticalBounds,
-                        ninePatch->horizontalStretchRegions, width - 2,
-                        &ninePatch->padding.left, &ninePatch->padding.right,
-                        &ninePatch->layoutBounds.left, &ninePatch->layoutBounds.right,
-                        "bottom", err)) {
-        return {};
-    }
+  if (!populateBounds(horizontalPadding, horizontalOpticalBounds,
+                      ninePatch->horizontalStretchRegions, width - 2,
+                      &ninePatch->padding.left, &ninePatch->padding.right,
+                      &ninePatch->layoutBounds.left,
+                      &ninePatch->layoutBounds.right, "bottom", err)) {
+    return {};
+  }
 
-    VerticalImageLine rightCol(rows, width - 1, 0, height);
-    if (!fillRanges(&rightCol, colorValidator.get(), &verticalPadding,
-                    &verticalOpticalBounds, err)) {
-        return {};
-    }
+  VerticalImageLine rightCol(rows, width - 1, 0, height);
+  if (!fillRanges(&rightCol, colorValidator.get(), &verticalPadding,
+                  &verticalOpticalBounds, err)) {
+    return {};
+  }
 
-    if (!populateBounds(verticalPadding, verticalOpticalBounds,
-                        ninePatch->verticalStretchRegions, height - 2,
-                        &ninePatch->padding.top, &ninePatch->padding.bottom,
-                        &ninePatch->layoutBounds.top, &ninePatch->layoutBounds.bottom,
-                        "right", err)) {
-        return {};
-    }
+  if (!populateBounds(verticalPadding, verticalOpticalBounds,
+                      ninePatch->verticalStretchRegions, height - 2,
+                      &ninePatch->padding.top, &ninePatch->padding.bottom,
+                      &ninePatch->layoutBounds.top,
+                      &ninePatch->layoutBounds.bottom, "right", err)) {
+    return {};
+  }
 
-    // Fill the region colors of the 9-patch.
-    const int32_t numRows = calculateSegmentCount(ninePatch->horizontalStretchRegions, width - 2);
-    const int32_t numCols = calculateSegmentCount(ninePatch->verticalStretchRegions, height - 2);
-    if ((int64_t) numRows * (int64_t) numCols > 0x7f) {
-        *err = "too many regions in 9-patch";
-        return {};
-    }
+  // Fill the region colors of the 9-patch.
+  const int32_t numRows =
+      calculateSegmentCount(ninePatch->horizontalStretchRegions, width - 2);
+  const int32_t numCols =
+      calculateSegmentCount(ninePatch->verticalStretchRegions, height - 2);
+  if ((int64_t)numRows * (int64_t)numCols > 0x7f) {
+    *err = "too many regions in 9-patch";
+    return {};
+  }
 
-    ninePatch->regionColors.reserve(numRows * numCols);
-    calculateRegionColors(rows, ninePatch->horizontalStretchRegions,
-                          ninePatch->verticalStretchRegions,
-                          width - 2, height - 2,
-                          &ninePatch->regionColors);
+  ninePatch->regionColors.reserve(numRows * numCols);
+  calculateRegionColors(rows, ninePatch->horizontalStretchRegions,
+                        ninePatch->verticalStretchRegions, width - 2,
+                        height - 2, &ninePatch->regionColors);
 
-    // Compute the outline based on opacity.
+  // Compute the outline based on opacity.
 
-    // Find left and right extent of 9-patch content on center row.
-    HorizontalImageLine midRow(rows, 1, height / 2, width - 2);
-    findOutlineInsets(&midRow, &ninePatch->outline.left, &ninePatch->outline.right);
+  // Find left and right extent of 9-patch content on center row.
+  HorizontalImageLine midRow(rows, 1, height / 2, width - 2);
+  findOutlineInsets(&midRow, &ninePatch->outline.left,
+                    &ninePatch->outline.right);
 
-    // Find top and bottom extent of 9-patch content on center column.
-    VerticalImageLine midCol(rows, width / 2, 1, height - 2);
-    findOutlineInsets(&midCol, &ninePatch->outline.top, &ninePatch->outline.bottom);
+  // Find top and bottom extent of 9-patch content on center column.
+  VerticalImageLine midCol(rows, width / 2, 1, height - 2);
+  findOutlineInsets(&midCol, &ninePatch->outline.top,
+                    &ninePatch->outline.bottom);
 
-    const int32_t outlineWidth = (width - 2) - ninePatch->outline.left - ninePatch->outline.right;
-    const int32_t outlineHeight = (height - 2) - ninePatch->outline.top - ninePatch->outline.bottom;
+  const int32_t outlineWidth =
+      (width - 2) - ninePatch->outline.left - ninePatch->outline.right;
+  const int32_t outlineHeight =
+      (height - 2) - ninePatch->outline.top - ninePatch->outline.bottom;
 
-    // Find the largest alpha value within the outline area.
-    HorizontalImageLine outlineMidRow(rows,
-                                      1 + ninePatch->outline.left,
-                                      1 + ninePatch->outline.top + (outlineHeight / 2),
-                                      outlineWidth);
-    VerticalImageLine outlineMidCol(rows,
-                                    1 + ninePatch->outline.left + (outlineWidth / 2),
-                                    1 + ninePatch->outline.top,
-                                    outlineHeight);
-    ninePatch->outlineAlpha = std::max(findMaxAlpha(&outlineMidRow), findMaxAlpha(&outlineMidCol));
+  // Find the largest alpha value within the outline area.
+  HorizontalImageLine outlineMidRow(
+      rows, 1 + ninePatch->outline.left,
+      1 + ninePatch->outline.top + (outlineHeight / 2), outlineWidth);
+  VerticalImageLine outlineMidCol(
+      rows, 1 + ninePatch->outline.left + (outlineWidth / 2),
+      1 + ninePatch->outline.top, outlineHeight);
+  ninePatch->outlineAlpha =
+      std::max(findMaxAlpha(&outlineMidRow), findMaxAlpha(&outlineMidCol));
 
-    // Assuming the image is a round rect, compute the radius by marching
-    // diagonally from the top left corner towards the center.
-    DiagonalImageLine diagonal(rows, 1 + ninePatch->outline.left, 1 + ninePatch->outline.top,
-                               1, 1, std::min(outlineWidth, outlineHeight));
-    int32_t topLeft, bottomRight;
-    findOutlineInsets(&diagonal, &topLeft, &bottomRight);
+  // Assuming the image is a round rect, compute the radius by marching
+  // diagonally from the top left corner towards the center.
+  DiagonalImageLine diagonal(rows, 1 + ninePatch->outline.left,
+                             1 + ninePatch->outline.top, 1, 1,
+                             std::min(outlineWidth, outlineHeight));
+  int32_t topLeft, bottomRight;
+  findOutlineInsets(&diagonal, &topLeft, &bottomRight);
 
-    /* Determine source radius based upon inset:
-     *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
-     *     sqrt(2) * r = sqrt(2) * i + r
-     *     (sqrt(2) - 1) * r = sqrt(2) * i
-     *     r = sqrt(2) / (sqrt(2) - 1) * i
-     */
-    ninePatch->outlineRadius = 3.4142f * topLeft;
-    return ninePatch;
+  /* Determine source radius based upon inset:
+   *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
+   *     sqrt(2) * r = sqrt(2) * i + r
+   *     (sqrt(2) - 1) * r = sqrt(2) * i
+   *     r = sqrt(2) / (sqrt(2) - 1) * i
+   */
+  ninePatch->outlineRadius = 3.4142f * topLeft;
+  return ninePatch;
 }
 
 std::unique_ptr<uint8_t[]> NinePatch::serializeBase(size_t* outLen) const {
-    android::Res_png_9patch data;
-    data.numXDivs = static_cast<uint8_t>(horizontalStretchRegions.size()) * 2;
-    data.numYDivs = static_cast<uint8_t>(verticalStretchRegions.size()) * 2;
-    data.numColors = static_cast<uint8_t>(regionColors.size());
-    data.paddingLeft = padding.left;
-    data.paddingRight = padding.right;
-    data.paddingTop = padding.top;
-    data.paddingBottom = padding.bottom;
+  android::Res_png_9patch data;
+  data.numXDivs = static_cast<uint8_t>(horizontalStretchRegions.size()) * 2;
+  data.numYDivs = static_cast<uint8_t>(verticalStretchRegions.size()) * 2;
+  data.numColors = static_cast<uint8_t>(regionColors.size());
+  data.paddingLeft = padding.left;
+  data.paddingRight = padding.right;
+  data.paddingTop = padding.top;
+  data.paddingBottom = padding.bottom;
 
-    auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[data.serializedSize()]);
-    android::Res_png_9patch::serialize(data,
-                                       (const int32_t*) horizontalStretchRegions.data(),
-                                       (const int32_t*) verticalStretchRegions.data(),
-                                       regionColors.data(),
-                                       buffer.get());
-    // Convert to file endianness.
-    reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();
+  auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[data.serializedSize()]);
+  android::Res_png_9patch::serialize(
+      data, (const int32_t*)horizontalStretchRegions.data(),
+      (const int32_t*)verticalStretchRegions.data(), regionColors.data(),
+      buffer.get());
+  // Convert to file endianness.
+  reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();
 
-    *outLen = data.serializedSize();
-    return buffer;
+  *outLen = data.serializedSize();
+  return buffer;
 }
 
-std::unique_ptr<uint8_t[]> NinePatch::serializeLayoutBounds(size_t* outLen) const {
-    size_t chunkLen = sizeof(uint32_t) * 4;
-    auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
-    uint8_t* cursor = buffer.get();
+std::unique_ptr<uint8_t[]> NinePatch::serializeLayoutBounds(
+    size_t* outLen) const {
+  size_t chunkLen = sizeof(uint32_t) * 4;
+  auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
+  uint8_t* cursor = buffer.get();
 
-    memcpy(cursor, &layoutBounds.left, sizeof(layoutBounds.left));
-    cursor += sizeof(layoutBounds.left);
+  memcpy(cursor, &layoutBounds.left, sizeof(layoutBounds.left));
+  cursor += sizeof(layoutBounds.left);
 
-    memcpy(cursor, &layoutBounds.top, sizeof(layoutBounds.top));
-    cursor += sizeof(layoutBounds.top);
+  memcpy(cursor, &layoutBounds.top, sizeof(layoutBounds.top));
+  cursor += sizeof(layoutBounds.top);
 
-    memcpy(cursor, &layoutBounds.right, sizeof(layoutBounds.right));
-    cursor += sizeof(layoutBounds.right);
+  memcpy(cursor, &layoutBounds.right, sizeof(layoutBounds.right));
+  cursor += sizeof(layoutBounds.right);
 
-    memcpy(cursor, &layoutBounds.bottom, sizeof(layoutBounds.bottom));
-    cursor += sizeof(layoutBounds.bottom);
+  memcpy(cursor, &layoutBounds.bottom, sizeof(layoutBounds.bottom));
+  cursor += sizeof(layoutBounds.bottom);
 
-    *outLen = chunkLen;
-    return buffer;
+  *outLen = chunkLen;
+  return buffer;
 }
 
-std::unique_ptr<uint8_t[]> NinePatch::serializeRoundedRectOutline(size_t* outLen) const {
-    size_t chunkLen = sizeof(uint32_t) * 6;
-    auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
-    uint8_t* cursor = buffer.get();
+std::unique_ptr<uint8_t[]> NinePatch::serializeRoundedRectOutline(
+    size_t* outLen) const {
+  size_t chunkLen = sizeof(uint32_t) * 6;
+  auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
+  uint8_t* cursor = buffer.get();
 
-    memcpy(cursor, &outline.left, sizeof(outline.left));
-    cursor += sizeof(outline.left);
+  memcpy(cursor, &outline.left, sizeof(outline.left));
+  cursor += sizeof(outline.left);
 
-    memcpy(cursor, &outline.top, sizeof(outline.top));
-    cursor += sizeof(outline.top);
+  memcpy(cursor, &outline.top, sizeof(outline.top));
+  cursor += sizeof(outline.top);
 
-    memcpy(cursor, &outline.right, sizeof(outline.right));
-    cursor += sizeof(outline.right);
+  memcpy(cursor, &outline.right, sizeof(outline.right));
+  cursor += sizeof(outline.right);
 
-    memcpy(cursor, &outline.bottom, sizeof(outline.bottom));
-    cursor += sizeof(outline.bottom);
+  memcpy(cursor, &outline.bottom, sizeof(outline.bottom));
+  cursor += sizeof(outline.bottom);
 
-    *((float*) cursor) = outlineRadius;
-    cursor += sizeof(outlineRadius);
+  *((float*)cursor) = outlineRadius;
+  cursor += sizeof(outlineRadius);
 
-    *((uint32_t*) cursor) = outlineAlpha;
+  *((uint32_t*)cursor) = outlineAlpha;
 
-    *outLen = chunkLen;
-    return buffer;
+  *outLen = chunkLen;
+  return buffer;
 }
 
 ::std::ostream& operator<<(::std::ostream& out, const Range& range) {
-    return out << "[" << range.start << ", " << range.end << ")";
+  return out << "[" << range.start << ", " << range.end << ")";
 }
 
 ::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds) {
-    return out << "l=" << bounds.left
-            << " t=" << bounds.top
-            << " r=" << bounds.right
-            << " b=" << bounds.bottom;
+  return out << "l=" << bounds.left << " t=" << bounds.top
+             << " r=" << bounds.right << " b=" << bounds.bottom;
 }
 
 ::std::ostream& operator<<(::std::ostream& out, const NinePatch& ninePatch) {
-    return out << "horizontalStretch:" << util::joiner(ninePatch.horizontalStretchRegions, " ")
-            << " verticalStretch:" << util::joiner(ninePatch.verticalStretchRegions, " ")
-            << " padding: " << ninePatch.padding
-            << ", bounds: " << ninePatch.layoutBounds
-            << ", outline: " << ninePatch.outline
-            << " rad=" << ninePatch.outlineRadius
-            << " alpha=" << ninePatch.outlineAlpha;
+  return out << "horizontalStretch:"
+             << util::joiner(ninePatch.horizontalStretchRegions, " ")
+             << " verticalStretch:"
+             << util::joiner(ninePatch.verticalStretchRegions, " ")
+             << " padding: " << ninePatch.padding
+             << ", bounds: " << ninePatch.layoutBounds
+             << ", outline: " << ninePatch.outline
+             << " rad=" << ninePatch.outlineRadius
+             << " alpha=" << ninePatch.outlineAlpha;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/NinePatch_test.cpp b/tools/aapt2/compile/NinePatch_test.cpp
index 3106ff8..b8eda09 100644
--- a/tools/aapt2/compile/NinePatch_test.cpp
+++ b/tools/aapt2/compile/NinePatch_test.cpp
@@ -21,8 +21,8 @@
 
 // Pixels are in RGBA_8888 packing.
 
-#define RED   "\xff\x00\x00\xff"
-#define BLUE  "\x00\x00\xff\xff"
+#define RED "\xff\x00\x00\xff"
+#define BLUE "\x00\x00\xff\xff"
 #define GREEN "\xff\x00\x00\xff"
 #define GR_70 "\xff\x00\x00\xb3"
 #define GR_50 "\xff\x00\x00\x80"
@@ -32,327 +32,346 @@
 #define TRANS "\x00\x00\x00\x00"
 
 static uint8_t* k2x2[] = {
-        (uint8_t*) WHITE WHITE,
-        (uint8_t*) WHITE WHITE,
+    (uint8_t*)WHITE WHITE, (uint8_t*)WHITE WHITE,
 };
 
 static uint8_t* kMixedNeutralColor3x3[] = {
-        (uint8_t*) WHITE BLACK TRANS,
-        (uint8_t*) TRANS RED   TRANS,
-        (uint8_t*) WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK TRANS, (uint8_t*)TRANS RED TRANS,
+    (uint8_t*)WHITE WHITE WHITE,
 };
 
 static uint8_t* kTransparentNeutralColor3x3[] = {
-        (uint8_t*) TRANS BLACK TRANS,
-        (uint8_t*) BLACK RED   BLACK,
-        (uint8_t*) TRANS BLACK TRANS,
+    (uint8_t*)TRANS BLACK TRANS, (uint8_t*)BLACK RED BLACK,
+    (uint8_t*)TRANS BLACK TRANS,
 };
 
 static uint8_t* kSingleStretch7x6[] = {
-        (uint8_t*) WHITE WHITE BLACK BLACK BLACK WHITE WHITE,
-        (uint8_t*) WHITE RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) BLACK RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) BLACK RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) WHITE RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK BLACK BLACK WHITE WHITE,
+    (uint8_t*)WHITE RED RED RED RED RED WHITE,
+    (uint8_t*)BLACK RED RED RED RED RED WHITE,
+    (uint8_t*)BLACK RED RED RED RED RED WHITE,
+    (uint8_t*)WHITE RED RED RED RED RED WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kMultipleStretch10x7[] = {
-        (uint8_t*) WHITE WHITE BLACK WHITE BLACK BLACK WHITE BLACK WHITE WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) WHITE RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK WHITE BLACK BLACK WHITE BLACK WHITE WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)WHITE RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kPadding6x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE BLACK,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE BLACK BLACK WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK BLACK WHITE WHITE,
 };
 
 static uint8_t* kLayoutBoundsWrongEdge3x3[] = {
-        (uint8_t*) WHITE RED   WHITE,
-        (uint8_t*) RED   WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE,
+    (uint8_t*)WHITE RED WHITE, (uint8_t*)RED WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE,
 };
 
 static uint8_t* kLayoutBoundsNotEdgeAligned5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE RED   WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE RED WHITE WHITE,
 };
 
 static uint8_t* kLayoutBounds5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE RED   WHITE RED   WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE RED WHITE RED WHITE,
 };
 
 static uint8_t* kAsymmetricLayoutBounds5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE RED   WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE RED WHITE WHITE WHITE,
 };
 
 static uint8_t* kPaddingAndLayoutBounds5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE BLACK,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE RED   BLACK RED   WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE BLACK,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE RED BLACK RED WHITE,
 };
 
 static uint8_t* kColorfulImage5x5[] = {
-        (uint8_t*) WHITE BLACK WHITE BLACK WHITE,
-        (uint8_t*) BLACK RED   BLUE  GREEN WHITE,
-        (uint8_t*) BLACK RED   GREEN GREEN WHITE,
-        (uint8_t*) WHITE TRANS BLUE  GREEN WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK WHITE BLACK WHITE,
+    (uint8_t*)BLACK RED BLUE GREEN WHITE,
+    (uint8_t*)BLACK RED GREEN GREEN WHITE,
+    (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineOpaque10x10[] = {
-        (uint8_t*) WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineTranslucent10x10[] = {
-        (uint8_t*) WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineOffsetTranslucent12x10[] = {
-        (uint8_t*) WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)
+        WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineRadius5x5[] = {
-        (uint8_t*) WHITE BLACK BLACK BLACK WHITE,
-        (uint8_t*) BLACK TRANS GREEN TRANS WHITE,
-        (uint8_t*) BLACK GREEN GREEN GREEN WHITE,
-        (uint8_t*) BLACK TRANS GREEN TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK BLACK BLACK WHITE,
+    (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+    (uint8_t*)BLACK GREEN GREEN GREEN WHITE,
+    (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kStretchAndPadding5x5[] = {
-        (uint8_t*) WHITE WHITE BLACK WHITE WHITE,
-        (uint8_t*) WHITE RED   RED   RED   WHITE,
-        (uint8_t*) BLACK RED   RED   RED   BLACK,
-        (uint8_t*) WHITE RED   RED   RED   WHITE,
-        (uint8_t*) WHITE WHITE BLACK WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK WHITE WHITE, (uint8_t*)WHITE RED RED RED WHITE,
+    (uint8_t*)BLACK RED RED RED BLACK,       (uint8_t*)WHITE RED RED RED WHITE,
+    (uint8_t*)WHITE WHITE BLACK WHITE WHITE,
 };
 
 TEST(NinePatchTest, Minimum3x3) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(k2x2, 2, 2, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr, NinePatch::create(k2x2, 2, 2, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, MixedNeutralColors) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(kMixedNeutralColor3x3, 3, 3, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr, NinePatch::create(kMixedNeutralColor3x3, 3, 3, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, TransparentNeutralColor) {
-    std::string err;
-    EXPECT_NE(nullptr, NinePatch::create(kTransparentNeutralColor3x3, 3, 3, &err));
+  std::string err;
+  EXPECT_NE(nullptr,
+            NinePatch::create(kTransparentNeutralColor3x3, 3, 3, &err));
 }
 
 TEST(NinePatchTest, SingleStretchRegion) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kSingleStretch7x6, 7, 6, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kSingleStretch7x6, 7, 6, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    ASSERT_EQ(1u, ninePatch->horizontalStretchRegions.size());
-    ASSERT_EQ(1u, ninePatch->verticalStretchRegions.size());
+  ASSERT_EQ(1u, ninePatch->horizontalStretchRegions.size());
+  ASSERT_EQ(1u, ninePatch->verticalStretchRegions.size());
 
-    EXPECT_EQ(Range(1, 4), ninePatch->horizontalStretchRegions.front());
-    EXPECT_EQ(Range(1, 3), ninePatch->verticalStretchRegions.front());
+  EXPECT_EQ(Range(1, 4), ninePatch->horizontalStretchRegions.front());
+  EXPECT_EQ(Range(1, 3), ninePatch->verticalStretchRegions.front());
 }
 
 TEST(NinePatchTest, MultipleStretchRegions) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    ASSERT_EQ(3u, ninePatch->horizontalStretchRegions.size());
-    ASSERT_EQ(2u, ninePatch->verticalStretchRegions.size());
+  ASSERT_EQ(3u, ninePatch->horizontalStretchRegions.size());
+  ASSERT_EQ(2u, ninePatch->verticalStretchRegions.size());
 
-    EXPECT_EQ(Range(1, 2), ninePatch->horizontalStretchRegions[0]);
-    EXPECT_EQ(Range(3, 5), ninePatch->horizontalStretchRegions[1]);
-    EXPECT_EQ(Range(6, 7), ninePatch->horizontalStretchRegions[2]);
+  EXPECT_EQ(Range(1, 2), ninePatch->horizontalStretchRegions[0]);
+  EXPECT_EQ(Range(3, 5), ninePatch->horizontalStretchRegions[1]);
+  EXPECT_EQ(Range(6, 7), ninePatch->horizontalStretchRegions[2]);
 
-    EXPECT_EQ(Range(0, 2), ninePatch->verticalStretchRegions[0]);
-    EXPECT_EQ(Range(3, 5), ninePatch->verticalStretchRegions[1]);
+  EXPECT_EQ(Range(0, 2), ninePatch->verticalStretchRegions[0]);
+  EXPECT_EQ(Range(3, 5), ninePatch->verticalStretchRegions[1]);
 }
 
 TEST(NinePatchTest, InferPaddingFromStretchRegions) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 0, 1, 0), ninePatch->padding);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 0, 1, 0), ninePatch->padding);
 }
 
 TEST(NinePatchTest, Padding) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kPadding6x5, 6, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kPadding6x5, 6, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
 }
 
 TEST(NinePatchTest, LayoutBoundsAreOnWrongEdge) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsWrongEdge3x3, 3, 3, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsWrongEdge3x3, 3, 3, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, LayoutBoundsMustTouchEdges) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr,
+            NinePatch::create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, LayoutBounds) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kLayoutBounds5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kLayoutBounds5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
 
-    ninePatch = NinePatch::create(kAsymmetricLayoutBounds5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 0, 0), ninePatch->layoutBounds);
+  ninePatch = NinePatch::create(kAsymmetricLayoutBounds5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 0, 0), ninePatch->layoutBounds);
 }
 
 TEST(NinePatchTest, PaddingAndLayoutBounds) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kPaddingAndLayoutBounds5x5, 5, 5,
-                                                             &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
 }
 
 TEST(NinePatchTest, RegionColorsAreCorrect) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kColorfulImage5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kColorfulImage5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    std::vector<uint32_t> expectedColors = {
-            NinePatch::packRGBA((uint8_t*) RED),
-            (uint32_t) android::Res_png_9patch::NO_COLOR,
-            NinePatch::packRGBA((uint8_t*) GREEN),
-            (uint32_t) android::Res_png_9patch::TRANSPARENT_COLOR,
-            NinePatch::packRGBA((uint8_t*) BLUE),
-            NinePatch::packRGBA((uint8_t*) GREEN),
-    };
-    EXPECT_EQ(expectedColors, ninePatch->regionColors);
+  std::vector<uint32_t> expectedColors = {
+      NinePatch::packRGBA((uint8_t*)RED),
+      (uint32_t)android::Res_png_9patch::NO_COLOR,
+      NinePatch::packRGBA((uint8_t*)GREEN),
+      (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
+      NinePatch::packRGBA((uint8_t*)BLUE),
+      NinePatch::packRGBA((uint8_t*)GREEN),
+  };
+  EXPECT_EQ(expectedColors, ninePatch->regionColors);
 }
 
 TEST(NinePatchTest, OutlineFromOpaqueImage) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineOpaque10x10, 10, 10, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(2, 2, 2, 2), ninePatch->outline);
-    EXPECT_EQ(0x000000ffu, ninePatch->outlineAlpha);
-    EXPECT_EQ(0.0f, ninePatch->outlineRadius);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineOpaque10x10, 10, 10, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(2, 2, 2, 2), ninePatch->outline);
+  EXPECT_EQ(0x000000ffu, ninePatch->outlineAlpha);
+  EXPECT_EQ(0.0f, ninePatch->outlineRadius);
 }
 
 TEST(NinePatchTest, OutlineFromTranslucentImage) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineTranslucent10x10, 10, 10,
-                                                             &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(3, 3, 3, 3), ninePatch->outline);
-    EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
-    EXPECT_EQ(0.0f, ninePatch->outlineRadius);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineTranslucent10x10, 10, 10, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(3, 3, 3, 3), ninePatch->outline);
+  EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
+  EXPECT_EQ(0.0f, ninePatch->outlineRadius);
 }
 
 TEST(NinePatchTest, OutlineFromOffCenterImage) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineOffsetTranslucent12x10, 12, 10,
-                                                             &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineOffsetTranslucent12x10, 12, 10, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    // TODO(adamlesinski): The old AAPT algorithm searches from the outside to the middle
-    // for each inset. If the outline is shifted, the search may not find a closer bounds.
-    // This check should be:
-    //   EXPECT_EQ(Bounds(5, 3, 3, 3), ninePatch->outline);
-    // but until I know what behaviour I'm breaking, I will leave it at the incorrect:
-    EXPECT_EQ(Bounds(4, 3, 3, 3), ninePatch->outline);
+  // TODO(adamlesinski): The old AAPT algorithm searches from the outside to the
+  // middle
+  // for each inset. If the outline is shifted, the search may not find a closer
+  // bounds.
+  // This check should be:
+  //   EXPECT_EQ(Bounds(5, 3, 3, 3), ninePatch->outline);
+  // but until I know what behaviour I'm breaking, I will leave it at the
+  // incorrect:
+  EXPECT_EQ(Bounds(4, 3, 3, 3), ninePatch->outline);
 
-    EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
-    EXPECT_EQ(0.0f, ninePatch->outlineRadius);
+  EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
+  EXPECT_EQ(0.0f, ninePatch->outlineRadius);
 }
 
 TEST(NinePatchTest, OutlineRadius) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineRadius5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(0, 0, 0, 0), ninePatch->outline);
-    EXPECT_EQ(3.4142f, ninePatch->outlineRadius);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineRadius5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(0, 0, 0, 0), ninePatch->outline);
+  EXPECT_EQ(3.4142f, ninePatch->outlineRadius);
 }
 
 ::testing::AssertionResult bigEndianOne(uint8_t* cursor) {
-    if (cursor[0] == 0 && cursor[1] == 0 && cursor[2] == 0 && cursor[3] == 1) {
-        return ::testing::AssertionSuccess();
-    }
-    return ::testing::AssertionFailure() << "Not BigEndian 1";
+  if (cursor[0] == 0 && cursor[1] == 0 && cursor[2] == 0 && cursor[3] == 1) {
+    return ::testing::AssertionSuccess();
+  }
+  return ::testing::AssertionFailure() << "Not BigEndian 1";
 }
 
 TEST(NinePatchTest, SerializePngEndianness) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kStretchAndPadding5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kStretchAndPadding5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    size_t len;
-    std::unique_ptr<uint8_t[]> data = ninePatch->serializeBase(&len);
-    ASSERT_NE(nullptr, data);
-    ASSERT_NE(0u, len);
+  size_t len;
+  std::unique_ptr<uint8_t[]> data = ninePatch->serializeBase(&len);
+  ASSERT_NE(nullptr, data);
+  ASSERT_NE(0u, len);
 
-    // Skip past wasDeserialized + numXDivs + numYDivs + numColors + xDivsOffset + yDivsOffset
-    // (12 bytes)
-    uint8_t* cursor = data.get() + 12;
+  // Skip past wasDeserialized + numXDivs + numYDivs + numColors + xDivsOffset +
+  // yDivsOffset
+  // (12 bytes)
+  uint8_t* cursor = data.get() + 12;
 
-    // Check that padding is big-endian. Expecting value 1.
-    EXPECT_TRUE(bigEndianOne(cursor));
-    EXPECT_TRUE(bigEndianOne(cursor + 4));
-    EXPECT_TRUE(bigEndianOne(cursor + 8));
-    EXPECT_TRUE(bigEndianOne(cursor + 12));
+  // Check that padding is big-endian. Expecting value 1.
+  EXPECT_TRUE(bigEndianOne(cursor));
+  EXPECT_TRUE(bigEndianOne(cursor + 4));
+  EXPECT_TRUE(bigEndianOne(cursor + 8));
+  EXPECT_TRUE(bigEndianOne(cursor + 12));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Png.cpp b/tools/aapt2/compile/Png.cpp
index 055d8b5..9b5fa7e09 100644
--- a/tools/aapt2/compile/Png.cpp
+++ b/tools/aapt2/compile/Png.cpp
@@ -14,18 +14,18 @@
  * limitations under the License.
  */
 
-#include "util/BigBuffer.h"
 #include "Png.h"
 #include "Source.h"
+#include "util/BigBuffer.h"
 #include "util/Util.h"
 
 #include <androidfw/ResourceTypes.h>
-#include <iostream>
 #include <png.h>
+#include <zlib.h>
+#include <iostream>
 #include <sstream>
 #include <string>
 #include <vector>
-#include <zlib.h>
 
 namespace aapt {
 
@@ -33,158 +33,166 @@
 constexpr size_t kPngSignatureSize = 8u;
 
 struct PngInfo {
-    ~PngInfo() {
-        for (png_bytep row : rows) {
-            if (row != nullptr) {
-                delete[] row;
-            }
-        }
-
-        delete[] xDivs;
-        delete[] yDivs;
+  ~PngInfo() {
+    for (png_bytep row : rows) {
+      if (row != nullptr) {
+        delete[] row;
+      }
     }
 
-    void* serialize9Patch() {
-        void* serialized = android::Res_png_9patch::serialize(info9Patch, xDivs, yDivs,
-                                                              colors.data());
-        reinterpret_cast<android::Res_png_9patch*>(serialized)->deviceToFile();
-        return serialized;
-    }
+    delete[] xDivs;
+    delete[] yDivs;
+  }
 
-    uint32_t width = 0;
-    uint32_t height = 0;
-    std::vector<png_bytep> rows;
+  void* serialize9Patch() {
+    void* serialized = android::Res_png_9patch::serialize(info9Patch, xDivs,
+                                                          yDivs, colors.data());
+    reinterpret_cast<android::Res_png_9patch*>(serialized)->deviceToFile();
+    return serialized;
+  }
 
-    bool is9Patch = false;
-    android::Res_png_9patch info9Patch;
-    int32_t* xDivs = nullptr;
-    int32_t* yDivs = nullptr;
-    std::vector<uint32_t> colors;
+  uint32_t width = 0;
+  uint32_t height = 0;
+  std::vector<png_bytep> rows;
 
-    // Layout padding.
-    bool haveLayoutBounds = false;
-    int32_t layoutBoundsLeft;
-    int32_t layoutBoundsTop;
-    int32_t layoutBoundsRight;
-    int32_t layoutBoundsBottom;
+  bool is9Patch = false;
+  android::Res_png_9patch info9Patch;
+  int32_t* xDivs = nullptr;
+  int32_t* yDivs = nullptr;
+  std::vector<uint32_t> colors;
 
-    // Round rect outline description.
-    int32_t outlineInsetsLeft;
-    int32_t outlineInsetsTop;
-    int32_t outlineInsetsRight;
-    int32_t outlineInsetsBottom;
-    float outlineRadius;
-    uint8_t outlineAlpha;
+  // Layout padding.
+  bool haveLayoutBounds = false;
+  int32_t layoutBoundsLeft;
+  int32_t layoutBoundsTop;
+  int32_t layoutBoundsRight;
+  int32_t layoutBoundsBottom;
+
+  // Round rect outline description.
+  int32_t outlineInsetsLeft;
+  int32_t outlineInsetsTop;
+  int32_t outlineInsetsRight;
+  int32_t outlineInsetsBottom;
+  float outlineRadius;
+  uint8_t outlineAlpha;
 };
 
-static void readDataFromStream(png_structp readPtr, png_bytep data, png_size_t length) {
-    std::istream* input = reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
-    if (!input->read(reinterpret_cast<char*>(data), length)) {
-        png_error(readPtr, strerror(errno));
-    }
+static void readDataFromStream(png_structp readPtr, png_bytep data,
+                               png_size_t length) {
+  std::istream* input =
+      reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
+  if (!input->read(reinterpret_cast<char*>(data), length)) {
+    png_error(readPtr, strerror(errno));
+  }
 }
 
-static void writeDataToStream(png_structp writePtr, png_bytep data, png_size_t length) {
-    BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
-    png_bytep buf = outBuffer->nextBlock<png_byte>(length);
-    memcpy(buf, data, length);
+static void writeDataToStream(png_structp writePtr, png_bytep data,
+                              png_size_t length) {
+  BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
+  png_bytep buf = outBuffer->nextBlock<png_byte>(length);
+  memcpy(buf, data, length);
 }
 
-static void flushDataToStream(png_structp /*writePtr*/) {
-}
+static void flushDataToStream(png_structp /*writePtr*/) {}
 
 static void logWarning(png_structp readPtr, png_const_charp warningMessage) {
-    IDiagnostics* diag = reinterpret_cast<IDiagnostics*>(png_get_error_ptr(readPtr));
-    diag->warn(DiagMessage() << warningMessage);
+  IDiagnostics* diag =
+      reinterpret_cast<IDiagnostics*>(png_get_error_ptr(readPtr));
+  diag->warn(DiagMessage() << warningMessage);
 }
 
+static bool readPng(IDiagnostics* diag, png_structp readPtr, png_infop infoPtr,
+                    PngInfo* outInfo) {
+  if (setjmp(png_jmpbuf(readPtr))) {
+    diag->error(DiagMessage() << "failed reading png");
+    return false;
+  }
 
-static bool readPng(IDiagnostics* diag, png_structp readPtr, png_infop infoPtr, PngInfo* outInfo) {
-    if (setjmp(png_jmpbuf(readPtr))) {
-        diag->error(DiagMessage() << "failed reading png");
-        return false;
-    }
+  png_set_sig_bytes(readPtr, kPngSignatureSize);
+  png_read_info(readPtr, infoPtr);
 
-    png_set_sig_bytes(readPtr, kPngSignatureSize);
-    png_read_info(readPtr, infoPtr);
+  int colorType, bitDepth, interlaceType, compressionType;
+  png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth,
+               &colorType, &interlaceType, &compressionType, nullptr);
 
-    int colorType, bitDepth, interlaceType, compressionType;
-    png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth, &colorType,
-                 &interlaceType, &compressionType, nullptr);
+  if (colorType == PNG_COLOR_TYPE_PALETTE) {
+    png_set_palette_to_rgb(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_PALETTE) {
-        png_set_palette_to_rgb(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
+    png_set_expand_gray_1_2_4_to_8(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
-        png_set_expand_gray_1_2_4_to_8(readPtr);
-    }
+  if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
+    png_set_tRNS_to_alpha(readPtr);
+  }
 
-    if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
-        png_set_tRNS_to_alpha(readPtr);
-    }
+  if (bitDepth == 16) {
+    png_set_strip_16(readPtr);
+  }
 
-    if (bitDepth == 16) {
-        png_set_strip_16(readPtr);
-    }
+  if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
+    png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
+  }
 
-    if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
-        png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY ||
+      colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    png_set_gray_to_rgb(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        png_set_gray_to_rgb(readPtr);
-    }
+  png_set_interlace_handling(readPtr);
+  png_read_update_info(readPtr, infoPtr);
 
-    png_set_interlace_handling(readPtr);
-    png_read_update_info(readPtr, infoPtr);
+  const uint32_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
+  outInfo->rows.resize(outInfo->height);
+  for (size_t i = 0; i < outInfo->height; i++) {
+    outInfo->rows[i] = new png_byte[rowBytes];
+  }
 
-    const uint32_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
-    outInfo->rows.resize(outInfo->height);
-    for (size_t i = 0; i < outInfo->height; i++) {
-        outInfo->rows[i] = new png_byte[rowBytes];
-    }
-
-    png_read_image(readPtr, outInfo->rows.data());
-    png_read_end(readPtr, infoPtr);
-    return true;
+  png_read_image(readPtr, outInfo->rows.data());
+  png_read_end(readPtr, infoPtr);
+  return true;
 }
 
-static void checkNinePatchSerialization(android::Res_png_9patch* inPatch,  void* data) {
-    size_t patchSize = inPatch->serializedSize();
-    void* newData = malloc(patchSize);
-    memcpy(newData, data, patchSize);
-    android::Res_png_9patch* outPatch = inPatch->deserialize(newData);
-    outPatch->fileToDevice();
-    // deserialization is done in place, so outPatch == newData
-    assert(outPatch == newData);
-    assert(outPatch->numXDivs == inPatch->numXDivs);
-    assert(outPatch->numYDivs == inPatch->numYDivs);
-    assert(outPatch->paddingLeft == inPatch->paddingLeft);
-    assert(outPatch->paddingRight == inPatch->paddingRight);
-    assert(outPatch->paddingTop == inPatch->paddingTop);
-    assert(outPatch->paddingBottom == inPatch->paddingBottom);
-/*    for (int i = 0; i < outPatch->numXDivs; i++) {
-        assert(outPatch->getXDivs()[i] == inPatch->getXDivs()[i]);
-    }
-    for (int i = 0; i < outPatch->numYDivs; i++) {
-        assert(outPatch->getYDivs()[i] == inPatch->getYDivs()[i]);
-    }
-    for (int i = 0; i < outPatch->numColors; i++) {
-        assert(outPatch->getColors()[i] == inPatch->getColors()[i]);
-    }*/
-    free(newData);
+static void checkNinePatchSerialization(android::Res_png_9patch* inPatch,
+                                        void* data) {
+  size_t patchSize = inPatch->serializedSize();
+  void* newData = malloc(patchSize);
+  memcpy(newData, data, patchSize);
+  android::Res_png_9patch* outPatch = inPatch->deserialize(newData);
+  outPatch->fileToDevice();
+  // deserialization is done in place, so outPatch == newData
+  assert(outPatch == newData);
+  assert(outPatch->numXDivs == inPatch->numXDivs);
+  assert(outPatch->numYDivs == inPatch->numYDivs);
+  assert(outPatch->paddingLeft == inPatch->paddingLeft);
+  assert(outPatch->paddingRight == inPatch->paddingRight);
+  assert(outPatch->paddingTop == inPatch->paddingTop);
+  assert(outPatch->paddingBottom == inPatch->paddingBottom);
+  /*    for (int i = 0; i < outPatch->numXDivs; i++) {
+          assert(outPatch->getXDivs()[i] == inPatch->getXDivs()[i]);
+      }
+      for (int i = 0; i < outPatch->numYDivs; i++) {
+          assert(outPatch->getYDivs()[i] == inPatch->getYDivs()[i]);
+      }
+      for (int i = 0; i < outPatch->numColors; i++) {
+          assert(outPatch->getColors()[i] == inPatch->getColors()[i]);
+      }*/
+  free(newData);
 }
 
-/*static void dump_image(int w, int h, const png_byte* const* rows, int color_type) {
+/*static void dump_image(int w, int h, const png_byte* const* rows, int
+color_type) {
     int i, j, rr, gg, bb, aa;
 
     int bpp;
-    if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_GRAY) {
+    if (color_type == PNG_COLOR_TYPE_PALETTE || color_type ==
+PNG_COLOR_TYPE_GRAY) {
         bpp = 1;
     } else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
         bpp = 2;
-    } else if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
+    } else if (color_type == PNG_COLOR_TYPE_RGB || color_type ==
+PNG_COLOR_TYPE_RGB_ALPHA) {
         // We use a padding byte even when there is no alpha
         bpp = 4;
     } else {
@@ -224,1055 +232,1083 @@
     }
 }*/
 
-#define MAX(a,b) ((a)>(b)?(a):(b))
-#define ABS(a)   ((a)<0?-(a):(a))
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define ABS(a) ((a) < 0 ? -(a) : (a))
 
-static void analyze_image(IDiagnostics* diag, const PngInfo& imageInfo, int grayscaleTolerance,
-                          png_colorp rgbPalette, png_bytep alphaPalette,
-                          int *paletteEntries, bool *hasTransparency, int *colorType,
+static void analyze_image(IDiagnostics* diag, const PngInfo& imageInfo,
+                          int grayscaleTolerance, png_colorp rgbPalette,
+                          png_bytep alphaPalette, int* paletteEntries,
+                          bool* hasTransparency, int* colorType,
                           png_bytepp outRows) {
-    int w = imageInfo.width;
-    int h = imageInfo.height;
-    int i, j, rr, gg, bb, aa, idx;
-    uint32_t colors[256], col;
-    int num_colors = 0;
-    int maxGrayDeviation = 0;
+  int w = imageInfo.width;
+  int h = imageInfo.height;
+  int i, j, rr, gg, bb, aa, idx;
+  uint32_t colors[256], col;
+  int num_colors = 0;
+  int maxGrayDeviation = 0;
 
-    bool isOpaque = true;
-    bool isPalette = true;
-    bool isGrayscale = true;
+  bool isOpaque = true;
+  bool isPalette = true;
+  bool isGrayscale = true;
 
-    // Scan the entire image and determine if:
-    // 1. Every pixel has R == G == B (grayscale)
-    // 2. Every pixel has A == 255 (opaque)
-    // 3. There are no more than 256 distinct RGBA colors
+  // Scan the entire image and determine if:
+  // 1. Every pixel has R == G == B (grayscale)
+  // 2. Every pixel has A == 255 (opaque)
+  // 3. There are no more than 256 distinct RGBA colors
 
-    if (kDebug) {
-        printf("Initial image data:\n");
-        //dump_image(w, h, imageInfo.rows.data(), PNG_COLOR_TYPE_RGB_ALPHA);
-    }
+  if (kDebug) {
+    printf("Initial image data:\n");
+    // dump_image(w, h, imageInfo.rows.data(), PNG_COLOR_TYPE_RGB_ALPHA);
+  }
 
-    for (j = 0; j < h; j++) {
-        const png_byte* row = imageInfo.rows[j];
-        png_bytep out = outRows[j];
-        for (i = 0; i < w; i++) {
-            rr = *row++;
-            gg = *row++;
-            bb = *row++;
-            aa = *row++;
+  for (j = 0; j < h; j++) {
+    const png_byte* row = imageInfo.rows[j];
+    png_bytep out = outRows[j];
+    for (i = 0; i < w; i++) {
+      rr = *row++;
+      gg = *row++;
+      bb = *row++;
+      aa = *row++;
 
-            int odev = maxGrayDeviation;
-            maxGrayDeviation = MAX(ABS(rr - gg), maxGrayDeviation);
-            maxGrayDeviation = MAX(ABS(gg - bb), maxGrayDeviation);
-            maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
-            if (maxGrayDeviation > odev) {
-                if (kDebug) {
-                    printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
-                            maxGrayDeviation, i, j, rr, gg, bb, aa);
-                }
-            }
-
-            // Check if image is really grayscale
-            if (isGrayscale) {
-                if (rr != gg || rr != bb) {
-                    if (kDebug) {
-                        printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n",
-                                i, j, rr, gg, bb, aa);
-                    }
-                    isGrayscale = false;
-                }
-            }
-
-            // Check if image is really opaque
-            if (isOpaque) {
-                if (aa != 0xff) {
-                    if (kDebug) {
-                        printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n",
-                                i, j, rr, gg, bb, aa);
-                    }
-                    isOpaque = false;
-                }
-            }
-
-            // Check if image is really <= 256 colors
-            if (isPalette) {
-                col = (uint32_t) ((rr << 24) | (gg << 16) | (bb << 8) | aa);
-                bool match = false;
-                for (idx = 0; idx < num_colors; idx++) {
-                    if (colors[idx] == col) {
-                        match = true;
-                        break;
-                    }
-                }
-
-                // Write the palette index for the pixel to outRows optimistically
-                // We might overwrite it later if we decide to encode as gray or
-                // gray + alpha
-                *out++ = idx;
-                if (!match) {
-                    if (num_colors == 256) {
-                        if (kDebug) {
-                            printf("Found 257th color at %d, %d\n", i, j);
-                        }
-                        isPalette = false;
-                    } else {
-                        colors[num_colors++] = col;
-                    }
-                }
-            }
+      int odev = maxGrayDeviation;
+      maxGrayDeviation = MAX(ABS(rr - gg), maxGrayDeviation);
+      maxGrayDeviation = MAX(ABS(gg - bb), maxGrayDeviation);
+      maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
+      if (maxGrayDeviation > odev) {
+        if (kDebug) {
+          printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
+                 maxGrayDeviation, i, j, rr, gg, bb, aa);
         }
-    }
+      }
 
-    *paletteEntries = 0;
-    *hasTransparency = !isOpaque;
-    int bpp = isOpaque ? 3 : 4;
-    int paletteSize = w * h + bpp * num_colors;
-
-    if (kDebug) {
-        printf("isGrayscale = %s\n", isGrayscale ? "true" : "false");
-        printf("isOpaque = %s\n", isOpaque ? "true" : "false");
-        printf("isPalette = %s\n", isPalette ? "true" : "false");
-        printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n",
-                paletteSize, 2 * w * h, bpp * w * h);
-        printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation, grayscaleTolerance);
-    }
-
-    // Choose the best color type for the image.
-    // 1. Opaque gray - use COLOR_TYPE_GRAY at 1 byte/pixel
-    // 2. Gray + alpha - use COLOR_TYPE_PALETTE if the number of distinct combinations
-    //     is sufficiently small, otherwise use COLOR_TYPE_GRAY_ALPHA
-    // 3. RGB(A) - use COLOR_TYPE_PALETTE if the number of distinct colors is sufficiently
-    //     small, otherwise use COLOR_TYPE_RGB{_ALPHA}
-    if (isGrayscale) {
-        if (isOpaque) {
-            *colorType = PNG_COLOR_TYPE_GRAY; // 1 byte/pixel
-        } else {
-            // Use a simple heuristic to determine whether using a palette will
-            // save space versus using gray + alpha for each pixel.
-            // This doesn't take into account chunk overhead, filtering, LZ
-            // compression, etc.
-            if (isPalette && (paletteSize < 2 * w * h)) {
-                *colorType = PNG_COLOR_TYPE_PALETTE; // 1 byte/pixel + 4 bytes/color
-            } else {
-                *colorType = PNG_COLOR_TYPE_GRAY_ALPHA; // 2 bytes per pixel
-            }
+      // Check if image is really grayscale
+      if (isGrayscale) {
+        if (rr != gg || rr != bb) {
+          if (kDebug) {
+            printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n", i, j,
+                   rr, gg, bb, aa);
+          }
+          isGrayscale = false;
         }
-    } else if (isPalette && (paletteSize < bpp * w * h)) {
-        *colorType = PNG_COLOR_TYPE_PALETTE;
+      }
+
+      // Check if image is really opaque
+      if (isOpaque) {
+        if (aa != 0xff) {
+          if (kDebug) {
+            printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n", i, j,
+                   rr, gg, bb, aa);
+          }
+          isOpaque = false;
+        }
+      }
+
+      // Check if image is really <= 256 colors
+      if (isPalette) {
+        col = (uint32_t)((rr << 24) | (gg << 16) | (bb << 8) | aa);
+        bool match = false;
+        for (idx = 0; idx < num_colors; idx++) {
+          if (colors[idx] == col) {
+            match = true;
+            break;
+          }
+        }
+
+        // Write the palette index for the pixel to outRows optimistically
+        // We might overwrite it later if we decide to encode as gray or
+        // gray + alpha
+        *out++ = idx;
+        if (!match) {
+          if (num_colors == 256) {
+            if (kDebug) {
+              printf("Found 257th color at %d, %d\n", i, j);
+            }
+            isPalette = false;
+          } else {
+            colors[num_colors++] = col;
+          }
+        }
+      }
+    }
+  }
+
+  *paletteEntries = 0;
+  *hasTransparency = !isOpaque;
+  int bpp = isOpaque ? 3 : 4;
+  int paletteSize = w * h + bpp * num_colors;
+
+  if (kDebug) {
+    printf("isGrayscale = %s\n", isGrayscale ? "true" : "false");
+    printf("isOpaque = %s\n", isOpaque ? "true" : "false");
+    printf("isPalette = %s\n", isPalette ? "true" : "false");
+    printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n", paletteSize,
+           2 * w * h, bpp * w * h);
+    printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation,
+           grayscaleTolerance);
+  }
+
+  // Choose the best color type for the image.
+  // 1. Opaque gray - use COLOR_TYPE_GRAY at 1 byte/pixel
+  // 2. Gray + alpha - use COLOR_TYPE_PALETTE if the number of distinct
+  // combinations
+  //     is sufficiently small, otherwise use COLOR_TYPE_GRAY_ALPHA
+  // 3. RGB(A) - use COLOR_TYPE_PALETTE if the number of distinct colors is
+  // sufficiently
+  //     small, otherwise use COLOR_TYPE_RGB{_ALPHA}
+  if (isGrayscale) {
+    if (isOpaque) {
+      *colorType = PNG_COLOR_TYPE_GRAY;  // 1 byte/pixel
     } else {
-        if (maxGrayDeviation <= grayscaleTolerance) {
-            diag->note(DiagMessage()
-                       << "forcing image to gray (max deviation = "
-                       << maxGrayDeviation << ")");
-            *colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
+      // Use a simple heuristic to determine whether using a palette will
+      // save space versus using gray + alpha for each pixel.
+      // This doesn't take into account chunk overhead, filtering, LZ
+      // compression, etc.
+      if (isPalette && (paletteSize < 2 * w * h)) {
+        *colorType = PNG_COLOR_TYPE_PALETTE;  // 1 byte/pixel + 4 bytes/color
+      } else {
+        *colorType = PNG_COLOR_TYPE_GRAY_ALPHA;  // 2 bytes per pixel
+      }
+    }
+  } else if (isPalette && (paletteSize < bpp * w * h)) {
+    *colorType = PNG_COLOR_TYPE_PALETTE;
+  } else {
+    if (maxGrayDeviation <= grayscaleTolerance) {
+      diag->note(DiagMessage() << "forcing image to gray (max deviation = "
+                               << maxGrayDeviation << ")");
+      *colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
+    } else {
+      *colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
+    }
+  }
+
+  // Perform postprocessing of the image or palette data based on the final
+  // color type chosen
+
+  if (*colorType == PNG_COLOR_TYPE_PALETTE) {
+    // Create separate RGB and Alpha palettes and set the number of colors
+    *paletteEntries = num_colors;
+
+    // Create the RGB and alpha palettes
+    for (int idx = 0; idx < num_colors; idx++) {
+      col = colors[idx];
+      rgbPalette[idx].red = (png_byte)((col >> 24) & 0xff);
+      rgbPalette[idx].green = (png_byte)((col >> 16) & 0xff);
+      rgbPalette[idx].blue = (png_byte)((col >> 8) & 0xff);
+      alphaPalette[idx] = (png_byte)(col & 0xff);
+    }
+  } else if (*colorType == PNG_COLOR_TYPE_GRAY ||
+             *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    // If the image is gray or gray + alpha, compact the pixels into outRows
+    for (j = 0; j < h; j++) {
+      const png_byte* row = imageInfo.rows[j];
+      png_bytep out = outRows[j];
+      for (i = 0; i < w; i++) {
+        rr = *row++;
+        gg = *row++;
+        bb = *row++;
+        aa = *row++;
+
+        if (isGrayscale) {
+          *out++ = rr;
         } else {
-            *colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
+          *out++ = (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
         }
+        if (!isOpaque) {
+          *out++ = aa;
+        }
+      }
     }
-
-    // Perform postprocessing of the image or palette data based on the final
-    // color type chosen
-
-    if (*colorType == PNG_COLOR_TYPE_PALETTE) {
-        // Create separate RGB and Alpha palettes and set the number of colors
-        *paletteEntries = num_colors;
-
-        // Create the RGB and alpha palettes
-        for (int idx = 0; idx < num_colors; idx++) {
-            col = colors[idx];
-            rgbPalette[idx].red   = (png_byte) ((col >> 24) & 0xff);
-            rgbPalette[idx].green = (png_byte) ((col >> 16) & 0xff);
-            rgbPalette[idx].blue  = (png_byte) ((col >>  8) & 0xff);
-            alphaPalette[idx]     = (png_byte)  (col        & 0xff);
-        }
-    } else if (*colorType == PNG_COLOR_TYPE_GRAY || *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        // If the image is gray or gray + alpha, compact the pixels into outRows
-        for (j = 0; j < h; j++) {
-            const png_byte* row = imageInfo.rows[j];
-            png_bytep out = outRows[j];
-            for (i = 0; i < w; i++) {
-                rr = *row++;
-                gg = *row++;
-                bb = *row++;
-                aa = *row++;
-
-                if (isGrayscale) {
-                    *out++ = rr;
-                } else {
-                    *out++ = (png_byte) (rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
-                }
-                if (!isOpaque) {
-                    *out++ = aa;
-                }
-           }
-        }
-    }
+  }
 }
 
-static bool writePng(IDiagnostics* diag, png_structp writePtr, png_infop infoPtr, PngInfo* info,
-                     int grayScaleTolerance) {
-    if (setjmp(png_jmpbuf(writePtr))) {
-        diag->error(DiagMessage() << "failed to write png");
-        return false;
+static bool writePng(IDiagnostics* diag, png_structp writePtr,
+                     png_infop infoPtr, PngInfo* info, int grayScaleTolerance) {
+  if (setjmp(png_jmpbuf(writePtr))) {
+    diag->error(DiagMessage() << "failed to write png");
+    return false;
+  }
+
+  uint32_t width, height;
+  int colorType, bitDepth, interlaceType, compressionType;
+
+  png_unknown_chunk unknowns[3];
+  unknowns[0].data = nullptr;
+  unknowns[1].data = nullptr;
+  unknowns[2].data = nullptr;
+
+  png_bytepp outRows =
+      (png_bytepp)malloc((int)info->height * sizeof(png_bytep));
+  if (outRows == (png_bytepp)0) {
+    printf("Can't allocate output buffer!\n");
+    exit(1);
+  }
+  for (uint32_t i = 0; i < info->height; i++) {
+    outRows[i] = (png_bytep)malloc(2 * (int)info->width);
+    if (outRows[i] == (png_bytep)0) {
+      printf("Can't allocate output buffer!\n");
+      exit(1);
     }
+  }
 
-    uint32_t width, height;
-    int colorType, bitDepth, interlaceType, compressionType;
+  png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
 
-    png_unknown_chunk unknowns[3];
-    unknowns[0].data = nullptr;
-    unknowns[1].data = nullptr;
-    unknowns[2].data = nullptr;
+  if (kDebug) {
+    diag->note(DiagMessage() << "writing image: w = " << info->width
+                             << ", h = " << info->height);
+  }
 
-    png_bytepp outRows = (png_bytepp) malloc((int) info->height * sizeof(png_bytep));
-    if (outRows == (png_bytepp) 0) {
-        printf("Can't allocate output buffer!\n");
-        exit(1);
-    }
-    for (uint32_t i = 0; i < info->height; i++) {
-        outRows[i] = (png_bytep) malloc(2 * (int) info->width);
-        if (outRows[i] == (png_bytep) 0) {
-            printf("Can't allocate output buffer!\n");
-            exit(1);
-        }
-    }
+  png_color rgbPalette[256];
+  png_byte alphaPalette[256];
+  bool hasTransparency;
+  int paletteEntries;
 
-    png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
+  analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette,
+                &paletteEntries, &hasTransparency, &colorType, outRows);
 
-    if (kDebug) {
+  // If the image is a 9-patch, we need to preserve it as a ARGB file to make
+  // sure the pixels will not be pre-dithered/clamped until we decide they are
+  if (info->is9Patch &&
+      (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_GRAY ||
+       colorType == PNG_COLOR_TYPE_PALETTE)) {
+    colorType = PNG_COLOR_TYPE_RGB_ALPHA;
+  }
+
+  if (kDebug) {
+    switch (colorType) {
+      case PNG_COLOR_TYPE_PALETTE:
+        diag->note(DiagMessage() << "has " << paletteEntries << " colors"
+                                 << (hasTransparency ? " (with alpha)" : "")
+                                 << ", using PNG_COLOR_TYPE_PALLETTE");
+        break;
+      case PNG_COLOR_TYPE_GRAY:
         diag->note(DiagMessage()
-                   << "writing image: w = " << info->width
-                   << ", h = " << info->height);
+                   << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
+        break;
+      case PNG_COLOR_TYPE_GRAY_ALPHA:
+        diag->note(DiagMessage()
+                   << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
+        break;
+      case PNG_COLOR_TYPE_RGB:
+        diag->note(DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
+        break;
+      case PNG_COLOR_TYPE_RGB_ALPHA:
+        diag->note(DiagMessage()
+                   << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
+        break;
     }
+  }
 
-    png_color rgbPalette[256];
-    png_byte alphaPalette[256];
-    bool hasTransparency;
-    int paletteEntries;
+  png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType,
+               PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
+               PNG_FILTER_TYPE_DEFAULT);
 
-    analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette,
-                  &paletteEntries, &hasTransparency, &colorType, outRows);
-
-    // If the image is a 9-patch, we need to preserve it as a ARGB file to make
-    // sure the pixels will not be pre-dithered/clamped until we decide they are
-    if (info->is9Patch && (colorType == PNG_COLOR_TYPE_RGB ||
-            colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_PALETTE)) {
-        colorType = PNG_COLOR_TYPE_RGB_ALPHA;
+  if (colorType == PNG_COLOR_TYPE_PALETTE) {
+    png_set_PLTE(writePtr, infoPtr, rgbPalette, paletteEntries);
+    if (hasTransparency) {
+      png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries,
+                   (png_color_16p)0);
     }
+    png_set_filter(writePtr, 0, PNG_NO_FILTERS);
+  } else {
+    png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
+  }
 
+  if (info->is9Patch) {
+    int chunkCount = 2 + (info->haveLayoutBounds ? 1 : 0);
+    int pIndex = info->haveLayoutBounds ? 2 : 1;
+    int bIndex = 1;
+    int oIndex = 0;
+
+    // Chunks ordered thusly because older platforms depend on the base 9 patch
+    // data being last
+    png_bytep chunkNames = info->haveLayoutBounds
+                               ? (png_bytep) "npOl\0npLb\0npTc\0"
+                               : (png_bytep) "npOl\0npTc";
+
+    // base 9 patch data
     if (kDebug) {
-        switch (colorType) {
-        case PNG_COLOR_TYPE_PALETTE:
-            diag->note(DiagMessage()
-                       << "has " << paletteEntries
-                       << " colors" << (hasTransparency ? " (with alpha)" : "")
-                       << ", using PNG_COLOR_TYPE_PALLETTE");
-            break;
-        case PNG_COLOR_TYPE_GRAY:
-            diag->note(DiagMessage() << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
-            break;
-        case PNG_COLOR_TYPE_GRAY_ALPHA:
-            diag->note(DiagMessage() << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
-            break;
-        case PNG_COLOR_TYPE_RGB:
-            diag->note(DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
-            break;
-        case PNG_COLOR_TYPE_RGB_ALPHA:
-            diag->note(DiagMessage() << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
-            break;
-        }
+      diag->note(DiagMessage() << "adding 9-patch info..");
+    }
+    strcpy((char*)unknowns[pIndex].name, "npTc");
+    unknowns[pIndex].data = (png_byte*)info->serialize9Patch();
+    unknowns[pIndex].size = info->info9Patch.serializedSize();
+    // TODO: remove the check below when everything works
+    checkNinePatchSerialization(&info->info9Patch, unknowns[pIndex].data);
+
+    // automatically generated 9 patch outline data
+    int chunkSize = sizeof(png_uint_32) * 6;
+    strcpy((char*)unknowns[oIndex].name, "npOl");
+    unknowns[oIndex].data = (png_byte*)calloc(chunkSize, 1);
+    png_byte outputData[chunkSize];
+    memcpy(&outputData, &info->outlineInsetsLeft, 4 * sizeof(png_uint_32));
+    ((float*)outputData)[4] = info->outlineRadius;
+    ((png_uint_32*)outputData)[5] = info->outlineAlpha;
+    memcpy(unknowns[oIndex].data, &outputData, chunkSize);
+    unknowns[oIndex].size = chunkSize;
+
+    // optional optical inset / layout bounds data
+    if (info->haveLayoutBounds) {
+      int chunkSize = sizeof(png_uint_32) * 4;
+      strcpy((char*)unknowns[bIndex].name, "npLb");
+      unknowns[bIndex].data = (png_byte*)calloc(chunkSize, 1);
+      memcpy(unknowns[bIndex].data, &info->layoutBoundsLeft, chunkSize);
+      unknowns[bIndex].size = chunkSize;
     }
 
-    png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType,
-                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
-    if (colorType == PNG_COLOR_TYPE_PALETTE) {
-        png_set_PLTE(writePtr, infoPtr, rgbPalette, paletteEntries);
-        if (hasTransparency) {
-            png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries, (png_color_16p) 0);
-        }
-        png_set_filter(writePtr, 0, PNG_NO_FILTERS);
-    } else {
-        png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
+    for (int i = 0; i < chunkCount; i++) {
+      unknowns[i].location = PNG_HAVE_PLTE;
     }
-
-    if (info->is9Patch) {
-        int chunkCount = 2 + (info->haveLayoutBounds ? 1 : 0);
-        int pIndex = info->haveLayoutBounds ? 2 : 1;
-        int bIndex = 1;
-        int oIndex = 0;
-
-        // Chunks ordered thusly because older platforms depend on the base 9 patch data being last
-        png_bytep chunkNames = info->haveLayoutBounds
-                ? (png_bytep)"npOl\0npLb\0npTc\0"
-                : (png_bytep)"npOl\0npTc";
-
-        // base 9 patch data
-        if (kDebug) {
-            diag->note(DiagMessage() << "adding 9-patch info..");
-        }
-        strcpy((char*)unknowns[pIndex].name, "npTc");
-        unknowns[pIndex].data = (png_byte*) info->serialize9Patch();
-        unknowns[pIndex].size = info->info9Patch.serializedSize();
-        // TODO: remove the check below when everything works
-        checkNinePatchSerialization(&info->info9Patch, unknowns[pIndex].data);
-
-        // automatically generated 9 patch outline data
-        int chunkSize = sizeof(png_uint_32) * 6;
-        strcpy((char*)unknowns[oIndex].name, "npOl");
-        unknowns[oIndex].data = (png_byte*) calloc(chunkSize, 1);
-        png_byte outputData[chunkSize];
-        memcpy(&outputData, &info->outlineInsetsLeft, 4 * sizeof(png_uint_32));
-        ((float*) outputData)[4] = info->outlineRadius;
-        ((png_uint_32*) outputData)[5] = info->outlineAlpha;
-        memcpy(unknowns[oIndex].data, &outputData, chunkSize);
-        unknowns[oIndex].size = chunkSize;
-
-        // optional optical inset / layout bounds data
-        if (info->haveLayoutBounds) {
-            int chunkSize = sizeof(png_uint_32) * 4;
-            strcpy((char*)unknowns[bIndex].name, "npLb");
-            unknowns[bIndex].data = (png_byte*) calloc(chunkSize, 1);
-            memcpy(unknowns[bIndex].data, &info->layoutBoundsLeft, chunkSize);
-            unknowns[bIndex].size = chunkSize;
-        }
-
-        for (int i = 0; i < chunkCount; i++) {
-            unknowns[i].location = PNG_HAVE_PLTE;
-        }
-        png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS,
-                                    chunkNames, chunkCount);
-        png_set_unknown_chunks(writePtr, infoPtr, unknowns, chunkCount);
+    png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, chunkNames,
+                                chunkCount);
+    png_set_unknown_chunks(writePtr, infoPtr, unknowns, chunkCount);
 
 #if PNG_LIBPNG_VER < 10600
-        // Deal with unknown chunk location bug in 1.5.x and earlier.
-        png_set_unknown_chunk_location(writePtr, infoPtr, 0, PNG_HAVE_PLTE);
-        if (info->haveLayoutBounds) {
-            png_set_unknown_chunk_location(writePtr, infoPtr, 1, PNG_HAVE_PLTE);
-        }
+    // Deal with unknown chunk location bug in 1.5.x and earlier.
+    png_set_unknown_chunk_location(writePtr, infoPtr, 0, PNG_HAVE_PLTE);
+    if (info->haveLayoutBounds) {
+      png_set_unknown_chunk_location(writePtr, infoPtr, 1, PNG_HAVE_PLTE);
+    }
 #endif
+  }
+
+  png_write_info(writePtr, infoPtr);
+
+  png_bytepp rows;
+  if (colorType == PNG_COLOR_TYPE_RGB ||
+      colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
+    if (colorType == PNG_COLOR_TYPE_RGB) {
+      png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
     }
+    rows = info->rows.data();
+  } else {
+    rows = outRows;
+  }
+  png_write_image(writePtr, rows);
 
-    png_write_info(writePtr, infoPtr);
+  if (kDebug) {
+    printf("Final image data:\n");
+    // dump_image(info->width, info->height, rows, colorType);
+  }
 
-    png_bytepp rows;
-    if (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
-        if (colorType == PNG_COLOR_TYPE_RGB) {
-            png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
-        }
-        rows = info->rows.data();
-    } else {
-        rows = outRows;
-    }
-    png_write_image(writePtr, rows);
+  png_write_end(writePtr, infoPtr);
 
-    if (kDebug) {
-        printf("Final image data:\n");
-        //dump_image(info->width, info->height, rows, colorType);
-    }
+  for (uint32_t i = 0; i < info->height; i++) {
+    free(outRows[i]);
+  }
+  free(outRows);
+  free(unknowns[0].data);
+  free(unknowns[1].data);
+  free(unknowns[2].data);
 
-    png_write_end(writePtr, infoPtr);
+  png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType,
+               &interlaceType, &compressionType, nullptr);
 
-    for (uint32_t i = 0; i < info->height; i++) {
-        free(outRows[i]);
-    }
-    free(outRows);
-    free(unknowns[0].data);
-    free(unknowns[1].data);
-    free(unknowns[2].data);
-
-    png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType, &interlaceType,
-                 &compressionType, nullptr);
-
-    if (kDebug) {
-        diag->note(DiagMessage()
-                   << "image written: w = " << width << ", h = " << height
-                   << ", d = " << bitDepth << ", colors = " << colorType
-                   << ", inter = " << interlaceType << ", comp = " << compressionType);
-    }
-    return true;
+  if (kDebug) {
+    diag->note(DiagMessage() << "image written: w = " << width
+                             << ", h = " << height << ", d = " << bitDepth
+                             << ", colors = " << colorType
+                             << ", inter = " << interlaceType
+                             << ", comp = " << compressionType);
+  }
+  return true;
 }
 
 constexpr uint32_t kColorWhite = 0xffffffffu;
 constexpr uint32_t kColorTick = 0xff000000u;
 constexpr uint32_t kColorLayoutBoundsTick = 0xff0000ffu;
 
-enum class TickType {
-    kNone,
-    kTick,
-    kLayoutBounds,
-    kBoth
-};
+enum class TickType { kNone, kTick, kLayoutBounds, kBoth };
 
 static TickType tickType(png_bytep p, bool transparent, const char** outError) {
-    png_uint_32 color = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
+  png_uint_32 color = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
 
-    if (transparent) {
-        if (p[3] == 0) {
-            return TickType::kNone;
-        }
-        if (color == kColorLayoutBoundsTick) {
-            return TickType::kLayoutBounds;
-        }
-        if (color == kColorTick) {
-            return TickType::kTick;
-        }
-
-        // Error cases
-        if (p[3] != 0xff) {
-            *outError = "Frame pixels must be either solid or transparent "
-                        "(not intermediate alphas)";
-            return TickType::kNone;
-        }
-
-        if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
-            *outError = "Ticks in transparent frame must be black or red";
-        }
-        return TickType::kTick;
-    }
-
-    if (p[3] != 0xFF) {
-        *outError = "White frame must be a solid color (no alpha)";
-    }
-    if (color == kColorWhite) {
-        return TickType::kNone;
-    }
-    if (color == kColorTick) {
-        return TickType::kTick;
+  if (transparent) {
+    if (p[3] == 0) {
+      return TickType::kNone;
     }
     if (color == kColorLayoutBoundsTick) {
-        return TickType::kLayoutBounds;
+      return TickType::kLayoutBounds;
+    }
+    if (color == kColorTick) {
+      return TickType::kTick;
+    }
+
+    // Error cases
+    if (p[3] != 0xff) {
+      *outError =
+          "Frame pixels must be either solid or transparent "
+          "(not intermediate alphas)";
+      return TickType::kNone;
     }
 
     if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
-        *outError = "Ticks in white frame must be black or red";
-        return TickType::kNone;
+      *outError = "Ticks in transparent frame must be black or red";
     }
     return TickType::kTick;
+  }
+
+  if (p[3] != 0xFF) {
+    *outError = "White frame must be a solid color (no alpha)";
+  }
+  if (color == kColorWhite) {
+    return TickType::kNone;
+  }
+  if (color == kColorTick) {
+    return TickType::kTick;
+  }
+  if (color == kColorLayoutBoundsTick) {
+    return TickType::kLayoutBounds;
+  }
+
+  if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
+    *outError = "Ticks in white frame must be black or red";
+    return TickType::kNone;
+  }
+  return TickType::kTick;
 }
 
-enum class TickState {
-    kStart,
-    kInside1,
-    kOutside1
-};
+enum class TickState { kStart, kInside1, kOutside1 };
 
-static bool getHorizontalTicks(png_bytep row, int width, bool transparent, bool required,
-                               int32_t* outLeft, int32_t* outRight, const char** outError,
+static bool getHorizontalTicks(png_bytep row, int width, bool transparent,
+                               bool required, int32_t* outLeft,
+                               int32_t* outRight, const char** outError,
                                uint8_t* outDivs, bool multipleAllowed) {
-    *outLeft = *outRight = -1;
-    TickState state = TickState::kStart;
-    bool found = false;
+  *outLeft = *outRight = -1;
+  TickState state = TickState::kStart;
+  bool found = false;
 
-    for (int i = 1; i < width - 1; i++) {
-        if (tickType(row+i*4, transparent, outError) == TickType::kTick) {
-            if (state == TickState::kStart ||
-                (state == TickState::kOutside1 && multipleAllowed)) {
-                *outLeft = i-1;
-                *outRight = width-2;
-                found = true;
-                if (outDivs != NULL) {
-                    *outDivs += 2;
-                }
-                state = TickState::kInside1;
-            } else if (state == TickState::kOutside1) {
-                *outError = "Can't have more than one marked region along edge";
-                *outLeft = i;
-                return false;
-            }
-        } else if (!*outError) {
-            if (state == TickState::kInside1) {
-                // We're done with this div.  Move on to the next.
-                *outRight = i-1;
-                outRight += 2;
-                outLeft += 2;
-                state = TickState::kOutside1;
-            }
-        } else {
-            *outLeft = i;
-            return false;
+  for (int i = 1; i < width - 1; i++) {
+    if (tickType(row + i * 4, transparent, outError) == TickType::kTick) {
+      if (state == TickState::kStart ||
+          (state == TickState::kOutside1 && multipleAllowed)) {
+        *outLeft = i - 1;
+        *outRight = width - 2;
+        found = true;
+        if (outDivs != NULL) {
+          *outDivs += 2;
         }
-    }
-
-    if (required && !found) {
-        *outError = "No marked region found along edge";
-        *outLeft = -1;
+        state = TickState::kInside1;
+      } else if (state == TickState::kOutside1) {
+        *outError = "Can't have more than one marked region along edge";
+        *outLeft = i;
         return false;
+      }
+    } else if (!*outError) {
+      if (state == TickState::kInside1) {
+        // We're done with this div.  Move on to the next.
+        *outRight = i - 1;
+        outRight += 2;
+        outLeft += 2;
+        state = TickState::kOutside1;
+      }
+    } else {
+      *outLeft = i;
+      return false;
     }
-    return true;
+  }
+
+  if (required && !found) {
+    *outError = "No marked region found along edge";
+    *outLeft = -1;
+    return false;
+  }
+  return true;
 }
 
-static bool getVerticalTicks(png_bytepp rows, int offset, int height, bool transparent,
-                             bool required, int32_t* outTop, int32_t* outBottom,
-                             const char** outError, uint8_t* outDivs, bool multipleAllowed) {
-    *outTop = *outBottom = -1;
-    TickState state = TickState::kStart;
-    bool found = false;
+static bool getVerticalTicks(png_bytepp rows, int offset, int height,
+                             bool transparent, bool required, int32_t* outTop,
+                             int32_t* outBottom, const char** outError,
+                             uint8_t* outDivs, bool multipleAllowed) {
+  *outTop = *outBottom = -1;
+  TickState state = TickState::kStart;
+  bool found = false;
 
-    for (int i = 1; i < height - 1; i++) {
-        if (tickType(rows[i]+offset, transparent, outError) == TickType::kTick) {
-            if (state == TickState::kStart ||
-                (state == TickState::kOutside1 && multipleAllowed)) {
-                *outTop = i-1;
-                *outBottom = height-2;
-                found = true;
-                if (outDivs != NULL) {
-                    *outDivs += 2;
-                }
-                state = TickState::kInside1;
-            } else if (state == TickState::kOutside1) {
-                *outError = "Can't have more than one marked region along edge";
-                *outTop = i;
-                return false;
-            }
-        } else if (!*outError) {
-            if (state == TickState::kInside1) {
-                // We're done with this div.  Move on to the next.
-                *outBottom = i-1;
-                outTop += 2;
-                outBottom += 2;
-                state = TickState::kOutside1;
-            }
-        } else {
-            *outTop = i;
-            return false;
+  for (int i = 1; i < height - 1; i++) {
+    if (tickType(rows[i] + offset, transparent, outError) == TickType::kTick) {
+      if (state == TickState::kStart ||
+          (state == TickState::kOutside1 && multipleAllowed)) {
+        *outTop = i - 1;
+        *outBottom = height - 2;
+        found = true;
+        if (outDivs != NULL) {
+          *outDivs += 2;
         }
-    }
-
-    if (required && !found) {
-        *outError = "No marked region found along edge";
-        *outTop = -1;
+        state = TickState::kInside1;
+      } else if (state == TickState::kOutside1) {
+        *outError = "Can't have more than one marked region along edge";
+        *outTop = i;
         return false;
+      }
+    } else if (!*outError) {
+      if (state == TickState::kInside1) {
+        // We're done with this div.  Move on to the next.
+        *outBottom = i - 1;
+        outTop += 2;
+        outBottom += 2;
+        state = TickState::kOutside1;
+      }
+    } else {
+      *outTop = i;
+      return false;
     }
-    return true;
+  }
+
+  if (required && !found) {
+    *outError = "No marked region found along edge";
+    *outTop = -1;
+    return false;
+  }
+  return true;
 }
 
-static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width, bool transparent,
-                                           bool /* required */, int32_t* outLeft,
-                                           int32_t* outRight, const char** outError) {
-    *outLeft = *outRight = 0;
+static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width,
+                                           bool transparent,
+                                           bool /* required */,
+                                           int32_t* outLeft, int32_t* outRight,
+                                           const char** outError) {
+  *outLeft = *outRight = 0;
 
-    // Look for left tick
-    if (tickType(row + 4, transparent, outError) == TickType::kLayoutBounds) {
-        // Starting with a layout padding tick
-        int i = 1;
-        while (i < width - 1) {
-            (*outLeft)++;
-            i++;
-            if (tickType(row + i * 4, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for left tick
+  if (tickType(row + 4, transparent, outError) == TickType::kLayoutBounds) {
+    // Starting with a layout padding tick
+    int i = 1;
+    while (i < width - 1) {
+      (*outLeft)++;
+      i++;
+      if (tickType(row + i * 4, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
+  }
 
-    // Look for right tick
-    if (tickType(row + (width - 2) * 4, transparent, outError) == TickType::kLayoutBounds) {
-        // Ending with a layout padding tick
-        int i = width - 2;
-        while (i > 1) {
-            (*outRight)++;
-            i--;
-            if (tickType(row+i*4, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for right tick
+  if (tickType(row + (width - 2) * 4, transparent, outError) ==
+      TickType::kLayoutBounds) {
+    // Ending with a layout padding tick
+    int i = width - 2;
+    while (i > 1) {
+      (*outRight)++;
+      i--;
+      if (tickType(row + i * 4, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset, int height, bool transparent,
-                                         bool /* required */, int32_t* outTop, int32_t* outBottom,
+static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset,
+                                         int height, bool transparent,
+                                         bool /* required */, int32_t* outTop,
+                                         int32_t* outBottom,
                                          const char** outError) {
-    *outTop = *outBottom = 0;
+  *outTop = *outBottom = 0;
 
-    // Look for top tick
-    if (tickType(rows[1] + offset, transparent, outError) == TickType::kLayoutBounds) {
-        // Starting with a layout padding tick
-        int i = 1;
-        while (i < height - 1) {
-            (*outTop)++;
-            i++;
-            if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for top tick
+  if (tickType(rows[1] + offset, transparent, outError) ==
+      TickType::kLayoutBounds) {
+    // Starting with a layout padding tick
+    int i = 1;
+    while (i < height - 1) {
+      (*outTop)++;
+      i++;
+      if (tickType(rows[i] + offset, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
+  }
 
-    // Look for bottom tick
-    if (tickType(rows[height - 2] + offset, transparent, outError) == TickType::kLayoutBounds) {
-        // Ending with a layout padding tick
-        int i = height - 2;
-        while (i > 1) {
-            (*outBottom)++;
-            i--;
-            if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for bottom tick
+  if (tickType(rows[height - 2] + offset, transparent, outError) ==
+      TickType::kLayoutBounds) {
+    // Ending with a layout padding tick
+    int i = height - 2;
+    while (i > 1) {
+      (*outBottom)++;
+      i--;
+      if (tickType(rows[i] + offset, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX, int endY,
-                           int dX, int dY, int* outInset) {
-    uint8_t maxOpacity = 0;
-    int inset = 0;
-    *outInset = 0;
-    for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) {
-        png_byte* color = rows[y] + x * 4;
-        uint8_t opacity = color[3];
-        if (opacity > maxOpacity) {
-            maxOpacity = opacity;
-            *outInset = inset;
-        }
-        if (opacity == 0xff) return;
+static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX,
+                           int endY, int dX, int dY, int* outInset) {
+  uint8_t maxOpacity = 0;
+  int inset = 0;
+  *outInset = 0;
+  for (int x = startX, y = startY; x != endX && y != endY;
+       x += dX, y += dY, inset++) {
+    png_byte* color = rows[y] + x * 4;
+    uint8_t opacity = color[3];
+    if (opacity > maxOpacity) {
+      maxOpacity = opacity;
+      *outInset = inset;
     }
+    if (opacity == 0xff) return;
+  }
 }
 
 static uint8_t maxAlphaOverRow(png_bytep row, int startX, int endX) {
-    uint8_t maxAlpha = 0;
-    for (int x = startX; x < endX; x++) {
-        uint8_t alpha = (row + x * 4)[3];
-        if (alpha > maxAlpha) maxAlpha = alpha;
-    }
-    return maxAlpha;
+  uint8_t maxAlpha = 0;
+  for (int x = startX; x < endX; x++) {
+    uint8_t alpha = (row + x * 4)[3];
+    if (alpha > maxAlpha) maxAlpha = alpha;
+  }
+  return maxAlpha;
 }
 
-static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY, int endY) {
-    uint8_t maxAlpha = 0;
-    for (int y = startY; y < endY; y++) {
-        uint8_t alpha = (rows[y] + offsetX * 4)[3];
-        if (alpha > maxAlpha) maxAlpha = alpha;
-    }
-    return maxAlpha;
+static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY,
+                               int endY) {
+  uint8_t maxAlpha = 0;
+  for (int y = startY; y < endY; y++) {
+    uint8_t alpha = (rows[y] + offsetX * 4)[3];
+    if (alpha > maxAlpha) maxAlpha = alpha;
+  }
+  return maxAlpha;
 }
 
 static void getOutline(PngInfo* image) {
-    int midX = image->width / 2;
-    int midY = image->height / 2;
-    int endX = image->width - 2;
-    int endY = image->height - 2;
+  int midX = image->width / 2;
+  int midY = image->height / 2;
+  int endX = image->width - 2;
+  int endY = image->height - 2;
 
-    // find left and right extent of nine patch content on center row
-    if (image->width > 4) {
-        findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0, &image->outlineInsetsLeft);
-        findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0,
-                       &image->outlineInsetsRight);
-    } else {
-        image->outlineInsetsLeft = 0;
-        image->outlineInsetsRight = 0;
-    }
+  // find left and right extent of nine patch content on center row
+  if (image->width > 4) {
+    findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0,
+                   &image->outlineInsetsLeft);
+    findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0,
+                   &image->outlineInsetsRight);
+  } else {
+    image->outlineInsetsLeft = 0;
+    image->outlineInsetsRight = 0;
+  }
 
-    // find top and bottom extent of nine patch content on center column
-    if (image->height > 4) {
-        findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1, &image->outlineInsetsTop);
-        findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1,
-                       &image->outlineInsetsBottom);
-    } else {
-        image->outlineInsetsTop = 0;
-        image->outlineInsetsBottom = 0;
-    }
+  // find top and bottom extent of nine patch content on center column
+  if (image->height > 4) {
+    findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1,
+                   &image->outlineInsetsTop);
+    findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1,
+                   &image->outlineInsetsBottom);
+  } else {
+    image->outlineInsetsTop = 0;
+    image->outlineInsetsBottom = 0;
+  }
 
-    int innerStartX = 1 + image->outlineInsetsLeft;
-    int innerStartY = 1 + image->outlineInsetsTop;
-    int innerEndX = endX - image->outlineInsetsRight;
-    int innerEndY = endY - image->outlineInsetsBottom;
-    int innerMidX = (innerEndX + innerStartX) / 2;
-    int innerMidY = (innerEndY + innerStartY) / 2;
+  int innerStartX = 1 + image->outlineInsetsLeft;
+  int innerStartY = 1 + image->outlineInsetsTop;
+  int innerEndX = endX - image->outlineInsetsRight;
+  int innerEndY = endY - image->outlineInsetsBottom;
+  int innerMidX = (innerEndX + innerStartX) / 2;
+  int innerMidY = (innerEndY + innerStartY) / 2;
 
-    // assuming the image is a round rect, compute the radius by marching
-    // diagonally from the top left corner towards the center
-    image->outlineAlpha = std::max(
-            maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
-            maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
+  // assuming the image is a round rect, compute the radius by marching
+  // diagonally from the top left corner towards the center
+  image->outlineAlpha = std::max(
+      maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
+      maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
 
-    int diagonalInset = 0;
-    findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
-                   &diagonalInset);
+  int diagonalInset = 0;
+  findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX,
+                 innerMidY, 1, 1, &diagonalInset);
 
-    /* Determine source radius based upon inset:
-     *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
-     *     sqrt(2) * r = sqrt(2) * i + r
-     *     (sqrt(2) - 1) * r = sqrt(2) * i
-     *     r = sqrt(2) / (sqrt(2) - 1) * i
-     */
-    image->outlineRadius = 3.4142f * diagonalInset;
+  /* Determine source radius based upon inset:
+   *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
+   *     sqrt(2) * r = sqrt(2) * i + r
+   *     (sqrt(2) - 1) * r = sqrt(2) * i
+   *     r = sqrt(2) / (sqrt(2) - 1) * i
+   */
+  image->outlineRadius = 3.4142f * diagonalInset;
 
-    if (kDebug) {
-        printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
-                image->outlineInsetsLeft,
-                image->outlineInsetsTop,
-                image->outlineInsetsRight,
-                image->outlineInsetsBottom,
-                image->outlineRadius,
-                image->outlineAlpha);
-    }
+  if (kDebug) {
+    printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
+           image->outlineInsetsLeft, image->outlineInsetsTop,
+           image->outlineInsetsRight, image->outlineInsetsBottom,
+           image->outlineRadius, image->outlineAlpha);
+  }
 }
 
-static uint32_t getColor(png_bytepp rows, int left, int top, int right, int bottom) {
-    png_bytep color = rows[top] + left*4;
+static uint32_t getColor(png_bytepp rows, int left, int top, int right,
+                         int bottom) {
+  png_bytep color = rows[top] + left * 4;
 
-    if (left > right || top > bottom) {
-        return android::Res_png_9patch::TRANSPARENT_COLOR;
-    }
+  if (left > right || top > bottom) {
+    return android::Res_png_9patch::TRANSPARENT_COLOR;
+  }
 
-    while (top <= bottom) {
-        for (int i = left; i <= right; i++) {
-            png_bytep p = rows[top]+i*4;
-            if (color[3] == 0) {
-                if (p[3] != 0) {
-                    return android::Res_png_9patch::NO_COLOR;
-                }
-            } else if (p[0] != color[0] || p[1] != color[1] ||
-                    p[2] != color[2] || p[3] != color[3]) {
-                return android::Res_png_9patch::NO_COLOR;
-            }
+  while (top <= bottom) {
+    for (int i = left; i <= right; i++) {
+      png_bytep p = rows[top] + i * 4;
+      if (color[3] == 0) {
+        if (p[3] != 0) {
+          return android::Res_png_9patch::NO_COLOR;
         }
-        top++;
+      } else if (p[0] != color[0] || p[1] != color[1] || p[2] != color[2] ||
+                 p[3] != color[3]) {
+        return android::Res_png_9patch::NO_COLOR;
+      }
     }
+    top++;
+  }
 
-    if (color[3] == 0) {
-        return android::Res_png_9patch::TRANSPARENT_COLOR;
-    }
-    return (color[3]<<24) | (color[0]<<16) | (color[1]<<8) | color[2];
+  if (color[3] == 0) {
+    return android::Res_png_9patch::TRANSPARENT_COLOR;
+  }
+  return (color[3] << 24) | (color[0] << 16) | (color[1] << 8) | color[2];
 }
 
 static bool do9Patch(PngInfo* image, std::string* outError) {
-    image->is9Patch = true;
+  image->is9Patch = true;
 
-    int W = image->width;
-    int H = image->height;
-    int i, j;
+  int W = image->width;
+  int H = image->height;
+  int i, j;
 
-    const int maxSizeXDivs = W * sizeof(int32_t);
-    const int maxSizeYDivs = H * sizeof(int32_t);
-    int32_t* xDivs = image->xDivs = new int32_t[W];
-    int32_t* yDivs = image->yDivs = new int32_t[H];
-    uint8_t numXDivs = 0;
-    uint8_t numYDivs = 0;
+  const int maxSizeXDivs = W * sizeof(int32_t);
+  const int maxSizeYDivs = H * sizeof(int32_t);
+  int32_t* xDivs = image->xDivs = new int32_t[W];
+  int32_t* yDivs = image->yDivs = new int32_t[H];
+  uint8_t numXDivs = 0;
+  uint8_t numYDivs = 0;
 
-    int8_t numColors;
-    int numRows;
-    int numCols;
-    int top;
-    int left;
-    int right;
-    int bottom;
-    memset(xDivs, -1, maxSizeXDivs);
-    memset(yDivs, -1, maxSizeYDivs);
-    image->info9Patch.paddingLeft = image->info9Patch.paddingRight = -1;
-    image->info9Patch.paddingTop = image->info9Patch.paddingBottom = -1;
-    image->layoutBoundsLeft = image->layoutBoundsRight = 0;
-    image->layoutBoundsTop = image->layoutBoundsBottom = 0;
+  int8_t numColors;
+  int numRows;
+  int numCols;
+  int top;
+  int left;
+  int right;
+  int bottom;
+  memset(xDivs, -1, maxSizeXDivs);
+  memset(yDivs, -1, maxSizeYDivs);
+  image->info9Patch.paddingLeft = image->info9Patch.paddingRight = -1;
+  image->info9Patch.paddingTop = image->info9Patch.paddingBottom = -1;
+  image->layoutBoundsLeft = image->layoutBoundsRight = 0;
+  image->layoutBoundsTop = image->layoutBoundsBottom = 0;
 
-    png_bytep p = image->rows[0];
-    bool transparent = p[3] == 0;
-    bool hasColor = false;
+  png_bytep p = image->rows[0];
+  bool transparent = p[3] == 0;
+  bool hasColor = false;
 
-    const char* errorMsg = nullptr;
-    int errorPixel = -1;
-    const char* errorEdge = nullptr;
+  const char* errorMsg = nullptr;
+  int errorPixel = -1;
+  const char* errorEdge = nullptr;
 
-    int colorIndex = 0;
-    std::vector<png_bytep> newRows;
+  int colorIndex = 0;
+  std::vector<png_bytep> newRows;
 
-    // Validate size...
-    if (W < 3 || H < 3) {
-        errorMsg = "Image must be at least 3x3 (1x1 without frame) pixels";
-        goto getout;
+  // Validate size...
+  if (W < 3 || H < 3) {
+    errorMsg = "Image must be at least 3x3 (1x1 without frame) pixels";
+    goto getout;
+  }
+
+  // Validate frame...
+  if (!transparent &&
+      (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
+    errorMsg = "Must have one-pixel frame that is either transparent or white";
+    goto getout;
+  }
+
+  // Find left and right of sizing areas...
+  if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1],
+                          &errorMsg, &numXDivs, true)) {
+    errorPixel = xDivs[0];
+    errorEdge = "top";
+    goto getout;
+  }
+
+  // Find top and bottom of sizing areas...
+  if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0],
+                        &yDivs[1], &errorMsg, &numYDivs, true)) {
+    errorPixel = yDivs[0];
+    errorEdge = "left";
+    goto getout;
+  }
+
+  // Copy patch size data into image...
+  image->info9Patch.numXDivs = numXDivs;
+  image->info9Patch.numYDivs = numYDivs;
+
+  // Find left and right of padding area...
+  if (!getHorizontalTicks(image->rows[H - 1], W, transparent, false,
+                          &image->info9Patch.paddingLeft,
+                          &image->info9Patch.paddingRight, &errorMsg, nullptr,
+                          false)) {
+    errorPixel = image->info9Patch.paddingLeft;
+    errorEdge = "bottom";
+    goto getout;
+  }
+
+  // Find top and bottom of padding area...
+  if (!getVerticalTicks(image->rows.data(), (W - 1) * 4, H, transparent, false,
+                        &image->info9Patch.paddingTop,
+                        &image->info9Patch.paddingBottom, &errorMsg, nullptr,
+                        false)) {
+    errorPixel = image->info9Patch.paddingTop;
+    errorEdge = "right";
+    goto getout;
+  }
+
+  // Find left and right of layout padding...
+  getHorizontalLayoutBoundsTicks(image->rows[H - 1], W, transparent, false,
+                                 &image->layoutBoundsLeft,
+                                 &image->layoutBoundsRight, &errorMsg);
+
+  getVerticalLayoutBoundsTicks(image->rows.data(), (W - 1) * 4, H, transparent,
+                               false, &image->layoutBoundsTop,
+                               &image->layoutBoundsBottom, &errorMsg);
+
+  image->haveLayoutBounds =
+      image->layoutBoundsLeft != 0 || image->layoutBoundsRight != 0 ||
+      image->layoutBoundsTop != 0 || image->layoutBoundsBottom != 0;
+
+  if (image->haveLayoutBounds) {
+    if (kDebug) {
+      printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft,
+             image->layoutBoundsTop, image->layoutBoundsRight,
+             image->layoutBoundsBottom);
     }
+  }
 
-    // Validate frame...
-    if (!transparent &&
-            (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
-        errorMsg = "Must have one-pixel frame that is either transparent or white";
-        goto getout;
-    }
+  // use opacity of pixels to estimate the round rect outline
+  getOutline(image);
 
-    // Find left and right of sizing areas...
-    if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1], &errorMsg, &numXDivs,
-                            true)) {
-        errorPixel = xDivs[0];
-        errorEdge = "top";
-        goto getout;
-    }
+  // If padding is not yet specified, take values from size.
+  if (image->info9Patch.paddingLeft < 0) {
+    image->info9Patch.paddingLeft = xDivs[0];
+    image->info9Patch.paddingRight = W - 2 - xDivs[1];
+  } else {
+    // Adjust value to be correct!
+    image->info9Patch.paddingRight = W - 2 - image->info9Patch.paddingRight;
+  }
+  if (image->info9Patch.paddingTop < 0) {
+    image->info9Patch.paddingTop = yDivs[0];
+    image->info9Patch.paddingBottom = H - 2 - yDivs[1];
+  } else {
+    // Adjust value to be correct!
+    image->info9Patch.paddingBottom = H - 2 - image->info9Patch.paddingBottom;
+  }
 
-    // Find top and bottom of sizing areas...
-    if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0], &yDivs[1],
-                          &errorMsg, &numYDivs, true)) {
-        errorPixel = yDivs[0];
-        errorEdge = "left";
-        goto getout;
-    }
+  /*    if (kDebug) {
+          printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
+                  xDivs[0], xDivs[1],
+                  yDivs[0], yDivs[1]);
+          printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
+                  image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
+                  image->info9Patch.paddingTop,
+     image->info9Patch.paddingBottom);
+      }*/
 
-    // Copy patch size data into image...
-    image->info9Patch.numXDivs = numXDivs;
-    image->info9Patch.numYDivs = numYDivs;
+  // Remove frame from image.
+  newRows.resize(H - 2);
+  for (i = 0; i < H - 2; i++) {
+    newRows[i] = image->rows[i + 1];
+    memmove(newRows[i], newRows[i] + 4, (W - 2) * 4);
+  }
+  image->rows.swap(newRows);
 
-    // Find left and right of padding area...
-    if (!getHorizontalTicks(image->rows[H-1], W, transparent, false,
-                            &image->info9Patch.paddingLeft, &image->info9Patch.paddingRight,
-                            &errorMsg, nullptr, false)) {
-        errorPixel = image->info9Patch.paddingLeft;
-        errorEdge = "bottom";
-        goto getout;
-    }
+  image->width -= 2;
+  W = image->width;
+  image->height -= 2;
+  H = image->height;
 
-    // Find top and bottom of padding area...
-    if (!getVerticalTicks(image->rows.data(), (W-1)*4, H, transparent, false,
-                          &image->info9Patch.paddingTop, &image->info9Patch.paddingBottom,
-                          &errorMsg, nullptr, false)) {
-        errorPixel = image->info9Patch.paddingTop;
-        errorEdge = "right";
-        goto getout;
-    }
+  // Figure out the number of rows and columns in the N-patch
+  numCols = numXDivs + 1;
+  if (xDivs[0] == 0) {  // Column 1 is strechable
+    numCols--;
+  }
+  if (xDivs[numXDivs - 1] == W) {
+    numCols--;
+  }
+  numRows = numYDivs + 1;
+  if (yDivs[0] == 0) {  // Row 1 is strechable
+    numRows--;
+  }
+  if (yDivs[numYDivs - 1] == H) {
+    numRows--;
+  }
 
-    // Find left and right of layout padding...
-    getHorizontalLayoutBoundsTicks(image->rows[H-1], W, transparent, false,
-                                   &image->layoutBoundsLeft, &image->layoutBoundsRight, &errorMsg);
+  // Make sure the amount of rows and columns will fit in the number of
+  // colors we can use in the 9-patch format.
+  if (numRows * numCols > 0x7F) {
+    errorMsg = "Too many rows and columns in 9-patch perimeter";
+    goto getout;
+  }
 
-    getVerticalLayoutBoundsTicks(image->rows.data(), (W-1)*4, H, transparent, false,
-                                 &image->layoutBoundsTop, &image->layoutBoundsBottom, &errorMsg);
+  numColors = numRows * numCols;
+  image->info9Patch.numColors = numColors;
+  image->colors.resize(numColors);
 
-    image->haveLayoutBounds = image->layoutBoundsLeft != 0
-                               || image->layoutBoundsRight != 0
-                               || image->layoutBoundsTop != 0
-                               || image->layoutBoundsBottom != 0;
+  // Fill in color information for each patch.
 
-    if (image->haveLayoutBounds) {
-        if (kDebug) {
-            printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft, image->layoutBoundsTop,
-                    image->layoutBoundsRight, image->layoutBoundsBottom);
-        }
-    }
+  uint32_t c;
+  top = 0;
 
-    // use opacity of pixels to estimate the round rect outline
-    getOutline(image);
+  // The first row always starts with the top being at y=0 and the bottom
+  // being either yDivs[1] (if yDivs[0]=0) of yDivs[0].  In the former case
+  // the first row is stretchable along the Y axis, otherwise it is fixed.
+  // The last row always ends with the bottom being bitmap.height and the top
+  // being either yDivs[numYDivs-2] (if yDivs[numYDivs-1]=bitmap.height) or
+  // yDivs[numYDivs-1]. In the former case the last row is stretchable along
+  // the Y axis, otherwise it is fixed.
+  //
+  // The first and last columns are similarly treated with respect to the X
+  // axis.
+  //
+  // The above is to help explain some of the special casing that goes on the
+  // code below.
 
-    // If padding is not yet specified, take values from size.
-    if (image->info9Patch.paddingLeft < 0) {
-        image->info9Patch.paddingLeft = xDivs[0];
-        image->info9Patch.paddingRight = W - 2 - xDivs[1];
+  // The initial yDiv and whether the first row is considered stretchable or
+  // not depends on whether yDiv[0] was zero or not.
+  for (j = (yDivs[0] == 0 ? 1 : 0); j <= numYDivs && top < H; j++) {
+    if (j == numYDivs) {
+      bottom = H;
     } else {
-        // Adjust value to be correct!
-        image->info9Patch.paddingRight = W - 2 - image->info9Patch.paddingRight;
+      bottom = yDivs[j];
     }
-    if (image->info9Patch.paddingTop < 0) {
-        image->info9Patch.paddingTop = yDivs[0];
-        image->info9Patch.paddingBottom = H - 2 - yDivs[1];
-    } else {
-        // Adjust value to be correct!
-        image->info9Patch.paddingBottom = H - 2 - image->info9Patch.paddingBottom;
-    }
-
-/*    if (kDebug) {
-        printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
-                xDivs[0], xDivs[1],
-                yDivs[0], yDivs[1]);
-        printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
-                image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
-                image->info9Patch.paddingTop, image->info9Patch.paddingBottom);
-    }*/
-
-    // Remove frame from image.
-    newRows.resize(H - 2);
-    for (i = 0; i < H - 2; i++) {
-        newRows[i] = image->rows[i + 1];
-        memmove(newRows[i], newRows[i] + 4, (W - 2) * 4);
-    }
-    image->rows.swap(newRows);
-
-    image->width -= 2;
-    W = image->width;
-    image->height -= 2;
-    H = image->height;
-
-    // Figure out the number of rows and columns in the N-patch
-    numCols = numXDivs + 1;
-    if (xDivs[0] == 0) {  // Column 1 is strechable
-        numCols--;
-    }
-    if (xDivs[numXDivs - 1] == W) {
-        numCols--;
-    }
-    numRows = numYDivs + 1;
-    if (yDivs[0] == 0) {  // Row 1 is strechable
-        numRows--;
-    }
-    if (yDivs[numYDivs - 1] == H) {
-        numRows--;
-    }
-
-    // Make sure the amount of rows and columns will fit in the number of
-    // colors we can use in the 9-patch format.
-    if (numRows * numCols > 0x7F) {
-        errorMsg = "Too many rows and columns in 9-patch perimeter";
-        goto getout;
-    }
-
-    numColors = numRows * numCols;
-    image->info9Patch.numColors = numColors;
-    image->colors.resize(numColors);
-
-    // Fill in color information for each patch.
-
-    uint32_t c;
-    top = 0;
-
-    // The first row always starts with the top being at y=0 and the bottom
-    // being either yDivs[1] (if yDivs[0]=0) of yDivs[0].  In the former case
-    // the first row is stretchable along the Y axis, otherwise it is fixed.
-    // The last row always ends with the bottom being bitmap.height and the top
-    // being either yDivs[numYDivs-2] (if yDivs[numYDivs-1]=bitmap.height) or
-    // yDivs[numYDivs-1]. In the former case the last row is stretchable along
-    // the Y axis, otherwise it is fixed.
-    //
-    // The first and last columns are similarly treated with respect to the X
-    // axis.
-    //
-    // The above is to help explain some of the special casing that goes on the
-    // code below.
-
-    // The initial yDiv and whether the first row is considered stretchable or
-    // not depends on whether yDiv[0] was zero or not.
-    for (j = (yDivs[0] == 0 ? 1 : 0); j <= numYDivs && top < H; j++) {
-        if (j == numYDivs) {
-            bottom = H;
-        } else {
-            bottom = yDivs[j];
+    left = 0;
+    // The initial xDiv and whether the first column is considered
+    // stretchable or not depends on whether xDiv[0] was zero or not.
+    for (i = xDivs[0] == 0 ? 1 : 0; i <= numXDivs && left < W; i++) {
+      if (i == numXDivs) {
+        right = W;
+      } else {
+        right = xDivs[i];
+      }
+      c = getColor(image->rows.data(), left, top, right - 1, bottom - 1);
+      image->colors[colorIndex++] = c;
+      if (kDebug) {
+        if (c != android::Res_png_9patch::NO_COLOR) {
+          hasColor = true;
         }
-        left = 0;
-        // The initial xDiv and whether the first column is considered
-        // stretchable or not depends on whether xDiv[0] was zero or not.
-        for (i = xDivs[0] == 0 ? 1 : 0; i <= numXDivs && left < W; i++) {
-            if (i == numXDivs) {
-                right = W;
-            } else {
-                right = xDivs[i];
-            }
-            c = getColor(image->rows.data(), left, top, right - 1, bottom - 1);
-            image->colors[colorIndex++] = c;
-            if (kDebug) {
-                if (c != android::Res_png_9patch::NO_COLOR) {
-                    hasColor = true;
-                }
-            }
-            left = right;
-        }
-        top = bottom;
+      }
+      left = right;
     }
+    top = bottom;
+  }
 
-    assert(colorIndex == numColors);
+  assert(colorIndex == numColors);
 
-    if (kDebug && hasColor) {
-        for (i = 0; i < numColors; i++) {
-            if (i == 0) printf("Colors:\n");
-            printf(" #%08x", image->colors[i]);
-            if (i == numColors - 1) printf("\n");
-        }
+  if (kDebug && hasColor) {
+    for (i = 0; i < numColors; i++) {
+      if (i == 0) printf("Colors:\n");
+      printf(" #%08x", image->colors[i]);
+      if (i == numColors - 1) printf("\n");
     }
+  }
 getout:
-    if (errorMsg) {
-        std::stringstream err;
-        err << "9-patch malformed: " << errorMsg;
-        if (errorEdge) {
-            err << "." << std::endl;
-            if (errorPixel >= 0) {
-                err << "Found at pixel #" << errorPixel << " along " << errorEdge << " edge";
-            } else {
-                err << "Found along " << errorEdge << " edge";
-            }
-        }
-        *outError = err.str();
-        return false;
+  if (errorMsg) {
+    std::stringstream err;
+    err << "9-patch malformed: " << errorMsg;
+    if (errorEdge) {
+      err << "." << std::endl;
+      if (errorPixel >= 0) {
+        err << "Found at pixel #" << errorPixel << " along " << errorEdge
+            << " edge";
+      } else {
+        err << "Found along " << errorEdge << " edge";
+      }
     }
-    return true;
+    *outError = err.str();
+    return false;
+  }
+  return true;
 }
 
+bool Png::process(const Source& source, std::istream* input,
+                  BigBuffer* outBuffer, const PngOptions& options) {
+  png_byte signature[kPngSignatureSize];
 
-bool Png::process(const Source& source, std::istream* input, BigBuffer* outBuffer,
-                  const PngOptions& options) {
-    png_byte signature[kPngSignatureSize];
+  // Read the PNG signature first.
+  if (!input->read(reinterpret_cast<char*>(signature), kPngSignatureSize)) {
+    mDiag->error(DiagMessage() << strerror(errno));
+    return false;
+  }
 
-    // Read the PNG signature first.
-    if (!input->read(reinterpret_cast<char*>(signature), kPngSignatureSize)) {
-        mDiag->error(DiagMessage() << strerror(errno));
-        return false;
+  // If the PNG signature doesn't match, bail early.
+  if (png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
+    mDiag->error(DiagMessage() << "not a valid png file");
+    return false;
+  }
+
+  bool result = false;
+  png_structp readPtr = nullptr;
+  png_infop infoPtr = nullptr;
+  png_structp writePtr = nullptr;
+  png_infop writeInfoPtr = nullptr;
+  PngInfo pngInfo = {};
+
+  readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
+  if (!readPtr) {
+    mDiag->error(DiagMessage() << "failed to allocate read ptr");
+    goto bail;
+  }
+
+  infoPtr = png_create_info_struct(readPtr);
+  if (!infoPtr) {
+    mDiag->error(DiagMessage() << "failed to allocate info ptr");
+    goto bail;
+  }
+
+  png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr,
+                   logWarning);
+
+  // Set the read function to read from std::istream.
+  png_set_read_fn(readPtr, (png_voidp)input, readDataFromStream);
+
+  if (!readPng(mDiag, readPtr, infoPtr, &pngInfo)) {
+    goto bail;
+  }
+
+  if (util::stringEndsWith(source.path, ".9.png")) {
+    std::string errorMsg;
+    if (!do9Patch(&pngInfo, &errorMsg)) {
+      mDiag->error(DiagMessage() << errorMsg);
+      goto bail;
     }
+  }
 
-    // If the PNG signature doesn't match, bail early.
-    if (png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
-        mDiag->error(DiagMessage() << "not a valid png file");
-        return false;
-    }
+  writePtr =
+      png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
+  if (!writePtr) {
+    mDiag->error(DiagMessage() << "failed to allocate write ptr");
+    goto bail;
+  }
 
-    bool result = false;
-    png_structp readPtr = nullptr;
-    png_infop infoPtr = nullptr;
-    png_structp writePtr = nullptr;
-    png_infop writeInfoPtr = nullptr;
-    PngInfo pngInfo = {};
+  writeInfoPtr = png_create_info_struct(writePtr);
+  if (!writeInfoPtr) {
+    mDiag->error(DiagMessage() << "failed to allocate write info ptr");
+    goto bail;
+  }
 
-    readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
-    if (!readPtr) {
-        mDiag->error(DiagMessage() << "failed to allocate read ptr");
-        goto bail;
-    }
+  png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
 
-    infoPtr = png_create_info_struct(readPtr);
-    if (!infoPtr) {
-        mDiag->error(DiagMessage() << "failed to allocate info ptr");
-        goto bail;
-    }
+  // Set the write function to write to std::ostream.
+  png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream,
+                   flushDataToStream);
 
-    png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr, logWarning);
+  if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo,
+                options.grayScaleTolerance)) {
+    goto bail;
+  }
 
-    // Set the read function to read from std::istream.
-    png_set_read_fn(readPtr, (png_voidp) input, readDataFromStream);
-
-    if (!readPng(mDiag, readPtr, infoPtr, &pngInfo)) {
-        goto bail;
-    }
-
-    if (util::stringEndsWith(source.path, ".9.png")) {
-        std::string errorMsg;
-        if (!do9Patch(&pngInfo, &errorMsg)) {
-            mDiag->error(DiagMessage() << errorMsg);
-            goto bail;
-        }
-    }
-
-    writePtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
-    if (!writePtr) {
-        mDiag->error(DiagMessage() << "failed to allocate write ptr");
-        goto bail;
-    }
-
-    writeInfoPtr = png_create_info_struct(writePtr);
-    if (!writeInfoPtr) {
-        mDiag->error(DiagMessage() << "failed to allocate write info ptr");
-        goto bail;
-    }
-
-    png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
-
-    // Set the write function to write to std::ostream.
-    png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream, flushDataToStream);
-
-    if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo, options.grayScaleTolerance)) {
-        goto bail;
-    }
-
-    result = true;
+  result = true;
 bail:
-    if (readPtr) {
-        png_destroy_read_struct(&readPtr, &infoPtr, nullptr);
-    }
+  if (readPtr) {
+    png_destroy_read_struct(&readPtr, &infoPtr, nullptr);
+  }
 
-    if (writePtr) {
-        png_destroy_write_struct(&writePtr, &writeInfoPtr);
-    }
-    return result;
+  if (writePtr) {
+    png_destroy_write_struct(&writePtr, &writeInfoPtr);
+  }
+  return result;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Png.h b/tools/aapt2/compile/Png.h
index 4a15d95..f9038af 100644
--- a/tools/aapt2/compile/Png.h
+++ b/tools/aapt2/compile/Png.h
@@ -31,51 +31,48 @@
 namespace aapt {
 
 struct PngOptions {
-    int grayScaleTolerance = 0;
+  int grayScaleTolerance = 0;
 };
 
 class Png {
-public:
-    explicit Png(IDiagnostics* diag) : mDiag(diag) {
-    }
+ public:
+  explicit Png(IDiagnostics* diag) : mDiag(diag) {}
 
-    bool process(const Source& source, std::istream* input, BigBuffer* outBuffer,
-                 const PngOptions& options);
+  bool process(const Source& source, std::istream* input, BigBuffer* outBuffer,
+               const PngOptions& options);
 
-private:
-    IDiagnostics* mDiag;
+ private:
+  IDiagnostics* mDiag;
 
-    DISALLOW_COPY_AND_ASSIGN(Png);
+  DISALLOW_COPY_AND_ASSIGN(Png);
 };
 
 /**
  * An InputStream that filters out unimportant PNG chunks.
  */
 class PngChunkFilter : public io::InputStream {
-public:
-    explicit PngChunkFilter(const StringPiece& data);
+ public:
+  explicit PngChunkFilter(const StringPiece& data);
 
-    bool Next(const void** buffer, int* len) override;
-    void BackUp(int count) override;
-    bool Skip(int count) override;
+  bool Next(const void** buffer, int* len) override;
+  void BackUp(int count) override;
+  bool Skip(int count) override;
 
-    int64_t ByteCount() const override {
-        return static_cast<int64_t>(mWindowStart);
-    }
+  int64_t ByteCount() const override {
+    return static_cast<int64_t>(mWindowStart);
+  }
 
-    bool HadError() const override {
-        return mError;
-    }
+  bool HadError() const override { return mError; }
 
-private:
-    bool consumeWindow(const void** buffer, int* len);
+ private:
+  bool consumeWindow(const void** buffer, int* len);
 
-    StringPiece mData;
-    size_t mWindowStart = 0;
-    size_t mWindowEnd = 0;
-    bool mError = false;
+  StringPiece mData;
+  size_t mWindowStart = 0;
+  size_t mWindowEnd = 0;
+  bool mError = false;
 
-    DISALLOW_COPY_AND_ASSIGN(PngChunkFilter);
+  DISALLOW_COPY_AND_ASSIGN(PngChunkFilter);
 };
 
 /**
@@ -84,11 +81,13 @@
 std::unique_ptr<Image> readPng(IAaptContext* context, io::InputStream* in);
 
 /**
- * Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream as a PNG.
+ * Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream
+ * as a PNG.
  */
-bool writePng(IAaptContext* context, const Image* image, const NinePatch* ninePatch,
-              io::OutputStream* out, const PngOptions& options);
+bool writePng(IAaptContext* context, const Image* image,
+              const NinePatch* ninePatch, io::OutputStream* out,
+              const PngOptions& options);
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_PNG_H
+#endif  // AAPT_PNG_H
diff --git a/tools/aapt2/compile/PngChunkFilter.cpp b/tools/aapt2/compile/PngChunkFilter.cpp
index 70a881f..fb7fe92 100644
--- a/tools/aapt2/compile/PngChunkFilter.cpp
+++ b/tools/aapt2/compile/PngChunkFilter.cpp
@@ -25,149 +25,149 @@
 // Useful helper function that encodes individual bytes into a uint32
 // at compile time.
 constexpr uint32_t u32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
-    return (((uint32_t) a) << 24)
-            | (((uint32_t) b) << 16)
-            | (((uint32_t) c) << 8)
-            | ((uint32_t) d);
+  return (((uint32_t)a) << 24) | (((uint32_t)b) << 16) | (((uint32_t)c) << 8) |
+         ((uint32_t)d);
 }
 
 // Whitelist of PNG chunk types that we want to keep in the resulting PNG.
 enum PngChunkTypes {
-    kPngChunkIHDR = u32(73, 72, 68, 82),
-    kPngChunkIDAT = u32(73, 68, 65, 84),
-    kPngChunkIEND = u32(73, 69, 78, 68),
-    kPngChunkPLTE = u32(80, 76, 84, 69),
-    kPngChunktRNS = u32(116, 82, 78, 83),
-    kPngChunksRGB = u32(115, 82, 71, 66),
+  kPngChunkIHDR = u32(73, 72, 68, 82),
+  kPngChunkIDAT = u32(73, 68, 65, 84),
+  kPngChunkIEND = u32(73, 69, 78, 68),
+  kPngChunkPLTE = u32(80, 76, 84, 69),
+  kPngChunktRNS = u32(116, 82, 78, 83),
+  kPngChunksRGB = u32(115, 82, 71, 66),
 };
 
 static uint32_t peek32LE(const char* data) {
-    uint32_t word = ((uint32_t) data[0]) & 0x000000ff;
-    word <<= 8;
-    word |= ((uint32_t) data[1]) & 0x000000ff;
-    word <<= 8;
-    word |= ((uint32_t) data[2]) & 0x000000ff;
-    word <<= 8;
-    word |= ((uint32_t) data[3]) & 0x000000ff;
-    return word;
+  uint32_t word = ((uint32_t)data[0]) & 0x000000ff;
+  word <<= 8;
+  word |= ((uint32_t)data[1]) & 0x000000ff;
+  word <<= 8;
+  word |= ((uint32_t)data[2]) & 0x000000ff;
+  word <<= 8;
+  word |= ((uint32_t)data[3]) & 0x000000ff;
+  return word;
 }
 
 static bool isPngChunkWhitelisted(uint32_t type) {
-    switch (type) {
+  switch (type) {
     case kPngChunkIHDR:
     case kPngChunkIDAT:
     case kPngChunkIEND:
     case kPngChunkPLTE:
     case kPngChunktRNS:
     case kPngChunksRGB:
-        return true;
+      return true;
     default:
-        return false;
-    }
+      return false;
+  }
 }
 
 PngChunkFilter::PngChunkFilter(const StringPiece& data) : mData(data) {
-    if (util::stringStartsWith(mData, kPngSignature)) {
-        mWindowStart = 0;
-        mWindowEnd = strlen(kPngSignature);
-    } else {
-        mError = true;
-    }
+  if (util::stringStartsWith(mData, kPngSignature)) {
+    mWindowStart = 0;
+    mWindowEnd = strlen(kPngSignature);
+  } else {
+    mError = true;
+  }
 }
 
 bool PngChunkFilter::consumeWindow(const void** buffer, int* len) {
-    if (mWindowStart != mWindowEnd) {
-        // We have bytes to give from our window.
-        const int bytesRead = (int) (mWindowEnd - mWindowStart);
-        *buffer = mData.data() + mWindowStart;
-        *len = bytesRead;
-        mWindowStart = mWindowEnd;
-        return true;
-    }
-    return false;
+  if (mWindowStart != mWindowEnd) {
+    // We have bytes to give from our window.
+    const int bytesRead = (int)(mWindowEnd - mWindowStart);
+    *buffer = mData.data() + mWindowStart;
+    *len = bytesRead;
+    mWindowStart = mWindowEnd;
+    return true;
+  }
+  return false;
 }
 
 bool PngChunkFilter::Next(const void** buffer, int* len) {
-    if (mError) {
-        return false;
-    }
-
-    // In case BackUp was called, we must consume the window.
-    if (consumeWindow(buffer, len)) {
-        return true;
-    }
-
-    // Advance the window as far as possible (until we meet a chunk that
-    // we want to strip).
-    while (mWindowEnd < mData.size()) {
-        // Chunk length (4 bytes) + type (4 bytes) + crc32 (4 bytes) = 12 bytes.
-        const size_t kMinChunkHeaderSize = 3 * sizeof(uint32_t);
-
-        // Is there enough room for a chunk header?
-        if (mData.size() - mWindowStart < kMinChunkHeaderSize) {
-            mError = true;
-            return false;
-        }
-
-        // Verify the chunk length.
-        const uint32_t chunkLen = peek32LE(mData.data() + mWindowEnd);
-        if (((uint64_t) chunkLen) + ((uint64_t) mWindowEnd) + sizeof(uint32_t) > mData.size()) {
-            // Overflow.
-            mError = true;
-            return false;
-        }
-
-        // Do we strip this chunk?
-        const uint32_t chunkType = peek32LE(mData.data() + mWindowEnd + sizeof(uint32_t));
-        if (isPngChunkWhitelisted(chunkType)) {
-            // Advance the window to include this chunk.
-            mWindowEnd += kMinChunkHeaderSize + chunkLen;
-        } else {
-            // We want to strip this chunk. If we accumulated a window,
-            // we must return the window now.
-            if (mWindowStart != mWindowEnd) {
-                break;
-            }
-
-            // The window is empty, so we can advance past this chunk
-            // and keep looking for the next good chunk,
-            mWindowEnd += kMinChunkHeaderSize + chunkLen;
-            mWindowStart = mWindowEnd;
-        }
-    }
-
-    if (consumeWindow(buffer, len)) {
-        return true;
-    }
+  if (mError) {
     return false;
+  }
+
+  // In case BackUp was called, we must consume the window.
+  if (consumeWindow(buffer, len)) {
+    return true;
+  }
+
+  // Advance the window as far as possible (until we meet a chunk that
+  // we want to strip).
+  while (mWindowEnd < mData.size()) {
+    // Chunk length (4 bytes) + type (4 bytes) + crc32 (4 bytes) = 12 bytes.
+    const size_t kMinChunkHeaderSize = 3 * sizeof(uint32_t);
+
+    // Is there enough room for a chunk header?
+    if (mData.size() - mWindowStart < kMinChunkHeaderSize) {
+      mError = true;
+      return false;
+    }
+
+    // Verify the chunk length.
+    const uint32_t chunkLen = peek32LE(mData.data() + mWindowEnd);
+    if (((uint64_t)chunkLen) + ((uint64_t)mWindowEnd) + sizeof(uint32_t) >
+        mData.size()) {
+      // Overflow.
+      mError = true;
+      return false;
+    }
+
+    // Do we strip this chunk?
+    const uint32_t chunkType =
+        peek32LE(mData.data() + mWindowEnd + sizeof(uint32_t));
+    if (isPngChunkWhitelisted(chunkType)) {
+      // Advance the window to include this chunk.
+      mWindowEnd += kMinChunkHeaderSize + chunkLen;
+    } else {
+      // We want to strip this chunk. If we accumulated a window,
+      // we must return the window now.
+      if (mWindowStart != mWindowEnd) {
+        break;
+      }
+
+      // The window is empty, so we can advance past this chunk
+      // and keep looking for the next good chunk,
+      mWindowEnd += kMinChunkHeaderSize + chunkLen;
+      mWindowStart = mWindowEnd;
+    }
+  }
+
+  if (consumeWindow(buffer, len)) {
+    return true;
+  }
+  return false;
 }
 
 void PngChunkFilter::BackUp(int count) {
-    if (mError) {
-        return;
-    }
-    mWindowStart -= count;
+  if (mError) {
+    return;
+  }
+  mWindowStart -= count;
 }
 
 bool PngChunkFilter::Skip(int count) {
-    if (mError) {
-        return false;
-    }
+  if (mError) {
+    return false;
+  }
 
-    const void* buffer;
-    int len;
-    while (count > 0) {
-        if (!Next(&buffer, &len)) {
-            return false;
-        }
-        if (len > count) {
-            BackUp(len - count);
-            count = 0;
-        } else {
-            count -= len;
-        }
+  const void* buffer;
+  int len;
+  while (count > 0) {
+    if (!Next(&buffer, &len)) {
+      return false;
     }
-    return true;
+    if (len > count) {
+      BackUp(len - count);
+      count = 0;
+    } else {
+      count -= len;
+    }
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/PngCrunch.cpp b/tools/aapt2/compile/PngCrunch.cpp
index a2e3f4f..4a74f7af7 100644
--- a/tools/aapt2/compile/PngCrunch.cpp
+++ b/tools/aapt2/compile/PngCrunch.cpp
@@ -16,13 +16,13 @@
 
 #include "compile/Png.h"
 
-#include <algorithm>
 #include <android-base/errors.h>
 #include <android-base/macros.h>
 #include <png.h>
+#include <zlib.h>
+#include <algorithm>
 #include <unordered_map>
 #include <unordered_set>
-#include <zlib.h>
 
 namespace aapt {
 
@@ -33,250 +33,261 @@
  * Custom deleter that destroys libpng read and info structs.
  */
 class PngReadStructDeleter {
-public:
-    explicit PngReadStructDeleter(png_structp readPtr, png_infop infoPtr) :
-            mReadPtr(readPtr), mInfoPtr(infoPtr) {
-    }
+ public:
+  explicit PngReadStructDeleter(png_structp readPtr, png_infop infoPtr)
+      : mReadPtr(readPtr), mInfoPtr(infoPtr) {}
 
-    ~PngReadStructDeleter() {
-        png_destroy_read_struct(&mReadPtr, &mInfoPtr, nullptr);
-    }
+  ~PngReadStructDeleter() {
+    png_destroy_read_struct(&mReadPtr, &mInfoPtr, nullptr);
+  }
 
-private:
-    png_structp mReadPtr;
-    png_infop mInfoPtr;
+ private:
+  png_structp mReadPtr;
+  png_infop mInfoPtr;
 
-    DISALLOW_COPY_AND_ASSIGN(PngReadStructDeleter);
+  DISALLOW_COPY_AND_ASSIGN(PngReadStructDeleter);
 };
 
 /**
  * Custom deleter that destroys libpng write and info structs.
  */
 class PngWriteStructDeleter {
-public:
-    explicit PngWriteStructDeleter(png_structp writePtr, png_infop infoPtr) :
-            mWritePtr(writePtr), mInfoPtr(infoPtr) {
-    }
+ public:
+  explicit PngWriteStructDeleter(png_structp writePtr, png_infop infoPtr)
+      : mWritePtr(writePtr), mInfoPtr(infoPtr) {}
 
-    ~PngWriteStructDeleter() {
-        png_destroy_write_struct(&mWritePtr, &mInfoPtr);
-    }
+  ~PngWriteStructDeleter() { png_destroy_write_struct(&mWritePtr, &mInfoPtr); }
 
-private:
-    png_structp mWritePtr;
-    png_infop mInfoPtr;
+ private:
+  png_structp mWritePtr;
+  png_infop mInfoPtr;
 
-    DISALLOW_COPY_AND_ASSIGN(PngWriteStructDeleter);
+  DISALLOW_COPY_AND_ASSIGN(PngWriteStructDeleter);
 };
 
 // Custom warning logging method that uses IDiagnostics.
 static void logWarning(png_structp pngPtr, png_const_charp warningMsg) {
-    IDiagnostics* diag = (IDiagnostics*) png_get_error_ptr(pngPtr);
-    diag->warn(DiagMessage() << warningMsg);
+  IDiagnostics* diag = (IDiagnostics*)png_get_error_ptr(pngPtr);
+  diag->warn(DiagMessage() << warningMsg);
 }
 
 // Custom error logging method that uses IDiagnostics.
 static void logError(png_structp pngPtr, png_const_charp errorMsg) {
-    IDiagnostics* diag = (IDiagnostics*) png_get_error_ptr(pngPtr);
-    diag->error(DiagMessage() << errorMsg);
+  IDiagnostics* diag = (IDiagnostics*)png_get_error_ptr(pngPtr);
+  diag->error(DiagMessage() << errorMsg);
 }
 
-static void readDataFromStream(png_structp pngPtr, png_bytep buffer, png_size_t len) {
-    io::InputStream* in = (io::InputStream*) png_get_io_ptr(pngPtr);
+static void readDataFromStream(png_structp pngPtr, png_bytep buffer,
+                               png_size_t len) {
+  io::InputStream* in = (io::InputStream*)png_get_io_ptr(pngPtr);
 
-    const void* inBuffer;
-    int inLen;
-    if (!in->Next(&inBuffer, &inLen)) {
-        if (in->HadError()) {
-            std::string err = in->GetError();
-            png_error(pngPtr, err.c_str());
-        }
-        return;
+  const void* inBuffer;
+  int inLen;
+  if (!in->Next(&inBuffer, &inLen)) {
+    if (in->HadError()) {
+      std::string err = in->GetError();
+      png_error(pngPtr, err.c_str());
     }
+    return;
+  }
 
-    const size_t bytesRead = std::min(static_cast<size_t>(inLen), len);
-    memcpy(buffer, inBuffer, bytesRead);
-    if (bytesRead != static_cast<size_t>(inLen)) {
-        in->BackUp(inLen - static_cast<int>(bytesRead));
-    }
+  const size_t bytesRead = std::min(static_cast<size_t>(inLen), len);
+  memcpy(buffer, inBuffer, bytesRead);
+  if (bytesRead != static_cast<size_t>(inLen)) {
+    in->BackUp(inLen - static_cast<int>(bytesRead));
+  }
 }
 
-static void writeDataToStream(png_structp pngPtr, png_bytep buffer, png_size_t len) {
-    io::OutputStream* out = (io::OutputStream*) png_get_io_ptr(pngPtr);
+static void writeDataToStream(png_structp pngPtr, png_bytep buffer,
+                              png_size_t len) {
+  io::OutputStream* out = (io::OutputStream*)png_get_io_ptr(pngPtr);
 
-    void* outBuffer;
-    int outLen;
-    while (len > 0) {
-        if (!out->Next(&outBuffer, &outLen)) {
-            if (out->HadError()) {
-                std::string err = out->GetError();
-                png_error(pngPtr, err.c_str());
-            }
-            return;
-        }
-
-        const size_t bytesWritten = std::min(static_cast<size_t>(outLen), len);
-        memcpy(outBuffer, buffer, bytesWritten);
-
-        // Advance the input buffer.
-        buffer += bytesWritten;
-        len -= bytesWritten;
-
-        // Advance the output buffer.
-        outLen -= static_cast<int>(bytesWritten);
+  void* outBuffer;
+  int outLen;
+  while (len > 0) {
+    if (!out->Next(&outBuffer, &outLen)) {
+      if (out->HadError()) {
+        std::string err = out->GetError();
+        png_error(pngPtr, err.c_str());
+      }
+      return;
     }
 
-    // If the entire output buffer wasn't used, backup.
-    if (outLen > 0) {
-        out->BackUp(outLen);
-    }
+    const size_t bytesWritten = std::min(static_cast<size_t>(outLen), len);
+    memcpy(outBuffer, buffer, bytesWritten);
+
+    // Advance the input buffer.
+    buffer += bytesWritten;
+    len -= bytesWritten;
+
+    // Advance the output buffer.
+    outLen -= static_cast<int>(bytesWritten);
+  }
+
+  // If the entire output buffer wasn't used, backup.
+  if (outLen > 0) {
+    out->BackUp(outLen);
+  }
 }
 
 std::unique_ptr<Image> readPng(IAaptContext* context, io::InputStream* in) {
-    // Read the first 8 bytes of the file looking for the PNG signature.
-    // Bail early if it does not match.
-    const png_byte* signature;
-    int bufferSize;
-    if (!in->Next((const void**) &signature, &bufferSize)) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << android::base::SystemErrorCodeToString(errno));
-        return {};
-    }
+  // Read the first 8 bytes of the file looking for the PNG signature.
+  // Bail early if it does not match.
+  const png_byte* signature;
+  int bufferSize;
+  if (!in->Next((const void**)&signature, &bufferSize)) {
+    context->getDiagnostics()->error(
+        DiagMessage() << android::base::SystemErrorCodeToString(errno));
+    return {};
+  }
 
-    if (static_cast<size_t>(bufferSize) < kPngSignatureSize
-            || png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << "file signature does not match PNG signature");
-        return {};
-    }
+  if (static_cast<size_t>(bufferSize) < kPngSignatureSize ||
+      png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "file signature does not match PNG signature");
+    return {};
+  }
 
-    // Start at the beginning of the first chunk.
-    in->BackUp(bufferSize - static_cast<int>(kPngSignatureSize));
+  // Start at the beginning of the first chunk.
+  in->BackUp(bufferSize - static_cast<int>(kPngSignatureSize));
 
-    // Create and initialize the png_struct with the default error and warning handlers.
-    // The header version is also passed in to ensure that this was built against the same
-    // version of libpng.
-    png_structp readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
-    if (readPtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << "failed to create libpng read png_struct");
-        return {};
-    }
+  // Create and initialize the png_struct with the default error and warning
+  // handlers.
+  // The header version is also passed in to ensure that this was built against
+  // the same
+  // version of libpng.
+  png_structp readPtr =
+      png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+  if (readPtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng read png_struct");
+    return {};
+  }
 
-    // Create and initialize the memory for image header and data.
-    png_infop infoPtr = png_create_info_struct(readPtr);
-    if (infoPtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage() << "failed to create libpng read png_info");
-        png_destroy_read_struct(&readPtr, nullptr, nullptr);
-        return {};
-    }
+  // Create and initialize the memory for image header and data.
+  png_infop infoPtr = png_create_info_struct(readPtr);
+  if (infoPtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng read png_info");
+    png_destroy_read_struct(&readPtr, nullptr, nullptr);
+    return {};
+  }
 
-    // Automatically release PNG resources at end of scope.
-    PngReadStructDeleter pngReadDeleter(readPtr, infoPtr);
+  // Automatically release PNG resources at end of scope.
+  PngReadStructDeleter pngReadDeleter(readPtr, infoPtr);
 
-    // libpng uses longjmp to jump to an error handling routine.
-    // setjmp will only return true if it was jumped to, aka there was
-    // an error.
-    if (setjmp(png_jmpbuf(readPtr))) {
-        return {};
-    }
+  // libpng uses longjmp to jump to an error handling routine.
+  // setjmp will only return true if it was jumped to, aka there was
+  // an error.
+  if (setjmp(png_jmpbuf(readPtr))) {
+    return {};
+  }
 
-    // Handle warnings ourselves via IDiagnostics.
-    png_set_error_fn(readPtr, (png_voidp) context->getDiagnostics(), logError, logWarning);
+  // Handle warnings ourselves via IDiagnostics.
+  png_set_error_fn(readPtr, (png_voidp)context->getDiagnostics(), logError,
+                   logWarning);
 
-    // Set up the read functions which read from our custom data sources.
-    png_set_read_fn(readPtr, (png_voidp) in, readDataFromStream);
+  // Set up the read functions which read from our custom data sources.
+  png_set_read_fn(readPtr, (png_voidp)in, readDataFromStream);
 
-    // Skip the signature that we already read.
-    png_set_sig_bytes(readPtr, kPngSignatureSize);
+  // Skip the signature that we already read.
+  png_set_sig_bytes(readPtr, kPngSignatureSize);
 
-    // Read the chunk headers.
-    png_read_info(readPtr, infoPtr);
+  // Read the chunk headers.
+  png_read_info(readPtr, infoPtr);
 
-    // Extract image meta-data from the various chunk headers.
-    uint32_t width, height;
-    int bitDepth, colorType, interlaceMethod, compressionMethod, filterMethod;
-    png_get_IHDR(readPtr, infoPtr, &width, &height, &bitDepth, &colorType, &interlaceMethod,
-                 &compressionMethod, &filterMethod);
+  // Extract image meta-data from the various chunk headers.
+  uint32_t width, height;
+  int bitDepth, colorType, interlaceMethod, compressionMethod, filterMethod;
+  png_get_IHDR(readPtr, infoPtr, &width, &height, &bitDepth, &colorType,
+               &interlaceMethod, &compressionMethod, &filterMethod);
 
-    // When the image is read, expand it so that it is in RGBA 8888 format
-    // so that image handling is uniform.
+  // When the image is read, expand it so that it is in RGBA 8888 format
+  // so that image handling is uniform.
 
-    if (colorType == PNG_COLOR_TYPE_PALETTE) {
-        png_set_palette_to_rgb(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_PALETTE) {
+    png_set_palette_to_rgb(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
-        png_set_expand_gray_1_2_4_to_8(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
+    png_set_expand_gray_1_2_4_to_8(readPtr);
+  }
 
-    if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
-        png_set_tRNS_to_alpha(readPtr);
-    }
+  if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
+    png_set_tRNS_to_alpha(readPtr);
+  }
 
-    if (bitDepth == 16) {
-        png_set_strip_16(readPtr);
-    }
+  if (bitDepth == 16) {
+    png_set_strip_16(readPtr);
+  }
 
-    if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
-        png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
-    }
+  if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
+    png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        png_set_gray_to_rgb(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY ||
+      colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    png_set_gray_to_rgb(readPtr);
+  }
 
-    if (interlaceMethod != PNG_INTERLACE_NONE) {
-        png_set_interlace_handling(readPtr);
-    }
+  if (interlaceMethod != PNG_INTERLACE_NONE) {
+    png_set_interlace_handling(readPtr);
+  }
 
-    // Once all the options for reading have been set, we need to flush
-    // them to libpng.
-    png_read_update_info(readPtr, infoPtr);
+  // Once all the options for reading have been set, we need to flush
+  // them to libpng.
+  png_read_update_info(readPtr, infoPtr);
 
-    // 9-patch uses int32_t to index images, so we cap the image dimensions to something
-    // that can always be represented by 9-patch.
-    if (width > std::numeric_limits<int32_t>::max() ||
-            height > std::numeric_limits<int32_t>::max()) {
-        context->getDiagnostics()->error(DiagMessage() << "PNG image dimensions are too large: "
-                                         << width << "x" << height);
-        return {};
-    }
+  // 9-patch uses int32_t to index images, so we cap the image dimensions to
+  // something
+  // that can always be represented by 9-patch.
+  if (width > std::numeric_limits<int32_t>::max() ||
+      height > std::numeric_limits<int32_t>::max()) {
+    context->getDiagnostics()->error(DiagMessage()
+                                     << "PNG image dimensions are too large: "
+                                     << width << "x" << height);
+    return {};
+  }
 
-    std::unique_ptr<Image> outputImage = util::make_unique<Image>();
-    outputImage->width = static_cast<int32_t>(width);
-    outputImage->height = static_cast<int32_t>(height);
+  std::unique_ptr<Image> outputImage = util::make_unique<Image>();
+  outputImage->width = static_cast<int32_t>(width);
+  outputImage->height = static_cast<int32_t>(height);
 
-    const size_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
-    assert(rowBytes == 4 * width); // RGBA
+  const size_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
+  assert(rowBytes == 4 * width);  // RGBA
 
-    // Allocate one large block to hold the image.
-    outputImage->data = std::unique_ptr<uint8_t[]>(new uint8_t[height * rowBytes]);
+  // Allocate one large block to hold the image.
+  outputImage->data =
+      std::unique_ptr<uint8_t[]>(new uint8_t[height * rowBytes]);
 
-    // Create an array of rows that index into the data block.
-    outputImage->rows = std::unique_ptr<uint8_t*[]>(new uint8_t*[height]);
-    for (uint32_t h = 0; h < height; h++) {
-        outputImage->rows[h] = outputImage->data.get() + (h * rowBytes);
-    }
+  // Create an array of rows that index into the data block.
+  outputImage->rows = std::unique_ptr<uint8_t* []>(new uint8_t*[height]);
+  for (uint32_t h = 0; h < height; h++) {
+    outputImage->rows[h] = outputImage->data.get() + (h * rowBytes);
+  }
 
-    // Actually read the image pixels.
-    png_read_image(readPtr, outputImage->rows.get());
+  // Actually read the image pixels.
+  png_read_image(readPtr, outputImage->rows.get());
 
-    // Finish reading. This will read any other chunks after the image data.
-    png_read_end(readPtr, infoPtr);
+  // Finish reading. This will read any other chunks after the image data.
+  png_read_end(readPtr, infoPtr);
 
-    return outputImage;
+  return outputImage;
 }
 
 /**
- * Experimentally chosen constant to be added to the overhead of using color type
- * PNG_COLOR_TYPE_PALETTE to account for the uncompressability of the palette chunk.
- * Without this, many small PNGs encoded with palettes are larger after compression than
+ * Experimentally chosen constant to be added to the overhead of using color
+ * type
+ * PNG_COLOR_TYPE_PALETTE to account for the uncompressability of the palette
+ * chunk.
+ * Without this, many small PNGs encoded with palettes are larger after
+ * compression than
  * the same PNGs encoded as RGBA.
  */
 constexpr static const size_t kPaletteOverheadConstant = 1024u * 10u;
 
-// Pick a color type by which to encode the image, based on which color type will take
+// Pick a color type by which to encode the image, based on which color type
+// will take
 // the least amount of disk space.
 //
 // 9-patch images traditionally have not been encoded with palettes.
@@ -298,427 +309,450 @@
 // - Grayscale + cheap alpha
 // - Grayscale + alpha
 //
-static int pickColorType(int32_t width, int32_t height,
-                         bool grayScale, bool convertibleToGrayScale, bool hasNinePatch,
+static int pickColorType(int32_t width, int32_t height, bool grayScale,
+                         bool convertibleToGrayScale, bool hasNinePatch,
                          size_t colorPaletteSize, size_t alphaPaletteSize) {
-    const size_t paletteChunkSize = 16 + colorPaletteSize * 3;
-    const size_t alphaChunkSize = 16 + alphaPaletteSize;
-    const size_t colorAlphaDataChunkSize = 16 + 4 * width * height;
-    const size_t colorDataChunkSize = 16 + 3 * width * height;
-    const size_t grayScaleAlphaDataChunkSize = 16 + 2 * width * height;
-    const size_t paletteDataChunkSize = 16 + width * height;
+  const size_t paletteChunkSize = 16 + colorPaletteSize * 3;
+  const size_t alphaChunkSize = 16 + alphaPaletteSize;
+  const size_t colorAlphaDataChunkSize = 16 + 4 * width * height;
+  const size_t colorDataChunkSize = 16 + 3 * width * height;
+  const size_t grayScaleAlphaDataChunkSize = 16 + 2 * width * height;
+  const size_t paletteDataChunkSize = 16 + width * height;
 
-    if (grayScale) {
-        if (alphaPaletteSize == 0) {
-            // This is the smallest the data can be.
-            return PNG_COLOR_TYPE_GRAY;
-        } else if (colorPaletteSize <= 256 && !hasNinePatch) {
-            // This grayscale has alpha and can fit within a palette.
-            // See if it is worth fitting into a palette.
-            const size_t paletteThreshold = paletteChunkSize + alphaChunkSize +
-                    paletteDataChunkSize + kPaletteOverheadConstant;
-            if (grayScaleAlphaDataChunkSize > paletteThreshold) {
-                return PNG_COLOR_TYPE_PALETTE;
-            }
-        }
-        return PNG_COLOR_TYPE_GRAY_ALPHA;
-    }
-
-
-    if (colorPaletteSize <= 256 && !hasNinePatch) {
-        // This image can fit inside a palette. Let's see if it is worth it.
-        size_t totalSizeWithPalette = paletteDataChunkSize + paletteChunkSize;
-        size_t totalSizeWithoutPalette = colorDataChunkSize;
-        if (alphaPaletteSize > 0) {
-            totalSizeWithPalette += alphaPaletteSize;
-            totalSizeWithoutPalette = colorAlphaDataChunkSize;
-        }
-
-        if (totalSizeWithoutPalette > totalSizeWithPalette + kPaletteOverheadConstant) {
-            return PNG_COLOR_TYPE_PALETTE;
-        }
-    }
-
-    if (convertibleToGrayScale) {
-        if (alphaPaletteSize == 0) {
-            return PNG_COLOR_TYPE_GRAY;
-        } else {
-            return PNG_COLOR_TYPE_GRAY_ALPHA;
-        }
-    }
-
+  if (grayScale) {
     if (alphaPaletteSize == 0) {
-        return PNG_COLOR_TYPE_RGB;
+      // This is the smallest the data can be.
+      return PNG_COLOR_TYPE_GRAY;
+    } else if (colorPaletteSize <= 256 && !hasNinePatch) {
+      // This grayscale has alpha and can fit within a palette.
+      // See if it is worth fitting into a palette.
+      const size_t paletteThreshold = paletteChunkSize + alphaChunkSize +
+                                      paletteDataChunkSize +
+                                      kPaletteOverheadConstant;
+      if (grayScaleAlphaDataChunkSize > paletteThreshold) {
+        return PNG_COLOR_TYPE_PALETTE;
+      }
     }
-    return PNG_COLOR_TYPE_RGBA;
+    return PNG_COLOR_TYPE_GRAY_ALPHA;
+  }
+
+  if (colorPaletteSize <= 256 && !hasNinePatch) {
+    // This image can fit inside a palette. Let's see if it is worth it.
+    size_t totalSizeWithPalette = paletteDataChunkSize + paletteChunkSize;
+    size_t totalSizeWithoutPalette = colorDataChunkSize;
+    if (alphaPaletteSize > 0) {
+      totalSizeWithPalette += alphaPaletteSize;
+      totalSizeWithoutPalette = colorAlphaDataChunkSize;
+    }
+
+    if (totalSizeWithoutPalette >
+        totalSizeWithPalette + kPaletteOverheadConstant) {
+      return PNG_COLOR_TYPE_PALETTE;
+    }
+  }
+
+  if (convertibleToGrayScale) {
+    if (alphaPaletteSize == 0) {
+      return PNG_COLOR_TYPE_GRAY;
+    } else {
+      return PNG_COLOR_TYPE_GRAY_ALPHA;
+    }
+  }
+
+  if (alphaPaletteSize == 0) {
+    return PNG_COLOR_TYPE_RGB;
+  }
+  return PNG_COLOR_TYPE_RGBA;
 }
 
-// Assigns indices to the color and alpha palettes, encodes them, and then invokes
+// Assigns indices to the color and alpha palettes, encodes them, and then
+// invokes
 // png_set_PLTE/png_set_tRNS.
 // This must be done before writing image data.
-// Image data must be transformed to use the indices assigned within the palette.
+// Image data must be transformed to use the indices assigned within the
+// palette.
 static void writePalette(png_structp writePtr, png_infop writeInfoPtr,
-                  std::unordered_map<uint32_t, int>* colorPalette,
-                  std::unordered_set<uint32_t>* alphaPalette) {
-    assert(colorPalette->size() <= 256);
-    assert(alphaPalette->size() <= 256);
+                         std::unordered_map<uint32_t, int>* colorPalette,
+                         std::unordered_set<uint32_t>* alphaPalette) {
+  assert(colorPalette->size() <= 256);
+  assert(alphaPalette->size() <= 256);
 
-    // Populate the PNG palette struct and assign indices to the color
-    // palette.
+  // Populate the PNG palette struct and assign indices to the color
+  // palette.
 
-    // Colors in the alpha palette should have smaller indices.
-    // This will ensure that we can truncate the alpha palette if it is
-    // smaller than the color palette.
-    int index = 0;
-    for (uint32_t color : *alphaPalette) {
-        (*colorPalette)[color] = index++;
+  // Colors in the alpha palette should have smaller indices.
+  // This will ensure that we can truncate the alpha palette if it is
+  // smaller than the color palette.
+  int index = 0;
+  for (uint32_t color : *alphaPalette) {
+    (*colorPalette)[color] = index++;
+  }
+
+  // Assign the rest of the entries.
+  for (auto& entry : *colorPalette) {
+    if (entry.second == -1) {
+      entry.second = index++;
     }
+  }
 
-    // Assign the rest of the entries.
-    for (auto& entry : *colorPalette) {
-        if (entry.second == -1) {
-            entry.second = index++;
-        }
+  // Create the PNG color palette struct.
+  auto colorPaletteBytes =
+      std::unique_ptr<png_color[]>(new png_color[colorPalette->size()]);
+
+  std::unique_ptr<png_byte[]> alphaPaletteBytes;
+  if (!alphaPalette->empty()) {
+    alphaPaletteBytes =
+        std::unique_ptr<png_byte[]>(new png_byte[alphaPalette->size()]);
+  }
+
+  for (const auto& entry : *colorPalette) {
+    const uint32_t color = entry.first;
+    const int index = entry.second;
+    assert(index >= 0);
+    assert(static_cast<size_t>(index) < colorPalette->size());
+
+    png_colorp slot = colorPaletteBytes.get() + index;
+    slot->red = color >> 24;
+    slot->green = color >> 16;
+    slot->blue = color >> 8;
+
+    const png_byte alpha = color & 0x000000ff;
+    if (alpha != 0xff && alphaPaletteBytes) {
+      assert(static_cast<size_t>(index) < alphaPalette->size());
+      alphaPaletteBytes[index] = alpha;
     }
+  }
 
-    // Create the PNG color palette struct.
-    auto colorPaletteBytes = std::unique_ptr<png_color[]>(new png_color[colorPalette->size()]);
+  // The bytes get copied here, so it is safe to release colorPaletteBytes at
+  // the end of function
+  // scope.
+  png_set_PLTE(writePtr, writeInfoPtr, colorPaletteBytes.get(),
+               colorPalette->size());
 
-    std::unique_ptr<png_byte[]> alphaPaletteBytes;
-    if (!alphaPalette->empty()) {
-        alphaPaletteBytes = std::unique_ptr<png_byte[]>(new png_byte[alphaPalette->size()]);
-    }
-
-    for (const auto& entry : *colorPalette) {
-        const uint32_t color = entry.first;
-        const int index = entry.second;
-        assert(index >= 0);
-        assert(static_cast<size_t>(index) < colorPalette->size());
-
-        png_colorp slot = colorPaletteBytes.get() + index;
-        slot->red = color >> 24;
-        slot->green = color >> 16;
-        slot->blue = color >> 8;
-
-        const png_byte alpha = color & 0x000000ff;
-        if (alpha != 0xff && alphaPaletteBytes) {
-            assert(static_cast<size_t>(index) < alphaPalette->size());
-            alphaPaletteBytes[index] = alpha;
-        }
-    }
-
-    // The bytes get copied here, so it is safe to release colorPaletteBytes at the end of function
-    // scope.
-    png_set_PLTE(writePtr, writeInfoPtr, colorPaletteBytes.get(), colorPalette->size());
-
-    if (alphaPaletteBytes) {
-        png_set_tRNS(writePtr, writeInfoPtr, alphaPaletteBytes.get(), alphaPalette->size(),
-                     nullptr);
-    }
+  if (alphaPaletteBytes) {
+    png_set_tRNS(writePtr, writeInfoPtr, alphaPaletteBytes.get(),
+                 alphaPalette->size(), nullptr);
+  }
 }
 
 // Write the 9-patch custom PNG chunks to writeInfoPtr. This must be done before
 // writing image data.
 static void writeNinePatch(png_structp writePtr, png_infop writeInfoPtr,
                            const NinePatch* ninePatch) {
-    // The order of the chunks is important.
-    // 9-patch code in older platforms expects the 9-patch chunk to
-    // be last.
+  // The order of the chunks is important.
+  // 9-patch code in older platforms expects the 9-patch chunk to
+  // be last.
 
-    png_unknown_chunk unknownChunks[3];
-    memset(unknownChunks, 0, sizeof(unknownChunks));
+  png_unknown_chunk unknownChunks[3];
+  memset(unknownChunks, 0, sizeof(unknownChunks));
 
-    size_t index = 0;
-    size_t chunkLen = 0;
+  size_t index = 0;
+  size_t chunkLen = 0;
 
-    std::unique_ptr<uint8_t[]> serializedOutline =
-            ninePatch->serializeRoundedRectOutline(&chunkLen);
-    strcpy((char*) unknownChunks[index].name, "npOl");
+  std::unique_ptr<uint8_t[]> serializedOutline =
+      ninePatch->serializeRoundedRectOutline(&chunkLen);
+  strcpy((char*)unknownChunks[index].name, "npOl");
+  unknownChunks[index].size = chunkLen;
+  unknownChunks[index].data = (png_bytep)serializedOutline.get();
+  unknownChunks[index].location = PNG_HAVE_PLTE;
+  index++;
+
+  std::unique_ptr<uint8_t[]> serializedLayoutBounds;
+  if (ninePatch->layoutBounds.nonZero()) {
+    serializedLayoutBounds = ninePatch->serializeLayoutBounds(&chunkLen);
+    strcpy((char*)unknownChunks[index].name, "npLb");
     unknownChunks[index].size = chunkLen;
-    unknownChunks[index].data = (png_bytep) serializedOutline.get();
+    unknownChunks[index].data = (png_bytep)serializedLayoutBounds.get();
     unknownChunks[index].location = PNG_HAVE_PLTE;
     index++;
+  }
 
-    std::unique_ptr<uint8_t[]> serializedLayoutBounds;
-    if (ninePatch->layoutBounds.nonZero()) {
-        serializedLayoutBounds = ninePatch->serializeLayoutBounds(&chunkLen);
-        strcpy((char*) unknownChunks[index].name, "npLb");
-        unknownChunks[index].size = chunkLen;
-        unknownChunks[index].data = (png_bytep) serializedLayoutBounds.get();
-        unknownChunks[index].location = PNG_HAVE_PLTE;
-        index++;
-    }
+  std::unique_ptr<uint8_t[]> serializedNinePatch =
+      ninePatch->serializeBase(&chunkLen);
+  strcpy((char*)unknownChunks[index].name, "npTc");
+  unknownChunks[index].size = chunkLen;
+  unknownChunks[index].data = (png_bytep)serializedNinePatch.get();
+  unknownChunks[index].location = PNG_HAVE_PLTE;
+  index++;
 
-    std::unique_ptr<uint8_t[]> serializedNinePatch = ninePatch->serializeBase(&chunkLen);
-    strcpy((char*) unknownChunks[index].name, "npTc");
-    unknownChunks[index].size = chunkLen;
-    unknownChunks[index].data = (png_bytep) serializedNinePatch.get();
-    unknownChunks[index].location = PNG_HAVE_PLTE;
-    index++;
+  // Handle all unknown chunks. We are manually setting the chunks here,
+  // so we will only ever handle our custom chunks.
+  png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, nullptr, 0);
 
-    // Handle all unknown chunks. We are manually setting the chunks here,
-    // so we will only ever handle our custom chunks.
-    png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, nullptr, 0);
-
-    // Set the actual chunks here. The data gets copied, so our buffers can
-    // safely go out of scope.
-    png_set_unknown_chunks(writePtr, writeInfoPtr, unknownChunks, index);
+  // Set the actual chunks here. The data gets copied, so our buffers can
+  // safely go out of scope.
+  png_set_unknown_chunks(writePtr, writeInfoPtr, unknownChunks, index);
 }
 
-bool writePng(IAaptContext* context, const Image* image, const NinePatch* ninePatch,
-              io::OutputStream* out, const PngOptions& options) {
-    // Create and initialize the write png_struct with the default error and warning handlers.
-    // The header version is also passed in to ensure that this was built against the same
-    // version of libpng.
-    png_structp writePtr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
-                                                   nullptr, nullptr, nullptr);
-    if (writePtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << "failed to create libpng write png_struct");
-        return false;
+bool writePng(IAaptContext* context, const Image* image,
+              const NinePatch* ninePatch, io::OutputStream* out,
+              const PngOptions& options) {
+  // Create and initialize the write png_struct with the default error and
+  // warning handlers.
+  // The header version is also passed in to ensure that this was built against
+  // the same
+  // version of libpng.
+  png_structp writePtr =
+      png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+  if (writePtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng write png_struct");
+    return false;
+  }
+
+  // Allocate memory to store image header data.
+  png_infop writeInfoPtr = png_create_info_struct(writePtr);
+  if (writeInfoPtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng write png_info");
+    png_destroy_write_struct(&writePtr, nullptr);
+    return false;
+  }
+
+  // Automatically release PNG resources at end of scope.
+  PngWriteStructDeleter pngWriteDeleter(writePtr, writeInfoPtr);
+
+  // libpng uses longjmp to jump to error handling routines.
+  // setjmp will return true only if it was jumped to, aka, there was an error.
+  if (setjmp(png_jmpbuf(writePtr))) {
+    return false;
+  }
+
+  // Handle warnings with our IDiagnostics.
+  png_set_error_fn(writePtr, (png_voidp)context->getDiagnostics(), logError,
+                   logWarning);
+
+  // Set up the write functions which write to our custom data sources.
+  png_set_write_fn(writePtr, (png_voidp)out, writeDataToStream, nullptr);
+
+  // We want small files and can take the performance hit to achieve this goal.
+  png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
+
+  // Begin analysis of the image data.
+  // Scan the entire image and determine if:
+  // 1. Every pixel has R == G == B (grayscale)
+  // 2. Every pixel has A == 255 (opaque)
+  // 3. There are no more than 256 distinct RGBA colors (palette).
+  std::unordered_map<uint32_t, int> colorPalette;
+  std::unordered_set<uint32_t> alphaPalette;
+  bool needsToZeroRGBChannelsOfTransparentPixels = false;
+  bool grayScale = true;
+  int maxGrayDeviation = 0;
+
+  for (int32_t y = 0; y < image->height; y++) {
+    const uint8_t* row = image->rows[y];
+    for (int32_t x = 0; x < image->width; x++) {
+      int red = *row++;
+      int green = *row++;
+      int blue = *row++;
+      int alpha = *row++;
+
+      if (alpha == 0) {
+        // The color is completely transparent.
+        // For purposes of palettes and grayscale optimization,
+        // treat all channels as 0x00.
+        needsToZeroRGBChannelsOfTransparentPixels =
+            needsToZeroRGBChannelsOfTransparentPixels ||
+            (red != 0 || green != 0 || blue != 0);
+        red = green = blue = 0;
+      }
+
+      // Insert the color into the color palette.
+      const uint32_t color = red << 24 | green << 16 | blue << 8 | alpha;
+      colorPalette[color] = -1;
+
+      // If the pixel has non-opaque alpha, insert it into the
+      // alpha palette.
+      if (alpha != 0xff) {
+        alphaPalette.insert(color);
+      }
+
+      // Check if the image is indeed grayscale.
+      if (grayScale) {
+        if (red != green || red != blue) {
+          grayScale = false;
+        }
+      }
+
+      // Calculate the gray scale deviation so that it can be compared
+      // with the threshold.
+      maxGrayDeviation = std::max(std::abs(red - green), maxGrayDeviation);
+      maxGrayDeviation = std::max(std::abs(green - blue), maxGrayDeviation);
+      maxGrayDeviation = std::max(std::abs(blue - red), maxGrayDeviation);
     }
+  }
 
-    // Allocate memory to store image header data.
-    png_infop writeInfoPtr = png_create_info_struct(writePtr);
-    if (writeInfoPtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage() << "failed to create libpng write png_info");
-        png_destroy_write_struct(&writePtr, nullptr);
-        return false;
+  if (context->verbose()) {
+    DiagMessage msg;
+    msg << " paletteSize=" << colorPalette.size()
+        << " alphaPaletteSize=" << alphaPalette.size()
+        << " maxGrayDeviation=" << maxGrayDeviation
+        << " grayScale=" << (grayScale ? "true" : "false");
+    context->getDiagnostics()->note(msg);
+  }
+
+  const bool convertibleToGrayScale =
+      maxGrayDeviation <= options.grayScaleTolerance;
+
+  const int newColorType = pickColorType(
+      image->width, image->height, grayScale, convertibleToGrayScale,
+      ninePatch != nullptr, colorPalette.size(), alphaPalette.size());
+
+  if (context->verbose()) {
+    DiagMessage msg;
+    msg << "encoding PNG ";
+    if (ninePatch) {
+      msg << "(with 9-patch) as ";
     }
-
-    // Automatically release PNG resources at end of scope.
-    PngWriteStructDeleter pngWriteDeleter(writePtr, writeInfoPtr);
-
-    // libpng uses longjmp to jump to error handling routines.
-    // setjmp will return true only if it was jumped to, aka, there was an error.
-    if (setjmp(png_jmpbuf(writePtr))) {
-        return false;
+    switch (newColorType) {
+      case PNG_COLOR_TYPE_GRAY:
+        msg << "GRAY";
+        break;
+      case PNG_COLOR_TYPE_GRAY_ALPHA:
+        msg << "GRAY + ALPHA";
+        break;
+      case PNG_COLOR_TYPE_RGB:
+        msg << "RGB";
+        break;
+      case PNG_COLOR_TYPE_RGB_ALPHA:
+        msg << "RGBA";
+        break;
+      case PNG_COLOR_TYPE_PALETTE:
+        msg << "PALETTE";
+        break;
+      default:
+        msg << "unknown type " << newColorType;
+        break;
     }
+    context->getDiagnostics()->note(msg);
+  }
 
-    // Handle warnings with our IDiagnostics.
-    png_set_error_fn(writePtr, (png_voidp) context->getDiagnostics(), logError, logWarning);
+  png_set_IHDR(writePtr, writeInfoPtr, image->width, image->height, 8,
+               newColorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
+               PNG_FILTER_TYPE_DEFAULT);
 
-    // Set up the write functions which write to our custom data sources.
-    png_set_write_fn(writePtr, (png_voidp) out, writeDataToStream, nullptr);
+  if (newColorType & PNG_COLOR_MASK_PALETTE) {
+    // Assigns indices to the palette, and writes the encoded palette to the
+    // libpng writePtr.
+    writePalette(writePtr, writeInfoPtr, &colorPalette, &alphaPalette);
+    png_set_filter(writePtr, 0, PNG_NO_FILTERS);
+  } else {
+    png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
+  }
 
-    // We want small files and can take the performance hit to achieve this goal.
-    png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
+  if (ninePatch) {
+    writeNinePatch(writePtr, writeInfoPtr, ninePatch);
+  }
 
-    // Begin analysis of the image data.
-    // Scan the entire image and determine if:
-    // 1. Every pixel has R == G == B (grayscale)
-    // 2. Every pixel has A == 255 (opaque)
-    // 3. There are no more than 256 distinct RGBA colors (palette).
-    std::unordered_map<uint32_t, int> colorPalette;
-    std::unordered_set<uint32_t> alphaPalette;
-    bool needsToZeroRGBChannelsOfTransparentPixels = false;
-    bool grayScale = true;
-    int maxGrayDeviation = 0;
+  // Flush our updates to the header.
+  png_write_info(writePtr, writeInfoPtr);
+
+  // Write out each row of image data according to its encoding.
+  if (newColorType == PNG_COLOR_TYPE_PALETTE) {
+    // 1 byte/pixel.
+    auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width]);
 
     for (int32_t y = 0; y < image->height; y++) {
-        const uint8_t* row = image->rows[y];
-        for (int32_t x = 0; x < image->width; x++) {
-            int red = *row++;
-            int green = *row++;
-            int blue = *row++;
-            int alpha = *row++;
-
-            if (alpha == 0) {
-                // The color is completely transparent.
-                // For purposes of palettes and grayscale optimization,
-                // treat all channels as 0x00.
-                needsToZeroRGBChannelsOfTransparentPixels =
-                        needsToZeroRGBChannelsOfTransparentPixels ||
-                        (red != 0 || green != 0 || blue != 0);
-                red = green = blue = 0;
-            }
-
-            // Insert the color into the color palette.
-            const uint32_t color = red << 24 | green << 16 | blue << 8 | alpha;
-            colorPalette[color] = -1;
-
-            // If the pixel has non-opaque alpha, insert it into the
-            // alpha palette.
-            if (alpha != 0xff) {
-                alphaPalette.insert(color);
-            }
-
-            // Check if the image is indeed grayscale.
-            if (grayScale) {
-                if (red != green || red != blue) {
-                    grayScale = false;
-                }
-            }
-
-            // Calculate the gray scale deviation so that it can be compared
-            // with the threshold.
-            maxGrayDeviation = std::max(std::abs(red - green), maxGrayDeviation);
-            maxGrayDeviation = std::max(std::abs(green - blue), maxGrayDeviation);
-            maxGrayDeviation = std::max(std::abs(blue - red), maxGrayDeviation);
+      png_const_bytep inRow = image->rows[y];
+      for (int32_t x = 0; x < image->width; x++) {
+        int rr = *inRow++;
+        int gg = *inRow++;
+        int bb = *inRow++;
+        int aa = *inRow++;
+        if (aa == 0) {
+          // Zero out color channels when transparent.
+          rr = gg = bb = 0;
         }
+
+        const uint32_t color = rr << 24 | gg << 16 | bb << 8 | aa;
+        const int idx = colorPalette[color];
+        assert(idx != -1);
+        outRow[x] = static_cast<png_byte>(idx);
+      }
+      png_write_row(writePtr, outRow.get());
     }
+  } else if (newColorType == PNG_COLOR_TYPE_GRAY ||
+             newColorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    const size_t bpp = newColorType == PNG_COLOR_TYPE_GRAY ? 1 : 2;
+    auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
 
-    if (context->verbose()) {
-        DiagMessage msg;
-        msg << " paletteSize=" << colorPalette.size()
-                << " alphaPaletteSize=" << alphaPalette.size()
-                << " maxGrayDeviation=" << maxGrayDeviation
-                << " grayScale=" << (grayScale ? "true" : "false");
-        context->getDiagnostics()->note(msg);
-    }
-
-    const bool convertibleToGrayScale = maxGrayDeviation <= options.grayScaleTolerance;
-
-    const int newColorType = pickColorType(image->width, image->height, grayScale,
-                                           convertibleToGrayScale, ninePatch != nullptr,
-                                           colorPalette.size(), alphaPalette.size());
-
-    if (context->verbose()) {
-        DiagMessage msg;
-        msg << "encoding PNG ";
-        if (ninePatch) {
-            msg << "(with 9-patch) as ";
+    for (int32_t y = 0; y < image->height; y++) {
+      png_const_bytep inRow = image->rows[y];
+      for (int32_t x = 0; x < image->width; x++) {
+        int rr = inRow[x * 4];
+        int gg = inRow[x * 4 + 1];
+        int bb = inRow[x * 4 + 2];
+        int aa = inRow[x * 4 + 3];
+        if (aa == 0) {
+          // Zero out the gray channel when transparent.
+          rr = gg = bb = 0;
         }
-        switch (newColorType) {
-        case PNG_COLOR_TYPE_GRAY:
-            msg << "GRAY";
-            break;
-        case PNG_COLOR_TYPE_GRAY_ALPHA:
-            msg << "GRAY + ALPHA";
-            break;
-        case PNG_COLOR_TYPE_RGB:
-            msg << "RGB";
-            break;
-        case PNG_COLOR_TYPE_RGB_ALPHA:
-            msg << "RGBA";
-            break;
-        case PNG_COLOR_TYPE_PALETTE:
-            msg << "PALETTE";
-            break;
-        default:
-            msg << "unknown type " << newColorType;
-            break;
-        }
-        context->getDiagnostics()->note(msg);
-    }
 
-    png_set_IHDR(writePtr, writeInfoPtr, image->width, image->height, 8, newColorType,
-                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
-    if (newColorType & PNG_COLOR_MASK_PALETTE) {
-        // Assigns indices to the palette, and writes the encoded palette to the libpng writePtr.
-        writePalette(writePtr, writeInfoPtr, &colorPalette, &alphaPalette);
-        png_set_filter(writePtr, 0, PNG_NO_FILTERS);
-    } else {
-        png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
-    }
-
-    if (ninePatch) {
-        writeNinePatch(writePtr, writeInfoPtr, ninePatch);
-    }
-
-    // Flush our updates to the header.
-    png_write_info(writePtr, writeInfoPtr);
-
-    // Write out each row of image data according to its encoding.
-    if (newColorType == PNG_COLOR_TYPE_PALETTE) {
-        // 1 byte/pixel.
-        auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width]);
-
-        for (int32_t y = 0; y < image->height; y++) {
-            png_const_bytep inRow = image->rows[y];
-            for (int32_t x = 0; x < image->width; x++) {
-                int rr = *inRow++;
-                int gg = *inRow++;
-                int bb = *inRow++;
-                int aa = *inRow++;
-                if (aa == 0) {
-                    // Zero out color channels when transparent.
-                    rr = gg = bb = 0;
-                }
-
-                const uint32_t color = rr << 24 | gg << 16 | bb << 8 | aa;
-                const int idx = colorPalette[color];
-                assert(idx != -1);
-                outRow[x] = static_cast<png_byte>(idx);
-            }
-            png_write_row(writePtr, outRow.get());
-        }
-    } else if (newColorType == PNG_COLOR_TYPE_GRAY || newColorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        const size_t bpp = newColorType == PNG_COLOR_TYPE_GRAY ? 1 : 2;
-        auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
-
-        for (int32_t y = 0; y < image->height; y++) {
-            png_const_bytep inRow = image->rows[y];
-            for (int32_t x = 0; x < image->width; x++) {
-                int rr = inRow[x * 4];
-                int gg = inRow[x * 4 + 1];
-                int bb = inRow[x * 4 + 2];
-                int aa = inRow[x * 4 + 3];
-                if (aa == 0) {
-                    // Zero out the gray channel when transparent.
-                    rr = gg = bb = 0;
-                }
-
-                if (grayScale) {
-                    // The image was already grayscale, red == green == blue.
-                    outRow[x * bpp] = inRow[x * 4];
-                } else {
-                    // The image is convertible to grayscale, use linear-luminance of
-                    // sRGB colorspace: https://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale
-                    outRow[x * bpp] = (png_byte) (rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
-                }
-
-                if (bpp == 2) {
-                    // Write out alpha if we have it.
-                    outRow[x * bpp + 1] = aa;
-                }
-            }
-            png_write_row(writePtr, outRow.get());
-        }
-    } else if (newColorType == PNG_COLOR_TYPE_RGB || newColorType == PNG_COLOR_TYPE_RGBA) {
-        const size_t bpp = newColorType == PNG_COLOR_TYPE_RGB ? 3 : 4;
-        if (needsToZeroRGBChannelsOfTransparentPixels) {
-            // The source RGBA data can't be used as-is, because we need to zero out the RGB
-            // values of transparent pixels.
-            auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
-
-            for (int32_t y = 0; y < image->height; y++) {
-                png_const_bytep inRow = image->rows[y];
-                for (int32_t x = 0; x < image->width; x++) {
-                    int rr = *inRow++;
-                    int gg = *inRow++;
-                    int bb = *inRow++;
-                    int aa = *inRow++;
-                    if (aa == 0) {
-                        // Zero out the RGB channels when transparent.
-                        rr = gg = bb = 0;
-                    }
-                    outRow[x * bpp] = rr;
-                    outRow[x * bpp + 1] = gg;
-                    outRow[x * bpp + 2] = bb;
-                    if (bpp == 4) {
-                        outRow[x * bpp + 3] = aa;
-                    }
-                }
-                png_write_row(writePtr, outRow.get());
-            }
+        if (grayScale) {
+          // The image was already grayscale, red == green == blue.
+          outRow[x * bpp] = inRow[x * 4];
         } else {
-            // The source image can be used as-is, just tell libpng whether or not to ignore
-            // the alpha channel.
-            if (newColorType == PNG_COLOR_TYPE_RGB) {
-                // Delete the extraneous alpha values that we appended to our buffer
-                // when reading the original values.
-                png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
-            }
-            png_write_image(writePtr, image->rows.get());
+          // The image is convertible to grayscale, use linear-luminance of
+          // sRGB colorspace:
+          // https://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale
+          outRow[x * bpp] =
+              (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
         }
-    } else {
-        assert(false && "unreachable");
-    }
 
-    png_write_end(writePtr, writeInfoPtr);
-    return true;
+        if (bpp == 2) {
+          // Write out alpha if we have it.
+          outRow[x * bpp + 1] = aa;
+        }
+      }
+      png_write_row(writePtr, outRow.get());
+    }
+  } else if (newColorType == PNG_COLOR_TYPE_RGB ||
+             newColorType == PNG_COLOR_TYPE_RGBA) {
+    const size_t bpp = newColorType == PNG_COLOR_TYPE_RGB ? 3 : 4;
+    if (needsToZeroRGBChannelsOfTransparentPixels) {
+      // The source RGBA data can't be used as-is, because we need to zero out
+      // the RGB
+      // values of transparent pixels.
+      auto outRow =
+          std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
+
+      for (int32_t y = 0; y < image->height; y++) {
+        png_const_bytep inRow = image->rows[y];
+        for (int32_t x = 0; x < image->width; x++) {
+          int rr = *inRow++;
+          int gg = *inRow++;
+          int bb = *inRow++;
+          int aa = *inRow++;
+          if (aa == 0) {
+            // Zero out the RGB channels when transparent.
+            rr = gg = bb = 0;
+          }
+          outRow[x * bpp] = rr;
+          outRow[x * bpp + 1] = gg;
+          outRow[x * bpp + 2] = bb;
+          if (bpp == 4) {
+            outRow[x * bpp + 3] = aa;
+          }
+        }
+        png_write_row(writePtr, outRow.get());
+      }
+    } else {
+      // The source image can be used as-is, just tell libpng whether or not to
+      // ignore
+      // the alpha channel.
+      if (newColorType == PNG_COLOR_TYPE_RGB) {
+        // Delete the extraneous alpha values that we appended to our buffer
+        // when reading the original values.
+        png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
+      }
+      png_write_image(writePtr, image->rows.get());
+    }
+  } else {
+    assert(false && "unreachable");
+  }
+
+  png_write_end(writePtr, writeInfoPtr);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/PseudolocaleGenerator.cpp b/tools/aapt2/compile/PseudolocaleGenerator.cpp
index 732101f..d8ed0bb 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator.cpp
+++ b/tools/aapt2/compile/PseudolocaleGenerator.cpp
@@ -14,235 +14,242 @@
  * limitations under the License.
  */
 
+#include "compile/PseudolocaleGenerator.h"
 #include "ResourceTable.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
-#include "compile/PseudolocaleGenerator.h"
 #include "compile/Pseudolocalizer.h"
 
 #include <algorithm>
 
 namespace aapt {
 
-std::unique_ptr<StyledString> pseudolocalizeStyledString(StyledString* string,
-                                                         Pseudolocalizer::Method method,
-                                                         StringPool* pool) {
-    Pseudolocalizer localizer(method);
+std::unique_ptr<StyledString> pseudolocalizeStyledString(
+    StyledString* string, Pseudolocalizer::Method method, StringPool* pool) {
+  Pseudolocalizer localizer(method);
 
-    const StringPiece originalText = *string->value->str;
+  const StringPiece originalText = *string->value->str;
 
-    StyleString localized;
+  StyleString localized;
 
-    // Copy the spans. We will update their offsets when we localize.
-    localized.spans.reserve(string->value->spans.size());
-    for (const StringPool::Span& span : string->value->spans) {
-        localized.spans.push_back(Span{ *span.name, span.firstChar, span.lastChar });
+  // Copy the spans. We will update their offsets when we localize.
+  localized.spans.reserve(string->value->spans.size());
+  for (const StringPool::Span& span : string->value->spans) {
+    localized.spans.push_back(Span{*span.name, span.firstChar, span.lastChar});
+  }
+
+  // The ranges are all represented with a single value. This is the start of
+  // one range and
+  // end of another.
+  struct Range {
+    size_t start;
+
+    // Once the new string is localized, these are the pointers to the spans to
+    // adjust.
+    // Since this struct represents the start of one range and end of another,
+    // we have
+    // the two pointers respectively.
+    uint32_t* updateStart;
+    uint32_t* updateEnd;
+  };
+
+  auto cmp = [](const Range& r, size_t index) -> bool {
+    return r.start < index;
+  };
+
+  // Construct the ranges. The ranges are represented like so: [0, 2, 5, 7]
+  // The ranges are the spaces in between. In this example, with a total string
+  // length of 9,
+  // the vector represents: (0,1], (2,4], (5,6], (7,9]
+  //
+  std::vector<Range> ranges;
+  ranges.push_back(Range{0});
+  ranges.push_back(Range{originalText.size() - 1});
+  for (size_t i = 0; i < string->value->spans.size(); i++) {
+    const StringPool::Span& span = string->value->spans[i];
+
+    // Insert or update the Range marker for the start of this span.
+    auto iter =
+        std::lower_bound(ranges.begin(), ranges.end(), span.firstChar, cmp);
+    if (iter != ranges.end() && iter->start == span.firstChar) {
+      iter->updateStart = &localized.spans[i].firstChar;
+    } else {
+      ranges.insert(
+          iter, Range{span.firstChar, &localized.spans[i].firstChar, nullptr});
     }
 
-    // The ranges are all represented with a single value. This is the start of one range and
-    // end of another.
-    struct Range {
-        size_t start;
+    // Insert or update the Range marker for the end of this span.
+    iter = std::lower_bound(ranges.begin(), ranges.end(), span.lastChar, cmp);
+    if (iter != ranges.end() && iter->start == span.lastChar) {
+      iter->updateEnd = &localized.spans[i].lastChar;
+    } else {
+      ranges.insert(
+          iter, Range{span.lastChar, nullptr, &localized.spans[i].lastChar});
+    }
+  }
 
-        // Once the new string is localized, these are the pointers to the spans to adjust.
-        // Since this struct represents the start of one range and end of another, we have
-        // the two pointers respectively.
-        uint32_t* updateStart;
-        uint32_t* updateEnd;
-    };
+  localized.str += localizer.start();
 
-    auto cmp = [](const Range& r, size_t index) -> bool {
-        return r.start < index;
-    };
-
-    // Construct the ranges. The ranges are represented like so: [0, 2, 5, 7]
-    // The ranges are the spaces in between. In this example, with a total string length of 9,
-    // the vector represents: (0,1], (2,4], (5,6], (7,9]
-    //
-    std::vector<Range> ranges;
-    ranges.push_back(Range{ 0 });
-    ranges.push_back(Range{ originalText.size() - 1 });
-    for (size_t i = 0; i < string->value->spans.size(); i++) {
-        const StringPool::Span& span = string->value->spans[i];
-
-        // Insert or update the Range marker for the start of this span.
-        auto iter = std::lower_bound(ranges.begin(), ranges.end(), span.firstChar, cmp);
-        if (iter != ranges.end() && iter->start == span.firstChar) {
-            iter->updateStart = &localized.spans[i].firstChar;
-        } else {
-            ranges.insert(iter,
-                          Range{ span.firstChar, &localized.spans[i].firstChar, nullptr });
-        }
-
-        // Insert or update the Range marker for the end of this span.
-        iter = std::lower_bound(ranges.begin(), ranges.end(), span.lastChar, cmp);
-        if (iter != ranges.end() && iter->start == span.lastChar) {
-            iter->updateEnd = &localized.spans[i].lastChar;
-        } else {
-            ranges.insert(iter,
-                          Range{ span.lastChar, nullptr, &localized.spans[i].lastChar });
-        }
+  // Iterate over the ranges and localize each section.
+  for (size_t i = 0; i < ranges.size(); i++) {
+    const size_t start = ranges[i].start;
+    size_t len = originalText.size() - start;
+    if (i + 1 < ranges.size()) {
+      len = ranges[i + 1].start - start;
     }
 
-    localized.str += localizer.start();
-
-    // Iterate over the ranges and localize each section.
-    for (size_t i = 0; i < ranges.size(); i++) {
-        const size_t start = ranges[i].start;
-        size_t len = originalText.size() - start;
-        if (i + 1 < ranges.size()) {
-            len = ranges[i + 1].start - start;
-        }
-
-        if (ranges[i].updateStart) {
-            *ranges[i].updateStart = localized.str.size();
-        }
-
-        if (ranges[i].updateEnd) {
-            *ranges[i].updateEnd = localized.str.size();
-        }
-
-        localized.str += localizer.text(originalText.substr(start, len));
+    if (ranges[i].updateStart) {
+      *ranges[i].updateStart = localized.str.size();
     }
 
-    localized.str += localizer.end();
+    if (ranges[i].updateEnd) {
+      *ranges[i].updateEnd = localized.str.size();
+    }
 
-    std::unique_ptr<StyledString> localizedString = util::make_unique<StyledString>(
-            pool->makeRef(localized));
-    localizedString->setSource(string->getSource());
-    return localizedString;
+    localized.str += localizer.text(originalText.substr(start, len));
+  }
+
+  localized.str += localizer.end();
+
+  std::unique_ptr<StyledString> localizedString =
+      util::make_unique<StyledString>(pool->makeRef(localized));
+  localizedString->setSource(string->getSource());
+  return localizedString;
 }
 
 namespace {
 
 struct Visitor : public RawValueVisitor {
-    StringPool* mPool;
-    Pseudolocalizer::Method mMethod;
-    Pseudolocalizer mLocalizer;
+  StringPool* mPool;
+  Pseudolocalizer::Method mMethod;
+  Pseudolocalizer mLocalizer;
 
-    // Either value or item will be populated upon visiting the value.
-    std::unique_ptr<Value> mValue;
-    std::unique_ptr<Item> mItem;
+  // Either value or item will be populated upon visiting the value.
+  std::unique_ptr<Value> mValue;
+  std::unique_ptr<Item> mItem;
 
-    Visitor(StringPool* pool, Pseudolocalizer::Method method) :
-            mPool(pool), mMethod(method), mLocalizer(method) {
-    }
+  Visitor(StringPool* pool, Pseudolocalizer::Method method)
+      : mPool(pool), mMethod(method), mLocalizer(method) {}
 
-    void visit(Plural* plural) override {
-        std::unique_ptr<Plural> localized = util::make_unique<Plural>();
-        for (size_t i = 0; i < plural->values.size(); i++) {
-            Visitor subVisitor(mPool, mMethod);
-            if (plural->values[i]) {
-                plural->values[i]->accept(&subVisitor);
-                if (subVisitor.mValue) {
-                    localized->values[i] = std::move(subVisitor.mItem);
-                } else {
-                    localized->values[i] = std::unique_ptr<Item>(plural->values[i]->clone(mPool));
-                }
-            }
+  void visit(Plural* plural) override {
+    std::unique_ptr<Plural> localized = util::make_unique<Plural>();
+    for (size_t i = 0; i < plural->values.size(); i++) {
+      Visitor subVisitor(mPool, mMethod);
+      if (plural->values[i]) {
+        plural->values[i]->accept(&subVisitor);
+        if (subVisitor.mValue) {
+          localized->values[i] = std::move(subVisitor.mItem);
+        } else {
+          localized->values[i] =
+              std::unique_ptr<Item>(plural->values[i]->clone(mPool));
         }
-        localized->setSource(plural->getSource());
-        localized->setWeak(true);
-        mValue = std::move(localized);
+      }
     }
+    localized->setSource(plural->getSource());
+    localized->setWeak(true);
+    mValue = std::move(localized);
+  }
 
-    void visit(String* string) override {
-        std::string result = mLocalizer.start() + mLocalizer.text(*string->value) +
-                mLocalizer.end();
-        std::unique_ptr<String> localized = util::make_unique<String>(mPool->makeRef(result));
-        localized->setSource(string->getSource());
-        localized->setWeak(true);
-        mItem = std::move(localized);
-    }
+  void visit(String* string) override {
+    std::string result =
+        mLocalizer.start() + mLocalizer.text(*string->value) + mLocalizer.end();
+    std::unique_ptr<String> localized =
+        util::make_unique<String>(mPool->makeRef(result));
+    localized->setSource(string->getSource());
+    localized->setWeak(true);
+    mItem = std::move(localized);
+  }
 
-    void visit(StyledString* string) override {
-        mItem = pseudolocalizeStyledString(string, mMethod, mPool);
-        mItem->setWeak(true);
-    }
+  void visit(StyledString* string) override {
+    mItem = pseudolocalizeStyledString(string, mMethod, mPool);
+    mItem->setWeak(true);
+  }
 };
 
 ConfigDescription modifyConfigForPseudoLocale(const ConfigDescription& base,
                                               Pseudolocalizer::Method m) {
-    ConfigDescription modified = base;
-    switch (m) {
+  ConfigDescription modified = base;
+  switch (m) {
     case Pseudolocalizer::Method::kAccent:
-        modified.language[0] = 'e';
-        modified.language[1] = 'n';
-        modified.country[0] = 'X';
-        modified.country[1] = 'A';
-        break;
+      modified.language[0] = 'e';
+      modified.language[1] = 'n';
+      modified.country[0] = 'X';
+      modified.country[1] = 'A';
+      break;
 
     case Pseudolocalizer::Method::kBidi:
-        modified.language[0] = 'a';
-        modified.language[1] = 'r';
-        modified.country[0] = 'X';
-        modified.country[1] = 'B';
-        break;
+      modified.language[0] = 'a';
+      modified.language[1] = 'r';
+      modified.country[0] = 'X';
+      modified.country[1] = 'B';
+      break;
     default:
-        break;
-    }
-    return modified;
+      break;
+  }
+  return modified;
 }
 
 void pseudolocalizeIfNeeded(const Pseudolocalizer::Method method,
                             ResourceConfigValue* originalValue,
-                            StringPool* pool,
-                            ResourceEntry* entry) {
-    Visitor visitor(pool, method);
-    originalValue->value->accept(&visitor);
+                            StringPool* pool, ResourceEntry* entry) {
+  Visitor visitor(pool, method);
+  originalValue->value->accept(&visitor);
 
-    std::unique_ptr<Value> localizedValue;
-    if (visitor.mValue) {
-        localizedValue = std::move(visitor.mValue);
-    } else if (visitor.mItem) {
-        localizedValue = std::move(visitor.mItem);
-    }
+  std::unique_ptr<Value> localizedValue;
+  if (visitor.mValue) {
+    localizedValue = std::move(visitor.mValue);
+  } else if (visitor.mItem) {
+    localizedValue = std::move(visitor.mItem);
+  }
 
-    if (!localizedValue) {
-        return;
-    }
+  if (!localizedValue) {
+    return;
+  }
 
-    ConfigDescription configWithAccent = modifyConfigForPseudoLocale(
-            originalValue->config, method);
+  ConfigDescription configWithAccent =
+      modifyConfigForPseudoLocale(originalValue->config, method);
 
-    ResourceConfigValue* newConfigValue = entry->findOrCreateValue(
-            configWithAccent, originalValue->product);
-    if (!newConfigValue->value) {
-        // Only use auto-generated pseudo-localization if none is defined.
-        newConfigValue->value = std::move(localizedValue);
-    }
+  ResourceConfigValue* newConfigValue =
+      entry->findOrCreateValue(configWithAccent, originalValue->product);
+  if (!newConfigValue->value) {
+    // Only use auto-generated pseudo-localization if none is defined.
+    newConfigValue->value = std::move(localizedValue);
+  }
 }
 
 /**
- * A value is pseudolocalizable if it does not define a locale (or is the default locale)
+ * A value is pseudolocalizable if it does not define a locale (or is the
+ * default locale)
  * and is translateable.
  */
 static bool isPseudolocalizable(ResourceConfigValue* configValue) {
-    const int diff = configValue->config.diff(ConfigDescription::defaultConfig());
-    if (diff & ConfigDescription::CONFIG_LOCALE) {
-        return false;
-    }
-    return configValue->value->isTranslateable();
+  const int diff = configValue->config.diff(ConfigDescription::defaultConfig());
+  if (diff & ConfigDescription::CONFIG_LOCALE) {
+    return false;
+  }
+  return configValue->value->isTranslateable();
 }
 
-} // namespace
+}  // namespace
 
-bool PseudolocaleGenerator::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                std::vector<ResourceConfigValue*> values = entry->findValuesIf(isPseudolocalizable);
+bool PseudolocaleGenerator::consume(IAaptContext* context,
+                                    ResourceTable* table) {
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        std::vector<ResourceConfigValue*> values =
+            entry->findValuesIf(isPseudolocalizable);
 
-                for (ResourceConfigValue* value : values) {
-                    pseudolocalizeIfNeeded(Pseudolocalizer::Method::kAccent, value,
-                                           &table->stringPool, entry.get());
-                    pseudolocalizeIfNeeded(Pseudolocalizer::Method::kBidi, value,
-                                           &table->stringPool, entry.get());
-                }
-            }
+        for (ResourceConfigValue* value : values) {
+          pseudolocalizeIfNeeded(Pseudolocalizer::Method::kAccent, value,
+                                 &table->stringPool, entry.get());
+          pseudolocalizeIfNeeded(Pseudolocalizer::Method::kBidi, value,
+                                 &table->stringPool, entry.get());
         }
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/PseudolocaleGenerator.h b/tools/aapt2/compile/PseudolocaleGenerator.h
index 4fbc516..4e97cb9 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator.h
+++ b/tools/aapt2/compile/PseudolocaleGenerator.h
@@ -23,14 +23,13 @@
 
 namespace aapt {
 
-std::unique_ptr<StyledString> pseudolocalizeStyledString(StyledString* string,
-                                                         Pseudolocalizer::Method method,
-                                                         StringPool* pool);
+std::unique_ptr<StyledString> pseudolocalizeStyledString(
+    StyledString* string, Pseudolocalizer::Method method, StringPool* pool);
 
 struct PseudolocaleGenerator : public IResourceTableConsumer {
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_PSEUDOLOCALEGENERATOR_H */
diff --git a/tools/aapt2/compile/PseudolocaleGenerator_test.cpp b/tools/aapt2/compile/PseudolocaleGenerator_test.cpp
index 1f62f90..64a3e97 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator_test.cpp
+++ b/tools/aapt2/compile/PseudolocaleGenerator_test.cpp
@@ -23,99 +23,110 @@
 namespace aapt {
 
 TEST(PseudolocaleGeneratorTest, PseudolocalizeStyledString) {
-    StringPool pool;
-    StyleString originalStyle;
-    originalStyle.str = "Hello world!";
-    originalStyle.spans = { Span{ "b", 2, 3 }, Span{ "b", 6, 7 }, Span{ "i", 1, 10 } };
+  StringPool pool;
+  StyleString originalStyle;
+  originalStyle.str = "Hello world!";
+  originalStyle.spans = {Span{"b", 2, 3}, Span{"b", 6, 7}, Span{"i", 1, 10}};
 
-    std::unique_ptr<StyledString> newString = pseudolocalizeStyledString(
-            util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
-            Pseudolocalizer::Method::kNone, &pool);
+  std::unique_ptr<StyledString> newString = pseudolocalizeStyledString(
+      util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
+      Pseudolocalizer::Method::kNone, &pool);
 
-    EXPECT_EQ(originalStyle.str, *newString->value->str);
-    ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
+  EXPECT_EQ(originalStyle.str, *newString->value->str);
+  ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
 
-    EXPECT_EQ(std::string("He").size(), newString->value->spans[0].firstChar);
-    EXPECT_EQ(std::string("Hel").size(), newString->value->spans[0].lastChar);
-    EXPECT_EQ(std::string("b"), *newString->value->spans[0].name);
+  EXPECT_EQ(std::string("He").size(), newString->value->spans[0].firstChar);
+  EXPECT_EQ(std::string("Hel").size(), newString->value->spans[0].lastChar);
+  EXPECT_EQ(std::string("b"), *newString->value->spans[0].name);
 
-    EXPECT_EQ(std::string("Hello ").size(), newString->value->spans[1].firstChar);
-    EXPECT_EQ(std::string("Hello w").size(), newString->value->spans[1].lastChar);
-    EXPECT_EQ(std::string("b"), *newString->value->spans[1].name);
+  EXPECT_EQ(std::string("Hello ").size(), newString->value->spans[1].firstChar);
+  EXPECT_EQ(std::string("Hello w").size(), newString->value->spans[1].lastChar);
+  EXPECT_EQ(std::string("b"), *newString->value->spans[1].name);
 
-    EXPECT_EQ(std::string("H").size(), newString->value->spans[2].firstChar);
-    EXPECT_EQ(std::string("Hello worl").size(), newString->value->spans[2].lastChar);
-    EXPECT_EQ(std::string("i"), *newString->value->spans[2].name);
+  EXPECT_EQ(std::string("H").size(), newString->value->spans[2].firstChar);
+  EXPECT_EQ(std::string("Hello worl").size(),
+            newString->value->spans[2].lastChar);
+  EXPECT_EQ(std::string("i"), *newString->value->spans[2].name);
 
-    originalStyle.spans.push_back(Span{ "em", 0, 11u });
+  originalStyle.spans.push_back(Span{"em", 0, 11u});
 
-    newString = pseudolocalizeStyledString(
-            util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
-            Pseudolocalizer::Method::kAccent, &pool);
+  newString = pseudolocalizeStyledString(
+      util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
+      Pseudolocalizer::Method::kAccent, &pool);
 
-    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð¡ one two]"), *newString->value->str);
-    ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
+  EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð¡ one two]"), *newString->value->str);
+  ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
 
-    EXPECT_EQ(std::string("[Ĥé").size(), newString->value->spans[0].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļ").size(), newString->value->spans[0].lastChar);
+  EXPECT_EQ(std::string("[Ĥé").size(), newString->value->spans[0].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļ").size(), newString->value->spans[0].lastChar);
 
-    EXPECT_EQ(std::string("[Ĥéļļö ").size(), newString->value->spans[1].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļļö ŵ").size(), newString->value->spans[1].lastChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ").size(),
+            newString->value->spans[1].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ŵ").size(),
+            newString->value->spans[1].lastChar);
 
-    EXPECT_EQ(std::string("[Ĥ").size(), newString->value->spans[2].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļ").size(), newString->value->spans[2].lastChar);
+  EXPECT_EQ(std::string("[Ĥ").size(), newString->value->spans[2].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļ").size(),
+            newString->value->spans[2].lastChar);
 
-    EXPECT_EQ(std::string("[").size(), newString->value->spans[3].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð").size(), newString->value->spans[3].lastChar);
+  EXPECT_EQ(std::string("[").size(), newString->value->spans[3].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð").size(),
+            newString->value->spans[3].lastChar);
 }
 
 TEST(PseudolocaleGeneratorTest, PseudolocalizeOnlyDefaultConfigs) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addString("android:string/one", "one")
-            .addString("android:string/two", ResourceId{}, test::parseConfigOrDie("en"), "two")
-            .addString("android:string/three", "three")
-            .addString("android:string/three", ResourceId{}, test::parseConfigOrDie("en-rXA"),
-                       "three")
-            .addString("android:string/four", "four")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addString("android:string/one", "one")
+          .addString("android:string/two", ResourceId{},
+                     test::parseConfigOrDie("en"), "two")
+          .addString("android:string/three", "three")
+          .addString("android:string/three", ResourceId{},
+                     test::parseConfigOrDie("en-rXA"), "three")
+          .addString("android:string/four", "four")
+          .build();
 
-    String* val = test::getValue<String>(table.get(), "android:string/four");
-    ASSERT_NE(nullptr, val);
-    val->setTranslateable(false);
+  String* val = test::getValue<String>(table.get(), "android:string/four");
+  ASSERT_NE(nullptr, val);
+  val->setTranslateable(false);
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    PseudolocaleGenerator generator;
-    ASSERT_TRUE(generator.consume(context.get(), table.get()));
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  PseudolocaleGenerator generator;
+  ASSERT_TRUE(generator.consume(context.get(), table.get()));
 
-    // Normal pseudolocalization should take place.
-    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "android:string/one",
-                                                       test::parseConfigOrDie("en-rXA")));
-    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "android:string/one",
-                                                       test::parseConfigOrDie("ar-rXB")));
+  // Normal pseudolocalization should take place.
+  ASSERT_NE(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/one",
+                                            test::parseConfigOrDie("en-rXA")));
+  ASSERT_NE(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/one",
+                                            test::parseConfigOrDie("ar-rXB")));
 
-    // No default config for android:string/two, so no pseudlocales should exist.
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/two",
-                                                       test::parseConfigOrDie("en-rXA")));
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/two",
-                                                       test::parseConfigOrDie("ar-rXB")));
+  // No default config for android:string/two, so no pseudlocales should exist.
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/two",
+                                            test::parseConfigOrDie("en-rXA")));
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/two",
+                                            test::parseConfigOrDie("ar-rXB")));
 
+  // Check that we didn't override manual pseudolocalization.
+  val = test::getValueForConfig<String>(table.get(), "android:string/three",
+                                        test::parseConfigOrDie("en-rXA"));
+  ASSERT_NE(nullptr, val);
+  EXPECT_EQ(std::string("three"), *val->value);
 
-    // Check that we didn't override manual pseudolocalization.
-    val = test::getValueForConfig<String>(table.get(), "android:string/three",
-                                          test::parseConfigOrDie("en-rXA"));
-    ASSERT_NE(nullptr, val);
-    EXPECT_EQ(std::string("three"), *val->value);
+  ASSERT_NE(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/three",
+                                            test::parseConfigOrDie("ar-rXB")));
 
-    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "android:string/three",
-                                                       test::parseConfigOrDie("ar-rXB")));
-
-    // Check that four's translateable marker was honored.
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/four",
-                                                       test::parseConfigOrDie("en-rXA")));
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/four",
-                                                       test::parseConfigOrDie("ar-rXB")));
-
+  // Check that four's translateable marker was honored.
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/four",
+                                            test::parseConfigOrDie("en-rXA")));
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/four",
+                                            test::parseConfigOrDie("ar-rXB")));
 }
 
-} // namespace aapt
-
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Pseudolocalizer.cpp b/tools/aapt2/compile/Pseudolocalizer.cpp
index 90d0d85..c3aec98 100644
--- a/tools/aapt2/compile/Pseudolocalizer.cpp
+++ b/tools/aapt2/compile/Pseudolocalizer.cpp
@@ -20,9 +20,10 @@
 namespace aapt {
 
 // String basis to generate expansion
-static const std::string k_expansion_string = "one two three "
-        "four five six seven eight nine ten eleven twelve thirteen "
-        "fourteen fiveteen sixteen seventeen nineteen twenty";
+static const std::string k_expansion_string =
+    "one two three "
+    "four five six seven eight nine ten eleven twelve thirteen "
+    "fourteen fiveteen sixteen seventeen nineteen twenty";
 
 // Special unicode characters to override directionality of the words
 static const std::string k_rlm = "\u200f";
@@ -37,229 +38,310 @@
 static const char k_arg_end = '}';
 
 class PseudoMethodNone : public PseudoMethodImpl {
-public:
-    std::string text(const StringPiece& text) override { return text.toString(); }
-    std::string placeholder(const StringPiece& text) override { return text.toString(); }
+ public:
+  std::string text(const StringPiece& text) override { return text.toString(); }
+  std::string placeholder(const StringPiece& text) override {
+    return text.toString();
+  }
 };
 
 class PseudoMethodBidi : public PseudoMethodImpl {
-public:
-    std::string text(const StringPiece& text) override;
-    std::string placeholder(const StringPiece& text) override;
+ public:
+  std::string text(const StringPiece& text) override;
+  std::string placeholder(const StringPiece& text) override;
 };
 
 class PseudoMethodAccent : public PseudoMethodImpl {
-public:
-    PseudoMethodAccent() : mDepth(0), mWordCount(0), mLength(0) {}
-    std::string start() override;
-    std::string end() override;
-    std::string text(const StringPiece& text) override;
-    std::string placeholder(const StringPiece& text) override;
-private:
-    size_t mDepth;
-    size_t mWordCount;
-    size_t mLength;
+ public:
+  PseudoMethodAccent() : mDepth(0), mWordCount(0), mLength(0) {}
+  std::string start() override;
+  std::string end() override;
+  std::string text(const StringPiece& text) override;
+  std::string placeholder(const StringPiece& text) override;
+
+ private:
+  size_t mDepth;
+  size_t mWordCount;
+  size_t mLength;
 };
 
 Pseudolocalizer::Pseudolocalizer(Method method) : mLastDepth(0) {
-    setMethod(method);
+  setMethod(method);
 }
 
 void Pseudolocalizer::setMethod(Method method) {
-    switch (method) {
+  switch (method) {
     case Method::kNone:
-        mImpl = util::make_unique<PseudoMethodNone>();
-        break;
+      mImpl = util::make_unique<PseudoMethodNone>();
+      break;
     case Method::kAccent:
-        mImpl = util::make_unique<PseudoMethodAccent>();
-        break;
+      mImpl = util::make_unique<PseudoMethodAccent>();
+      break;
     case Method::kBidi:
-        mImpl = util::make_unique<PseudoMethodBidi>();
-        break;
-    }
+      mImpl = util::make_unique<PseudoMethodBidi>();
+      break;
+  }
 }
 
 std::string Pseudolocalizer::text(const StringPiece& text) {
-    std::string out;
-    size_t depth = mLastDepth;
-    size_t lastpos, pos;
-    const size_t length = text.size();
-    const char* str = text.data();
-    bool escaped = false;
-    for (lastpos = pos = 0; pos < length; pos++) {
-        char16_t c = str[pos];
-        if (escaped) {
-            escaped = false;
-            continue;
-        }
-        if (c == '\'') {
-            escaped = true;
-            continue;
-        }
-
-        if (c == k_arg_start) {
-            depth++;
-        } else if (c == k_arg_end && depth) {
-            depth--;
-        }
-
-        if (mLastDepth != depth || pos == length - 1) {
-            bool pseudo = ((mLastDepth % 2) == 0);
-            size_t nextpos = pos;
-            if (!pseudo || depth == mLastDepth) {
-                nextpos++;
-            }
-            size_t size = nextpos - lastpos;
-            if (size) {
-                std::string chunk = text.substr(lastpos, size).toString();
-                if (pseudo) {
-                    chunk = mImpl->text(chunk);
-                } else if (str[lastpos] == k_arg_start && str[nextpos - 1] == k_arg_end) {
-                    chunk = mImpl->placeholder(chunk);
-                }
-                out.append(chunk);
-            }
-            if (pseudo && depth < mLastDepth) { // End of message
-                out.append(mImpl->end());
-            } else if (!pseudo && depth > mLastDepth) { // Start of message
-                out.append(mImpl->start());
-            }
-            lastpos = nextpos;
-            mLastDepth = depth;
-        }
+  std::string out;
+  size_t depth = mLastDepth;
+  size_t lastpos, pos;
+  const size_t length = text.size();
+  const char* str = text.data();
+  bool escaped = false;
+  for (lastpos = pos = 0; pos < length; pos++) {
+    char16_t c = str[pos];
+    if (escaped) {
+      escaped = false;
+      continue;
     }
-    return out;
+    if (c == '\'') {
+      escaped = true;
+      continue;
+    }
+
+    if (c == k_arg_start) {
+      depth++;
+    } else if (c == k_arg_end && depth) {
+      depth--;
+    }
+
+    if (mLastDepth != depth || pos == length - 1) {
+      bool pseudo = ((mLastDepth % 2) == 0);
+      size_t nextpos = pos;
+      if (!pseudo || depth == mLastDepth) {
+        nextpos++;
+      }
+      size_t size = nextpos - lastpos;
+      if (size) {
+        std::string chunk = text.substr(lastpos, size).toString();
+        if (pseudo) {
+          chunk = mImpl->text(chunk);
+        } else if (str[lastpos] == k_arg_start &&
+                   str[nextpos - 1] == k_arg_end) {
+          chunk = mImpl->placeholder(chunk);
+        }
+        out.append(chunk);
+      }
+      if (pseudo && depth < mLastDepth) {  // End of message
+        out.append(mImpl->end());
+      } else if (!pseudo && depth > mLastDepth) {  // Start of message
+        out.append(mImpl->start());
+      }
+      lastpos = nextpos;
+      mLastDepth = depth;
+    }
+  }
+  return out;
 }
 
 static const char* pseudolocalizeChar(const char c) {
-    switch (c) {
-        case 'a':   return "\u00e5";
-        case 'b':   return "\u0253";
-        case 'c':   return "\u00e7";
-        case 'd':   return "\u00f0";
-        case 'e':   return "\u00e9";
-        case 'f':   return "\u0192";
-        case 'g':   return "\u011d";
-        case 'h':   return "\u0125";
-        case 'i':   return "\u00ee";
-        case 'j':   return "\u0135";
-        case 'k':   return "\u0137";
-        case 'l':   return "\u013c";
-        case 'm':   return "\u1e3f";
-        case 'n':   return "\u00f1";
-        case 'o':   return "\u00f6";
-        case 'p':   return "\u00fe";
-        case 'q':   return "\u0051";
-        case 'r':   return "\u0155";
-        case 's':   return "\u0161";
-        case 't':   return "\u0163";
-        case 'u':   return "\u00fb";
-        case 'v':   return "\u0056";
-        case 'w':   return "\u0175";
-        case 'x':   return "\u0445";
-        case 'y':   return "\u00fd";
-        case 'z':   return "\u017e";
-        case 'A':   return "\u00c5";
-        case 'B':   return "\u03b2";
-        case 'C':   return "\u00c7";
-        case 'D':   return "\u00d0";
-        case 'E':   return "\u00c9";
-        case 'G':   return "\u011c";
-        case 'H':   return "\u0124";
-        case 'I':   return "\u00ce";
-        case 'J':   return "\u0134";
-        case 'K':   return "\u0136";
-        case 'L':   return "\u013b";
-        case 'M':   return "\u1e3e";
-        case 'N':   return "\u00d1";
-        case 'O':   return "\u00d6";
-        case 'P':   return "\u00de";
-        case 'Q':   return "\u0071";
-        case 'R':   return "\u0154";
-        case 'S':   return "\u0160";
-        case 'T':   return "\u0162";
-        case 'U':   return "\u00db";
-        case 'V':   return "\u03bd";
-        case 'W':   return "\u0174";
-        case 'X':   return "\u00d7";
-        case 'Y':   return "\u00dd";
-        case 'Z':   return "\u017d";
-        case '!':   return "\u00a1";
-        case '?':   return "\u00bf";
-        case '$':   return "\u20ac";
-        default:    return nullptr;
-    }
+  switch (c) {
+    case 'a':
+      return "\u00e5";
+    case 'b':
+      return "\u0253";
+    case 'c':
+      return "\u00e7";
+    case 'd':
+      return "\u00f0";
+    case 'e':
+      return "\u00e9";
+    case 'f':
+      return "\u0192";
+    case 'g':
+      return "\u011d";
+    case 'h':
+      return "\u0125";
+    case 'i':
+      return "\u00ee";
+    case 'j':
+      return "\u0135";
+    case 'k':
+      return "\u0137";
+    case 'l':
+      return "\u013c";
+    case 'm':
+      return "\u1e3f";
+    case 'n':
+      return "\u00f1";
+    case 'o':
+      return "\u00f6";
+    case 'p':
+      return "\u00fe";
+    case 'q':
+      return "\u0051";
+    case 'r':
+      return "\u0155";
+    case 's':
+      return "\u0161";
+    case 't':
+      return "\u0163";
+    case 'u':
+      return "\u00fb";
+    case 'v':
+      return "\u0056";
+    case 'w':
+      return "\u0175";
+    case 'x':
+      return "\u0445";
+    case 'y':
+      return "\u00fd";
+    case 'z':
+      return "\u017e";
+    case 'A':
+      return "\u00c5";
+    case 'B':
+      return "\u03b2";
+    case 'C':
+      return "\u00c7";
+    case 'D':
+      return "\u00d0";
+    case 'E':
+      return "\u00c9";
+    case 'G':
+      return "\u011c";
+    case 'H':
+      return "\u0124";
+    case 'I':
+      return "\u00ce";
+    case 'J':
+      return "\u0134";
+    case 'K':
+      return "\u0136";
+    case 'L':
+      return "\u013b";
+    case 'M':
+      return "\u1e3e";
+    case 'N':
+      return "\u00d1";
+    case 'O':
+      return "\u00d6";
+    case 'P':
+      return "\u00de";
+    case 'Q':
+      return "\u0071";
+    case 'R':
+      return "\u0154";
+    case 'S':
+      return "\u0160";
+    case 'T':
+      return "\u0162";
+    case 'U':
+      return "\u00db";
+    case 'V':
+      return "\u03bd";
+    case 'W':
+      return "\u0174";
+    case 'X':
+      return "\u00d7";
+    case 'Y':
+      return "\u00dd";
+    case 'Z':
+      return "\u017d";
+    case '!':
+      return "\u00a1";
+    case '?':
+      return "\u00bf";
+    case '$':
+      return "\u20ac";
+    default:
+      return nullptr;
+  }
 }
 
 static bool isPossibleNormalPlaceholderEnd(const char c) {
-    switch (c) {
-        case 's': return true;
-        case 'S': return true;
-        case 'c': return true;
-        case 'C': return true;
-        case 'd': return true;
-        case 'o': return true;
-        case 'x': return true;
-        case 'X': return true;
-        case 'f': return true;
-        case 'e': return true;
-        case 'E': return true;
-        case 'g': return true;
-        case 'G': return true;
-        case 'a': return true;
-        case 'A': return true;
-        case 'b': return true;
-        case 'B': return true;
-        case 'h': return true;
-        case 'H': return true;
-        case '%': return true;
-        case 'n': return true;
-        default:  return false;
-    }
+  switch (c) {
+    case 's':
+      return true;
+    case 'S':
+      return true;
+    case 'c':
+      return true;
+    case 'C':
+      return true;
+    case 'd':
+      return true;
+    case 'o':
+      return true;
+    case 'x':
+      return true;
+    case 'X':
+      return true;
+    case 'f':
+      return true;
+    case 'e':
+      return true;
+    case 'E':
+      return true;
+    case 'g':
+      return true;
+    case 'G':
+      return true;
+    case 'a':
+      return true;
+    case 'A':
+      return true;
+    case 'b':
+      return true;
+    case 'B':
+      return true;
+    case 'h':
+      return true;
+    case 'H':
+      return true;
+    case '%':
+      return true;
+    case 'n':
+      return true;
+    default:
+      return false;
+  }
 }
 
 static std::string pseudoGenerateExpansion(const unsigned int length) {
-    std::string result = k_expansion_string;
-    const char* s = result.data();
-    if (result.size() < length) {
-        result += " ";
-        result += pseudoGenerateExpansion(length - result.size());
-    } else {
-        int ext = 0;
-        // Should contain only whole words, so looking for a space
-        for (unsigned int i = length + 1; i < result.size(); ++i) {
-            ++ext;
-            if (s[i] == ' ') {
-                break;
-            }
-        }
-        result = result.substr(0, length + ext);
+  std::string result = k_expansion_string;
+  const char* s = result.data();
+  if (result.size() < length) {
+    result += " ";
+    result += pseudoGenerateExpansion(length - result.size());
+  } else {
+    int ext = 0;
+    // Should contain only whole words, so looking for a space
+    for (unsigned int i = length + 1; i < result.size(); ++i) {
+      ++ext;
+      if (s[i] == ' ') {
+        break;
+      }
     }
-    return result;
+    result = result.substr(0, length + ext);
+  }
+  return result;
 }
 
 std::string PseudoMethodAccent::start() {
-    std::string result;
-    if (mDepth == 0) {
-        result = "[";
-    }
-    mWordCount = mLength = 0;
-    mDepth++;
-    return result;
+  std::string result;
+  if (mDepth == 0) {
+    result = "[";
+  }
+  mWordCount = mLength = 0;
+  mDepth++;
+  return result;
 }
 
 std::string PseudoMethodAccent::end() {
-    std::string result;
-    if (mLength) {
-        result += " ";
-        result += pseudoGenerateExpansion(mWordCount > 3 ? mLength : mLength / 2);
-    }
-    mWordCount = mLength = 0;
-    mDepth--;
-    if (mDepth == 0) {
-        result += "]";
-    }
-    return result;
+  std::string result;
+  if (mLength) {
+    result += " ";
+    result += pseudoGenerateExpansion(mWordCount > 3 ? mLength : mLength / 2);
+  }
+  mWordCount = mLength = 0;
+  mDepth--;
+  if (mDepth == 0) {
+    result += "]";
+  }
+  return result;
 }
 
 /**
@@ -267,128 +349,125 @@
  *
  * Note: This leaves placeholder syntax untouched.
  */
-std::string PseudoMethodAccent::text(const StringPiece& source)
-{
-    const char* s = source.data();
-    std::string result;
-    const size_t I = source.size();
-    bool lastspace = true;
-    for (size_t i = 0; i < I; i++) {
-        char c = s[i];
-        if (c == '%') {
-            // Placeholder syntax, no need to pseudolocalize
-            std::string chunk;
-            bool end = false;
-            chunk.append(&c, 1);
-            while (!end && i + 1 < I) {
-                ++i;
-                c = s[i];
-                chunk.append(&c, 1);
-                if (isPossibleNormalPlaceholderEnd(c)) {
-                    end = true;
-                } else if (i + 1 < I && c == 't') {
-                    ++i;
-                    c = s[i];
-                    chunk.append(&c, 1);
-                    end = true;
-                }
-            }
-            // Treat chunk as a placeholder unless it ends with %.
-            result += ((c == '%') ? chunk : placeholder(chunk));
-        } else if (c == '<' || c == '&') {
-            // html syntax, no need to pseudolocalize
-            bool tag_closed = false;
-            while (!tag_closed && i < I) {
-                if (c == '&') {
-                    std::string escapeText;
-                    escapeText.append(&c, 1);
-                    bool end = false;
-                    size_t htmlCodePos = i;
-                    while (!end && htmlCodePos < I) {
-                        ++htmlCodePos;
-                        c = s[htmlCodePos];
-                        escapeText.append(&c, 1);
-                        // Valid html code
-                        if (c == ';') {
-                            end = true;
-                            i = htmlCodePos;
-                        }
-                        // Wrong html code
-                        else if (!((c == '#' ||
-                                 (c >= 'a' && c <= 'z') ||
-                                 (c >= 'A' && c <= 'Z') ||
-                                 (c >= '0' && c <= '9')))) {
-                            end = true;
-                        }
-                    }
-                    result += escapeText;
-                    if (escapeText != "&lt;") {
-                        tag_closed = true;
-                    }
-                    continue;
-                }
-                if (c == '>') {
-                    tag_closed = true;
-                    result.append(&c, 1);
-                    continue;
-                }
-                result.append(&c, 1);
-                i++;
-                c = s[i];
-            }
-        } else {
-            // This is a pure text that should be pseudolocalized
-            const char* p = pseudolocalizeChar(c);
-            if (p != nullptr) {
-                result += p;
-            } else {
-                bool space = isspace(c);
-                if (lastspace && !space) {
-                    mWordCount++;
-                }
-                lastspace = space;
-                result.append(&c, 1);
-            }
-            // Count only pseudolocalizable chars and delimiters
-            mLength++;
+std::string PseudoMethodAccent::text(const StringPiece& source) {
+  const char* s = source.data();
+  std::string result;
+  const size_t I = source.size();
+  bool lastspace = true;
+  for (size_t i = 0; i < I; i++) {
+    char c = s[i];
+    if (c == '%') {
+      // Placeholder syntax, no need to pseudolocalize
+      std::string chunk;
+      bool end = false;
+      chunk.append(&c, 1);
+      while (!end && i + 1 < I) {
+        ++i;
+        c = s[i];
+        chunk.append(&c, 1);
+        if (isPossibleNormalPlaceholderEnd(c)) {
+          end = true;
+        } else if (i + 1 < I && c == 't') {
+          ++i;
+          c = s[i];
+          chunk.append(&c, 1);
+          end = true;
         }
-    }
-    return result;
-}
-
-std::string PseudoMethodAccent::placeholder(const StringPiece& source) {
-    // Surround a placeholder with brackets
-    return k_placeholder_open + source.toString() + k_placeholder_close;
-}
-
-std::string PseudoMethodBidi::text(const StringPiece& source) {
-    const char* s = source.data();
-    std::string result;
-    bool lastspace = true;
-    bool space = true;
-    for (size_t i = 0; i < source.size(); i++) {
-        char c = s[i];
-        space = isspace(c);
+      }
+      // Treat chunk as a placeholder unless it ends with %.
+      result += ((c == '%') ? chunk : placeholder(chunk));
+    } else if (c == '<' || c == '&') {
+      // html syntax, no need to pseudolocalize
+      bool tag_closed = false;
+      while (!tag_closed && i < I) {
+        if (c == '&') {
+          std::string escapeText;
+          escapeText.append(&c, 1);
+          bool end = false;
+          size_t htmlCodePos = i;
+          while (!end && htmlCodePos < I) {
+            ++htmlCodePos;
+            c = s[htmlCodePos];
+            escapeText.append(&c, 1);
+            // Valid html code
+            if (c == ';') {
+              end = true;
+              i = htmlCodePos;
+            }
+            // Wrong html code
+            else if (!((c == '#' || (c >= 'a' && c <= 'z') ||
+                        (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')))) {
+              end = true;
+            }
+          }
+          result += escapeText;
+          if (escapeText != "&lt;") {
+            tag_closed = true;
+          }
+          continue;
+        }
+        if (c == '>') {
+          tag_closed = true;
+          result.append(&c, 1);
+          continue;
+        }
+        result.append(&c, 1);
+        i++;
+        c = s[i];
+      }
+    } else {
+      // This is a pure text that should be pseudolocalized
+      const char* p = pseudolocalizeChar(c);
+      if (p != nullptr) {
+        result += p;
+      } else {
+        bool space = isspace(c);
         if (lastspace && !space) {
-            // Word start
-            result += k_rlm + k_rlo;
-        } else if (!lastspace && space) {
-            // Word end
-            result += k_pdf + k_rlm;
+          mWordCount++;
         }
         lastspace = space;
         result.append(&c, 1);
+      }
+      // Count only pseudolocalizable chars and delimiters
+      mLength++;
     }
-    if (!lastspace) {
-        // End of last word
-        result += k_pdf + k_rlm;
+  }
+  return result;
+}
+
+std::string PseudoMethodAccent::placeholder(const StringPiece& source) {
+  // Surround a placeholder with brackets
+  return k_placeholder_open + source.toString() + k_placeholder_close;
+}
+
+std::string PseudoMethodBidi::text(const StringPiece& source) {
+  const char* s = source.data();
+  std::string result;
+  bool lastspace = true;
+  bool space = true;
+  for (size_t i = 0; i < source.size(); i++) {
+    char c = s[i];
+    space = isspace(c);
+    if (lastspace && !space) {
+      // Word start
+      result += k_rlm + k_rlo;
+    } else if (!lastspace && space) {
+      // Word end
+      result += k_pdf + k_rlm;
     }
-    return result;
+    lastspace = space;
+    result.append(&c, 1);
+  }
+  if (!lastspace) {
+    // End of last word
+    result += k_pdf + k_rlm;
+  }
+  return result;
 }
 
 std::string PseudoMethodBidi::placeholder(const StringPiece& source) {
-    // Surround a placeholder with directionality change sequence
-    return k_rlm + k_rlo + source.toString() + k_pdf + k_rlm;
+  // Surround a placeholder with directionality change sequence
+  return k_rlm + k_rlo + source.toString() + k_pdf + k_rlm;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Pseudolocalizer.h b/tools/aapt2/compile/Pseudolocalizer.h
index 91d17d174..a526877 100644
--- a/tools/aapt2/compile/Pseudolocalizer.h
+++ b/tools/aapt2/compile/Pseudolocalizer.h
@@ -27,32 +27,33 @@
 namespace aapt {
 
 class PseudoMethodImpl {
-public:
-    virtual ~PseudoMethodImpl() {}
-    virtual std::string start() { return {}; }
-    virtual std::string end() { return {}; }
-    virtual std::string text(const StringPiece& text) = 0;
-    virtual std::string placeholder(const StringPiece& text) = 0;
+ public:
+  virtual ~PseudoMethodImpl() {}
+  virtual std::string start() { return {}; }
+  virtual std::string end() { return {}; }
+  virtual std::string text(const StringPiece& text) = 0;
+  virtual std::string placeholder(const StringPiece& text) = 0;
 };
 
 class Pseudolocalizer {
-public:
-    enum class Method {
-        kNone,
-        kAccent,
-        kBidi,
-    };
+ public:
+  enum class Method {
+    kNone,
+    kAccent,
+    kBidi,
+  };
 
-    explicit Pseudolocalizer(Method method);
-    void setMethod(Method method);
-    std::string start() { return mImpl->start(); }
-    std::string end() { return mImpl->end(); }
-    std::string text(const StringPiece& text);
-private:
-    std::unique_ptr<PseudoMethodImpl> mImpl;
-    size_t mLastDepth;
+  explicit Pseudolocalizer(Method method);
+  void setMethod(Method method);
+  std::string start() { return mImpl->start(); }
+  std::string end() { return mImpl->end(); }
+  std::string text(const StringPiece& text);
+
+ private:
+  std::unique_ptr<PseudoMethodImpl> mImpl;
+  size_t mLastDepth;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_PSEUDOLOCALIZE_H */
diff --git a/tools/aapt2/compile/Pseudolocalizer_test.cpp b/tools/aapt2/compile/Pseudolocalizer_test.cpp
index c33e152..a152ed6 100644
--- a/tools/aapt2/compile/Pseudolocalizer_test.cpp
+++ b/tools/aapt2/compile/Pseudolocalizer_test.cpp
@@ -25,199 +25,207 @@
 // In this context, 'Axis' represents a particular field in the configuration,
 // such as language or density.
 
-static ::testing::AssertionResult simpleHelper(const char* input, const char* expected,
+static ::testing::AssertionResult simpleHelper(const char* input,
+                                               const char* expected,
                                                Pseudolocalizer::Method method) {
-    Pseudolocalizer pseudo(method);
-    std::string result = pseudo.start() + pseudo.text(input) + pseudo.end();
-    if (result != expected) {
-        return ::testing::AssertionFailure() << expected << " != " << result;
-    }
-    return ::testing::AssertionSuccess();
+  Pseudolocalizer pseudo(method);
+  std::string result = pseudo.start() + pseudo.text(input) + pseudo.end();
+  if (result != expected) {
+    return ::testing::AssertionFailure() << expected << " != " << result;
+  }
+  return ::testing::AssertionSuccess();
 }
 
-static ::testing::AssertionResult compoundHelper(const char* in1, const char* in2, const char *in3,
-                                                 const char* expected,
-                                                 Pseudolocalizer::Method method) {
-    Pseudolocalizer pseudo(method);
-    std::string result = pseudo.start() + pseudo.text(in1) + pseudo.text(in2) + pseudo.text(in3) +
-            pseudo.end();
-    if (result != expected) {
-        return ::testing::AssertionFailure() << expected << " != " << result;
-    }
-    return ::testing::AssertionSuccess();
+static ::testing::AssertionResult compoundHelper(
+    const char* in1, const char* in2, const char* in3, const char* expected,
+    Pseudolocalizer::Method method) {
+  Pseudolocalizer pseudo(method);
+  std::string result = pseudo.start() + pseudo.text(in1) + pseudo.text(in2) +
+                       pseudo.text(in3) + pseudo.end();
+  if (result != expected) {
+    return ::testing::AssertionFailure() << expected << " != " << result;
+  }
+  return ::testing::AssertionSuccess();
 }
 
 TEST(PseudolocalizerTest, NoPseudolocalization) {
-    EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kNone));
-    EXPECT_TRUE(simpleHelper("Hello, world", "Hello, world", Pseudolocalizer::Method::kNone));
+  EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kNone));
+  EXPECT_TRUE(simpleHelper("Hello, world", "Hello, world",
+                           Pseudolocalizer::Method::kNone));
 
-    EXPECT_TRUE(compoundHelper("Hello,", " world", "",
-                               "Hello, world", Pseudolocalizer::Method::kNone));
+  EXPECT_TRUE(compoundHelper("Hello,", " world", "", "Hello, world",
+                             Pseudolocalizer::Method::kNone));
 }
 
 TEST(PseudolocalizerTest, PlaintextAccent) {
-    EXPECT_TRUE(simpleHelper("", "[]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("Hello, world",
-                             "[Ĥéļļö, ŵöŕļð one two]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("", "[]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Hello, world", "[Ĥéļļö, ŵöŕļð one two]",
+                           Pseudolocalizer::Method::kAccent));
 
-    EXPECT_TRUE(simpleHelper("Hello, %1d",
-                             "[Ĥéļļö, »%1d« one two]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Hello, %1d", "[Ĥéļļö, »%1d« one two]",
+                           Pseudolocalizer::Method::kAccent));
 
-    EXPECT_TRUE(simpleHelper("Battery %1d%%",
-                             "[βåţţéŕý »%1d«%% one two]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("^1 %", "[^1 % one]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(compoundHelper("", "", "", "[]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(compoundHelper("Hello,", " world", "",
-                               "[Ĥéļļö, ŵöŕļð one two]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Battery %1d%%", "[βåţţéŕý »%1d«%% one two]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(
+      simpleHelper("^1 %", "[^1 % one]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(
+      compoundHelper("", "", "", "[]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(compoundHelper("Hello,", " world", "", "[Ĥéļļö, ŵöŕļð one two]",
+                             Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, PlaintextBidi) {
-    EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("word",
-                             "\xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("  word  ",
-                             "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("  word  ",
-                             "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("hello\n  world\n",
-                             "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n" \
-                                     "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(compoundHelper("hello", "\n ", " world\n",
-                               "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n" \
-                                       "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
-                               Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "word", "\xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "  word  ", "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "  word  ", "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(
+      simpleHelper("hello\n  world\n",
+                   "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n"
+                   "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
+                   Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(compoundHelper(
+      "hello", "\n ", " world\n",
+      "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n"
+      "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
+      Pseudolocalizer::Method::kBidi));
 }
 
 TEST(PseudolocalizerTest, SimpleICU) {
-    // Single-fragment messages
-    EXPECT_TRUE(simpleHelper("{placeholder}", "[»{placeholder}«]",
+  // Single-fragment messages
+  EXPECT_TRUE(simpleHelper("{placeholder}", "[»{placeholder}«]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("{USER} is offline", "[»{USER}« îš öƒƒļîñé one two]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Copy from {path1} to {path2}",
+                           "[Çöþý ƒŕöḿ »{path1}« ţö »{path2}« one two three]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Today is {1,date} {1,time}",
+                           "[Ţöðåý îš »{1,date}« »{1,time}« one two]",
+                           Pseudolocalizer::Method::kAccent));
+
+  // Multi-fragment messages
+  EXPECT_TRUE(compoundHelper("{USER}", " ", "is offline",
+                             "[»{USER}« îš öƒƒļîñé one two]",
                              Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("{USER} is offline",
-                             "[»{USER}« îš öƒƒļîñé one two]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("Copy from {path1} to {path2}",
+  EXPECT_TRUE(compoundHelper("Copy from ", "{path1}", " to {path2}",
                              "[Çöþý ƒŕöḿ »{path1}« ţö »{path2}« one two three]",
                              Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("Today is {1,date} {1,time}",
-                             "[Ţöðåý îš »{1,date}« »{1,time}« one two]",
-                             Pseudolocalizer::Method::kAccent));
-
-    // Multi-fragment messages
-    EXPECT_TRUE(compoundHelper("{USER}", " ", "is offline",
-                               "[»{USER}« îš öƒƒļîñé one two]",
-                               Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(compoundHelper("Copy from ", "{path1}", " to {path2}",
-                               "[Çöþý ƒŕöḿ »{path1}« ţö »{path2}« one two three]",
-                               Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, ICUBidi) {
-    // Single-fragment messages
-    EXPECT_TRUE(simpleHelper("{placeholder}",
-                             "\xe2\x80\x8f\xE2\x80\xae{placeholder}\xE2\x80\xac\xe2\x80\x8f",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper(
-            "{COUNT, plural, one {one} other {other}}",
-            "{COUNT, plural, " \
-                    "one {\xe2\x80\x8f\xE2\x80\xaeone\xE2\x80\xac\xe2\x80\x8f} " \
-                    "other {\xe2\x80\x8f\xE2\x80\xaeother\xE2\x80\xac\xe2\x80\x8f}}",
-            Pseudolocalizer::Method::kBidi));
+  // Single-fragment messages
+  EXPECT_TRUE(simpleHelper(
+      "{placeholder}",
+      "\xe2\x80\x8f\xE2\x80\xae{placeholder}\xE2\x80\xac\xe2\x80\x8f",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "{COUNT, plural, one {one} other {other}}",
+      "{COUNT, plural, "
+      "one {\xe2\x80\x8f\xE2\x80\xaeone\xE2\x80\xac\xe2\x80\x8f} "
+      "other {\xe2\x80\x8f\xE2\x80\xaeother\xE2\x80\xac\xe2\x80\x8f}}",
+      Pseudolocalizer::Method::kBidi));
 }
 
 TEST(PseudolocalizerTest, Escaping) {
-    // Single-fragment messages
-    EXPECT_TRUE(simpleHelper("'{USER'} is offline",
-                             "['{ÛŠÉŔ'} îš öƒƒļîñé one two three]",
-                             Pseudolocalizer::Method::kAccent));
+  // Single-fragment messages
+  EXPECT_TRUE(simpleHelper("'{USER'} is offline",
+                           "['{ÛŠÉŔ'} îš öƒƒļîñé one two three]",
+                           Pseudolocalizer::Method::kAccent));
 
-    // Multi-fragment messages
-    EXPECT_TRUE(compoundHelper("'{USER}", " ", "''is offline",
-                               "['{ÛŠÉŔ} ''îš öƒƒļîñé one two three]",
-                               Pseudolocalizer::Method::kAccent));
+  // Multi-fragment messages
+  EXPECT_TRUE(compoundHelper("'{USER}", " ", "''is offline",
+                             "['{ÛŠÉŔ} ''îš öƒƒļîñé one two three]",
+                             Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, PluralsAndSelects) {
-    EXPECT_TRUE(simpleHelper(
-            "{COUNT, plural, one {Delete a file} other {Delete {COUNT} files}}",
-            "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} " \
+  EXPECT_TRUE(simpleHelper(
+      "{COUNT, plural, one {Delete a file} other {Delete {COUNT} files}}",
+      "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} "
+      "other {Ðéļéţé »{COUNT}« ƒîļéš one two}}]",
+      Pseudolocalizer::Method::kAccent));
+
+  EXPECT_TRUE(
+      simpleHelper("Distance is {COUNT, plural, one {# mile} other {# miles}}",
+                   "[Ðîšţåñçé îš {COUNT, plural, one {# ḿîļé one two} "
+                   "other {# ḿîļéš one two}}]",
+                   Pseudolocalizer::Method::kAccent));
+
+  EXPECT_TRUE(simpleHelper(
+      "{1, select, female {{1} added you} "
+      "male {{1} added you} other {{1} added you}}",
+      "[{1, select, female {»{1}« åððéð ýöû one two} "
+      "male {»{1}« åððéð ýöû one two} other {»{1}« åððéð ýöû one two}}]",
+      Pseudolocalizer::Method::kAccent));
+
+  EXPECT_TRUE(
+      compoundHelper("{COUNT, plural, one {Delete a file} "
+                     "other {Delete ",
+                     "{COUNT}", " files}}",
+                     "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} "
                      "other {Ðéļéţé »{COUNT}« ƒîļéš one two}}]",
-            Pseudolocalizer::Method::kAccent));
-
-    EXPECT_TRUE(simpleHelper(
-            "Distance is {COUNT, plural, one {# mile} other {# miles}}",
-            "[Ðîšţåñçé îš {COUNT, plural, one {# ḿîļé one two} " \
-                                 "other {# ḿîļéš one two}}]",
-            Pseudolocalizer::Method::kAccent));
-
-    EXPECT_TRUE(simpleHelper(
-            "{1, select, female {{1} added you} " \
-                    "male {{1} added you} other {{1} added you}}",
-            "[{1, select, female {»{1}« åððéð ýöû one two} " \
-                    "male {»{1}« åððéð ýöû one two} other {»{1}« åððéð ýöû one two}}]",
-            Pseudolocalizer::Method::kAccent));
-
-    EXPECT_TRUE(compoundHelper(
-            "{COUNT, plural, one {Delete a file} " \
-                    "other {Delete ", "{COUNT}", " files}}",
-            "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} " \
-                    "other {Ðéļéţé »{COUNT}« ƒîļéš one two}}]",
-            Pseudolocalizer::Method::kAccent));
+                     Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, NestedICU) {
-    EXPECT_TRUE(simpleHelper(
-            "{person, select, " \
-                "female {" \
-                    "{num_circles, plural," \
-                        "=0{{person} didn't add you to any of her circles.}" \
-                        "=1{{person} added you to one of her circles.}" \
-                        "other{{person} added you to her # circles.}}}" \
-                "male {" \
-                    "{num_circles, plural," \
-                        "=0{{person} didn't add you to any of his circles.}" \
-                        "=1{{person} added you to one of his circles.}" \
-                        "other{{person} added you to his # circles.}}}" \
-                "other {" \
-                    "{num_circles, plural," \
-                        "=0{{person} didn't add you to any of their circles.}" \
-                        "=1{{person} added you to one of their circles.}" \
-                        "other{{person} added you to their # circles.}}}}",
-            "[{person, select, " \
-                "female {" \
-                    "{num_circles, plural," \
-                        "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥéŕ çîŕçļéš." \
-                            " one two three four five}" \
-                        "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥéŕ çîŕçļéš." \
-                            " one two three four}" \
-                        "other{»{person}« åððéð ýöû ţö ĥéŕ # çîŕçļéš." \
-                            " one two three four}}}" \
-                "male {" \
-                    "{num_circles, plural," \
-                        "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥîš çîŕçļéš." \
-                            " one two three four five}" \
-                        "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥîš çîŕçļéš." \
-                            " one two three four}" \
-                        "other{»{person}« åððéð ýöû ţö ĥîš # çîŕçļéš." \
-                            " one two three four}}}" \
-                "other {{num_circles, plural," \
-                    "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ţĥéîŕ çîŕçļéš." \
-                        " one two three four five}" \
-                    "=1{»{person}« åððéð ýöû ţö öñé öƒ ţĥéîŕ çîŕçļéš." \
-                        " one two three four}" \
-                    "other{»{person}« åððéð ýöû ţö ţĥéîŕ # çîŕçļéš." \
-                        " one two three four}}}}]",
-            Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(
+      simpleHelper("{person, select, "
+                   "female {"
+                   "{num_circles, plural,"
+                   "=0{{person} didn't add you to any of her circles.}"
+                   "=1{{person} added you to one of her circles.}"
+                   "other{{person} added you to her # circles.}}}"
+                   "male {"
+                   "{num_circles, plural,"
+                   "=0{{person} didn't add you to any of his circles.}"
+                   "=1{{person} added you to one of his circles.}"
+                   "other{{person} added you to his # circles.}}}"
+                   "other {"
+                   "{num_circles, plural,"
+                   "=0{{person} didn't add you to any of their circles.}"
+                   "=1{{person} added you to one of their circles.}"
+                   "other{{person} added you to their # circles.}}}}",
+                   "[{person, select, "
+                   "female {"
+                   "{num_circles, plural,"
+                   "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥéŕ çîŕçļéš."
+                   " one two three four five}"
+                   "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥéŕ çîŕçļéš."
+                   " one two three four}"
+                   "other{»{person}« åððéð ýöû ţö ĥéŕ # çîŕçļéš."
+                   " one two three four}}}"
+                   "male {"
+                   "{num_circles, plural,"
+                   "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥîš çîŕçļéš."
+                   " one two three four five}"
+                   "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥîš çîŕçļéš."
+                   " one two three four}"
+                   "other{»{person}« åððéð ýöû ţö ĥîš # çîŕçļéš."
+                   " one two three four}}}"
+                   "other {{num_circles, plural,"
+                   "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ţĥéîŕ çîŕçļéš."
+                   " one two three four five}"
+                   "=1{»{person}« åððéð ýöû ţö öñé öƒ ţĥéîŕ çîŕçļéš."
+                   " one two three four}"
+                   "other{»{person}« åððéð ýöû ţö ţĥéîŕ # çîŕçļéš."
+                   " one two three four}}}}]",
+                   Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, RedefineMethod) {
-    Pseudolocalizer pseudo(Pseudolocalizer::Method::kAccent);
-    std::string result = pseudo.text("Hello, ");
-    pseudo.setMethod(Pseudolocalizer::Method::kNone);
-    result += pseudo.text("world!");
-    ASSERT_EQ(StringPiece("Ĥéļļö, world!"), result);
+  Pseudolocalizer pseudo(Pseudolocalizer::Method::kAccent);
+  std::string result = pseudo.text("Hello, ");
+  pseudo.setMethod(Pseudolocalizer::Method::kNone);
+  result += pseudo.text("world!");
+  ASSERT_EQ(StringPiece("Ĥéļļö, world!"), result);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/XmlIdCollector.cpp b/tools/aapt2/compile/XmlIdCollector.cpp
index 3901419..aa8b1df 100644
--- a/tools/aapt2/compile/XmlIdCollector.cpp
+++ b/tools/aapt2/compile/XmlIdCollector.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+#include "compile/XmlIdCollector.h"
 #include "ResourceUtils.h"
 #include "ResourceValues.h"
-#include "compile/XmlIdCollector.h"
 #include "xml/XmlDom.h"
 
 #include <algorithm>
@@ -27,44 +27,44 @@
 namespace {
 
 static bool cmpName(const SourcedResourceName& a, const ResourceNameRef& b) {
-    return a.name < b;
+  return a.name < b;
 }
 
 struct IdCollector : public xml::Visitor {
-    using xml::Visitor::visit;
+  using xml::Visitor::visit;
 
-    std::vector<SourcedResourceName>* mOutSymbols;
+  std::vector<SourcedResourceName>* mOutSymbols;
 
-    explicit IdCollector(std::vector<SourcedResourceName>* outSymbols) : mOutSymbols(outSymbols) {
-    }
+  explicit IdCollector(std::vector<SourcedResourceName>* outSymbols)
+      : mOutSymbols(outSymbols) {}
 
-    void visit(xml::Element* element) override {
-        for (xml::Attribute& attr : element->attributes) {
-            ResourceNameRef name;
-            bool create = false;
-            if (ResourceUtils::parseReference(attr.value, &name, &create, nullptr)) {
-                if (create && name.type == ResourceType::kId) {
-                    auto iter = std::lower_bound(mOutSymbols->begin(), mOutSymbols->end(),
-                                                 name, cmpName);
-                    if (iter == mOutSymbols->end() || iter->name != name) {
-                        mOutSymbols->insert(iter, SourcedResourceName{ name.toResourceName(),
-                                                                       element->lineNumber });
-                    }
-                }
-            }
+  void visit(xml::Element* element) override {
+    for (xml::Attribute& attr : element->attributes) {
+      ResourceNameRef name;
+      bool create = false;
+      if (ResourceUtils::parseReference(attr.value, &name, &create, nullptr)) {
+        if (create && name.type == ResourceType::kId) {
+          auto iter = std::lower_bound(mOutSymbols->begin(), mOutSymbols->end(),
+                                       name, cmpName);
+          if (iter == mOutSymbols->end() || iter->name != name) {
+            mOutSymbols->insert(iter, SourcedResourceName{name.toResourceName(),
+                                                          element->lineNumber});
+          }
         }
-
-        xml::Visitor::visit(element);
+      }
     }
+
+    xml::Visitor::visit(element);
+  }
 };
 
-} // namespace
+}  // namespace
 
 bool XmlIdCollector::consume(IAaptContext* context, xml::XmlResource* xmlRes) {
-    xmlRes->file.exportedSymbols.clear();
-    IdCollector collector(&xmlRes->file.exportedSymbols);
-    xmlRes->root->accept(&collector);
-    return true;
+  xmlRes->file.exportedSymbols.clear();
+  IdCollector collector(&xmlRes->file.exportedSymbols);
+  xmlRes->root->accept(&collector);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/XmlIdCollector.h b/tools/aapt2/compile/XmlIdCollector.h
index 1b14944..8423f48 100644
--- a/tools/aapt2/compile/XmlIdCollector.h
+++ b/tools/aapt2/compile/XmlIdCollector.h
@@ -23,9 +23,9 @@
 namespace aapt {
 
 struct XmlIdCollector : public IXmlResourceConsumer {
-    bool consume(IAaptContext* context, xml::XmlResource* xmlRes) override;
+  bool consume(IAaptContext* context, xml::XmlResource* xmlRes) override;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_XMLIDCOLLECTOR_H */
diff --git a/tools/aapt2/compile/XmlIdCollector_test.cpp b/tools/aapt2/compile/XmlIdCollector_test.cpp
index 2c9eab8..08ca7b1 100644
--- a/tools/aapt2/compile/XmlIdCollector_test.cpp
+++ b/tools/aapt2/compile/XmlIdCollector_test.cpp
@@ -18,15 +18,15 @@
 #include "test/Builders.h"
 #include "test/Context.h"
 
-#include <algorithm>
 #include <gtest/gtest.h>
+#include <algorithm>
 
 namespace aapt {
 
 TEST(XmlIdCollectorTest, CollectsIds) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:id="@+id/foo"
                   text="@+id/bar">
@@ -34,28 +34,35 @@
                        class="@+id/bar"/>
             </View>)EOF");
 
-    XmlIdCollector collector;
-    ASSERT_TRUE(collector.consume(context.get(), doc.get()));
+  XmlIdCollector collector;
+  ASSERT_TRUE(collector.consume(context.get(), doc.get()));
 
-    EXPECT_EQ(1, std::count(doc->file.exportedSymbols.begin(), doc->file.exportedSymbols.end(),
-                             SourcedResourceName{ test::parseNameOrDie("id/foo"), 3u }));
+  EXPECT_EQ(
+      1, std::count(doc->file.exportedSymbols.begin(),
+                    doc->file.exportedSymbols.end(),
+                    SourcedResourceName{test::parseNameOrDie("id/foo"), 3u}));
 
-    EXPECT_EQ(1, std::count(doc->file.exportedSymbols.begin(), doc->file.exportedSymbols.end(),
-                             SourcedResourceName{ test::parseNameOrDie("id/bar"), 3u }));
+  EXPECT_EQ(
+      1, std::count(doc->file.exportedSymbols.begin(),
+                    doc->file.exportedSymbols.end(),
+                    SourcedResourceName{test::parseNameOrDie("id/bar"), 3u}));
 
-    EXPECT_EQ(1, std::count(doc->file.exportedSymbols.begin(), doc->file.exportedSymbols.end(),
-                             SourcedResourceName{ test::parseNameOrDie("id/car"), 6u }));
+  EXPECT_EQ(
+      1, std::count(doc->file.exportedSymbols.begin(),
+                    doc->file.exportedSymbols.end(),
+                    SourcedResourceName{test::parseNameOrDie("id/car"), 6u}));
 }
 
 TEST(XmlIdCollectorTest, DontCollectNonIds) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom("<View foo=\"@+string/foo\"/>");
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDom("<View foo=\"@+string/foo\"/>");
 
-    XmlIdCollector collector;
-    ASSERT_TRUE(collector.consume(context.get(), doc.get()));
+  XmlIdCollector collector;
+  ASSERT_TRUE(collector.consume(context.get(), doc.get()));
 
-    EXPECT_TRUE(doc->file.exportedSymbols.empty());
+  EXPECT_TRUE(doc->file.exportedSymbols.empty());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/diff/Diff.cpp b/tools/aapt2/diff/Diff.cpp
index 9b1f057..01f4539 100644
--- a/tools/aapt2/diff/Diff.cpp
+++ b/tools/aapt2/diff/Diff.cpp
@@ -27,412 +27,401 @@
 namespace aapt {
 
 class DiffContext : public IAaptContext {
-public:
-    const std::string& getCompilationPackage() override {
-        return mEmpty;
-    }
+ public:
+  const std::string& getCompilationPackage() override { return mEmpty; }
 
-    uint8_t getPackageId() override {
-        return 0x0;
-    }
+  uint8_t getPackageId() override { return 0x0; }
 
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-        return &mNameMangler;
-    }
+  NameMangler* getNameMangler() override { return &mNameMangler; }
 
-    SymbolTable* getExternalSymbols() override {
-        return &mSymbolTable;
-    }
+  SymbolTable* getExternalSymbols() override { return &mSymbolTable; }
 
-    bool verbose() override {
-        return false;
-    }
+  bool verbose() override { return false; }
 
-    int getMinSdkVersion() override {
-        return 0;
-    }
+  int getMinSdkVersion() override { return 0; }
 
-private:
-    std::string mEmpty;
-    StdErrDiagnostics mDiagnostics;
-    NameMangler mNameMangler = NameMangler(NameManglerPolicy{});
-    SymbolTable mSymbolTable;
+ private:
+  std::string mEmpty;
+  StdErrDiagnostics mDiagnostics;
+  NameMangler mNameMangler = NameMangler(NameManglerPolicy{});
+  SymbolTable mSymbolTable;
 };
 
 class LoadedApk {
-public:
-    LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
-              std::unique_ptr<ResourceTable> table) :
-            mSource(source), mApk(std::move(apk)), mTable(std::move(table)) {
-    }
+ public:
+  LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
+            std::unique_ptr<ResourceTable> table)
+      : mSource(source), mApk(std::move(apk)), mTable(std::move(table)) {}
 
-    io::IFileCollection* getFileCollection() {
-        return mApk.get();
-    }
+  io::IFileCollection* getFileCollection() { return mApk.get(); }
 
-    ResourceTable* getResourceTable() {
-        return mTable.get();
-    }
+  ResourceTable* getResourceTable() { return mTable.get(); }
 
-    const Source& getSource() {
-        return mSource;
-    }
+  const Source& getSource() { return mSource; }
 
-private:
-    Source mSource;
-    std::unique_ptr<io::IFileCollection> mApk;
-    std::unique_ptr<ResourceTable> mTable;
+ private:
+  Source mSource;
+  std::unique_ptr<io::IFileCollection> mApk;
+  std::unique_ptr<ResourceTable> mTable;
 
-    DISALLOW_COPY_AND_ASSIGN(LoadedApk);
+  DISALLOW_COPY_AND_ASSIGN(LoadedApk);
 };
 
-static std::unique_ptr<LoadedApk> loadApkFromPath(IAaptContext* context, const StringPiece& path) {
-    Source source(path);
-    std::string error;
-    std::unique_ptr<io::ZipFileCollection> apk = io::ZipFileCollection::create(path, &error);
-    if (!apk) {
-        context->getDiagnostics()->error(DiagMessage(source) << error);
-        return {};
-    }
+static std::unique_ptr<LoadedApk> loadApkFromPath(IAaptContext* context,
+                                                  const StringPiece& path) {
+  Source source(path);
+  std::string error;
+  std::unique_ptr<io::ZipFileCollection> apk =
+      io::ZipFileCollection::create(path, &error);
+  if (!apk) {
+    context->getDiagnostics()->error(DiagMessage(source) << error);
+    return {};
+  }
 
-    io::IFile* file = apk->findFile("resources.arsc");
-    if (!file) {
-        context->getDiagnostics()->error(DiagMessage(source) << "no resources.arsc found");
-        return {};
-    }
+  io::IFile* file = apk->findFile("resources.arsc");
+  if (!file) {
+    context->getDiagnostics()->error(DiagMessage(source)
+                                     << "no resources.arsc found");
+    return {};
+  }
 
-    std::unique_ptr<io::IData> data = file->openAsData();
-    if (!data) {
-        context->getDiagnostics()->error(DiagMessage(source) << "could not open resources.arsc");
-        return {};
-    }
+  std::unique_ptr<io::IData> data = file->openAsData();
+  if (!data) {
+    context->getDiagnostics()->error(DiagMessage(source)
+                                     << "could not open resources.arsc");
+    return {};
+  }
 
-    std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
-    BinaryResourceParser parser(context, table.get(), source, data->data(), data->size());
-    if (!parser.parse()) {
-        return {};
-    }
+  std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
+  BinaryResourceParser parser(context, table.get(), source, data->data(),
+                              data->size());
+  if (!parser.parse()) {
+    return {};
+  }
 
-    return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
+  return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
 }
 
 static void emitDiffLine(const Source& source, const StringPiece& message) {
-    std::cerr << source << ": " << message << "\n";
+  std::cerr << source << ": " << message << "\n";
 }
 
-static bool isSymbolVisibilityDifferent(const Symbol& symbolA, const Symbol& symbolB) {
-    return symbolA.state != symbolB.state;
+static bool isSymbolVisibilityDifferent(const Symbol& symbolA,
+                                        const Symbol& symbolB) {
+  return symbolA.state != symbolB.state;
 }
 
 template <typename Id>
 static bool isIdDiff(const Symbol& symbolA, const Maybe<Id>& idA,
                      const Symbol& symbolB, const Maybe<Id>& idB) {
-    if (symbolA.state == SymbolState::kPublic || symbolB.state == SymbolState::kPublic) {
-        return idA != idB;
-    }
-    return false;
+  if (symbolA.state == SymbolState::kPublic ||
+      symbolB.state == SymbolState::kPublic) {
+    return idA != idB;
+  }
+  return false;
 }
 
-static bool emitResourceConfigValueDiff(IAaptContext* context,
-                                        LoadedApk* apkA,
-                                        ResourceTablePackage* pkgA,
-                                        ResourceTableType* typeA,
-                                        ResourceEntry* entryA,
-                                        ResourceConfigValue* configValueA,
-                                        LoadedApk* apkB,
-                                        ResourceTablePackage* pkgB,
-                                        ResourceTableType* typeB,
-                                        ResourceEntry* entryB,
-                                        ResourceConfigValue* configValueB) {
-    Value* valueA = configValueA->value.get();
-    Value* valueB = configValueB->value.get();
-    if (!valueA->equals(valueB)) {
-        std::stringstream strStream;
-        strStream << "value " << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                << " config=" << configValueA->config << " does not match:\n";
-        valueA->print(&strStream);
-        strStream << "\n vs \n";
-        valueB->print(&strStream);
-        emitDiffLine(apkB->getSource(), strStream.str());
-        return true;
-    }
-    return false;
+static bool emitResourceConfigValueDiff(
+    IAaptContext* context, LoadedApk* apkA, ResourceTablePackage* pkgA,
+    ResourceTableType* typeA, ResourceEntry* entryA,
+    ResourceConfigValue* configValueA, LoadedApk* apkB,
+    ResourceTablePackage* pkgB, ResourceTableType* typeB, ResourceEntry* entryB,
+    ResourceConfigValue* configValueB) {
+  Value* valueA = configValueA->value.get();
+  Value* valueB = configValueB->value.get();
+  if (!valueA->equals(valueB)) {
+    std::stringstream strStream;
+    strStream << "value " << pkgA->name << ":" << typeA->type << "/"
+              << entryA->name << " config=" << configValueA->config
+              << " does not match:\n";
+    valueA->print(&strStream);
+    strStream << "\n vs \n";
+    valueB->print(&strStream);
+    emitDiffLine(apkB->getSource(), strStream.str());
+    return true;
+  }
+  return false;
 }
 
-static bool emitResourceEntryDiff(IAaptContext* context,
-                                  LoadedApk* apkA,
+static bool emitResourceEntryDiff(IAaptContext* context, LoadedApk* apkA,
                                   ResourceTablePackage* pkgA,
                                   ResourceTableType* typeA,
-                                  ResourceEntry* entryA,
-                                  LoadedApk* apkB,
+                                  ResourceEntry* entryA, LoadedApk* apkB,
                                   ResourceTablePackage* pkgB,
                                   ResourceTableType* typeB,
                                   ResourceEntry* entryB) {
-    bool diff = false;
-    for (std::unique_ptr<ResourceConfigValue>& configValueA : entryA->values) {
-        ResourceConfigValue* configValueB = entryB->findValue(configValueA->config);
-        if (!configValueB) {
-            std::stringstream strStream;
-            strStream << "missing " << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                    << " config=" << configValueA->config;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        } else {
-            diff |= emitResourceConfigValueDiff(context, apkA, pkgA, typeA, entryA,
-                                                configValueA.get(), apkB, pkgB, typeB, entryB,
-                                                configValueB);
-        }
+  bool diff = false;
+  for (std::unique_ptr<ResourceConfigValue>& configValueA : entryA->values) {
+    ResourceConfigValue* configValueB = entryB->findValue(configValueA->config);
+    if (!configValueB) {
+      std::stringstream strStream;
+      strStream << "missing " << pkgA->name << ":" << typeA->type << "/"
+                << entryA->name << " config=" << configValueA->config;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
+    } else {
+      diff |= emitResourceConfigValueDiff(context, apkA, pkgA, typeA, entryA,
+                                          configValueA.get(), apkB, pkgB, typeB,
+                                          entryB, configValueB);
     }
+  }
 
-    // Check for any newly added config values.
-    for (std::unique_ptr<ResourceConfigValue>& configValueB : entryB->values) {
-        ResourceConfigValue* configValueA = entryA->findValue(configValueB->config);
-        if (!configValueA) {
-            std::stringstream strStream;
-            strStream << "new config " << pkgB->name << ":" << typeB->type << "/" << entryB->name
-                    << " config=" << configValueB->config;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added config values.
+  for (std::unique_ptr<ResourceConfigValue>& configValueB : entryB->values) {
+    ResourceConfigValue* configValueA = entryA->findValue(configValueB->config);
+    if (!configValueA) {
+      std::stringstream strStream;
+      strStream << "new config " << pkgB->name << ":" << typeB->type << "/"
+                << entryB->name << " config=" << configValueB->config;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return false;
+  }
+  return false;
 }
 
-static bool emitResourceTypeDiff(IAaptContext* context,
-                                 LoadedApk* apkA,
+static bool emitResourceTypeDiff(IAaptContext* context, LoadedApk* apkA,
                                  ResourceTablePackage* pkgA,
-                                 ResourceTableType* typeA,
-                                 LoadedApk* apkB,
+                                 ResourceTableType* typeA, LoadedApk* apkB,
                                  ResourceTablePackage* pkgB,
                                  ResourceTableType* typeB) {
-    bool diff = false;
-    for (std::unique_ptr<ResourceEntry>& entryA : typeA->entries) {
-        ResourceEntry* entryB = typeB->findEntry(entryA->name);
-        if (!entryB) {
-            std::stringstream strStream;
-            strStream << "missing " << pkgA->name << ":" << typeA->type << "/" << entryA->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
+  bool diff = false;
+  for (std::unique_ptr<ResourceEntry>& entryA : typeA->entries) {
+    ResourceEntry* entryB = typeB->findEntry(entryA->name);
+    if (!entryB) {
+      std::stringstream strStream;
+      strStream << "missing " << pkgA->name << ":" << typeA->type << "/"
+                << entryA->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
+    } else {
+      if (isSymbolVisibilityDifferent(entryA->symbolStatus,
+                                      entryB->symbolStatus)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
+                  << " has different visibility (";
+        if (entryB->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
         } else {
-            if (isSymbolVisibilityDifferent(entryA->symbolStatus, entryB->symbolStatus)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                        << " has different visibility (";
-                if (entryB->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << " vs ";
-                if (entryA->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            } else if (isIdDiff(entryA->symbolStatus, entryA->id,
-                                entryB->symbolStatus, entryB->id)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                        << " has different public ID (";
-                if (entryB->id) {
-                    strStream << "0x" << std::hex << entryB->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << " vs ";
-                if (entryA->id) {
-                    strStream << "0x " << std::hex << entryA->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            }
-            diff |= emitResourceEntryDiff(context, apkA, pkgA, typeA, entryA.get(),
-                                          apkB, pkgB, typeB, entryB);
+          strStream << "PRIVATE";
         }
+        strStream << " vs ";
+        if (entryA->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
+        } else {
+          strStream << "PRIVATE";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      } else if (isIdDiff(entryA->symbolStatus, entryA->id,
+                          entryB->symbolStatus, entryB->id)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
+                  << " has different public ID (";
+        if (entryB->id) {
+          strStream << "0x" << std::hex << entryB->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << " vs ";
+        if (entryA->id) {
+          strStream << "0x " << std::hex << entryA->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      }
+      diff |= emitResourceEntryDiff(context, apkA, pkgA, typeA, entryA.get(),
+                                    apkB, pkgB, typeB, entryB);
     }
+  }
 
-    // Check for any newly added entries.
-    for (std::unique_ptr<ResourceEntry>& entryB : typeB->entries) {
-        ResourceEntry* entryA = typeA->findEntry(entryB->name);
-        if (!entryA) {
-            std::stringstream strStream;
-            strStream << "new entry " << pkgB->name << ":" << typeB->type << "/" << entryB->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added entries.
+  for (std::unique_ptr<ResourceEntry>& entryB : typeB->entries) {
+    ResourceEntry* entryA = typeA->findEntry(entryB->name);
+    if (!entryA) {
+      std::stringstream strStream;
+      strStream << "new entry " << pkgB->name << ":" << typeB->type << "/"
+                << entryB->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return diff;
+  }
+  return diff;
 }
 
 static bool emitResourcePackageDiff(IAaptContext* context, LoadedApk* apkA,
-                                    ResourceTablePackage* pkgA,
-                                    LoadedApk* apkB, ResourceTablePackage* pkgB) {
-    bool diff = false;
-    for (std::unique_ptr<ResourceTableType>& typeA : pkgA->types) {
-        ResourceTableType* typeB = pkgB->findType(typeA->type);
-        if (!typeB) {
-            std::stringstream strStream;
-            strStream << "missing " << pkgA->name << ":" << typeA->type;
-            emitDiffLine(apkA->getSource(), strStream.str());
-            diff = true;
+                                    ResourceTablePackage* pkgA, LoadedApk* apkB,
+                                    ResourceTablePackage* pkgB) {
+  bool diff = false;
+  for (std::unique_ptr<ResourceTableType>& typeA : pkgA->types) {
+    ResourceTableType* typeB = pkgB->findType(typeA->type);
+    if (!typeB) {
+      std::stringstream strStream;
+      strStream << "missing " << pkgA->name << ":" << typeA->type;
+      emitDiffLine(apkA->getSource(), strStream.str());
+      diff = true;
+    } else {
+      if (isSymbolVisibilityDifferent(typeA->symbolStatus,
+                                      typeB->symbolStatus)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type
+                  << " has different visibility (";
+        if (typeB->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
         } else {
-            if (isSymbolVisibilityDifferent(typeA->symbolStatus, typeB->symbolStatus)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << " has different visibility (";
-                if (typeB->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << " vs ";
-                if (typeA->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            } else if (isIdDiff(typeA->symbolStatus, typeA->id, typeB->symbolStatus, typeB->id)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << " has different public ID (";
-                if (typeB->id) {
-                    strStream << "0x" << std::hex << typeB->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << " vs ";
-                if (typeA->id) {
-                    strStream << "0x " << std::hex << typeA->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            }
-            diff |= emitResourceTypeDiff(context, apkA, pkgA, typeA.get(), apkB, pkgB, typeB);
+          strStream << "PRIVATE";
         }
+        strStream << " vs ";
+        if (typeA->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
+        } else {
+          strStream << "PRIVATE";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      } else if (isIdDiff(typeA->symbolStatus, typeA->id, typeB->symbolStatus,
+                          typeB->id)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type
+                  << " has different public ID (";
+        if (typeB->id) {
+          strStream << "0x" << std::hex << typeB->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << " vs ";
+        if (typeA->id) {
+          strStream << "0x " << std::hex << typeA->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      }
+      diff |= emitResourceTypeDiff(context, apkA, pkgA, typeA.get(), apkB, pkgB,
+                                   typeB);
     }
+  }
 
-    // Check for any newly added types.
-    for (std::unique_ptr<ResourceTableType>& typeB : pkgB->types) {
-        ResourceTableType* typeA = pkgA->findType(typeB->type);
-        if (!typeA) {
-            std::stringstream strStream;
-            strStream << "new type " << pkgB->name << ":" << typeB->type;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added types.
+  for (std::unique_ptr<ResourceTableType>& typeB : pkgB->types) {
+    ResourceTableType* typeA = pkgA->findType(typeB->type);
+    if (!typeA) {
+      std::stringstream strStream;
+      strStream << "new type " << pkgB->name << ":" << typeB->type;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return diff;
+  }
+  return diff;
 }
 
-static bool emitResourceTableDiff(IAaptContext* context, LoadedApk* apkA, LoadedApk* apkB) {
-    ResourceTable* tableA = apkA->getResourceTable();
-    ResourceTable* tableB = apkB->getResourceTable();
+static bool emitResourceTableDiff(IAaptContext* context, LoadedApk* apkA,
+                                  LoadedApk* apkB) {
+  ResourceTable* tableA = apkA->getResourceTable();
+  ResourceTable* tableB = apkB->getResourceTable();
 
-    bool diff = false;
-    for (std::unique_ptr<ResourceTablePackage>& pkgA : tableA->packages) {
-        ResourceTablePackage* pkgB = tableB->findPackage(pkgA->name);
-        if (!pkgB) {
-            std::stringstream strStream;
-            strStream << "missing package " << pkgA->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
+  bool diff = false;
+  for (std::unique_ptr<ResourceTablePackage>& pkgA : tableA->packages) {
+    ResourceTablePackage* pkgB = tableB->findPackage(pkgA->name);
+    if (!pkgB) {
+      std::stringstream strStream;
+      strStream << "missing package " << pkgA->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
+    } else {
+      if (pkgA->id != pkgB->id) {
+        std::stringstream strStream;
+        strStream << "package '" << pkgA->name << "' has different id (";
+        if (pkgB->id) {
+          strStream << "0x" << std::hex << pkgB->id.value();
         } else {
-            if (pkgA->id != pkgB->id) {
-                std::stringstream strStream;
-                strStream << "package '" << pkgA->name << "' has different id (";
-                if (pkgB->id) {
-                    strStream << "0x" << std::hex << pkgB->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << " vs ";
-                if (pkgA->id) {
-                    strStream << "0x" << std::hex << pkgA->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            }
-            diff |= emitResourcePackageDiff(context, apkA, pkgA.get(), apkB, pkgB);
+          strStream << "none";
         }
+        strStream << " vs ";
+        if (pkgA->id) {
+          strStream << "0x" << std::hex << pkgA->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      }
+      diff |= emitResourcePackageDiff(context, apkA, pkgA.get(), apkB, pkgB);
     }
+  }
 
-    // Check for any newly added packages.
-    for (std::unique_ptr<ResourceTablePackage>& pkgB : tableB->packages) {
-        ResourceTablePackage* pkgA = tableA->findPackage(pkgB->name);
-        if (!pkgA) {
-            std::stringstream strStream;
-            strStream << "new package " << pkgB->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added packages.
+  for (std::unique_ptr<ResourceTablePackage>& pkgB : tableB->packages) {
+    ResourceTablePackage* pkgA = tableA->findPackage(pkgB->name);
+    if (!pkgA) {
+      std::stringstream strStream;
+      strStream << "new package " << pkgB->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return diff;
+  }
+  return diff;
 }
 
 class ZeroingReferenceVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    void visit(Reference* ref) override {
-        if (ref->name && ref->id) {
-            if (ref->id.value().packageId() == 0x7f) {
-                ref->id = {};
-            }
-        }
+  void visit(Reference* ref) override {
+    if (ref->name && ref->id) {
+      if (ref->id.value().packageId() == 0x7f) {
+        ref->id = {};
+      }
     }
+  }
 };
 
 static void zeroOutAppReferences(ResourceTable* table) {
-    ZeroingReferenceVisitor visitor;
-    visitAllValuesInTable(table, &visitor);
+  ZeroingReferenceVisitor visitor;
+  visitAllValuesInTable(table, &visitor);
 }
 
 int diff(const std::vector<StringPiece>& args) {
-    DiffContext context;
+  DiffContext context;
 
-    Flags flags;
-    if (!flags.parse("aapt2 diff", args, &std::cerr)) {
-        return 1;
-    }
+  Flags flags;
+  if (!flags.parse("aapt2 diff", args, &std::cerr)) {
+    return 1;
+  }
 
-    if (flags.getArgs().size() != 2u) {
-        std::cerr << "must have two apks as arguments.\n\n";
-        flags.usage("aapt2 diff", &std::cerr);
-        return 1;
-    }
+  if (flags.getArgs().size() != 2u) {
+    std::cerr << "must have two apks as arguments.\n\n";
+    flags.usage("aapt2 diff", &std::cerr);
+    return 1;
+  }
 
-    std::unique_ptr<LoadedApk> apkA = loadApkFromPath(&context, flags.getArgs()[0]);
-    std::unique_ptr<LoadedApk> apkB = loadApkFromPath(&context, flags.getArgs()[1]);
-    if (!apkA || !apkB) {
-        return 1;
-    }
+  std::unique_ptr<LoadedApk> apkA =
+      loadApkFromPath(&context, flags.getArgs()[0]);
+  std::unique_ptr<LoadedApk> apkB =
+      loadApkFromPath(&context, flags.getArgs()[1]);
+  if (!apkA || !apkB) {
+    return 1;
+  }
 
-    // Zero out Application IDs in references.
-    zeroOutAppReferences(apkA->getResourceTable());
-    zeroOutAppReferences(apkB->getResourceTable());
+  // Zero out Application IDs in references.
+  zeroOutAppReferences(apkA->getResourceTable());
+  zeroOutAppReferences(apkB->getResourceTable());
 
-    if (emitResourceTableDiff(&context, apkA.get(), apkB.get())) {
-        // We emitted a diff, so return 1 (failure).
-        return 1;
-    }
-    return 0;
+  if (emitResourceTableDiff(&context, apkA.get(), apkB.get())) {
+    // We emitted a diff, so return 1 (failure).
+    return 1;
+  }
+  return 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/dump/Dump.cpp b/tools/aapt2/dump/Dump.cpp
index f61ec94..3556cd88 100644
--- a/tools/aapt2/dump/Dump.cpp
+++ b/tools/aapt2/dump/Dump.cpp
@@ -28,183 +28,181 @@
 
 namespace aapt {
 
-//struct DumpOptions {
+// struct DumpOptions {
 //
 //};
 
-void dumpCompiledFile(const pb::CompiledFile& pbFile, const void* data, size_t len,
-                      const Source& source, IAaptContext* context) {
-    std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(pbFile, source,
-                                                                       context->getDiagnostics());
-    if (!file) {
-        context->getDiagnostics()->warn(DiagMessage() << "failed to read compiled file");
-        return;
-    }
+void dumpCompiledFile(const pb::CompiledFile& pbFile, const void* data,
+                      size_t len, const Source& source, IAaptContext* context) {
+  std::unique_ptr<ResourceFile> file =
+      deserializeCompiledFileFromPb(pbFile, source, context->getDiagnostics());
+  if (!file) {
+    context->getDiagnostics()->warn(DiagMessage()
+                                    << "failed to read compiled file");
+    return;
+  }
 
-    std::cout << "Resource: " << file->name << "\n"
-              << "Config:   " << file->config << "\n"
-              << "Source:   " << file->source << "\n";
+  std::cout << "Resource: " << file->name << "\n"
+            << "Config:   " << file->config << "\n"
+            << "Source:   " << file->source << "\n";
 }
 
 void tryDumpFile(IAaptContext* context, const std::string& filePath) {
-    std::unique_ptr<ResourceTable> table;
+  std::unique_ptr<ResourceTable> table;
 
-    std::string err;
-    std::unique_ptr<io::ZipFileCollection> zip = io::ZipFileCollection::create(filePath, &err);
-    if (zip) {
-        io::IFile* file = zip->findFile("resources.arsc.flat");
-        if (file) {
-            std::unique_ptr<io::IData> data = file->openAsData();
-            if (!data) {
-                context->getDiagnostics()->error(DiagMessage(filePath)
-                                                 << "failed to open resources.arsc.flat");
-                return;
-            }
+  std::string err;
+  std::unique_ptr<io::ZipFileCollection> zip =
+      io::ZipFileCollection::create(filePath, &err);
+  if (zip) {
+    io::IFile* file = zip->findFile("resources.arsc.flat");
+    if (file) {
+      std::unique_ptr<io::IData> data = file->openAsData();
+      if (!data) {
+        context->getDiagnostics()->error(
+            DiagMessage(filePath) << "failed to open resources.arsc.flat");
+        return;
+      }
 
-            pb::ResourceTable pbTable;
-            if (!pbTable.ParseFromArray(data->data(), data->size())) {
-                context->getDiagnostics()->error(DiagMessage(filePath)
-                                                 << "invalid resources.arsc.flat");
-                return;
-            }
+      pb::ResourceTable pbTable;
+      if (!pbTable.ParseFromArray(data->data(), data->size())) {
+        context->getDiagnostics()->error(DiagMessage(filePath)
+                                         << "invalid resources.arsc.flat");
+        return;
+      }
 
-            table = deserializeTableFromPb(
-                    pbTable, Source(filePath), context->getDiagnostics());
-            if (!table) {
-                return;
-            }
-        }
-
-        if (!table) {
-            file = zip->findFile("resources.arsc");
-            if (file) {
-                std::unique_ptr<io::IData> data = file->openAsData();
-                if (!data) {
-                    context->getDiagnostics()->error(DiagMessage(filePath)
-                                                     << "failed to open resources.arsc");
-                    return;
-                }
-
-                table = util::make_unique<ResourceTable>();
-                BinaryResourceParser parser(context, table.get(), Source(filePath),
-                                            data->data(), data->size());
-                if (!parser.parse()) {
-                    return;
-                }
-            }
-        }
+      table = deserializeTableFromPb(pbTable, Source(filePath),
+                                     context->getDiagnostics());
+      if (!table) {
+        return;
+      }
     }
 
     if (!table) {
-        Maybe<android::FileMap> file = file::mmapPath(filePath, &err);
-        if (!file) {
-            context->getDiagnostics()->error(DiagMessage(filePath) << err);
-            return;
+      file = zip->findFile("resources.arsc");
+      if (file) {
+        std::unique_ptr<io::IData> data = file->openAsData();
+        if (!data) {
+          context->getDiagnostics()->error(DiagMessage(filePath)
+                                           << "failed to open resources.arsc");
+          return;
         }
 
-        android::FileMap* fileMap = &file.value();
-
-        // Try as a compiled table.
-        pb::ResourceTable pbTable;
-        if (pbTable.ParseFromArray(fileMap->getDataPtr(), fileMap->getDataLength())) {
-            table = deserializeTableFromPb(pbTable, Source(filePath), context->getDiagnostics());
+        table = util::make_unique<ResourceTable>();
+        BinaryResourceParser parser(context, table.get(), Source(filePath),
+                                    data->data(), data->size());
+        if (!parser.parse()) {
+          return;
         }
+      }
+    }
+  }
 
-        if (!table) {
-            // Try as a compiled file.
-            CompiledFileInputStream input(fileMap->getDataPtr(), fileMap->getDataLength());
-
-            uint32_t numFiles = 0;
-            if (!input.ReadLittleEndian32(&numFiles)) {
-                return;
-            }
-
-            for (uint32_t i = 0; i < numFiles; i++) {
-                pb::CompiledFile compiledFile;
-                if (!input.ReadCompiledFile(&compiledFile)) {
-                    context->getDiagnostics()->warn(DiagMessage() << "failed to read compiled file");
-                    return;
-                }
-
-                uint64_t offset, len;
-                if (!input.ReadDataMetaData(&offset, &len)) {
-                    context->getDiagnostics()->warn(DiagMessage() << "failed to read meta data");
-                    return;
-                }
-
-                const void* data = static_cast<const uint8_t*>(fileMap->getDataPtr()) + offset;
-                dumpCompiledFile(compiledFile, data, len, Source(filePath), context);
-            }
-        }
+  if (!table) {
+    Maybe<android::FileMap> file = file::mmapPath(filePath, &err);
+    if (!file) {
+      context->getDiagnostics()->error(DiagMessage(filePath) << err);
+      return;
     }
 
-    if (table) {
-        DebugPrintTableOptions debugPrintTableOptions;
-        debugPrintTableOptions.showSources = true;
-        Debug::printTable(table.get(), debugPrintTableOptions);
+    android::FileMap* fileMap = &file.value();
+
+    // Try as a compiled table.
+    pb::ResourceTable pbTable;
+    if (pbTable.ParseFromArray(fileMap->getDataPtr(),
+                               fileMap->getDataLength())) {
+      table = deserializeTableFromPb(pbTable, Source(filePath),
+                                     context->getDiagnostics());
     }
+
+    if (!table) {
+      // Try as a compiled file.
+      CompiledFileInputStream input(fileMap->getDataPtr(),
+                                    fileMap->getDataLength());
+
+      uint32_t numFiles = 0;
+      if (!input.ReadLittleEndian32(&numFiles)) {
+        return;
+      }
+
+      for (uint32_t i = 0; i < numFiles; i++) {
+        pb::CompiledFile compiledFile;
+        if (!input.ReadCompiledFile(&compiledFile)) {
+          context->getDiagnostics()->warn(DiagMessage()
+                                          << "failed to read compiled file");
+          return;
+        }
+
+        uint64_t offset, len;
+        if (!input.ReadDataMetaData(&offset, &len)) {
+          context->getDiagnostics()->warn(DiagMessage()
+                                          << "failed to read meta data");
+          return;
+        }
+
+        const void* data =
+            static_cast<const uint8_t*>(fileMap->getDataPtr()) + offset;
+        dumpCompiledFile(compiledFile, data, len, Source(filePath), context);
+      }
+    }
+  }
+
+  if (table) {
+    DebugPrintTableOptions debugPrintTableOptions;
+    debugPrintTableOptions.showSources = true;
+    Debug::printTable(table.get(), debugPrintTableOptions);
+  }
 }
 
 class DumpContext : public IAaptContext {
-public:
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+ public:
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-        abort();
-        return nullptr;
-    }
+  NameMangler* getNameMangler() override {
+    abort();
+    return nullptr;
+  }
 
-    const std::string& getCompilationPackage() override {
-        static std::string empty;
-        return empty;
-    }
+  const std::string& getCompilationPackage() override {
+    static std::string empty;
+    return empty;
+  }
 
-    uint8_t getPackageId() override {
-        return 0;
-    }
+  uint8_t getPackageId() override { return 0; }
 
-    SymbolTable* getExternalSymbols() override {
-        abort();
-        return nullptr;
-    }
+  SymbolTable* getExternalSymbols() override {
+    abort();
+    return nullptr;
+  }
 
-    bool verbose() override {
-        return mVerbose;
-    }
+  bool verbose() override { return mVerbose; }
 
-    void setVerbose(bool val) {
-        mVerbose = val;
-    }
+  void setVerbose(bool val) { mVerbose = val; }
 
-    int getMinSdkVersion() override {
-        return 0;
-    }
+  int getMinSdkVersion() override { return 0; }
 
-private:
-    StdErrDiagnostics mDiagnostics;
-    bool mVerbose = false;
+ private:
+  StdErrDiagnostics mDiagnostics;
+  bool mVerbose = false;
 };
 
 /**
  * Entry point for dump command.
  */
 int dump(const std::vector<StringPiece>& args) {
-    bool verbose = false;
-    Flags flags = Flags()
-            .optionalSwitch("-v", "increase verbosity of output", &verbose);
-    if (!flags.parse("aapt2 dump", args, &std::cerr)) {
-        return 1;
-    }
+  bool verbose = false;
+  Flags flags =
+      Flags().optionalSwitch("-v", "increase verbosity of output", &verbose);
+  if (!flags.parse("aapt2 dump", args, &std::cerr)) {
+    return 1;
+  }
 
-    DumpContext context;
-    context.setVerbose(verbose);
+  DumpContext context;
+  context.setVerbose(verbose);
 
-    for (const std::string& arg : flags.getArgs()) {
-        tryDumpFile(&context, arg);
-    }
-    return 0;
+  for (const std::string& arg : flags.getArgs()) {
+    tryDumpFile(&context, arg);
+  }
+  return 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/filter/ConfigFilter.cpp b/tools/aapt2/filter/ConfigFilter.cpp
index 68a017d..5af996c 100644
--- a/tools/aapt2/filter/ConfigFilter.cpp
+++ b/tools/aapt2/filter/ConfigFilter.cpp
@@ -14,64 +14,68 @@
  * limitations under the License.
  */
 
-#include "ConfigDescription.h"
 #include "filter/ConfigFilter.h"
+#include "ConfigDescription.h"
 
 #include <androidfw/ResourceTypes.h>
 
 namespace aapt {
 
 void AxisConfigFilter::addConfig(ConfigDescription config) {
-    uint32_t diffMask = ConfigDescription::defaultConfig().diff(config);
+  uint32_t diffMask = ConfigDescription::defaultConfig().diff(config);
 
-    // Ignore the version
-    diffMask &= ~android::ResTable_config::CONFIG_VERSION;
+  // Ignore the version
+  diffMask &= ~android::ResTable_config::CONFIG_VERSION;
 
-    // Ignore any densities. Those are best handled in --preferred-density
-    if ((diffMask & android::ResTable_config::CONFIG_DENSITY) != 0) {
-        config.density = 0;
-        diffMask &= ~android::ResTable_config::CONFIG_DENSITY;
-    }
+  // Ignore any densities. Those are best handled in --preferred-density
+  if ((diffMask & android::ResTable_config::CONFIG_DENSITY) != 0) {
+    config.density = 0;
+    diffMask &= ~android::ResTable_config::CONFIG_DENSITY;
+  }
 
-    mConfigs.insert(std::make_pair(config, diffMask));
-    mConfigMask |= diffMask;
+  mConfigs.insert(std::make_pair(config, diffMask));
+  mConfigMask |= diffMask;
 }
 
 bool AxisConfigFilter::match(const ConfigDescription& config) const {
-    const uint32_t mask = ConfigDescription::defaultConfig().diff(config);
-    if ((mConfigMask & mask) == 0) {
-        // The two configurations don't have any common axis.
-        return true;
-    }
+  const uint32_t mask = ConfigDescription::defaultConfig().diff(config);
+  if ((mConfigMask & mask) == 0) {
+    // The two configurations don't have any common axis.
+    return true;
+  }
 
-    uint32_t matchedAxis = 0;
-    for (const auto& entry : mConfigs) {
-        const ConfigDescription& target = entry.first;
-        const uint32_t diffMask = entry.second;
-        uint32_t diff = target.diff(config);
-        if ((diff & diffMask) == 0) {
-            // Mark the axis that was matched.
-            matchedAxis |= diffMask;
-        } else if ((diff & diffMask) == android::ResTable_config::CONFIG_LOCALE) {
-            // If the locales differ, but the languages are the same and
-            // the locale we are matching only has a language specified,
-            // we match.
-            if (config.language[0] &&
-                    memcmp(config.language, target.language, sizeof(config.language)) == 0) {
-                if (config.country[0] == 0) {
-                    matchedAxis |= android::ResTable_config::CONFIG_LOCALE;
-                }
-            }
-        } else if ((diff & diffMask) == android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE) {
-            // Special case if the smallest screen width doesn't match. We check that the
-            // config being matched has a smaller screen width than the filter specified.
-            if (config.smallestScreenWidthDp != 0 &&
-                    config.smallestScreenWidthDp < target.smallestScreenWidthDp) {
-                matchedAxis |= android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE;
-            }
+  uint32_t matchedAxis = 0;
+  for (const auto& entry : mConfigs) {
+    const ConfigDescription& target = entry.first;
+    const uint32_t diffMask = entry.second;
+    uint32_t diff = target.diff(config);
+    if ((diff & diffMask) == 0) {
+      // Mark the axis that was matched.
+      matchedAxis |= diffMask;
+    } else if ((diff & diffMask) == android::ResTable_config::CONFIG_LOCALE) {
+      // If the locales differ, but the languages are the same and
+      // the locale we are matching only has a language specified,
+      // we match.
+      if (config.language[0] &&
+          memcmp(config.language, target.language, sizeof(config.language)) ==
+              0) {
+        if (config.country[0] == 0) {
+          matchedAxis |= android::ResTable_config::CONFIG_LOCALE;
         }
+      }
+    } else if ((diff & diffMask) ==
+               android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE) {
+      // Special case if the smallest screen width doesn't match. We check that
+      // the
+      // config being matched has a smaller screen width than the filter
+      // specified.
+      if (config.smallestScreenWidthDp != 0 &&
+          config.smallestScreenWidthDp < target.smallestScreenWidthDp) {
+        matchedAxis |= android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE;
+      }
     }
-    return matchedAxis == (mConfigMask & mask);
+  }
+  return matchedAxis == (mConfigMask & mask);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/filter/ConfigFilter.h b/tools/aapt2/filter/ConfigFilter.h
index 36e9c44..c50160b 100644
--- a/tools/aapt2/filter/ConfigFilter.h
+++ b/tools/aapt2/filter/ConfigFilter.h
@@ -28,34 +28,37 @@
  * Matches ConfigDescriptions based on some pattern.
  */
 class IConfigFilter {
-public:
-    virtual ~IConfigFilter() = default;
+ public:
+  virtual ~IConfigFilter() = default;
 
-    /**
-     * Returns true if the filter matches the configuration, false otherwise.
-     */
-    virtual bool match(const ConfigDescription& config) const = 0;
+  /**
+   * Returns true if the filter matches the configuration, false otherwise.
+   */
+  virtual bool match(const ConfigDescription& config) const = 0;
 };
 
 /**
- * Implements config axis matching. An axis is one component of a configuration, like screen
- * density or locale. If an axis is specified in the filter, and the axis is specified in
- * the configuration to match, they must be compatible. Otherwise the configuration to match is
+ * Implements config axis matching. An axis is one component of a configuration,
+ * like screen
+ * density or locale. If an axis is specified in the filter, and the axis is
+ * specified in
+ * the configuration to match, they must be compatible. Otherwise the
+ * configuration to match is
  * accepted.
  *
  * Used when handling "-c" options.
  */
 class AxisConfigFilter : public IConfigFilter {
-public:
-    void addConfig(ConfigDescription config);
+ public:
+  void addConfig(ConfigDescription config);
 
-    bool match(const ConfigDescription& config) const override;
+  bool match(const ConfigDescription& config) const override;
 
-private:
-    std::set<std::pair<ConfigDescription, uint32_t>> mConfigs;
-    uint32_t mConfigMask = 0;
+ private:
+  std::set<std::pair<ConfigDescription, uint32_t>> mConfigs;
+  uint32_t mConfigMask = 0;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FILTER_CONFIGFILTER_H */
diff --git a/tools/aapt2/filter/ConfigFilter_test.cpp b/tools/aapt2/filter/ConfigFilter_test.cpp
index f6b4955..edb40a8 100644
--- a/tools/aapt2/filter/ConfigFilter_test.cpp
+++ b/tools/aapt2/filter/ConfigFilter_test.cpp
@@ -22,91 +22,92 @@
 namespace aapt {
 
 TEST(ConfigFilterTest, EmptyFilterMatchesAnything) {
-    AxisConfigFilter filter;
+  AxisConfigFilter filter;
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithUnrelatedAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithSameValueAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithSameValueAxisAndOtherUnrelatedAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-320dpi")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-320dpi")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithOneMatchingAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr-rFR"));
-    filter.addConfig(test::parseConfigOrDie("sw360dp"));
-    filter.addConfig(test::parseConfigOrDie("normal"));
-    filter.addConfig(test::parseConfigOrDie("en-rUS"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr-rFR"));
+  filter.addConfig(test::parseConfigOrDie("sw360dp"));
+  filter.addConfig(test::parseConfigOrDie("normal"));
+  filter.addConfig(test::parseConfigOrDie("en-rUS"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("en")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("en")));
 }
 
 TEST(ConfigFilterTest, DoesNotMatchConfigWithDifferentValueAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_FALSE(filter.match(test::parseConfigOrDie("de")));
+  EXPECT_FALSE(filter.match(test::parseConfigOrDie("de")));
 }
 
 TEST(ConfigFilterTest, DoesNotMatchWhenOneQualifierIsExplicitlyNotMatched) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr-rFR"));
-    filter.addConfig(test::parseConfigOrDie("en-rUS"));
-    filter.addConfig(test::parseConfigOrDie("normal"));
-    filter.addConfig(test::parseConfigOrDie("large"));
-    filter.addConfig(test::parseConfigOrDie("xxhdpi"));
-    filter.addConfig(test::parseConfigOrDie("sw320dp"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr-rFR"));
+  filter.addConfig(test::parseConfigOrDie("en-rUS"));
+  filter.addConfig(test::parseConfigOrDie("normal"));
+  filter.addConfig(test::parseConfigOrDie("large"));
+  filter.addConfig(test::parseConfigOrDie("xxhdpi"));
+  filter.addConfig(test::parseConfigOrDie("sw320dp"));
 
-    EXPECT_FALSE(filter.match(test::parseConfigOrDie("fr-sw600dp-v13")));
+  EXPECT_FALSE(filter.match(test::parseConfigOrDie("fr-sw600dp-v13")));
 }
 
 TEST(ConfigFilterTest, MatchesSmallestWidthWhenSmaller) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("sw600dp"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("sw600dp"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-sw320dp-v13")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-sw320dp-v13")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithSameLanguageButNoRegionSpecified) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("de-rDE"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("de-rDE"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("de")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("de")));
 }
 
 TEST(ConfigFilterTest, IgnoresVersion) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("normal-v4"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("normal-v4"));
 
-    // The configs don't match on any axis besides version, which should be ignored.
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("sw600dp-v13")));
+  // The configs don't match on any axis besides version, which should be
+  // ignored.
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("sw600dp-v13")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithRegion) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("kok"));
-    filter.addConfig(test::parseConfigOrDie("kok-rIN"));
-    filter.addConfig(test::parseConfigOrDie("kok-v419"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("kok"));
+  filter.addConfig(test::parseConfigOrDie("kok-rIN"));
+  filter.addConfig(test::parseConfigOrDie("kok-v419"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("kok-rIN")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("kok-rIN")));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/Archive.cpp b/tools/aapt2/flatten/Archive.cpp
index 3a244c0..ae08f65 100644
--- a/tools/aapt2/flatten/Archive.cpp
+++ b/tools/aapt2/flatten/Archive.cpp
@@ -18,167 +18,169 @@
 #include "util/Files.h"
 #include "util/StringPiece.h"
 
+#include <ziparchive/zip_writer.h>
 #include <cstdio>
 #include <memory>
 #include <string>
 #include <vector>
-#include <ziparchive/zip_writer.h>
 
 namespace aapt {
 
 namespace {
 
 struct DirectoryWriter : public IArchiveWriter {
-    std::string mOutDir;
-    std::unique_ptr<FILE, decltype(fclose)*> mFile = { nullptr, fclose };
+  std::string mOutDir;
+  std::unique_ptr<FILE, decltype(fclose)*> mFile = {nullptr, fclose};
 
-    bool open(IDiagnostics* diag, const StringPiece& outDir) {
-        mOutDir = outDir.toString();
-        file::FileType type = file::getFileType(mOutDir);
-        if (type == file::FileType::kNonexistant) {
-            diag->error(DiagMessage() << "directory " << mOutDir << " does not exist");
-            return false;
-        } else if (type != file::FileType::kDirectory) {
-            diag->error(DiagMessage() << mOutDir << " is not a directory");
-            return false;
-        }
-        return true;
+  bool open(IDiagnostics* diag, const StringPiece& outDir) {
+    mOutDir = outDir.toString();
+    file::FileType type = file::getFileType(mOutDir);
+    if (type == file::FileType::kNonexistant) {
+      diag->error(DiagMessage() << "directory " << mOutDir
+                                << " does not exist");
+      return false;
+    } else if (type != file::FileType::kDirectory) {
+      diag->error(DiagMessage() << mOutDir << " is not a directory");
+      return false;
+    }
+    return true;
+  }
+
+  bool startEntry(const StringPiece& path, uint32_t flags) override {
+    if (mFile) {
+      return false;
     }
 
-    bool startEntry(const StringPiece& path, uint32_t flags) override {
-        if (mFile) {
-            return false;
-        }
+    std::string fullPath = mOutDir;
+    file::appendPath(&fullPath, path);
+    file::mkdirs(file::getStem(fullPath));
 
-        std::string fullPath = mOutDir;
-        file::appendPath(&fullPath, path);
-        file::mkdirs(file::getStem(fullPath));
+    mFile = {fopen(fullPath.data(), "wb"), fclose};
+    if (!mFile) {
+      return false;
+    }
+    return true;
+  }
 
-        mFile = { fopen(fullPath.data(), "wb"), fclose };
-        if (!mFile) {
-            return false;
-        }
-        return true;
+  bool writeEntry(const BigBuffer& buffer) override {
+    if (!mFile) {
+      return false;
     }
 
-    bool writeEntry(const BigBuffer& buffer) override {
-        if (!mFile) {
-            return false;
-        }
-
-        for (const BigBuffer::Block& b : buffer) {
-            if (fwrite(b.buffer.get(), 1, b.size, mFile.get()) != b.size) {
-                mFile.reset(nullptr);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    bool writeEntry(const void* data, size_t len) override {
-        if (fwrite(data, 1, len, mFile.get()) != len) {
-            mFile.reset(nullptr);
-            return false;
-        }
-        return true;
-    }
-
-    bool finishEntry() override {
-        if (!mFile) {
-            return false;
-        }
+    for (const BigBuffer::Block& b : buffer) {
+      if (fwrite(b.buffer.get(), 1, b.size, mFile.get()) != b.size) {
         mFile.reset(nullptr);
-        return true;
+        return false;
+      }
     }
+    return true;
+  }
+
+  bool writeEntry(const void* data, size_t len) override {
+    if (fwrite(data, 1, len, mFile.get()) != len) {
+      mFile.reset(nullptr);
+      return false;
+    }
+    return true;
+  }
+
+  bool finishEntry() override {
+    if (!mFile) {
+      return false;
+    }
+    mFile.reset(nullptr);
+    return true;
+  }
 };
 
 struct ZipFileWriter : public IArchiveWriter {
-    std::unique_ptr<FILE, decltype(fclose)*> mFile = { nullptr, fclose };
-    std::unique_ptr<ZipWriter> mWriter;
+  std::unique_ptr<FILE, decltype(fclose)*> mFile = {nullptr, fclose};
+  std::unique_ptr<ZipWriter> mWriter;
 
-    bool open(IDiagnostics* diag, const StringPiece& path) {
-        mFile = { fopen(path.data(), "w+b"), fclose };
-        if (!mFile) {
-            diag->error(DiagMessage() << "failed to open " << path << ": " << strerror(errno));
-            return false;
-        }
-        mWriter = util::make_unique<ZipWriter>(mFile.get());
-        return true;
+  bool open(IDiagnostics* diag, const StringPiece& path) {
+    mFile = {fopen(path.data(), "w+b"), fclose};
+    if (!mFile) {
+      diag->error(DiagMessage() << "failed to open " << path << ": "
+                                << strerror(errno));
+      return false;
+    }
+    mWriter = util::make_unique<ZipWriter>(mFile.get());
+    return true;
+  }
+
+  bool startEntry(const StringPiece& path, uint32_t flags) override {
+    if (!mWriter) {
+      return false;
     }
 
-    bool startEntry(const StringPiece& path, uint32_t flags) override {
-        if (!mWriter) {
-            return false;
-        }
-
-        size_t zipFlags = 0;
-        if (flags & ArchiveEntry::kCompress) {
-            zipFlags |= ZipWriter::kCompress;
-        }
-
-        if (flags & ArchiveEntry::kAlign) {
-            zipFlags |= ZipWriter::kAlign32;
-        }
-
-        int32_t result = mWriter->StartEntry(path.data(), zipFlags);
-        if (result != 0) {
-            return false;
-        }
-        return true;
+    size_t zipFlags = 0;
+    if (flags & ArchiveEntry::kCompress) {
+      zipFlags |= ZipWriter::kCompress;
     }
 
-    bool writeEntry(const void* data, size_t len) override {
-        int32_t result = mWriter->WriteBytes(data, len);
-        if (result != 0) {
-            return false;
-        }
-        return true;
+    if (flags & ArchiveEntry::kAlign) {
+      zipFlags |= ZipWriter::kAlign32;
     }
 
-    bool writeEntry(const BigBuffer& buffer) override {
-        for (const BigBuffer::Block& b : buffer) {
-            int32_t result = mWriter->WriteBytes(b.buffer.get(), b.size);
-            if (result != 0) {
-                return false;
-            }
-        }
-        return true;
+    int32_t result = mWriter->StartEntry(path.data(), zipFlags);
+    if (result != 0) {
+      return false;
     }
+    return true;
+  }
 
-    bool finishEntry() override {
-        int32_t result = mWriter->FinishEntry();
-        if (result != 0) {
-            return false;
-        }
-        return true;
+  bool writeEntry(const void* data, size_t len) override {
+    int32_t result = mWriter->WriteBytes(data, len);
+    if (result != 0) {
+      return false;
     }
+    return true;
+  }
 
-    virtual ~ZipFileWriter() {
-        if (mWriter) {
-            mWriter->Finish();
-        }
+  bool writeEntry(const BigBuffer& buffer) override {
+    for (const BigBuffer::Block& b : buffer) {
+      int32_t result = mWriter->WriteBytes(b.buffer.get(), b.size);
+      if (result != 0) {
+        return false;
+      }
     }
+    return true;
+  }
+
+  bool finishEntry() override {
+    int32_t result = mWriter->FinishEntry();
+    if (result != 0) {
+      return false;
+    }
+    return true;
+  }
+
+  virtual ~ZipFileWriter() {
+    if (mWriter) {
+      mWriter->Finish();
+    }
+  }
 };
 
-} // namespace
+}  // namespace
 
-std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(IDiagnostics* diag,
-                                                             const StringPiece& path) {
-
-    std::unique_ptr<DirectoryWriter> writer = util::make_unique<DirectoryWriter>();
-    if (!writer->open(diag, path)) {
-        return {};
-    }
-    return std::move(writer);
+std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path) {
+  std::unique_ptr<DirectoryWriter> writer =
+      util::make_unique<DirectoryWriter>();
+  if (!writer->open(diag, path)) {
+    return {};
+  }
+  return std::move(writer);
 }
 
-std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(IDiagnostics* diag,
-                                                           const StringPiece& path) {
-    std::unique_ptr<ZipFileWriter> writer = util::make_unique<ZipFileWriter>();
-    if (!writer->open(diag, path)) {
-        return {};
-    }
-    return std::move(writer);
+std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path) {
+  std::unique_ptr<ZipFileWriter> writer = util::make_unique<ZipFileWriter>();
+  if (!writer->open(diag, path)) {
+    return {};
+  }
+  return std::move(writer);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/Archive.h b/tools/aapt2/flatten/Archive.h
index 96d8512..46cd0ac 100644
--- a/tools/aapt2/flatten/Archive.h
+++ b/tools/aapt2/flatten/Archive.h
@@ -31,37 +31,37 @@
 namespace aapt {
 
 struct ArchiveEntry {
-    enum : uint32_t {
-        kCompress = 0x01,
-        kAlign    = 0x02,
-    };
+  enum : uint32_t {
+    kCompress = 0x01,
+    kAlign = 0x02,
+  };
 
-    std::string path;
-    uint32_t flags;
-    size_t uncompressedSize;
+  std::string path;
+  uint32_t flags;
+  size_t uncompressedSize;
 };
 
 class IArchiveWriter : public google::protobuf::io::CopyingOutputStream {
-public:
-    virtual ~IArchiveWriter() = default;
+ public:
+  virtual ~IArchiveWriter() = default;
 
-    virtual bool startEntry(const StringPiece& path, uint32_t flags) = 0;
-    virtual bool writeEntry(const BigBuffer& buffer) = 0;
-    virtual bool writeEntry(const void* data, size_t len) = 0;
-    virtual bool finishEntry() = 0;
+  virtual bool startEntry(const StringPiece& path, uint32_t flags) = 0;
+  virtual bool writeEntry(const BigBuffer& buffer) = 0;
+  virtual bool writeEntry(const void* data, size_t len) = 0;
+  virtual bool finishEntry() = 0;
 
-    // CopyingOutputStream implementations.
-    bool Write(const void* buffer, int size) override {
-        return writeEntry(buffer, size);
-    }
+  // CopyingOutputStream implementations.
+  bool Write(const void* buffer, int size) override {
+    return writeEntry(buffer, size);
+  }
 };
 
-std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(IDiagnostics* diag,
-                                                             const StringPiece& path);
+std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path);
 
-std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(IDiagnostics* diag,
-                                                           const StringPiece& path);
+std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_ARCHIVE_H */
diff --git a/tools/aapt2/flatten/ChunkWriter.h b/tools/aapt2/flatten/ChunkWriter.h
index de1d87a..852afd4 100644
--- a/tools/aapt2/flatten/ChunkWriter.h
+++ b/tools/aapt2/flatten/ChunkWriter.h
@@ -25,63 +25,56 @@
 namespace aapt {
 
 class ChunkWriter {
-private:
-    BigBuffer* mBuffer;
-    size_t mStartSize = 0;
-    android::ResChunk_header* mHeader = nullptr;
+ private:
+  BigBuffer* mBuffer;
+  size_t mStartSize = 0;
+  android::ResChunk_header* mHeader = nullptr;
 
-public:
-    explicit inline ChunkWriter(BigBuffer* buffer) : mBuffer(buffer) {
-    }
+ public:
+  explicit inline ChunkWriter(BigBuffer* buffer) : mBuffer(buffer) {}
 
-    ChunkWriter(const ChunkWriter&) = delete;
-    ChunkWriter& operator=(const ChunkWriter&) = delete;
-    ChunkWriter(ChunkWriter&&) = default;
-    ChunkWriter& operator=(ChunkWriter&&) = default;
+  ChunkWriter(const ChunkWriter&) = delete;
+  ChunkWriter& operator=(const ChunkWriter&) = delete;
+  ChunkWriter(ChunkWriter&&) = default;
+  ChunkWriter& operator=(ChunkWriter&&) = default;
 
-    template <typename T>
-    inline T* startChunk(uint16_t type) {
-        mStartSize = mBuffer->size();
-        T* chunk = mBuffer->nextBlock<T>();
-        mHeader = &chunk->header;
-        mHeader->type = util::hostToDevice16(type);
-        mHeader->headerSize = util::hostToDevice16(sizeof(T));
-        return chunk;
-    }
+  template <typename T>
+  inline T* startChunk(uint16_t type) {
+    mStartSize = mBuffer->size();
+    T* chunk = mBuffer->nextBlock<T>();
+    mHeader = &chunk->header;
+    mHeader->type = util::hostToDevice16(type);
+    mHeader->headerSize = util::hostToDevice16(sizeof(T));
+    return chunk;
+  }
 
-    template <typename T>
-    inline T* nextBlock(size_t count = 1) {
-        return mBuffer->nextBlock<T>(count);
-    }
+  template <typename T>
+  inline T* nextBlock(size_t count = 1) {
+    return mBuffer->nextBlock<T>(count);
+  }
 
-    inline BigBuffer* getBuffer() {
-        return mBuffer;
-    }
+  inline BigBuffer* getBuffer() { return mBuffer; }
 
-    inline android::ResChunk_header* getChunkHeader() {
-        return mHeader;
-    }
+  inline android::ResChunk_header* getChunkHeader() { return mHeader; }
 
-    inline size_t size() {
-        return mBuffer->size() - mStartSize;
-    }
+  inline size_t size() { return mBuffer->size() - mStartSize; }
 
-    inline android::ResChunk_header* finish() {
-        mBuffer->align4();
-        mHeader->size = util::hostToDevice32(mBuffer->size() - mStartSize);
-        return mHeader;
-    }
+  inline android::ResChunk_header* finish() {
+    mBuffer->align4();
+    mHeader->size = util::hostToDevice32(mBuffer->size() - mStartSize);
+    return mHeader;
+  }
 };
 
 template <>
 inline android::ResChunk_header* ChunkWriter::startChunk(uint16_t type) {
-    mStartSize = mBuffer->size();
-    mHeader = mBuffer->nextBlock<android::ResChunk_header>();
-    mHeader->type = util::hostToDevice16(type);
-    mHeader->headerSize = util::hostToDevice16(sizeof(android::ResChunk_header));
-    return mHeader;
+  mStartSize = mBuffer->size();
+  mHeader = mBuffer->nextBlock<android::ResChunk_header>();
+  mHeader->type = util::hostToDevice16(type);
+  mHeader->headerSize = util::hostToDevice16(sizeof(android::ResChunk_header));
+  return mHeader;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_CHUNKWRITER_H */
diff --git a/tools/aapt2/flatten/ResourceTypeExtensions.h b/tools/aapt2/flatten/ResourceTypeExtensions.h
index 3e20ad6..0b19240 100644
--- a/tools/aapt2/flatten/ResourceTypeExtensions.h
+++ b/tools/aapt2/flatten/ResourceTypeExtensions.h
@@ -22,15 +22,16 @@
 namespace aapt {
 
 /**
- * An alternative struct to use instead of ResTable_map_entry. This one is a standard_layout
+ * An alternative struct to use instead of ResTable_map_entry. This one is a
+ * standard_layout
  * struct.
  */
 struct ResTable_entry_ext {
-    android::ResTable_entry entry;
-    android::ResTable_ref parent;
-    uint32_t count;
+  android::ResTable_entry entry;
+  android::ResTable_ref parent;
+  uint32_t count;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_TYPE_EXTENSIONS_H
+#endif  // AAPT_RESOURCE_TYPE_EXTENSIONS_H
diff --git a/tools/aapt2/flatten/TableFlattener.cpp b/tools/aapt2/flatten/TableFlattener.cpp
index d5067b1..d4ea6c0 100644
--- a/tools/aapt2/flatten/TableFlattener.cpp
+++ b/tools/aapt2/flatten/TableFlattener.cpp
@@ -25,9 +25,9 @@
 
 #include <android-base/macros.h>
 #include <algorithm>
+#include <numeric>
 #include <sstream>
 #include <type_traits>
-#include <numeric>
 
 using namespace android;
 
@@ -37,438 +37,454 @@
 
 template <typename T>
 static bool cmpIds(const T* a, const T* b) {
-    return a->id.value() < b->id.value();
+  return a->id.value() < b->id.value();
 }
 
 static void strcpy16_htod(uint16_t* dst, size_t len, const StringPiece16& src) {
-    if (len == 0) {
-        return;
-    }
+  if (len == 0) {
+    return;
+  }
 
-    size_t i;
-    const char16_t* srcData = src.data();
-    for (i = 0; i < len - 1 && i < src.size(); i++) {
-        dst[i] = util::hostToDevice16((uint16_t) srcData[i]);
-    }
-    dst[i] = 0;
+  size_t i;
+  const char16_t* srcData = src.data();
+  for (i = 0; i < len - 1 && i < src.size(); i++) {
+    dst[i] = util::hostToDevice16((uint16_t)srcData[i]);
+  }
+  dst[i] = 0;
 }
 
 static bool cmpStyleEntries(const Style::Entry& a, const Style::Entry& b) {
-   if (a.key.id) {
-       if (b.key.id) {
-           return a.key.id.value() < b.key.id.value();
-       }
-       return true;
-   } else if (!b.key.id) {
-       return a.key.name.value() < b.key.name.value();
-   }
-   return false;
+  if (a.key.id) {
+    if (b.key.id) {
+      return a.key.id.value() < b.key.id.value();
+    }
+    return true;
+  } else if (!b.key.id) {
+    return a.key.name.value() < b.key.name.value();
+  }
+  return false;
 }
 
 struct FlatEntry {
-    ResourceEntry* entry;
-    Value* value;
+  ResourceEntry* entry;
+  Value* value;
 
-    // The entry string pool index to the entry's name.
-    uint32_t entryKey;
+  // The entry string pool index to the entry's name.
+  uint32_t entryKey;
 };
 
 class MapFlattenVisitor : public RawValueVisitor {
-public:
-    using RawValueVisitor::visit;
+ public:
+  using RawValueVisitor::visit;
 
-    MapFlattenVisitor(ResTable_entry_ext* outEntry, BigBuffer* buffer) :
-            mOutEntry(outEntry), mBuffer(buffer) {
+  MapFlattenVisitor(ResTable_entry_ext* outEntry, BigBuffer* buffer)
+      : mOutEntry(outEntry), mBuffer(buffer) {}
+
+  void visit(Attribute* attr) override {
+    {
+      Reference key = Reference(ResourceId(ResTable_map::ATTR_TYPE));
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC, attr->typeMask);
+      flattenEntry(&key, &val);
     }
 
-    void visit(Attribute* attr) override {
-        {
-            Reference key = Reference(ResourceId(ResTable_map::ATTR_TYPE));
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, attr->typeMask);
-            flattenEntry(&key, &val);
-        }
-
-        if (attr->minInt != std::numeric_limits<int32_t>::min()) {
-            Reference key = Reference(ResourceId(ResTable_map::ATTR_MIN));
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(attr->minInt));
-            flattenEntry(&key, &val);
-        }
-
-        if (attr->maxInt != std::numeric_limits<int32_t>::max()) {
-            Reference key = Reference(ResourceId(ResTable_map::ATTR_MAX));
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(attr->maxInt));
-            flattenEntry(&key, &val);
-        }
-
-        for (Attribute::Symbol& s : attr->symbols) {
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, s.value);
-            flattenEntry(&s.symbol, &val);
-        }
+    if (attr->minInt != std::numeric_limits<int32_t>::min()) {
+      Reference key = Reference(ResourceId(ResTable_map::ATTR_MIN));
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC,
+                          static_cast<uint32_t>(attr->minInt));
+      flattenEntry(&key, &val);
     }
 
-    void visit(Style* style) override {
-        if (style->parent) {
-            const Reference& parentRef = style->parent.value();
-            assert(parentRef.id && "parent has no ID");
-            mOutEntry->parent.ident = util::hostToDevice32(parentRef.id.value().id);
-        }
-
-        // Sort the style.
-        std::sort(style->entries.begin(), style->entries.end(), cmpStyleEntries);
-
-        for (Style::Entry& entry : style->entries) {
-            flattenEntry(&entry.key, entry.value.get());
-        }
+    if (attr->maxInt != std::numeric_limits<int32_t>::max()) {
+      Reference key = Reference(ResourceId(ResTable_map::ATTR_MAX));
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC,
+                          static_cast<uint32_t>(attr->maxInt));
+      flattenEntry(&key, &val);
     }
 
-    void visit(Styleable* styleable) override {
-        for (auto& attrRef : styleable->entries) {
-            BinaryPrimitive val(Res_value{});
-            flattenEntry(&attrRef, &val);
-        }
+    for (Attribute::Symbol& s : attr->symbols) {
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC, s.value);
+      flattenEntry(&s.symbol, &val);
+    }
+  }
 
+  void visit(Style* style) override {
+    if (style->parent) {
+      const Reference& parentRef = style->parent.value();
+      assert(parentRef.id && "parent has no ID");
+      mOutEntry->parent.ident = util::hostToDevice32(parentRef.id.value().id);
     }
 
-    void visit(Array* array) override {
-        for (auto& item : array->items) {
-            ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
-            flattenValue(item.get(), outEntry);
-            outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
-            mEntryCount++;
-        }
+    // Sort the style.
+    std::sort(style->entries.begin(), style->entries.end(), cmpStyleEntries);
+
+    for (Style::Entry& entry : style->entries) {
+      flattenEntry(&entry.key, entry.value.get());
     }
+  }
 
-    void visit(Plural* plural) override {
-        const size_t count = plural->values.size();
-        for (size_t i = 0; i < count; i++) {
-            if (!plural->values[i]) {
-                continue;
-            }
-
-            ResourceId q;
-            switch (i) {
-            case Plural::Zero:
-                q.id = android::ResTable_map::ATTR_ZERO;
-                break;
-
-            case Plural::One:
-                q.id = android::ResTable_map::ATTR_ONE;
-                break;
-
-            case Plural::Two:
-                q.id = android::ResTable_map::ATTR_TWO;
-                break;
-
-            case Plural::Few:
-                q.id = android::ResTable_map::ATTR_FEW;
-                break;
-
-            case Plural::Many:
-                q.id = android::ResTable_map::ATTR_MANY;
-                break;
-
-            case Plural::Other:
-                q.id = android::ResTable_map::ATTR_OTHER;
-                break;
-
-            default:
-                assert(false);
-                break;
-            }
-
-            Reference key(q);
-            flattenEntry(&key, plural->values[i].get());
-        }
+  void visit(Styleable* styleable) override {
+    for (auto& attrRef : styleable->entries) {
+      BinaryPrimitive val(Res_value{});
+      flattenEntry(&attrRef, &val);
     }
+  }
 
-    /**
-     * Call this after visiting a Value. This will finish any work that
-     * needs to be done to prepare the entry.
-     */
-    void finish() {
-        mOutEntry->count = util::hostToDevice32(mEntryCount);
+  void visit(Array* array) override {
+    for (auto& item : array->items) {
+      ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
+      flattenValue(item.get(), outEntry);
+      outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
+      mEntryCount++;
     }
+  }
 
-private:
-    void flattenKey(Reference* key, ResTable_map* outEntry) {
-        assert(key->id && "key has no ID");
-        outEntry->name.ident = util::hostToDevice32(key->id.value().id);
+  void visit(Plural* plural) override {
+    const size_t count = plural->values.size();
+    for (size_t i = 0; i < count; i++) {
+      if (!plural->values[i]) {
+        continue;
+      }
+
+      ResourceId q;
+      switch (i) {
+        case Plural::Zero:
+          q.id = android::ResTable_map::ATTR_ZERO;
+          break;
+
+        case Plural::One:
+          q.id = android::ResTable_map::ATTR_ONE;
+          break;
+
+        case Plural::Two:
+          q.id = android::ResTable_map::ATTR_TWO;
+          break;
+
+        case Plural::Few:
+          q.id = android::ResTable_map::ATTR_FEW;
+          break;
+
+        case Plural::Many:
+          q.id = android::ResTable_map::ATTR_MANY;
+          break;
+
+        case Plural::Other:
+          q.id = android::ResTable_map::ATTR_OTHER;
+          break;
+
+        default:
+          assert(false);
+          break;
+      }
+
+      Reference key(q);
+      flattenEntry(&key, plural->values[i].get());
     }
+  }
 
-    void flattenValue(Item* value, ResTable_map* outEntry) {
-        bool result = value->flatten(&outEntry->value);
-        assert(result && "flatten failed");
-    }
+  /**
+   * Call this after visiting a Value. This will finish any work that
+   * needs to be done to prepare the entry.
+   */
+  void finish() { mOutEntry->count = util::hostToDevice32(mEntryCount); }
 
-    void flattenEntry(Reference* key, Item* value) {
-        ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
-        flattenKey(key, outEntry);
-        flattenValue(value, outEntry);
-        outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
-        mEntryCount++;
-    }
+ private:
+  void flattenKey(Reference* key, ResTable_map* outEntry) {
+    assert(key->id && "key has no ID");
+    outEntry->name.ident = util::hostToDevice32(key->id.value().id);
+  }
 
-    ResTable_entry_ext* mOutEntry;
-    BigBuffer* mBuffer;
-    size_t mEntryCount = 0;
+  void flattenValue(Item* value, ResTable_map* outEntry) {
+    bool result = value->flatten(&outEntry->value);
+    assert(result && "flatten failed");
+  }
+
+  void flattenEntry(Reference* key, Item* value) {
+    ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
+    flattenKey(key, outEntry);
+    flattenValue(value, outEntry);
+    outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
+    mEntryCount++;
+  }
+
+  ResTable_entry_ext* mOutEntry;
+  BigBuffer* mBuffer;
+  size_t mEntryCount = 0;
 };
 
 class PackageFlattener {
-public:
-    PackageFlattener(IDiagnostics* diag, ResourceTablePackage* package) :
-            mDiag(diag), mPackage(package) {
+ public:
+  PackageFlattener(IDiagnostics* diag, ResourceTablePackage* package)
+      : mDiag(diag), mPackage(package) {}
+
+  bool flattenPackage(BigBuffer* buffer) {
+    ChunkWriter pkgWriter(buffer);
+    ResTable_package* pkgHeader =
+        pkgWriter.startChunk<ResTable_package>(RES_TABLE_PACKAGE_TYPE);
+    pkgHeader->id = util::hostToDevice32(mPackage->id.value());
+
+    if (mPackage->name.size() >= arraysize(pkgHeader->name)) {
+      mDiag->error(DiagMessage() << "package name '" << mPackage->name
+                                 << "' is too long");
+      return false;
     }
 
-    bool flattenPackage(BigBuffer* buffer) {
-        ChunkWriter pkgWriter(buffer);
-        ResTable_package* pkgHeader = pkgWriter.startChunk<ResTable_package>(
-                RES_TABLE_PACKAGE_TYPE);
-        pkgHeader->id = util::hostToDevice32(mPackage->id.value());
+    // Copy the package name in device endianness.
+    strcpy16_htod(pkgHeader->name, arraysize(pkgHeader->name),
+                  util::utf8ToUtf16(mPackage->name));
 
-        if (mPackage->name.size() >= arraysize(pkgHeader->name)) {
-            mDiag->error(DiagMessage() <<
-                         "package name '" << mPackage->name << "' is too long");
-            return false;
-        }
+    // Serialize the types. We do this now so that our type and key strings
+    // are populated. We write those first.
+    BigBuffer typeBuffer(1024);
+    flattenTypes(&typeBuffer);
 
-        // Copy the package name in device endianness.
-        strcpy16_htod(pkgHeader->name, arraysize(pkgHeader->name),
-                      util::utf8ToUtf16(mPackage->name));
+    pkgHeader->typeStrings = util::hostToDevice32(pkgWriter.size());
+    StringPool::flattenUtf16(pkgWriter.getBuffer(), mTypePool);
 
-        // Serialize the types. We do this now so that our type and key strings
-        // are populated. We write those first.
-        BigBuffer typeBuffer(1024);
-        flattenTypes(&typeBuffer);
+    pkgHeader->keyStrings = util::hostToDevice32(pkgWriter.size());
+    StringPool::flattenUtf8(pkgWriter.getBuffer(), mKeyPool);
 
-        pkgHeader->typeStrings = util::hostToDevice32(pkgWriter.size());
-        StringPool::flattenUtf16(pkgWriter.getBuffer(), mTypePool);
+    // Append the types.
+    buffer->appendBuffer(std::move(typeBuffer));
 
-        pkgHeader->keyStrings = util::hostToDevice32(pkgWriter.size());
-        StringPool::flattenUtf8(pkgWriter.getBuffer(), mKeyPool);
+    pkgWriter.finish();
+    return true;
+  }
 
-        // Append the types.
-        buffer->appendBuffer(std::move(typeBuffer));
+ private:
+  IDiagnostics* mDiag;
+  ResourceTablePackage* mPackage;
+  StringPool mTypePool;
+  StringPool mKeyPool;
 
-        pkgWriter.finish();
-        return true;
-    }
-
-private:
-    IDiagnostics* mDiag;
-    ResourceTablePackage* mPackage;
-    StringPool mTypePool;
-    StringPool mKeyPool;
-
-    template <typename T, bool IsItem>
-    T* writeEntry(FlatEntry* entry, BigBuffer* buffer) {
-        static_assert(std::is_same<ResTable_entry, T>::value ||
+  template <typename T, bool IsItem>
+  T* writeEntry(FlatEntry* entry, BigBuffer* buffer) {
+    static_assert(std::is_same<ResTable_entry, T>::value ||
                       std::is_same<ResTable_entry_ext, T>::value,
-                      "T must be ResTable_entry or ResTable_entry_ext");
+                  "T must be ResTable_entry or ResTable_entry_ext");
 
-        T* result = buffer->nextBlock<T>();
-        ResTable_entry* outEntry = (ResTable_entry*)(result);
-        if (entry->entry->symbolStatus.state == SymbolState::kPublic) {
-            outEntry->flags |= ResTable_entry::FLAG_PUBLIC;
-        }
-
-        if (entry->value->isWeak()) {
-            outEntry->flags |= ResTable_entry::FLAG_WEAK;
-        }
-
-        if (!IsItem) {
-            outEntry->flags |= ResTable_entry::FLAG_COMPLEX;
-        }
-
-        outEntry->flags = util::hostToDevice16(outEntry->flags);
-        outEntry->key.index = util::hostToDevice32(entry->entryKey);
-        outEntry->size = util::hostToDevice16(sizeof(T));
-        return result;
+    T* result = buffer->nextBlock<T>();
+    ResTable_entry* outEntry = (ResTable_entry*)(result);
+    if (entry->entry->symbolStatus.state == SymbolState::kPublic) {
+      outEntry->flags |= ResTable_entry::FLAG_PUBLIC;
     }
 
-    bool flattenValue(FlatEntry* entry, BigBuffer* buffer) {
-        if (Item* item = valueCast<Item>(entry->value)) {
-            writeEntry<ResTable_entry, true>(entry, buffer);
-            Res_value* outValue = buffer->nextBlock<Res_value>();
-            bool result = item->flatten(outValue);
-            assert(result && "flatten failed");
-            outValue->size = util::hostToDevice16(sizeof(*outValue));
-        } else {
-            ResTable_entry_ext* outEntry = writeEntry<ResTable_entry_ext, false>(entry, buffer);
-            MapFlattenVisitor visitor(outEntry, buffer);
-            entry->value->accept(&visitor);
-            visitor.finish();
-        }
-        return true;
+    if (entry->value->isWeak()) {
+      outEntry->flags |= ResTable_entry::FLAG_WEAK;
     }
 
-    bool flattenConfig(const ResourceTableType* type, const ConfigDescription& config,
-                       std::vector<FlatEntry>* entries, BigBuffer* buffer) {
-        ChunkWriter typeWriter(buffer);
-        ResTable_type* typeHeader = typeWriter.startChunk<ResTable_type>(RES_TABLE_TYPE_TYPE);
-        typeHeader->id = type->id.value();
-        typeHeader->config = config;
-        typeHeader->config.swapHtoD();
-
-        auto maxAccum = [](uint32_t max, const std::unique_ptr<ResourceEntry>& a) -> uint32_t {
-            return std::max(max, (uint32_t) a->id.value());
-        };
-
-        // Find the largest entry ID. That is how many entries we will have.
-        const uint32_t entryCount =
-                std::accumulate(type->entries.begin(), type->entries.end(), 0, maxAccum) + 1;
-
-        typeHeader->entryCount = util::hostToDevice32(entryCount);
-        uint32_t* indices = typeWriter.nextBlock<uint32_t>(entryCount);
-
-        assert((size_t) entryCount <= std::numeric_limits<uint16_t>::max() + 1);
-        memset(indices, 0xff, entryCount * sizeof(uint32_t));
-
-        typeHeader->entriesStart = util::hostToDevice32(typeWriter.size());
-
-        const size_t entryStart = typeWriter.getBuffer()->size();
-        for (FlatEntry& flatEntry : *entries) {
-            assert(flatEntry.entry->id.value() < entryCount);
-            indices[flatEntry.entry->id.value()] = util::hostToDevice32(
-                    typeWriter.getBuffer()->size() - entryStart);
-            if (!flattenValue(&flatEntry, typeWriter.getBuffer())) {
-                mDiag->error(DiagMessage()
-                             << "failed to flatten resource '"
-                             << ResourceNameRef(mPackage->name, type->type, flatEntry.entry->name)
-                             << "' for configuration '" << config << "'");
-                return false;
-            }
-        }
-        typeWriter.finish();
-        return true;
+    if (!IsItem) {
+      outEntry->flags |= ResTable_entry::FLAG_COMPLEX;
     }
 
-    std::vector<ResourceTableType*> collectAndSortTypes() {
-        std::vector<ResourceTableType*> sortedTypes;
-        for (auto& type : mPackage->types) {
-            if (type->type == ResourceType::kStyleable) {
-                // Styleables aren't real Resource Types, they are represented in the R.java
-                // file.
-                continue;
-            }
+    outEntry->flags = util::hostToDevice16(outEntry->flags);
+    outEntry->key.index = util::hostToDevice32(entry->entryKey);
+    outEntry->size = util::hostToDevice16(sizeof(T));
+    return result;
+  }
 
-            assert(type->id && "type must have an ID set");
+  bool flattenValue(FlatEntry* entry, BigBuffer* buffer) {
+    if (Item* item = valueCast<Item>(entry->value)) {
+      writeEntry<ResTable_entry, true>(entry, buffer);
+      Res_value* outValue = buffer->nextBlock<Res_value>();
+      bool result = item->flatten(outValue);
+      assert(result && "flatten failed");
+      outValue->size = util::hostToDevice16(sizeof(*outValue));
+    } else {
+      ResTable_entry_ext* outEntry =
+          writeEntry<ResTable_entry_ext, false>(entry, buffer);
+      MapFlattenVisitor visitor(outEntry, buffer);
+      entry->value->accept(&visitor);
+      visitor.finish();
+    }
+    return true;
+  }
 
-            sortedTypes.push_back(type.get());
-        }
-        std::sort(sortedTypes.begin(), sortedTypes.end(), cmpIds<ResourceTableType>);
-        return sortedTypes;
+  bool flattenConfig(const ResourceTableType* type,
+                     const ConfigDescription& config,
+                     std::vector<FlatEntry>* entries, BigBuffer* buffer) {
+    ChunkWriter typeWriter(buffer);
+    ResTable_type* typeHeader =
+        typeWriter.startChunk<ResTable_type>(RES_TABLE_TYPE_TYPE);
+    typeHeader->id = type->id.value();
+    typeHeader->config = config;
+    typeHeader->config.swapHtoD();
+
+    auto maxAccum = [](uint32_t max,
+                       const std::unique_ptr<ResourceEntry>& a) -> uint32_t {
+      return std::max(max, (uint32_t)a->id.value());
+    };
+
+    // Find the largest entry ID. That is how many entries we will have.
+    const uint32_t entryCount =
+        std::accumulate(type->entries.begin(), type->entries.end(), 0,
+                        maxAccum) +
+        1;
+
+    typeHeader->entryCount = util::hostToDevice32(entryCount);
+    uint32_t* indices = typeWriter.nextBlock<uint32_t>(entryCount);
+
+    assert((size_t)entryCount <= std::numeric_limits<uint16_t>::max() + 1);
+    memset(indices, 0xff, entryCount * sizeof(uint32_t));
+
+    typeHeader->entriesStart = util::hostToDevice32(typeWriter.size());
+
+    const size_t entryStart = typeWriter.getBuffer()->size();
+    for (FlatEntry& flatEntry : *entries) {
+      assert(flatEntry.entry->id.value() < entryCount);
+      indices[flatEntry.entry->id.value()] =
+          util::hostToDevice32(typeWriter.getBuffer()->size() - entryStart);
+      if (!flattenValue(&flatEntry, typeWriter.getBuffer())) {
+        mDiag->error(DiagMessage()
+                     << "failed to flatten resource '"
+                     << ResourceNameRef(mPackage->name, type->type,
+                                        flatEntry.entry->name)
+                     << "' for configuration '" << config << "'");
+        return false;
+      }
+    }
+    typeWriter.finish();
+    return true;
+  }
+
+  std::vector<ResourceTableType*> collectAndSortTypes() {
+    std::vector<ResourceTableType*> sortedTypes;
+    for (auto& type : mPackage->types) {
+      if (type->type == ResourceType::kStyleable) {
+        // Styleables aren't real Resource Types, they are represented in the
+        // R.java
+        // file.
+        continue;
+      }
+
+      assert(type->id && "type must have an ID set");
+
+      sortedTypes.push_back(type.get());
+    }
+    std::sort(sortedTypes.begin(), sortedTypes.end(),
+              cmpIds<ResourceTableType>);
+    return sortedTypes;
+  }
+
+  std::vector<ResourceEntry*> collectAndSortEntries(ResourceTableType* type) {
+    // Sort the entries by entry ID.
+    std::vector<ResourceEntry*> sortedEntries;
+    for (auto& entry : type->entries) {
+      assert(entry->id && "entry must have an ID set");
+      sortedEntries.push_back(entry.get());
+    }
+    std::sort(sortedEntries.begin(), sortedEntries.end(),
+              cmpIds<ResourceEntry>);
+    return sortedEntries;
+  }
+
+  bool flattenTypeSpec(ResourceTableType* type,
+                       std::vector<ResourceEntry*>* sortedEntries,
+                       BigBuffer* buffer) {
+    ChunkWriter typeSpecWriter(buffer);
+    ResTable_typeSpec* specHeader =
+        typeSpecWriter.startChunk<ResTable_typeSpec>(RES_TABLE_TYPE_SPEC_TYPE);
+    specHeader->id = type->id.value();
+
+    if (sortedEntries->empty()) {
+      typeSpecWriter.finish();
+      return true;
     }
 
-    std::vector<ResourceEntry*> collectAndSortEntries(ResourceTableType* type) {
-        // Sort the entries by entry ID.
-        std::vector<ResourceEntry*> sortedEntries;
-        for (auto& entry : type->entries) {
-            assert(entry->id && "entry must have an ID set");
-            sortedEntries.push_back(entry.get());
+    // We can't just take the size of the vector. There may be holes in the
+    // entry ID space.
+    // Since the entries are sorted by ID, the last one will be the biggest.
+    const size_t numEntries = sortedEntries->back()->id.value() + 1;
+
+    specHeader->entryCount = util::hostToDevice32(numEntries);
+
+    // Reserve space for the masks of each resource in this type. These
+    // show for which configuration axis the resource changes.
+    uint32_t* configMasks = typeSpecWriter.nextBlock<uint32_t>(numEntries);
+
+    const size_t actualNumEntries = sortedEntries->size();
+    for (size_t entryIndex = 0; entryIndex < actualNumEntries; entryIndex++) {
+      ResourceEntry* entry = sortedEntries->at(entryIndex);
+
+      // Populate the config masks for this entry.
+
+      if (entry->symbolStatus.state == SymbolState::kPublic) {
+        configMasks[entry->id.value()] |=
+            util::hostToDevice32(ResTable_typeSpec::SPEC_PUBLIC);
+      }
+
+      const size_t configCount = entry->values.size();
+      for (size_t i = 0; i < configCount; i++) {
+        const ConfigDescription& config = entry->values[i]->config;
+        for (size_t j = i + 1; j < configCount; j++) {
+          configMasks[entry->id.value()] |=
+              util::hostToDevice32(config.diff(entry->values[j]->config));
         }
-        std::sort(sortedEntries.begin(), sortedEntries.end(), cmpIds<ResourceEntry>);
-        return sortedEntries;
+      }
     }
+    typeSpecWriter.finish();
+    return true;
+  }
 
-    bool flattenTypeSpec(ResourceTableType* type, std::vector<ResourceEntry*>* sortedEntries,
-                         BigBuffer* buffer) {
-        ChunkWriter typeSpecWriter(buffer);
-        ResTable_typeSpec* specHeader = typeSpecWriter.startChunk<ResTable_typeSpec>(
-                RES_TABLE_TYPE_SPEC_TYPE);
-        specHeader->id = type->id.value();
+  bool flattenTypes(BigBuffer* buffer) {
+    // Sort the types by their IDs. They will be inserted into the StringPool in
+    // this order.
+    std::vector<ResourceTableType*> sortedTypes = collectAndSortTypes();
 
-        if (sortedEntries->empty()) {
-            typeSpecWriter.finish();
-            return true;
+    size_t expectedTypeId = 1;
+    for (ResourceTableType* type : sortedTypes) {
+      // If there is a gap in the type IDs, fill in the StringPool
+      // with empty values until we reach the ID we expect.
+      while (type->id.value() > expectedTypeId) {
+        std::stringstream typeName;
+        typeName << "?" << expectedTypeId;
+        mTypePool.makeRef(typeName.str());
+        expectedTypeId++;
+      }
+      expectedTypeId++;
+      mTypePool.makeRef(toString(type->type));
+
+      std::vector<ResourceEntry*> sortedEntries = collectAndSortEntries(type);
+
+      if (!flattenTypeSpec(type, &sortedEntries, buffer)) {
+        return false;
+      }
+
+      // The binary resource table lists resource entries for each
+      // configuration.
+      // We store them inverted, where a resource entry lists the values for
+      // each
+      // configuration available. Here we reverse this to match the binary
+      // table.
+      std::map<ConfigDescription, std::vector<FlatEntry>> configToEntryListMap;
+      for (ResourceEntry* entry : sortedEntries) {
+        const uint32_t keyIndex =
+            (uint32_t)mKeyPool.makeRef(entry->name).getIndex();
+
+        // Group values by configuration.
+        for (auto& configValue : entry->values) {
+          configToEntryListMap[configValue->config].push_back(
+              FlatEntry{entry, configValue->value.get(), keyIndex});
         }
+      }
 
-        // We can't just take the size of the vector. There may be holes in the entry ID space.
-        // Since the entries are sorted by ID, the last one will be the biggest.
-        const size_t numEntries = sortedEntries->back()->id.value() + 1;
-
-        specHeader->entryCount = util::hostToDevice32(numEntries);
-
-        // Reserve space for the masks of each resource in this type. These
-        // show for which configuration axis the resource changes.
-        uint32_t* configMasks = typeSpecWriter.nextBlock<uint32_t>(numEntries);
-
-        const size_t actualNumEntries = sortedEntries->size();
-        for (size_t entryIndex = 0; entryIndex < actualNumEntries; entryIndex++) {
-            ResourceEntry* entry = sortedEntries->at(entryIndex);
-
-            // Populate the config masks for this entry.
-
-            if (entry->symbolStatus.state == SymbolState::kPublic) {
-                configMasks[entry->id.value()] |=
-                        util::hostToDevice32(ResTable_typeSpec::SPEC_PUBLIC);
-            }
-
-            const size_t configCount = entry->values.size();
-            for (size_t i = 0; i < configCount; i++) {
-                const ConfigDescription& config = entry->values[i]->config;
-                for (size_t j = i + 1; j < configCount; j++) {
-                    configMasks[entry->id.value()] |= util::hostToDevice32(
-                            config.diff(entry->values[j]->config));
-                }
-            }
+      // Flatten a configuration value.
+      for (auto& entry : configToEntryListMap) {
+        if (!flattenConfig(type, entry.first, &entry.second, buffer)) {
+          return false;
         }
-        typeSpecWriter.finish();
-        return true;
+      }
     }
-
-    bool flattenTypes(BigBuffer* buffer) {
-        // Sort the types by their IDs. They will be inserted into the StringPool in this order.
-        std::vector<ResourceTableType*> sortedTypes = collectAndSortTypes();
-
-        size_t expectedTypeId = 1;
-        for (ResourceTableType* type : sortedTypes) {
-            // If there is a gap in the type IDs, fill in the StringPool
-            // with empty values until we reach the ID we expect.
-            while (type->id.value() > expectedTypeId) {
-                std::stringstream typeName;
-                typeName << "?" << expectedTypeId;
-                mTypePool.makeRef(typeName.str());
-                expectedTypeId++;
-            }
-            expectedTypeId++;
-            mTypePool.makeRef(toString(type->type));
-
-            std::vector<ResourceEntry*> sortedEntries = collectAndSortEntries(type);
-
-            if (!flattenTypeSpec(type, &sortedEntries, buffer)) {
-                return false;
-            }
-
-            // The binary resource table lists resource entries for each configuration.
-            // We store them inverted, where a resource entry lists the values for each
-            // configuration available. Here we reverse this to match the binary table.
-            std::map<ConfigDescription, std::vector<FlatEntry>> configToEntryListMap;
-            for (ResourceEntry* entry : sortedEntries) {
-                const uint32_t keyIndex = (uint32_t) mKeyPool.makeRef(entry->name).getIndex();
-
-                // Group values by configuration.
-                for (auto& configValue : entry->values) {
-                    configToEntryListMap[configValue->config].push_back(FlatEntry{
-                            entry, configValue->value.get(), keyIndex });
-                }
-            }
-
-            // Flatten a configuration value.
-            for (auto& entry : configToEntryListMap) {
-                if (!flattenConfig(type, entry.first, &entry.second, buffer)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
+    return true;
+  }
 };
 
-} // namespace
+}  // namespace
 
 bool TableFlattener::consume(IAaptContext* context, ResourceTable* table) {
-    // We must do this before writing the resources, since the string pool IDs may change.
-    table->stringPool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+  // We must do this before writing the resources, since the string pool IDs may
+  // change.
+  table->stringPool.sort(
+      [](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
         int diff = a.context.priority - b.context.priority;
         if (diff < 0) return true;
         if (diff > 0) return false;
@@ -476,31 +492,32 @@
         if (diff < 0) return true;
         if (diff > 0) return false;
         return a.value < b.value;
-    });
-    table->stringPool.prune();
+      });
+  table->stringPool.prune();
 
-    // Write the ResTable header.
-    ChunkWriter tableWriter(mBuffer);
-    ResTable_header* tableHeader = tableWriter.startChunk<ResTable_header>(RES_TABLE_TYPE);
-    tableHeader->packageCount = util::hostToDevice32(table->packages.size());
+  // Write the ResTable header.
+  ChunkWriter tableWriter(mBuffer);
+  ResTable_header* tableHeader =
+      tableWriter.startChunk<ResTable_header>(RES_TABLE_TYPE);
+  tableHeader->packageCount = util::hostToDevice32(table->packages.size());
 
-    // Flatten the values string pool.
-    StringPool::flattenUtf8(tableWriter.getBuffer(), table->stringPool);
+  // Flatten the values string pool.
+  StringPool::flattenUtf8(tableWriter.getBuffer(), table->stringPool);
 
-    BigBuffer packageBuffer(1024);
+  BigBuffer packageBuffer(1024);
 
-    // Flatten each package.
-    for (auto& package : table->packages) {
-        PackageFlattener flattener(context->getDiagnostics(), package.get());
-        if (!flattener.flattenPackage(&packageBuffer)) {
-            return false;
-        }
+  // Flatten each package.
+  for (auto& package : table->packages) {
+    PackageFlattener flattener(context->getDiagnostics(), package.get());
+    if (!flattener.flattenPackage(&packageBuffer)) {
+      return false;
     }
+  }
 
-    // Finally merge all the packages into the main buffer.
-    tableWriter.getBuffer()->appendBuffer(std::move(packageBuffer));
-    tableWriter.finish();
-    return true;
+  // Finally merge all the packages into the main buffer.
+  tableWriter.getBuffer()->appendBuffer(std::move(packageBuffer));
+  tableWriter.finish();
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/TableFlattener.h b/tools/aapt2/flatten/TableFlattener.h
index b416f20..91f9654 100644
--- a/tools/aapt2/flatten/TableFlattener.h
+++ b/tools/aapt2/flatten/TableFlattener.h
@@ -25,16 +25,15 @@
 class ResourceTable;
 
 class TableFlattener : public IResourceTableConsumer {
-public:
-    explicit TableFlattener(BigBuffer* buffer) : mBuffer(buffer) {
-    }
+ public:
+  explicit TableFlattener(BigBuffer* buffer) : mBuffer(buffer) {}
 
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 
-private:
-    BigBuffer* mBuffer;
+ private:
+  BigBuffer* mBuffer;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_TABLEFLATTENER_H */
diff --git a/tools/aapt2/flatten/TableFlattener_test.cpp b/tools/aapt2/flatten/TableFlattener_test.cpp
index b25bfa7..a7706bd 100644
--- a/tools/aapt2/flatten/TableFlattener_test.cpp
+++ b/tools/aapt2/flatten/TableFlattener_test.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceUtils.h"
 #include "flatten/TableFlattener.h"
+#include "ResourceUtils.h"
 #include "test/Test.h"
 #include "unflatten/BinaryResourceParser.h"
 #include "util/Util.h"
@@ -25,195 +25,207 @@
 namespace aapt {
 
 class TableFlattenerTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .setPackageId(0x7f)
-                .build();
+ public:
+  void SetUp() override {
+    mContext = test::ContextBuilder()
+                   .setCompilationPackage("com.app.test")
+                   .setPackageId(0x7f)
+                   .build();
+  }
+
+  ::testing::AssertionResult flatten(ResourceTable* table, ResTable* outTable) {
+    BigBuffer buffer(1024);
+    TableFlattener flattener(&buffer);
+    if (!flattener.consume(mContext.get(), table)) {
+      return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
     }
 
-    ::testing::AssertionResult flatten(ResourceTable* table, ResTable* outTable) {
-        BigBuffer buffer(1024);
-        TableFlattener flattener(&buffer);
-        if (!flattener.consume(mContext.get(), table)) {
-            return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
-        }
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+    if (outTable->add(data.get(), buffer.size(), -1, true) != NO_ERROR) {
+      return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
+    }
+    return ::testing::AssertionSuccess();
+  }
 
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-        if (outTable->add(data.get(), buffer.size(), -1, true) != NO_ERROR) {
-            return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
-        }
-        return ::testing::AssertionSuccess();
+  ::testing::AssertionResult flatten(ResourceTable* table,
+                                     ResourceTable* outTable) {
+    BigBuffer buffer(1024);
+    TableFlattener flattener(&buffer);
+    if (!flattener.consume(mContext.get(), table)) {
+      return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
     }
 
-    ::testing::AssertionResult flatten(ResourceTable* table, ResourceTable* outTable) {
-        BigBuffer buffer(1024);
-        TableFlattener flattener(&buffer);
-        if (!flattener.consume(mContext.get(), table)) {
-            return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
-        }
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+    BinaryResourceParser parser(mContext.get(), outTable, {}, data.get(),
+                                buffer.size());
+    if (!parser.parse()) {
+      return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
+    }
+    return ::testing::AssertionSuccess();
+  }
 
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-        BinaryResourceParser parser(mContext.get(), outTable, {}, data.get(), buffer.size());
-        if (!parser.parse()) {
-            return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
-        }
-        return ::testing::AssertionSuccess();
+  ::testing::AssertionResult exists(ResTable* table,
+                                    const StringPiece& expectedName,
+                                    const ResourceId& expectedId,
+                                    const ConfigDescription& expectedConfig,
+                                    const uint8_t expectedDataType,
+                                    const uint32_t expectedData,
+                                    const uint32_t expectedSpecFlags) {
+    const ResourceName expectedResName = test::parseNameOrDie(expectedName);
+
+    table->setParameters(&expectedConfig);
+
+    ResTable_config config;
+    Res_value val;
+    uint32_t specFlags;
+    if (table->getResource(expectedId.id, &val, false, 0, &specFlags, &config) <
+        0) {
+      return ::testing::AssertionFailure() << "could not find resource with";
     }
 
-    ::testing::AssertionResult exists(ResTable* table,
-                                      const StringPiece& expectedName,
-                                      const ResourceId& expectedId,
-                                      const ConfigDescription& expectedConfig,
-                                      const uint8_t expectedDataType, const uint32_t expectedData,
-                                      const uint32_t expectedSpecFlags) {
-        const ResourceName expectedResName = test::parseNameOrDie(expectedName);
-
-        table->setParameters(&expectedConfig);
-
-        ResTable_config config;
-        Res_value val;
-        uint32_t specFlags;
-        if (table->getResource(expectedId.id, &val, false, 0, &specFlags, &config) < 0) {
-            return ::testing::AssertionFailure() << "could not find resource with";
-        }
-
-        if (expectedDataType != val.dataType) {
-            return ::testing::AssertionFailure()
-                    << "expected data type "
-                    << std::hex << (int) expectedDataType << " but got data type "
-                    << (int) val.dataType << std::dec << " instead";
-        }
-
-        if (expectedData != val.data) {
-            return ::testing::AssertionFailure()
-                    << "expected data "
-                    << std::hex << expectedData << " but got data "
-                    << val.data << std::dec << " instead";
-        }
-
-        if (expectedSpecFlags != specFlags) {
-            return ::testing::AssertionFailure()
-                    << "expected specFlags "
-                    << std::hex << expectedSpecFlags << " but got specFlags "
-                    << specFlags << std::dec << " instead";
-        }
-
-        ResTable::resource_name actualName;
-        if (!table->getResourceName(expectedId.id, false, &actualName)) {
-            return ::testing::AssertionFailure() << "failed to find resource name";
-        }
-
-        Maybe<ResourceName> resName = ResourceUtils::toResourceName(actualName);
-        if (!resName) {
-            return ::testing::AssertionFailure()
-                    << "expected name '" << expectedResName << "' but got '"
-                    << StringPiece16(actualName.package, actualName.packageLen)
-                    << ":"
-                    << StringPiece16(actualName.type, actualName.typeLen)
-                    << "/"
-                    << StringPiece16(actualName.name, actualName.nameLen)
-                    << "'";
-        }
-
-        if (expectedConfig != config) {
-            return ::testing::AssertionFailure()
-                    << "expected config '" << expectedConfig << "' but got '"
-                    << ConfigDescription(config) << "'";
-        }
-        return ::testing::AssertionSuccess();
+    if (expectedDataType != val.dataType) {
+      return ::testing::AssertionFailure()
+             << "expected data type " << std::hex << (int)expectedDataType
+             << " but got data type " << (int)val.dataType << std::dec
+             << " instead";
     }
 
-private:
-    std::unique_ptr<IAaptContext> mContext;
+    if (expectedData != val.data) {
+      return ::testing::AssertionFailure()
+             << "expected data " << std::hex << expectedData << " but got data "
+             << val.data << std::dec << " instead";
+    }
+
+    if (expectedSpecFlags != specFlags) {
+      return ::testing::AssertionFailure()
+             << "expected specFlags " << std::hex << expectedSpecFlags
+             << " but got specFlags " << specFlags << std::dec << " instead";
+    }
+
+    ResTable::resource_name actualName;
+    if (!table->getResourceName(expectedId.id, false, &actualName)) {
+      return ::testing::AssertionFailure() << "failed to find resource name";
+    }
+
+    Maybe<ResourceName> resName = ResourceUtils::toResourceName(actualName);
+    if (!resName) {
+      return ::testing::AssertionFailure()
+             << "expected name '" << expectedResName << "' but got '"
+             << StringPiece16(actualName.package, actualName.packageLen) << ":"
+             << StringPiece16(actualName.type, actualName.typeLen) << "/"
+             << StringPiece16(actualName.name, actualName.nameLen) << "'";
+    }
+
+    if (expectedConfig != config) {
+      return ::testing::AssertionFailure() << "expected config '"
+                                           << expectedConfig << "' but got '"
+                                           << ConfigDescription(config) << "'";
+    }
+    return ::testing::AssertionSuccess();
+  }
+
+ private:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(TableFlattenerTest, FlattenFullyLinkedTable) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addSimple("com.app.test:id/one", ResourceId(0x7f020000))
-            .addSimple("com.app.test:id/two", ResourceId(0x7f020001))
-            .addValue("com.app.test:id/three", ResourceId(0x7f020002),
-                      test::buildReference("com.app.test:id/one", ResourceId(0x7f020000)))
-            .addValue("com.app.test:integer/one", ResourceId(0x7f030000),
-                      util::make_unique<BinaryPrimitive>(uint8_t(Res_value::TYPE_INT_DEC), 1u))
-            .addValue("com.app.test:integer/one", test::parseConfigOrDie("v1"),
-                      ResourceId(0x7f030000),
-                      util::make_unique<BinaryPrimitive>(uint8_t(Res_value::TYPE_INT_DEC), 2u))
-            .addString("com.app.test:string/test", ResourceId(0x7f040000), "foo")
-            .addString("com.app.test:layout/bar", ResourceId(0x7f050000), "res/layout/bar.xml")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addSimple("com.app.test:id/one", ResourceId(0x7f020000))
+          .addSimple("com.app.test:id/two", ResourceId(0x7f020001))
+          .addValue("com.app.test:id/three", ResourceId(0x7f020002),
+                    test::buildReference("com.app.test:id/one",
+                                         ResourceId(0x7f020000)))
+          .addValue("com.app.test:integer/one", ResourceId(0x7f030000),
+                    util::make_unique<BinaryPrimitive>(
+                        uint8_t(Res_value::TYPE_INT_DEC), 1u))
+          .addValue("com.app.test:integer/one", test::parseConfigOrDie("v1"),
+                    ResourceId(0x7f030000),
+                    util::make_unique<BinaryPrimitive>(
+                        uint8_t(Res_value::TYPE_INT_DEC), 2u))
+          .addString("com.app.test:string/test", ResourceId(0x7f040000), "foo")
+          .addString("com.app.test:layout/bar", ResourceId(0x7f050000),
+                     "res/layout/bar.xml")
+          .build();
 
-    ResTable resTable;
-    ASSERT_TRUE(flatten(table.get(), &resTable));
+  ResTable resTable;
+  ASSERT_TRUE(flatten(table.get(), &resTable));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020000), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020000),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/two", ResourceId(0x7f020001), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/two", ResourceId(0x7f020001),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020002), {},
-                       Res_value::TYPE_REFERENCE, 0x7f020000u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020002),
+                     {}, Res_value::TYPE_REFERENCE, 0x7f020000u, 0u));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one", ResourceId(0x7f030000),
-                       {}, Res_value::TYPE_INT_DEC, 1u,
-                       ResTable_config::CONFIG_VERSION));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one",
+                     ResourceId(0x7f030000), {}, Res_value::TYPE_INT_DEC, 1u,
+                     ResTable_config::CONFIG_VERSION));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one", ResourceId(0x7f030000),
-                       test::parseConfigOrDie("v1"), Res_value::TYPE_INT_DEC, 2u,
-                       ResTable_config::CONFIG_VERSION));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one",
+                     ResourceId(0x7f030000), test::parseConfigOrDie("v1"),
+                     Res_value::TYPE_INT_DEC, 2u,
+                     ResTable_config::CONFIG_VERSION));
 
-    std::u16string fooStr = u"foo";
-    ssize_t idx = resTable.getTableStringBlock(0)->indexOfString(fooStr.data(), fooStr.size());
-    ASSERT_GE(idx, 0);
-    EXPECT_TRUE(exists(&resTable, "com.app.test:string/test", ResourceId(0x7f040000),
-                       {}, Res_value::TYPE_STRING, (uint32_t) idx, 0u));
+  std::u16string fooStr = u"foo";
+  ssize_t idx = resTable.getTableStringBlock(0)->indexOfString(fooStr.data(),
+                                                               fooStr.size());
+  ASSERT_GE(idx, 0);
+  EXPECT_TRUE(exists(&resTable, "com.app.test:string/test",
+                     ResourceId(0x7f040000), {}, Res_value::TYPE_STRING,
+                     (uint32_t)idx, 0u));
 
-    std::u16string barPath = u"res/layout/bar.xml";
-    idx = resTable.getTableStringBlock(0)->indexOfString(barPath.data(), barPath.size());
-    ASSERT_GE(idx, 0);
-    EXPECT_TRUE(exists(&resTable, "com.app.test:layout/bar", ResourceId(0x7f050000), {},
-                       Res_value::TYPE_STRING, (uint32_t) idx, 0u));
+  std::u16string barPath = u"res/layout/bar.xml";
+  idx = resTable.getTableStringBlock(0)->indexOfString(barPath.data(),
+                                                       barPath.size());
+  ASSERT_GE(idx, 0);
+  EXPECT_TRUE(exists(&resTable, "com.app.test:layout/bar",
+                     ResourceId(0x7f050000), {}, Res_value::TYPE_STRING,
+                     (uint32_t)idx, 0u));
 }
 
 TEST_F(TableFlattenerTest, FlattenEntriesWithGapsInIds) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addSimple("com.app.test:id/one", ResourceId(0x7f020001))
-            .addSimple("com.app.test:id/three", ResourceId(0x7f020003))
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addSimple("com.app.test:id/one", ResourceId(0x7f020001))
+          .addSimple("com.app.test:id/three", ResourceId(0x7f020003))
+          .build();
 
-    ResTable resTable;
-    ASSERT_TRUE(flatten(table.get(), &resTable));
+  ResTable resTable;
+  ASSERT_TRUE(flatten(table.get(), &resTable));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020001), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020003), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020001),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020003),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
 }
 
 TEST_F(TableFlattenerTest, FlattenMinMaxAttributes) {
-    Attribute attr(false);
-    attr.typeMask = android::ResTable_map::TYPE_INTEGER;
-    attr.minInt = 10;
-    attr.maxInt = 23;
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("android", 0x01)
-            .addValue("android:attr/foo", ResourceId(0x01010000),
-                      util::make_unique<Attribute>(attr))
-            .build();
+  Attribute attr(false);
+  attr.typeMask = android::ResTable_map::TYPE_INTEGER;
+  attr.minInt = 10;
+  attr.maxInt = 23;
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("android", 0x01)
+          .addValue("android:attr/foo", ResourceId(0x01010000),
+                    util::make_unique<Attribute>(attr))
+          .build();
 
-    ResourceTable result;
-    ASSERT_TRUE(flatten(table.get(), &result));
+  ResourceTable result;
+  ASSERT_TRUE(flatten(table.get(), &result));
 
-    Attribute* actualAttr = test::getValue<Attribute>(&result, "android:attr/foo");
-    ASSERT_NE(nullptr, actualAttr);
-    EXPECT_EQ(attr.isWeak(), actualAttr->isWeak());
-    EXPECT_EQ(attr.typeMask, actualAttr->typeMask);
-    EXPECT_EQ(attr.minInt, actualAttr->minInt);
-    EXPECT_EQ(attr.maxInt, actualAttr->maxInt);
+  Attribute* actualAttr =
+      test::getValue<Attribute>(&result, "android:attr/foo");
+  ASSERT_NE(nullptr, actualAttr);
+  EXPECT_EQ(attr.isWeak(), actualAttr->isWeak());
+  EXPECT_EQ(attr.typeMask, actualAttr->typeMask);
+  EXPECT_EQ(attr.minInt, actualAttr->minInt);
+  EXPECT_EQ(attr.maxInt, actualAttr->maxInt);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index ed5b60f..c296dde 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -14,16 +14,16 @@
  * limitations under the License.
  */
 
+#include "flatten/XmlFlattener.h"
 #include "SdkConstants.h"
 #include "flatten/ChunkWriter.h"
 #include "flatten/ResourceTypeExtensions.h"
-#include "flatten/XmlFlattener.h"
 #include "xml/XmlDom.h"
 
 #include <androidfw/ResourceTypes.h>
+#include <utils/misc.h>
 #include <algorithm>
 #include <map>
-#include <utils/misc.h>
 #include <vector>
 
 using namespace android;
@@ -35,300 +35,316 @@
 constexpr uint32_t kLowPriority = 0xffffffffu;
 
 struct XmlFlattenerVisitor : public xml::Visitor {
-    using xml::Visitor::visit;
+  using xml::Visitor::visit;
 
-    BigBuffer* mBuffer;
-    XmlFlattenerOptions mOptions;
-    StringPool mPool;
-    std::map<uint8_t, StringPool> mPackagePools;
+  BigBuffer* mBuffer;
+  XmlFlattenerOptions mOptions;
+  StringPool mPool;
+  std::map<uint8_t, StringPool> mPackagePools;
 
-    struct StringFlattenDest {
-        StringPool::Ref ref;
-        ResStringPool_ref* dest;
-    };
-    std::vector<StringFlattenDest> mStringRefs;
+  struct StringFlattenDest {
+    StringPool::Ref ref;
+    ResStringPool_ref* dest;
+  };
+  std::vector<StringFlattenDest> mStringRefs;
 
-    // Scratch vector to filter attributes. We avoid allocations
-    // making this a member.
-    std::vector<xml::Attribute*> mFilteredAttrs;
+  // Scratch vector to filter attributes. We avoid allocations
+  // making this a member.
+  std::vector<xml::Attribute*> mFilteredAttrs;
 
+  XmlFlattenerVisitor(BigBuffer* buffer, XmlFlattenerOptions options)
+      : mBuffer(buffer), mOptions(options) {}
 
-    XmlFlattenerVisitor(BigBuffer* buffer, XmlFlattenerOptions options) :
-            mBuffer(buffer), mOptions(options) {
+  void addString(const StringPiece& str, uint32_t priority,
+                 android::ResStringPool_ref* dest,
+                 bool treatEmptyStringAsNull = false) {
+    if (str.empty() && treatEmptyStringAsNull) {
+      // Some parts of the runtime treat null differently than empty string.
+      dest->index = util::deviceToHost32(-1);
+    } else {
+      mStringRefs.push_back(StringFlattenDest{
+          mPool.makeRef(str, StringPool::Context{priority}), dest});
+    }
+  }
+
+  void addString(const StringPool::Ref& ref, android::ResStringPool_ref* dest) {
+    mStringRefs.push_back(StringFlattenDest{ref, dest});
+  }
+
+  void writeNamespace(xml::Namespace* node, uint16_t type) {
+    ChunkWriter writer(mBuffer);
+
+    ResXMLTree_node* flatNode = writer.startChunk<ResXMLTree_node>(type);
+    flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
+    flatNode->comment.index = util::hostToDevice32(-1);
+
+    ResXMLTree_namespaceExt* flatNs =
+        writer.nextBlock<ResXMLTree_namespaceExt>();
+    addString(node->namespacePrefix, kLowPriority, &flatNs->prefix);
+    addString(node->namespaceUri, kLowPriority, &flatNs->uri);
+
+    writer.finish();
+  }
+
+  void visit(xml::Namespace* node) override {
+    if (node->namespaceUri == xml::kSchemaTools) {
+      // Skip dedicated tools namespace.
+      xml::Visitor::visit(node);
+    } else {
+      writeNamespace(node, android::RES_XML_START_NAMESPACE_TYPE);
+      xml::Visitor::visit(node);
+      writeNamespace(node, android::RES_XML_END_NAMESPACE_TYPE);
+    }
+  }
+
+  void visit(xml::Text* node) override {
+    if (util::trimWhitespace(node->text).empty()) {
+      // Skip whitespace only text nodes.
+      return;
     }
 
-    void addString(const StringPiece& str, uint32_t priority, android::ResStringPool_ref* dest,
-                   bool treatEmptyStringAsNull = false) {
-        if (str.empty() && treatEmptyStringAsNull) {
-            // Some parts of the runtime treat null differently than empty string.
-            dest->index = util::deviceToHost32(-1);
-        } else {
-            mStringRefs.push_back(StringFlattenDest{
-                    mPool.makeRef(str, StringPool::Context{ priority }),
-                    dest });
-        }
+    ChunkWriter writer(mBuffer);
+    ResXMLTree_node* flatNode =
+        writer.startChunk<ResXMLTree_node>(RES_XML_CDATA_TYPE);
+    flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
+    flatNode->comment.index = util::hostToDevice32(-1);
+
+    ResXMLTree_cdataExt* flatText = writer.nextBlock<ResXMLTree_cdataExt>();
+    addString(node->text, kLowPriority, &flatText->data);
+
+    writer.finish();
+  }
+
+  void visit(xml::Element* node) override {
+    {
+      ChunkWriter startWriter(mBuffer);
+      ResXMLTree_node* flatNode =
+          startWriter.startChunk<ResXMLTree_node>(RES_XML_START_ELEMENT_TYPE);
+      flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
+      flatNode->comment.index = util::hostToDevice32(-1);
+
+      ResXMLTree_attrExt* flatElem =
+          startWriter.nextBlock<ResXMLTree_attrExt>();
+
+      // A missing namespace must be null, not an empty string. Otherwise the
+      // runtime
+      // complains.
+      addString(node->namespaceUri, kLowPriority, &flatElem->ns,
+                true /* treatEmptyStringAsNull */);
+      addString(node->name, kLowPriority, &flatElem->name,
+                true /* treatEmptyStringAsNull */);
+
+      flatElem->attributeStart = util::hostToDevice16(sizeof(*flatElem));
+      flatElem->attributeSize =
+          util::hostToDevice16(sizeof(ResXMLTree_attribute));
+
+      writeAttributes(node, flatElem, &startWriter);
+
+      startWriter.finish();
     }
 
-    void addString(const StringPool::Ref& ref, android::ResStringPool_ref* dest) {
-        mStringRefs.push_back(StringFlattenDest{ ref, dest });
-    }
-
-    void writeNamespace(xml::Namespace* node, uint16_t type) {
-        ChunkWriter writer(mBuffer);
-
-        ResXMLTree_node* flatNode = writer.startChunk<ResXMLTree_node>(type);
-        flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
-        flatNode->comment.index = util::hostToDevice32(-1);
-
-        ResXMLTree_namespaceExt* flatNs = writer.nextBlock<ResXMLTree_namespaceExt>();
-        addString(node->namespacePrefix, kLowPriority, &flatNs->prefix);
-        addString(node->namespaceUri, kLowPriority, &flatNs->uri);
-
-        writer.finish();
-    }
-
-    void visit(xml::Namespace* node) override {
-        if (node->namespaceUri == xml::kSchemaTools) {
-            // Skip dedicated tools namespace.
-            xml::Visitor::visit(node);
-        } else {
-            writeNamespace(node, android::RES_XML_START_NAMESPACE_TYPE);
-            xml::Visitor::visit(node);
-            writeNamespace(node, android::RES_XML_END_NAMESPACE_TYPE);
-        }
-    }
-
-    void visit(xml::Text* node) override {
-        if (util::trimWhitespace(node->text).empty()) {
-            // Skip whitespace only text nodes.
-            return;
-        }
-
-        ChunkWriter writer(mBuffer);
-        ResXMLTree_node* flatNode = writer.startChunk<ResXMLTree_node>(RES_XML_CDATA_TYPE);
-        flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
-        flatNode->comment.index = util::hostToDevice32(-1);
-
-        ResXMLTree_cdataExt* flatText = writer.nextBlock<ResXMLTree_cdataExt>();
-        addString(node->text, kLowPriority, &flatText->data);
-
-        writer.finish();
-    }
-
-    void visit(xml::Element* node) override {
-        {
-            ChunkWriter startWriter(mBuffer);
-            ResXMLTree_node* flatNode = startWriter.startChunk<ResXMLTree_node>(
-                    RES_XML_START_ELEMENT_TYPE);
-            flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
-            flatNode->comment.index = util::hostToDevice32(-1);
-
-            ResXMLTree_attrExt* flatElem = startWriter.nextBlock<ResXMLTree_attrExt>();
-
-            // A missing namespace must be null, not an empty string. Otherwise the runtime
-            // complains.
-            addString(node->namespaceUri, kLowPriority, &flatElem->ns,
-                      true /* treatEmptyStringAsNull */);
-            addString(node->name, kLowPriority, &flatElem->name,
-                      true /* treatEmptyStringAsNull */);
-
-            flatElem->attributeStart = util::hostToDevice16(sizeof(*flatElem));
-            flatElem->attributeSize = util::hostToDevice16(sizeof(ResXMLTree_attribute));
-
-            writeAttributes(node, flatElem, &startWriter);
-
-            startWriter.finish();
-        }
-
-        xml::Visitor::visit(node);
-
-        {
-            ChunkWriter endWriter(mBuffer);
-            ResXMLTree_node* flatEndNode = endWriter.startChunk<ResXMLTree_node>(
-                    RES_XML_END_ELEMENT_TYPE);
-            flatEndNode->lineNumber = util::hostToDevice32(node->lineNumber);
-            flatEndNode->comment.index = util::hostToDevice32(-1);
-
-            ResXMLTree_endElementExt* flatEndElem = endWriter.nextBlock<ResXMLTree_endElementExt>();
-            addString(node->namespaceUri, kLowPriority, &flatEndElem->ns,
-                      true /* treatEmptyStringAsNull */);
-            addString(node->name, kLowPriority, &flatEndElem->name);
-
-            endWriter.finish();
-        }
-    }
-
-    static bool cmpXmlAttributeById(const xml::Attribute* a, const xml::Attribute* b) {
-        if (a->compiledAttribute && a->compiledAttribute.value().id) {
-            if (b->compiledAttribute && b->compiledAttribute.value().id) {
-                return a->compiledAttribute.value().id.value() < b->compiledAttribute.value().id.value();
-            }
-            return true;
-        } else if (!b->compiledAttribute) {
-            int diff = a->namespaceUri.compare(b->namespaceUri);
-            if (diff < 0) {
-                return true;
-            } else if (diff > 0) {
-                return false;
-            }
-            return a->name < b->name;
-        }
-        return false;
-    }
-
-    void writeAttributes(xml::Element* node, ResXMLTree_attrExt* flatElem, ChunkWriter* writer) {
-        mFilteredAttrs.clear();
-        mFilteredAttrs.reserve(node->attributes.size());
-
-        // Filter the attributes.
-        for (xml::Attribute& attr : node->attributes) {
-            if (mOptions.maxSdkLevel && attr.compiledAttribute && attr.compiledAttribute.value().id) {
-                size_t sdkLevel = findAttributeSdkLevel(attr.compiledAttribute.value().id.value());
-                if (sdkLevel > mOptions.maxSdkLevel.value()) {
-                    continue;
-                }
-            }
-            if (attr.namespaceUri == xml::kSchemaTools) {
-                continue;
-            }
-            mFilteredAttrs.push_back(&attr);
-        }
-
-        if (mFilteredAttrs.empty()) {
-            return;
-        }
-
-        const ResourceId kIdAttr(0x010100d0);
-
-        std::sort(mFilteredAttrs.begin(), mFilteredAttrs.end(), cmpXmlAttributeById);
-
-        flatElem->attributeCount = util::hostToDevice16(mFilteredAttrs.size());
-
-        ResXMLTree_attribute* flatAttr = writer->nextBlock<ResXMLTree_attribute>(
-                mFilteredAttrs.size());
-        uint16_t attributeIndex = 1;
-        for (const xml::Attribute* xmlAttr : mFilteredAttrs) {
-            // Assign the indices for specific attributes.
-            if (xmlAttr->compiledAttribute && xmlAttr->compiledAttribute.value().id &&
-                    xmlAttr->compiledAttribute.value().id.value() == kIdAttr) {
-                flatElem->idIndex = util::hostToDevice16(attributeIndex);
-            } else if (xmlAttr->namespaceUri.empty()) {
-                if (xmlAttr->name == "class") {
-                    flatElem->classIndex = util::hostToDevice16(attributeIndex);
-                } else if (xmlAttr->name == "style") {
-                    flatElem->styleIndex = util::hostToDevice16(attributeIndex);
-                }
-            }
-            attributeIndex++;
-
-            // Add the namespaceUri to the list of StringRefs to encode. Use null if the namespace
-            // is empty (doesn't exist).
-            addString(xmlAttr->namespaceUri, kLowPriority, &flatAttr->ns,
-                      true /* treatEmptyStringAsNull */);
-
-            flatAttr->rawValue.index = util::hostToDevice32(-1);
-
-            if (!xmlAttr->compiledAttribute || !xmlAttr->compiledAttribute.value().id) {
-                // The attribute has no associated ResourceID, so the string order doesn't matter.
-                addString(xmlAttr->name, kLowPriority, &flatAttr->name);
-            } else {
-                // Attribute names are stored without packages, but we use
-                // their StringPool index to lookup their resource IDs.
-                // This will cause collisions, so we can't dedupe
-                // attribute names from different packages. We use separate
-                // pools that we later combine.
-                //
-                // Lookup the StringPool for this package and make the reference there.
-                const xml::AaptAttribute& aaptAttr = xmlAttr->compiledAttribute.value();
-
-                StringPool::Ref nameRef = mPackagePools[aaptAttr.id.value().packageId()].makeRef(
-                        xmlAttr->name, StringPool::Context{ aaptAttr.id.value().id });
-
-                // Add it to the list of strings to flatten.
-                addString(nameRef, &flatAttr->name);
-            }
-
-            if (mOptions.keepRawValues || !xmlAttr->compiledValue) {
-                // Keep raw values if the value is not compiled or
-                // if we're building a static library (need symbols).
-                addString(xmlAttr->value, kLowPriority, &flatAttr->rawValue);
-            }
-
-            if (xmlAttr->compiledValue) {
-                bool result = xmlAttr->compiledValue->flatten(&flatAttr->typedValue);
-                assert(result);
-            } else {
-                // Flatten as a regular string type.
-                flatAttr->typedValue.dataType = android::Res_value::TYPE_STRING;
-                addString(xmlAttr->value, kLowPriority,
-                          (ResStringPool_ref*) &flatAttr->typedValue.data);
-            }
-
-            flatAttr->typedValue.size = util::hostToDevice16(sizeof(flatAttr->typedValue));
-            flatAttr++;
-        }
-    }
-};
-
-} // namespace
-
-bool XmlFlattener::flatten(IAaptContext* context, xml::Node* node) {
-    BigBuffer nodeBuffer(1024);
-    XmlFlattenerVisitor visitor(&nodeBuffer, mOptions);
-    node->accept(&visitor);
-
-    // Merge the package pools into the main pool.
-    for (auto& packagePoolEntry : visitor.mPackagePools) {
-        visitor.mPool.merge(std::move(packagePoolEntry.second));
-    }
-
-    // Sort the string pool so that attribute resource IDs show up first.
-    visitor.mPool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
-        return a.context.priority < b.context.priority;
-    });
-
-    // Now we flatten the string pool references into the correct places.
-    for (const auto& refEntry : visitor.mStringRefs) {
-        refEntry.dest->index = util::hostToDevice32(refEntry.ref.getIndex());
-    }
-
-    // Write the XML header.
-    ChunkWriter xmlHeaderWriter(mBuffer);
-    xmlHeaderWriter.startChunk<ResXMLTree_header>(RES_XML_TYPE);
-
-    // Flatten the StringPool.
-    StringPool::flattenUtf8(mBuffer, visitor.mPool);
+    xml::Visitor::visit(node);
 
     {
-        // Write the array of resource IDs, indexed by StringPool order.
-        ChunkWriter resIdMapWriter(mBuffer);
-        resIdMapWriter.startChunk<ResChunk_header>(RES_XML_RESOURCE_MAP_TYPE);
-        for (const auto& str : visitor.mPool) {
-            ResourceId id = { str->context.priority };
-            if (id.id == kLowPriority || !id.isValid()) {
-                // When we see the first non-resource ID,
-                // we're done.
-                break;
-            }
+      ChunkWriter endWriter(mBuffer);
+      ResXMLTree_node* flatEndNode =
+          endWriter.startChunk<ResXMLTree_node>(RES_XML_END_ELEMENT_TYPE);
+      flatEndNode->lineNumber = util::hostToDevice32(node->lineNumber);
+      flatEndNode->comment.index = util::hostToDevice32(-1);
 
-            *resIdMapWriter.nextBlock<uint32_t>() = id.id;
+      ResXMLTree_endElementExt* flatEndElem =
+          endWriter.nextBlock<ResXMLTree_endElementExt>();
+      addString(node->namespaceUri, kLowPriority, &flatEndElem->ns,
+                true /* treatEmptyStringAsNull */);
+      addString(node->name, kLowPriority, &flatEndElem->name);
+
+      endWriter.finish();
+    }
+  }
+
+  static bool cmpXmlAttributeById(const xml::Attribute* a,
+                                  const xml::Attribute* b) {
+    if (a->compiledAttribute && a->compiledAttribute.value().id) {
+      if (b->compiledAttribute && b->compiledAttribute.value().id) {
+        return a->compiledAttribute.value().id.value() <
+               b->compiledAttribute.value().id.value();
+      }
+      return true;
+    } else if (!b->compiledAttribute) {
+      int diff = a->namespaceUri.compare(b->namespaceUri);
+      if (diff < 0) {
+        return true;
+      } else if (diff > 0) {
+        return false;
+      }
+      return a->name < b->name;
+    }
+    return false;
+  }
+
+  void writeAttributes(xml::Element* node, ResXMLTree_attrExt* flatElem,
+                       ChunkWriter* writer) {
+    mFilteredAttrs.clear();
+    mFilteredAttrs.reserve(node->attributes.size());
+
+    // Filter the attributes.
+    for (xml::Attribute& attr : node->attributes) {
+      if (mOptions.maxSdkLevel && attr.compiledAttribute &&
+          attr.compiledAttribute.value().id) {
+        size_t sdkLevel =
+            findAttributeSdkLevel(attr.compiledAttribute.value().id.value());
+        if (sdkLevel > mOptions.maxSdkLevel.value()) {
+          continue;
         }
-        resIdMapWriter.finish();
+      }
+      if (attr.namespaceUri == xml::kSchemaTools) {
+        continue;
+      }
+      mFilteredAttrs.push_back(&attr);
     }
 
-    // Move the nodeBuffer and append it to the out buffer.
-    mBuffer->appendBuffer(std::move(nodeBuffer));
+    if (mFilteredAttrs.empty()) {
+      return;
+    }
 
-    // Finish the xml header.
-    xmlHeaderWriter.finish();
-    return true;
+    const ResourceId kIdAttr(0x010100d0);
+
+    std::sort(mFilteredAttrs.begin(), mFilteredAttrs.end(),
+              cmpXmlAttributeById);
+
+    flatElem->attributeCount = util::hostToDevice16(mFilteredAttrs.size());
+
+    ResXMLTree_attribute* flatAttr =
+        writer->nextBlock<ResXMLTree_attribute>(mFilteredAttrs.size());
+    uint16_t attributeIndex = 1;
+    for (const xml::Attribute* xmlAttr : mFilteredAttrs) {
+      // Assign the indices for specific attributes.
+      if (xmlAttr->compiledAttribute && xmlAttr->compiledAttribute.value().id &&
+          xmlAttr->compiledAttribute.value().id.value() == kIdAttr) {
+        flatElem->idIndex = util::hostToDevice16(attributeIndex);
+      } else if (xmlAttr->namespaceUri.empty()) {
+        if (xmlAttr->name == "class") {
+          flatElem->classIndex = util::hostToDevice16(attributeIndex);
+        } else if (xmlAttr->name == "style") {
+          flatElem->styleIndex = util::hostToDevice16(attributeIndex);
+        }
+      }
+      attributeIndex++;
+
+      // Add the namespaceUri to the list of StringRefs to encode. Use null if
+      // the namespace
+      // is empty (doesn't exist).
+      addString(xmlAttr->namespaceUri, kLowPriority, &flatAttr->ns,
+                true /* treatEmptyStringAsNull */);
+
+      flatAttr->rawValue.index = util::hostToDevice32(-1);
+
+      if (!xmlAttr->compiledAttribute ||
+          !xmlAttr->compiledAttribute.value().id) {
+        // The attribute has no associated ResourceID, so the string order
+        // doesn't matter.
+        addString(xmlAttr->name, kLowPriority, &flatAttr->name);
+      } else {
+        // Attribute names are stored without packages, but we use
+        // their StringPool index to lookup their resource IDs.
+        // This will cause collisions, so we can't dedupe
+        // attribute names from different packages. We use separate
+        // pools that we later combine.
+        //
+        // Lookup the StringPool for this package and make the reference there.
+        const xml::AaptAttribute& aaptAttr = xmlAttr->compiledAttribute.value();
+
+        StringPool::Ref nameRef =
+            mPackagePools[aaptAttr.id.value().packageId()].makeRef(
+                xmlAttr->name, StringPool::Context{aaptAttr.id.value().id});
+
+        // Add it to the list of strings to flatten.
+        addString(nameRef, &flatAttr->name);
+      }
+
+      if (mOptions.keepRawValues || !xmlAttr->compiledValue) {
+        // Keep raw values if the value is not compiled or
+        // if we're building a static library (need symbols).
+        addString(xmlAttr->value, kLowPriority, &flatAttr->rawValue);
+      }
+
+      if (xmlAttr->compiledValue) {
+        bool result = xmlAttr->compiledValue->flatten(&flatAttr->typedValue);
+        assert(result);
+      } else {
+        // Flatten as a regular string type.
+        flatAttr->typedValue.dataType = android::Res_value::TYPE_STRING;
+        addString(xmlAttr->value, kLowPriority,
+                  (ResStringPool_ref*)&flatAttr->typedValue.data);
+      }
+
+      flatAttr->typedValue.size =
+          util::hostToDevice16(sizeof(flatAttr->typedValue));
+      flatAttr++;
+    }
+  }
+};
+
+}  // namespace
+
+bool XmlFlattener::flatten(IAaptContext* context, xml::Node* node) {
+  BigBuffer nodeBuffer(1024);
+  XmlFlattenerVisitor visitor(&nodeBuffer, mOptions);
+  node->accept(&visitor);
+
+  // Merge the package pools into the main pool.
+  for (auto& packagePoolEntry : visitor.mPackagePools) {
+    visitor.mPool.merge(std::move(packagePoolEntry.second));
+  }
+
+  // Sort the string pool so that attribute resource IDs show up first.
+  visitor.mPool.sort(
+      [](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+        return a.context.priority < b.context.priority;
+      });
+
+  // Now we flatten the string pool references into the correct places.
+  for (const auto& refEntry : visitor.mStringRefs) {
+    refEntry.dest->index = util::hostToDevice32(refEntry.ref.getIndex());
+  }
+
+  // Write the XML header.
+  ChunkWriter xmlHeaderWriter(mBuffer);
+  xmlHeaderWriter.startChunk<ResXMLTree_header>(RES_XML_TYPE);
+
+  // Flatten the StringPool.
+  StringPool::flattenUtf8(mBuffer, visitor.mPool);
+
+  {
+    // Write the array of resource IDs, indexed by StringPool order.
+    ChunkWriter resIdMapWriter(mBuffer);
+    resIdMapWriter.startChunk<ResChunk_header>(RES_XML_RESOURCE_MAP_TYPE);
+    for (const auto& str : visitor.mPool) {
+      ResourceId id = {str->context.priority};
+      if (id.id == kLowPriority || !id.isValid()) {
+        // When we see the first non-resource ID,
+        // we're done.
+        break;
+      }
+
+      *resIdMapWriter.nextBlock<uint32_t>() = id.id;
+    }
+    resIdMapWriter.finish();
+  }
+
+  // Move the nodeBuffer and append it to the out buffer.
+  mBuffer->appendBuffer(std::move(nodeBuffer));
+
+  // Finish the xml header.
+  xmlHeaderWriter.finish();
+  return true;
 }
 
 bool XmlFlattener::consume(IAaptContext* context, xml::XmlResource* resource) {
-    if (!resource->root) {
-        return false;
-    }
-    return flatten(context, resource->root.get());
+  if (!resource->root) {
+    return false;
+  }
+  return flatten(context, resource->root.get());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/XmlFlattener.h b/tools/aapt2/flatten/XmlFlattener.h
index a688ac9..d8d592b 100644
--- a/tools/aapt2/flatten/XmlFlattener.h
+++ b/tools/aapt2/flatten/XmlFlattener.h
@@ -24,32 +24,31 @@
 namespace aapt {
 
 struct XmlFlattenerOptions {
-    /**
-     * Keep attribute raw string values along with typed values.
-     */
-    bool keepRawValues = false;
+  /**
+   * Keep attribute raw string values along with typed values.
+   */
+  bool keepRawValues = false;
 
-    /**
-     * If set, the max SDK level of attribute to flatten. All others are ignored.
-     */
-    Maybe<size_t> maxSdkLevel;
+  /**
+   * If set, the max SDK level of attribute to flatten. All others are ignored.
+   */
+  Maybe<size_t> maxSdkLevel;
 };
 
 class XmlFlattener : public IXmlResourceConsumer {
-public:
-    XmlFlattener(BigBuffer* buffer, XmlFlattenerOptions options) :
-            mBuffer(buffer), mOptions(options) {
-    }
+ public:
+  XmlFlattener(BigBuffer* buffer, XmlFlattenerOptions options)
+      : mBuffer(buffer), mOptions(options) {}
 
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 
-private:
-    BigBuffer* mBuffer;
-    XmlFlattenerOptions mOptions;
+ private:
+  BigBuffer* mBuffer;
+  XmlFlattenerOptions mOptions;
 
-    bool flatten(IAaptContext* context, xml::Node* node);
+  bool flatten(IAaptContext* context, xml::Node* node);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_XMLFLATTENER_H */
diff --git a/tools/aapt2/flatten/XmlFlattener_test.cpp b/tools/aapt2/flatten/XmlFlattener_test.cpp
index 4d1e178..e0159cb 100644
--- a/tools/aapt2/flatten/XmlFlattener_test.cpp
+++ b/tools/aapt2/flatten/XmlFlattener_test.cpp
@@ -25,230 +25,240 @@
 namespace aapt {
 
 class XmlFlattenerTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-                .addSymbolSource(test::StaticSymbolSourceBuilder()
-                        .addSymbol("android:attr/id", ResourceId(0x010100d0),
-                                   test::AttributeBuilder().build())
-                        .addSymbol("com.app.test:id/id", ResourceId(0x7f020000))
-                        .addSymbol("android:attr/paddingStart", ResourceId(0x010103b3),
-                                   test::AttributeBuilder().build())
-                        .addSymbol("android:attr/colorAccent", ResourceId(0x01010435),
-                                   test::AttributeBuilder().build())
-                        .build())
-                .build();
+ public:
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            .setCompilationPackage("com.app.test")
+            .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+            .addSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .addSymbol("android:attr/id", ResourceId(0x010100d0),
+                               test::AttributeBuilder().build())
+                    .addSymbol("com.app.test:id/id", ResourceId(0x7f020000))
+                    .addSymbol("android:attr/paddingStart",
+                               ResourceId(0x010103b3),
+                               test::AttributeBuilder().build())
+                    .addSymbol("android:attr/colorAccent",
+                               ResourceId(0x01010435),
+                               test::AttributeBuilder().build())
+                    .build())
+            .build();
+  }
+
+  ::testing::AssertionResult flatten(xml::XmlResource* doc,
+                                     android::ResXMLTree* outTree,
+                                     const XmlFlattenerOptions& options = {}) {
+    using namespace android;  // For NO_ERROR on windows because it is a macro.
+
+    BigBuffer buffer(1024);
+    XmlFlattener flattener(&buffer, options);
+    if (!flattener.consume(mContext.get(), doc)) {
+      return ::testing::AssertionFailure() << "failed to flatten XML Tree";
     }
 
-    ::testing::AssertionResult flatten(xml::XmlResource* doc, android::ResXMLTree* outTree,
-                                       const XmlFlattenerOptions& options = {}) {
-        using namespace android; // For NO_ERROR on windows because it is a macro.
-
-        BigBuffer buffer(1024);
-        XmlFlattener flattener(&buffer, options);
-        if (!flattener.consume(mContext.get(), doc)) {
-            return ::testing::AssertionFailure() << "failed to flatten XML Tree";
-        }
-
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-        if (outTree->setTo(data.get(), buffer.size(), true) != NO_ERROR) {
-            return ::testing::AssertionFailure() << "flattened XML is corrupt";
-        }
-        return ::testing::AssertionSuccess();
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+    if (outTree->setTo(data.get(), buffer.size(), true) != NO_ERROR) {
+      return ::testing::AssertionFailure() << "flattened XML is corrupt";
     }
+    return ::testing::AssertionSuccess();
+  }
 
-protected:
-    std::unique_ptr<IAaptContext> mContext;
+ protected:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(XmlFlattenerTest, FlattenXmlWithNoCompiledAttributes) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:test="http://com.test"
                   attr="hey">
               <Layout test:hello="hi" />
               <Layout>Some text</Layout>
             </View>)EOF");
 
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
+  size_t len;
+  const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
+  EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
 
-    size_t len;
-    const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
-    EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
+  const char16_t* namespaceUri = tree.getNamespaceUri(&len);
+  ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
 
-    const char16_t* namespaceUri = tree.getNamespaceUri(&len);
-    ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  const char16_t* tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"View");
 
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    const char16_t* tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"View");
+  ASSERT_EQ(1u, tree.getAttributeCount());
+  ASSERT_EQ(tree.getAttributeNamespace(0, &len), nullptr);
+  const char16_t* attrName = tree.getAttributeName(0, &len);
+  EXPECT_EQ(StringPiece16(attrName, len), u"attr");
 
-    ASSERT_EQ(1u, tree.getAttributeCount());
-    ASSERT_EQ(tree.getAttributeNamespace(0, &len), nullptr);
-    const char16_t* attrName = tree.getAttributeName(0, &len);
-    EXPECT_EQ(StringPiece16(attrName, len), u"attr");
+  EXPECT_EQ(0, tree.indexOfAttribute(nullptr, 0, u"attr",
+                                     StringPiece16(u"attr").size()));
 
-    EXPECT_EQ(0, tree.indexOfAttribute(nullptr, 0, u"attr", StringPiece16(u"attr").size()));
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
 
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
+  ASSERT_EQ(1u, tree.getAttributeCount());
+  const char16_t* attrNamespace = tree.getAttributeNamespace(0, &len);
+  EXPECT_EQ(StringPiece16(attrNamespace, len), u"http://com.test");
 
-    ASSERT_EQ(1u, tree.getAttributeCount());
-    const char16_t* attrNamespace = tree.getAttributeNamespace(0, &len);
-    EXPECT_EQ(StringPiece16(attrNamespace, len), u"http://com.test");
+  attrName = tree.getAttributeName(0, &len);
+  EXPECT_EQ(StringPiece16(attrName, len), u"hello");
 
-    attrName = tree.getAttributeName(0, &len);
-    EXPECT_EQ(StringPiece16(attrName, len), u"hello");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
+  ASSERT_EQ(0u, tree.getAttributeCount());
 
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
-    ASSERT_EQ(0u, tree.getAttributeCount());
+  ASSERT_EQ(tree.next(), android::ResXMLTree::TEXT);
+  const char16_t* text = tree.getText(&len);
+  EXPECT_EQ(StringPiece16(text, len), u"Some text");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::TEXT);
-    const char16_t* text = tree.getText(&len);
-    EXPECT_EQ(StringPiece16(text, len), u"Some text");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"View");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"View");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_NAMESPACE);
+  namespacePrefix = tree.getNamespacePrefix(&len);
+  EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_NAMESPACE);
-    namespacePrefix = tree.getNamespacePrefix(&len);
-    EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
+  namespaceUri = tree.getNamespaceUri(&len);
+  ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
 
-    namespaceUri = tree.getNamespaceUri(&len);
-    ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
-
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_DOCUMENT);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_DOCUMENT);
 }
 
 TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripSdk21) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                 android:paddingStart="1dp"
                 android:colorAccent="#ffffff"/>)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
-    ASSERT_TRUE(linker.getSdkLevels().count(17) == 1);
-    ASSERT_TRUE(linker.getSdkLevels().count(21) == 1);
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  ASSERT_TRUE(linker.getSdkLevels().count(17) == 1);
+  ASSERT_TRUE(linker.getSdkLevels().count(21) == 1);
 
-    android::ResXMLTree tree;
-    XmlFlattenerOptions options;
-    options.maxSdkLevel = 17;
-    ASSERT_TRUE(flatten(doc.get(), &tree, options));
+  android::ResXMLTree tree;
+  XmlFlattenerOptions options;
+  options.maxSdkLevel = 17;
+  ASSERT_TRUE(flatten(doc.get(), &tree, options));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    ASSERT_EQ(1u, tree.getAttributeCount());
-    EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
+  ASSERT_EQ(1u, tree.getAttributeCount());
+  EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
 }
 
 TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripOnlyTools) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:tools="http://schemas.android.com/tools"
                 xmlns:foo="http://schemas.android.com/foo"
                 foo:bar="Foo"
                 tools:ignore="MissingTranslation"/>)EOF");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
 
-    size_t len;
-    const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
-    EXPECT_EQ(StringPiece16(namespacePrefix, len), u"foo");
+  size_t len;
+  const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
+  EXPECT_EQ(StringPiece16(namespacePrefix, len), u"foo");
 
-    const char16_t* namespaceUri = tree.getNamespaceUri(&len);
-    ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://schemas.android.com/foo");
+  const char16_t* namespaceUri = tree.getNamespaceUri(&len);
+  ASSERT_EQ(StringPiece16(namespaceUri, len),
+            u"http://schemas.android.com/foo");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    EXPECT_EQ(
-            tree.indexOfAttribute("http://schemas.android.com/tools", "ignore"),
+  EXPECT_EQ(tree.indexOfAttribute("http://schemas.android.com/tools", "ignore"),
             android::NAME_NOT_FOUND);
-    EXPECT_GE(tree.indexOfAttribute("http://schemas.android.com/foo", "bar"), 0);
+  EXPECT_GE(tree.indexOfAttribute("http://schemas.android.com/foo", "bar"), 0);
 }
 
 TEST_F(XmlFlattenerTest, AssignSpecialAttributeIndices) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:id="@id/id"
                   class="str"
                   style="@id/id"/>)EOF");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    EXPECT_EQ(tree.indexOfClass(), 0);
-    EXPECT_EQ(tree.indexOfStyle(), 1);
+  EXPECT_EQ(tree.indexOfClass(), 0);
+  EXPECT_EQ(tree.indexOfStyle(), 1);
 }
 
 /*
- * The device ResXMLParser in libandroidfw differentiates between empty namespace and null
+ * The device ResXMLParser in libandroidfw differentiates between empty
+ * namespace and null
  * namespace.
  */
 TEST_F(XmlFlattenerTest, NoNamespaceIsNotTheSameAsEmptyNamespace) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom("<View package=\"android\"/>");
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDom("<View package=\"android\"/>");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    const StringPiece16 kPackage = u"package";
-    EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()), 0);
+  const StringPiece16 kPackage = u"package";
+  EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()),
+            0);
 }
 
 TEST_F(XmlFlattenerTest, EmptyStringValueInAttributeIsNotNull) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom("<View package=\"\"/>");
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDom("<View package=\"\"/>");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    const StringPiece16 kPackage = u"package";
-    ssize_t idx = tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
-    ASSERT_GE(idx, 0);
+  const StringPiece16 kPackage = u"package";
+  ssize_t idx =
+      tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
+  ASSERT_GE(idx, 0);
 
-    size_t len;
-    EXPECT_NE(nullptr, tree.getAttributeStringValue(idx, &len));
+  size_t len;
+  EXPECT_NE(nullptr, tree.getAttributeStringValue(idx, &len));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/io/Data.h b/tools/aapt2/io/Data.h
index 34eed63..0479228b 100644
--- a/tools/aapt2/io/Data.h
+++ b/tools/aapt2/io/Data.h
@@ -18,105 +18,95 @@
 #define AAPT_IO_DATA_H
 
 #include <android-base/macros.h>
-#include <memory>
 #include <utils/FileMap.h>
+#include <memory>
 
 namespace aapt {
 namespace io {
 
 /**
- * Interface for a block of contiguous memory. An instance of this interface owns the data.
+ * Interface for a block of contiguous memory. An instance of this interface
+ * owns the data.
  */
 class IData {
-public:
-    virtual ~IData() = default;
+ public:
+  virtual ~IData() = default;
 
-    virtual const void* data() const = 0;
-    virtual size_t size() const = 0;
+  virtual const void* data() const = 0;
+  virtual size_t size() const = 0;
 };
 
 class DataSegment : public IData {
-public:
-    explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len) :
-            mData(std::move(data)), mOffset(offset), mLen(len) {
-    }
+ public:
+  explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len)
+      : mData(std::move(data)), mOffset(offset), mLen(len) {}
 
-    const void* data() const override {
-        return static_cast<const uint8_t*>(mData->data()) + mOffset;
-    }
+  const void* data() const override {
+    return static_cast<const uint8_t*>(mData->data()) + mOffset;
+  }
 
-    size_t size() const override {
-        return mLen;
-    }
+  size_t size() const override { return mLen; }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(DataSegment);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DataSegment);
 
-    std::unique_ptr<IData> mData;
-    size_t mOffset;
-    size_t mLen;
+  std::unique_ptr<IData> mData;
+  size_t mOffset;
+  size_t mLen;
 };
 
 /**
- * Implementation of IData that exposes a memory mapped file. The mmapped file is owned by this
+ * Implementation of IData that exposes a memory mapped file. The mmapped file
+ * is owned by this
  * object.
  */
 class MmappedData : public IData {
-public:
-    explicit MmappedData(android::FileMap&& map) : mMap(std::forward<android::FileMap>(map)) {
-    }
+ public:
+  explicit MmappedData(android::FileMap&& map)
+      : mMap(std::forward<android::FileMap>(map)) {}
 
-    const void* data() const override {
-        return mMap.getDataPtr();
-    }
+  const void* data() const override { return mMap.getDataPtr(); }
 
-    size_t size() const override {
-        return mMap.getDataLength();
-    }
+  size_t size() const override { return mMap.getDataLength(); }
 
-private:
-    android::FileMap mMap;
+ private:
+  android::FileMap mMap;
 };
 
 /**
- * Implementation of IData that exposes a block of memory that was malloc'ed (new'ed). The
+ * Implementation of IData that exposes a block of memory that was malloc'ed
+ * (new'ed). The
  * memory is owned by this object.
  */
 class MallocData : public IData {
-public:
-    MallocData(std::unique_ptr<const uint8_t[]> data, size_t size) :
-            mData(std::move(data)), mSize(size) {
-    }
+ public:
+  MallocData(std::unique_ptr<const uint8_t[]> data, size_t size)
+      : mData(std::move(data)), mSize(size) {}
 
-    const void* data() const override {
-        return mData.get();
-    }
+  const void* data() const override { return mData.get(); }
 
-    size_t size() const override {
-        return mSize;
-    }
+  size_t size() const override { return mSize; }
 
-private:
-    std::unique_ptr<const uint8_t[]> mData;
-    size_t mSize;
+ private:
+  std::unique_ptr<const uint8_t[]> mData;
+  size_t mSize;
 };
 
 /**
- * When mmap fails because the file has length 0, we use the EmptyData to simulate data of length 0.
+ * When mmap fails because the file has length 0, we use the EmptyData to
+ * simulate data of length 0.
  */
 class EmptyData : public IData {
-public:
-    const void* data() const override {
-        static const uint8_t d = 0;
-        return &d;
-    }
+ public:
+  const void* data() const override {
+    static const uint8_t d = 0;
+    return &d;
+  }
 
-    size_t size() const override {
-        return 0u;
-    }
+  size_t size() const override { return 0u; }
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_DATA_H */
diff --git a/tools/aapt2/io/File.h b/tools/aapt2/io/File.h
index 807981e..012f446 100644
--- a/tools/aapt2/io/File.h
+++ b/tools/aapt2/io/File.h
@@ -30,83 +30,90 @@
 namespace io {
 
 /**
- * Interface for a file, which could be a real file on the file system, or a file inside
+ * Interface for a file, which could be a real file on the file system, or a
+ * file inside
  * a ZIP archive.
  */
 class IFile {
-public:
-    virtual ~IFile() = default;
+ public:
+  virtual ~IFile() = default;
 
-    /**
-     * Open the file and return it as a block of contiguous memory. How this occurs is
-     * implementation dependent. For example, if this is a file on the file system, it may
-     * simply mmap the contents. If this file represents a compressed file in a ZIP archive,
-     * it may need to inflate it to memory, incurring a copy.
-     *
-     * Returns nullptr on failure.
-     */
-    virtual std::unique_ptr<IData> openAsData() = 0;
+  /**
+   * Open the file and return it as a block of contiguous memory. How this
+   * occurs is
+   * implementation dependent. For example, if this is a file on the file
+   * system, it may
+   * simply mmap the contents. If this file represents a compressed file in a
+   * ZIP archive,
+   * it may need to inflate it to memory, incurring a copy.
+   *
+   * Returns nullptr on failure.
+   */
+  virtual std::unique_ptr<IData> openAsData() = 0;
 
-    /**
-     * Returns the source of this file. This is for presentation to the user and may not be a
-     * valid file system path (for example, it may contain a '@' sign to separate the files within
-     * a ZIP archive from the path to the containing ZIP archive.
-     */
-    virtual const Source& getSource() const = 0;
+  /**
+   * Returns the source of this file. This is for presentation to the user and
+   * may not be a
+   * valid file system path (for example, it may contain a '@' sign to separate
+   * the files within
+   * a ZIP archive from the path to the containing ZIP archive.
+   */
+  virtual const Source& getSource() const = 0;
 
-    IFile* createFileSegment(size_t offset, size_t len);
+  IFile* createFileSegment(size_t offset, size_t len);
 
-private:
-    // Any segments created from this IFile need to be owned by this IFile, so keep them
-    // in a list. This will never be read, so we prefer better insertion performance
-    // than cache locality, hence the list.
-    std::list<std::unique_ptr<IFile>> mSegments;
+ private:
+  // Any segments created from this IFile need to be owned by this IFile, so
+  // keep them
+  // in a list. This will never be read, so we prefer better insertion
+  // performance
+  // than cache locality, hence the list.
+  std::list<std::unique_ptr<IFile>> mSegments;
 };
 
 /**
- * An IFile that wraps an underlying IFile but limits it to a subsection of that file.
+ * An IFile that wraps an underlying IFile but limits it to a subsection of that
+ * file.
  */
 class FileSegment : public IFile {
-public:
-    explicit FileSegment(IFile* file, size_t offset, size_t len) :
-            mFile(file), mOffset(offset), mLen(len) {
-    }
+ public:
+  explicit FileSegment(IFile* file, size_t offset, size_t len)
+      : mFile(file), mOffset(offset), mLen(len) {}
 
-    std::unique_ptr<IData> openAsData() override;
+  std::unique_ptr<IData> openAsData() override;
 
-    const Source& getSource() const override {
-        return mFile->getSource();
-    }
+  const Source& getSource() const override { return mFile->getSource(); }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(FileSegment);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FileSegment);
 
-    IFile* mFile;
-    size_t mOffset;
-    size_t mLen;
+  IFile* mFile;
+  size_t mOffset;
+  size_t mLen;
 };
 
 class IFileCollectionIterator {
-public:
-    virtual ~IFileCollectionIterator() = default;
+ public:
+  virtual ~IFileCollectionIterator() = default;
 
-    virtual bool hasNext() = 0;
-    virtual IFile* next() = 0;
+  virtual bool hasNext() = 0;
+  virtual IFile* next() = 0;
 };
 
 /**
- * Interface for a collection of files, all of which share a common source. That source may
+ * Interface for a collection of files, all of which share a common source. That
+ * source may
  * simply be the filesystem, or a ZIP archive.
  */
 class IFileCollection {
-public:
-    virtual ~IFileCollection() = default;
+ public:
+  virtual ~IFileCollection() = default;
 
-    virtual IFile* findFile(const StringPiece& path) = 0;
-    virtual std::unique_ptr<IFileCollectionIterator> iterator() = 0;
+  virtual IFile* findFile(const StringPiece& path) = 0;
+  virtual std::unique_ptr<IFileCollectionIterator> iterator() = 0;
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_FILE_H */
diff --git a/tools/aapt2/io/FileSystem.h b/tools/aapt2/io/FileSystem.h
index 72a932a..8584d48 100644
--- a/tools/aapt2/io/FileSystem.h
+++ b/tools/aapt2/io/FileSystem.h
@@ -28,47 +28,47 @@
  * A regular file from the file system. Uses mmap to open the data.
  */
 class RegularFile : public IFile {
-public:
-    explicit RegularFile(const Source& source);
+ public:
+  explicit RegularFile(const Source& source);
 
-    std::unique_ptr<IData> openAsData() override;
-    const Source& getSource() const override;
+  std::unique_ptr<IData> openAsData() override;
+  const Source& getSource() const override;
 
-private:
-    Source mSource;
+ private:
+  Source mSource;
 };
 
 class FileCollection;
 
 class FileCollectionIterator : public IFileCollectionIterator {
-public:
-    explicit FileCollectionIterator(FileCollection* collection);
+ public:
+  explicit FileCollectionIterator(FileCollection* collection);
 
-    bool hasNext() override;
-    io::IFile* next() override;
+  bool hasNext() override;
+  io::IFile* next() override;
 
-private:
-    std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
+ private:
+  std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
 };
 
 /**
  * An IFileCollection representing the file system.
  */
 class FileCollection : public IFileCollection {
-public:
-    /**
-     * Adds a file located at path. Returns the IFile representation of that file.
-     */
-    IFile* insertFile(const StringPiece& path);
-    IFile* findFile(const StringPiece& path) override;
-    std::unique_ptr<IFileCollectionIterator> iterator() override;
+ public:
+  /**
+   * Adds a file located at path. Returns the IFile representation of that file.
+   */
+  IFile* insertFile(const StringPiece& path);
+  IFile* findFile(const StringPiece& path) override;
+  std::unique_ptr<IFileCollectionIterator> iterator() override;
 
-private:
-    friend class FileCollectionIterator;
-    std::map<std::string, std::unique_ptr<IFile>> mFiles;
+ private:
+  friend class FileCollectionIterator;
+  std::map<std::string, std::unique_ptr<IFile>> mFiles;
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
-#endif // AAPT_IO_FILESYSTEM_H
+#endif  // AAPT_IO_FILESYSTEM_H
diff --git a/tools/aapt2/io/Io.h b/tools/aapt2/io/Io.h
index e1e9107..49b9fc3 100644
--- a/tools/aapt2/io/Io.h
+++ b/tools/aapt2/io/Io.h
@@ -30,12 +30,10 @@
  * The code style here matches the protobuf style.
  */
 class InputStream : public google::protobuf::io::ZeroCopyInputStream {
-public:
-    virtual std::string GetError() const {
-        return {};
-    }
+ public:
+  virtual std::string GetError() const { return {}; }
 
-    virtual bool HadError() const = 0;
+  virtual bool HadError() const = 0;
 };
 
 /**
@@ -45,12 +43,10 @@
  * The code style here matches the protobuf style.
  */
 class OutputStream : public google::protobuf::io::ZeroCopyOutputStream {
-public:
-    virtual std::string GetError() const {
-        return {};
-    }
+ public:
+  virtual std::string GetError() const { return {}; }
 
-    virtual bool HadError() const = 0;
+  virtual bool HadError() const = 0;
 };
 
 /**
@@ -60,7 +56,7 @@
  */
 bool copy(OutputStream* out, InputStream* in);
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_IO_H */
diff --git a/tools/aapt2/io/ZipArchive.h b/tools/aapt2/io/ZipArchive.h
index 565588e..e04525f 100644
--- a/tools/aapt2/io/ZipArchive.h
+++ b/tools/aapt2/io/ZipArchive.h
@@ -20,64 +20,66 @@
 #include "io/File.h"
 #include "util/StringPiece.h"
 
-#include <map>
 #include <ziparchive/zip_archive.h>
+#include <map>
 
 namespace aapt {
 namespace io {
 
 /**
- * An IFile representing a file within a ZIP archive. If the file is compressed, it is uncompressed
- * and copied into memory when opened. Otherwise it is mmapped from the ZIP archive.
+ * An IFile representing a file within a ZIP archive. If the file is compressed,
+ * it is uncompressed
+ * and copied into memory when opened. Otherwise it is mmapped from the ZIP
+ * archive.
  */
 class ZipFile : public IFile {
-public:
-    ZipFile(ZipArchiveHandle handle, const ZipEntry& entry, const Source& source);
+ public:
+  ZipFile(ZipArchiveHandle handle, const ZipEntry& entry, const Source& source);
 
-    std::unique_ptr<IData> openAsData() override;
-    const Source& getSource() const override;
+  std::unique_ptr<IData> openAsData() override;
+  const Source& getSource() const override;
 
-private:
-    ZipArchiveHandle mZipHandle;
-    ZipEntry mZipEntry;
-    Source mSource;
+ private:
+  ZipArchiveHandle mZipHandle;
+  ZipEntry mZipEntry;
+  Source mSource;
 };
 
 class ZipFileCollection;
 
 class ZipFileCollectionIterator : public IFileCollectionIterator {
-public:
-    explicit ZipFileCollectionIterator(ZipFileCollection* collection);
+ public:
+  explicit ZipFileCollectionIterator(ZipFileCollection* collection);
 
-    bool hasNext() override;
-    io::IFile* next() override;
+  bool hasNext() override;
+  io::IFile* next() override;
 
-private:
-    std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
+ private:
+  std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
 };
 
 /**
  * An IFileCollection that represents a ZIP archive and the entries within it.
  */
 class ZipFileCollection : public IFileCollection {
-public:
-    static std::unique_ptr<ZipFileCollection> create(const StringPiece& path,
-                                                     std::string* outError);
+ public:
+  static std::unique_ptr<ZipFileCollection> create(const StringPiece& path,
+                                                   std::string* outError);
 
-    io::IFile* findFile(const StringPiece& path) override;
-    std::unique_ptr<IFileCollectionIterator> iterator() override;
+  io::IFile* findFile(const StringPiece& path) override;
+  std::unique_ptr<IFileCollectionIterator> iterator() override;
 
-    ~ZipFileCollection() override;
+  ~ZipFileCollection() override;
 
-private:
-    friend class ZipFileCollectionIterator;
-    ZipFileCollection();
+ private:
+  friend class ZipFileCollectionIterator;
+  ZipFileCollection();
 
-    ZipArchiveHandle mHandle;
-    std::map<std::string, std::unique_ptr<IFile>> mFiles;
+  ZipArchiveHandle mHandle;
+  std::map<std::string, std::unique_ptr<IFile>> mFiles;
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_ZIPARCHIVE_H */
diff --git a/tools/aapt2/java/AnnotationProcessor.h b/tools/aapt2/java/AnnotationProcessor.h
index cfc32f3..5419608 100644
--- a/tools/aapt2/java/AnnotationProcessor.h
+++ b/tools/aapt2/java/AnnotationProcessor.h
@@ -52,34 +52,36 @@
  *
  */
 class AnnotationProcessor {
-public:
-    /**
-     * Adds more comments. Since resources can have various values with different configurations,
-     * we need to collect all the comments.
-     */
-    void appendComment(const StringPiece& comment);
+ public:
+  /**
+   * Adds more comments. Since resources can have various values with different
+   * configurations,
+   * we need to collect all the comments.
+   */
+  void appendComment(const StringPiece& comment);
 
-    void appendNewLine();
+  void appendNewLine();
 
-    /**
-     * Writes the comments and annotations to the stream, with the given prefix before each line.
-     */
-    void writeToStream(std::ostream* out, const StringPiece& prefix) const;
+  /**
+   * Writes the comments and annotations to the stream, with the given prefix
+   * before each line.
+   */
+  void writeToStream(std::ostream* out, const StringPiece& prefix) const;
 
-private:
-    enum : uint32_t {
-        kDeprecated = 0x01,
-        kSystemApi = 0x02,
-    };
+ private:
+  enum : uint32_t {
+    kDeprecated = 0x01,
+    kSystemApi = 0x02,
+  };
 
-    std::stringstream mComment;
-    std::stringstream mAnnotations;
-    bool mHasComments = false;
-    uint32_t mAnnotationBitMask = 0;
+  std::stringstream mComment;
+  std::stringstream mAnnotations;
+  bool mHasComments = false;
+  uint32_t mAnnotationBitMask = 0;
 
-    void appendCommentLine(std::string& line);
+  void appendCommentLine(std::string& line);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_JAVA_ANNOTATIONPROCESSOR_H */
diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h
index e84c274..bd7e7b2 100644
--- a/tools/aapt2/java/ClassDefinition.h
+++ b/tools/aapt2/java/ClassDefinition.h
@@ -33,46 +33,43 @@
 constexpr static const char* kIndent = "  ";
 
 class ClassMember {
-public:
-    virtual ~ClassMember() = default;
+ public:
+  virtual ~ClassMember() = default;
 
-    AnnotationProcessor* getCommentBuilder() {
-        return &mProcessor;
-    }
+  AnnotationProcessor* getCommentBuilder() { return &mProcessor; }
 
-    virtual bool empty() const = 0;
+  virtual bool empty() const = 0;
 
-    virtual void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const {
-        mProcessor.writeToStream(out, prefix);
-    }
+  virtual void writeToStream(const StringPiece& prefix, bool final,
+                             std::ostream* out) const {
+    mProcessor.writeToStream(out, prefix);
+  }
 
-private:
-    AnnotationProcessor mProcessor;
+ private:
+  AnnotationProcessor mProcessor;
 };
 
 template <typename T>
 class PrimitiveMember : public ClassMember {
-public:
-    PrimitiveMember(const StringPiece& name, const T& val) :
-            mName(name.toString()), mVal(val) {
-    }
+ public:
+  PrimitiveMember(const StringPiece& name, const T& val)
+      : mName(name.toString()), mVal(val) {}
 
-    bool empty() const override {
-        return false;
-    }
+  bool empty() const override { return false; }
 
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override {
-        ClassMember::writeToStream(prefix, final, out);
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override {
+    ClassMember::writeToStream(prefix, final, out);
 
-        *out << prefix << "public static " << (final ? "final " : "")
-             << "int " << mName << "=" << mVal << ";";
-    }
+    *out << prefix << "public static " << (final ? "final " : "") << "int "
+         << mName << "=" << mVal << ";";
+  }
 
-private:
-    std::string mName;
-    T mVal;
+ private:
+  std::string mName;
+  T mVal;
 
-    DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
+  DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
 };
 
 /**
@@ -80,27 +77,25 @@
  */
 template <>
 class PrimitiveMember<std::string> : public ClassMember {
-public:
-    PrimitiveMember(const StringPiece& name, const std::string& val) :
-            mName(name.toString()), mVal(val) {
-    }
+ public:
+  PrimitiveMember(const StringPiece& name, const std::string& val)
+      : mName(name.toString()), mVal(val) {}
 
-    bool empty() const override {
-        return false;
-    }
+  bool empty() const override { return false; }
 
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override {
-        ClassMember::writeToStream(prefix, final, out);
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override {
+    ClassMember::writeToStream(prefix, final, out);
 
-        *out << prefix << "public static " << (final ? "final " : "")
-             << "String " << mName << "=\"" << mVal << "\";";
-    }
+    *out << prefix << "public static " << (final ? "final " : "") << "String "
+         << mName << "=\"" << mVal << "\";";
+  }
 
-private:
-    std::string mName;
-    std::string mVal;
+ private:
+  std::string mName;
+  std::string mVal;
 
-    DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
+  DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
 };
 
 using IntMember = PrimitiveMember<uint32_t>;
@@ -109,80 +104,75 @@
 
 template <typename T>
 class PrimitiveArrayMember : public ClassMember {
-public:
-    explicit PrimitiveArrayMember(const StringPiece& name) :
-            mName(name.toString()) {
+ public:
+  explicit PrimitiveArrayMember(const StringPiece& name)
+      : mName(name.toString()) {}
+
+  void addElement(const T& val) { mElements.push_back(val); }
+
+  bool empty() const override { return false; }
+
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override {
+    ClassMember::writeToStream(prefix, final, out);
+
+    *out << prefix << "public static final int[] " << mName << "={";
+
+    const auto begin = mElements.begin();
+    const auto end = mElements.end();
+    for (auto current = begin; current != end; ++current) {
+      if (std::distance(begin, current) % kAttribsPerLine == 0) {
+        *out << "\n" << prefix << kIndent << kIndent;
+      }
+
+      *out << *current;
+      if (std::distance(current, end) > 1) {
+        *out << ", ";
+      }
     }
+    *out << "\n" << prefix << kIndent << "};";
+  }
 
-    void addElement(const T& val) {
-        mElements.push_back(val);
-    }
+ private:
+  std::string mName;
+  std::vector<T> mElements;
 
-    bool empty() const override {
-        return false;
-    }
-
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override {
-        ClassMember::writeToStream(prefix, final, out);
-
-        *out << prefix << "public static final int[] " << mName << "={";
-
-        const auto begin = mElements.begin();
-        const auto end = mElements.end();
-        for (auto current = begin; current != end; ++current) {
-            if (std::distance(begin, current) % kAttribsPerLine == 0) {
-                *out << "\n" << prefix << kIndent << kIndent;
-            }
-
-            *out << *current;
-            if (std::distance(current, end) > 1) {
-                *out << ", ";
-            }
-        }
-        *out << "\n" << prefix << kIndent <<"};";
-    }
-
-private:
-    std::string mName;
-    std::vector<T> mElements;
-
-    DISALLOW_COPY_AND_ASSIGN(PrimitiveArrayMember);
+  DISALLOW_COPY_AND_ASSIGN(PrimitiveArrayMember);
 };
 
 using ResourceArrayMember = PrimitiveArrayMember<ResourceId>;
 
-enum class ClassQualifier {
-    None,
-    Static
-};
+enum class ClassQualifier { None, Static };
 
 class ClassDefinition : public ClassMember {
-public:
-    static bool writeJavaFile(const ClassDefinition* def,
-                              const StringPiece& package,
-                              bool final,
-                              std::ostream* out);
+ public:
+  static bool writeJavaFile(const ClassDefinition* def,
+                            const StringPiece& package, bool final,
+                            std::ostream* out);
 
-    ClassDefinition(const StringPiece& name, ClassQualifier qualifier, bool createIfEmpty) :
-            mName(name.toString()), mQualifier(qualifier), mCreateIfEmpty(createIfEmpty) {
-    }
+  ClassDefinition(const StringPiece& name, ClassQualifier qualifier,
+                  bool createIfEmpty)
+      : mName(name.toString()),
+        mQualifier(qualifier),
+        mCreateIfEmpty(createIfEmpty) {}
 
-    void addMember(std::unique_ptr<ClassMember> member) {
-        mMembers.push_back(std::move(member));
-    }
+  void addMember(std::unique_ptr<ClassMember> member) {
+    mMembers.push_back(std::move(member));
+  }
 
-    bool empty() const override;
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override;
+  bool empty() const override;
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override;
 
-private:
-    std::string mName;
-    ClassQualifier mQualifier;
-    bool mCreateIfEmpty;
-    std::vector<std::unique_ptr<ClassMember>> mMembers;
+ private:
+  std::string mName;
+  ClassQualifier mQualifier;
+  bool mCreateIfEmpty;
+  std::vector<std::unique_ptr<ClassMember>> mMembers;
 
-    DISALLOW_COPY_AND_ASSIGN(ClassDefinition);
+  DISALLOW_COPY_AND_ASSIGN(ClassDefinition);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_JAVA_CLASSDEFINITION_H */
diff --git a/tools/aapt2/java/JavaClassGenerator.h b/tools/aapt2/java/JavaClassGenerator.h
index 901a86e..2fdf268 100644
--- a/tools/aapt2/java/JavaClassGenerator.h
+++ b/tools/aapt2/java/JavaClassGenerator.h
@@ -31,72 +31,74 @@
 class ClassDefinition;
 
 struct JavaClassGeneratorOptions {
-    /*
-     * Specifies whether to use the 'final' modifier
-     * on resource entries. Default is true.
-     */
-    bool useFinal = true;
+  /*
+   * Specifies whether to use the 'final' modifier
+   * on resource entries. Default is true.
+   */
+  bool useFinal = true;
 
-    enum class SymbolTypes {
-        kAll,
-        kPublicPrivate,
-        kPublic,
-    };
+  enum class SymbolTypes {
+    kAll,
+    kPublicPrivate,
+    kPublic,
+  };
 
-    SymbolTypes types = SymbolTypes::kAll;
+  SymbolTypes types = SymbolTypes::kAll;
 
-    /**
-     * A list of JavaDoc annotations to add to the comments of all generated classes.
-     */
-    std::vector<std::string> javadocAnnotations;
+  /**
+   * A list of JavaDoc annotations to add to the comments of all generated
+   * classes.
+   */
+  std::vector<std::string> javadocAnnotations;
 };
 
 /*
  * Generates the R.java file for a resource table.
  */
 class JavaClassGenerator {
-public:
-    JavaClassGenerator(IAaptContext* context, ResourceTable* table,
-                       const JavaClassGeneratorOptions& options);
+ public:
+  JavaClassGenerator(IAaptContext* context, ResourceTable* table,
+                     const JavaClassGeneratorOptions& options);
 
-    /*
-     * Writes the R.java file to `out`. Only symbols belonging to `package` are written.
-     * All symbols technically belong to a single package, but linked libraries will
-     * have their names mangled, denoting that they came from a different package.
-     * We need to generate these symbols in a separate file.
-     * Returns true on success.
-     */
-    bool generate(const StringPiece& packageNameToGenerate, std::ostream* out);
+  /*
+   * Writes the R.java file to `out`. Only symbols belonging to `package` are
+   * written.
+   * All symbols technically belong to a single package, but linked libraries
+   * will
+   * have their names mangled, denoting that they came from a different package.
+   * We need to generate these symbols in a separate file.
+   * Returns true on success.
+   */
+  bool generate(const StringPiece& packageNameToGenerate, std::ostream* out);
 
-    bool generate(const StringPiece& packageNameToGenerate,
-                  const StringPiece& outputPackageName,
-                  std::ostream* out);
+  bool generate(const StringPiece& packageNameToGenerate,
+                const StringPiece& outputPackageName, std::ostream* out);
 
-    const std::string& getError() const;
+  const std::string& getError() const;
 
-private:
-    bool addMembersToTypeClass(const StringPiece& packageNameToGenerate,
-                               const ResourceTablePackage* package,
-                               const ResourceTableType* type,
-                               ClassDefinition* outTypeClassDef);
+ private:
+  bool addMembersToTypeClass(const StringPiece& packageNameToGenerate,
+                             const ResourceTablePackage* package,
+                             const ResourceTableType* type,
+                             ClassDefinition* outTypeClassDef);
 
-    void addMembersToStyleableClass(const StringPiece& packageNameToGenerate,
-                                    const std::string& entryName,
-                                    const Styleable* styleable,
-                                    ClassDefinition* outStyleableClassDef);
+  void addMembersToStyleableClass(const StringPiece& packageNameToGenerate,
+                                  const std::string& entryName,
+                                  const Styleable* styleable,
+                                  ClassDefinition* outStyleableClassDef);
 
-    bool skipSymbol(SymbolState state);
+  bool skipSymbol(SymbolState state);
 
-    IAaptContext* mContext;
-    ResourceTable* mTable;
-    JavaClassGeneratorOptions mOptions;
-    std::string mError;
+  IAaptContext* mContext;
+  ResourceTable* mTable;
+  JavaClassGeneratorOptions mOptions;
+  std::string mError;
 };
 
 inline const std::string& JavaClassGenerator::getError() const {
-    return mError;
+  return mError;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_JAVA_CLASS_GENERATOR_H
+#endif  // AAPT_JAVA_CLASS_GENERATOR_H
diff --git a/tools/aapt2/java/ManifestClassGenerator.h b/tools/aapt2/java/ManifestClassGenerator.h
index f565289..1817648 100644
--- a/tools/aapt2/java/ManifestClassGenerator.h
+++ b/tools/aapt2/java/ManifestClassGenerator.h
@@ -26,8 +26,9 @@
 
 namespace aapt {
 
-std::unique_ptr<ClassDefinition> generateManifestClass(IDiagnostics* diag, xml::XmlResource* res);
+std::unique_ptr<ClassDefinition> generateManifestClass(IDiagnostics* diag,
+                                                       xml::XmlResource* res);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_JAVA_MANIFESTCLASSGENERATOR_H */
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h
index c2d2bd9..7578ec2 100644
--- a/tools/aapt2/java/ProguardRules.h
+++ b/tools/aapt2/java/ProguardRules.h
@@ -30,29 +30,31 @@
 namespace proguard {
 
 class KeepSet {
-public:
-    inline void addClass(const Source& source, const std::string& className) {
-        mKeepSet[className].insert(source);
-    }
+ public:
+  inline void addClass(const Source& source, const std::string& className) {
+    mKeepSet[className].insert(source);
+  }
 
-    inline void addMethod(const Source& source, const std::string& methodName) {
-        mKeepMethodSet[methodName].insert(source);
-    }
+  inline void addMethod(const Source& source, const std::string& methodName) {
+    mKeepMethodSet[methodName].insert(source);
+  }
 
-private:
-    friend bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
+ private:
+  friend bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
 
-    std::map<std::string, std::set<Source>> mKeepSet;
-    std::map<std::string, std::set<Source>> mKeepMethodSet;
+  std::map<std::string, std::set<Source>> mKeepSet;
+  std::map<std::string, std::set<Source>> mKeepMethodSet;
 };
 
-bool collectProguardRulesForManifest(const Source& source, xml::XmlResource* res, KeepSet* keepSet,
+bool collectProguardRulesForManifest(const Source& source,
+                                     xml::XmlResource* res, KeepSet* keepSet,
                                      bool mainDexOnly = false);
-bool collectProguardRules(const Source& source, xml::XmlResource* res, KeepSet* keepSet);
+bool collectProguardRules(const Source& source, xml::XmlResource* res,
+                          KeepSet* keepSet);
 
 bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
 
-} // namespace proguard
-} // namespace aapt
+}  // namespace proguard
+}  // namespace aapt
 
-#endif // AAPT_PROGUARD_RULES_H
+#endif  // AAPT_PROGUARD_RULES_H
diff --git a/tools/aapt2/link/AutoVersioner.cpp b/tools/aapt2/link/AutoVersioner.cpp
index 8ed27c3..5ba9819 100644
--- a/tools/aapt2/link/AutoVersioner.cpp
+++ b/tools/aapt2/link/AutoVersioner.cpp
@@ -25,117 +25,128 @@
 
 namespace aapt {
 
-bool shouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+bool shouldGenerateVersionedResource(const ResourceEntry* entry,
+                                     const ConfigDescription& config,
                                      const int sdkVersionToGenerate) {
-    // We assume the caller is trying to generate a version greater than the current configuration.
-    assert(sdkVersionToGenerate > config.sdkVersion);
+  // We assume the caller is trying to generate a version greater than the
+  // current configuration.
+  assert(sdkVersionToGenerate > config.sdkVersion);
 
-    const auto endIter = entry->values.end();
-    auto iter = entry->values.begin();
-    for (; iter != endIter; ++iter) {
-        if ((*iter)->config == config) {
-            break;
-        }
+  const auto endIter = entry->values.end();
+  auto iter = entry->values.begin();
+  for (; iter != endIter; ++iter) {
+    if ((*iter)->config == config) {
+      break;
     }
+  }
 
-    // The source config came from this list, so it should be here.
-    assert(iter != entry->values.end());
-    ++iter;
+  // The source config came from this list, so it should be here.
+  assert(iter != entry->values.end());
+  ++iter;
 
-    // The next configuration either only varies in sdkVersion, or it is completely different
-    // and therefore incompatible. If it is incompatible, we must generate the versioned resource.
+  // The next configuration either only varies in sdkVersion, or it is
+  // completely different
+  // and therefore incompatible. If it is incompatible, we must generate the
+  // versioned resource.
 
-    // NOTE: The ordering of configurations takes sdkVersion as higher precedence than other
-    // qualifiers, so we need to iterate through the entire list to be sure there
-    // are no higher sdk level versions of this resource.
-    ConfigDescription tempConfig(config);
-    for (; iter != endIter; ++iter) {
-        tempConfig.sdkVersion = (*iter)->config.sdkVersion;
-        if (tempConfig == (*iter)->config) {
-            // The two configs are the same, check the sdk version.
-            return sdkVersionToGenerate < (*iter)->config.sdkVersion;
-        }
+  // NOTE: The ordering of configurations takes sdkVersion as higher precedence
+  // than other
+  // qualifiers, so we need to iterate through the entire list to be sure there
+  // are no higher sdk level versions of this resource.
+  ConfigDescription tempConfig(config);
+  for (; iter != endIter; ++iter) {
+    tempConfig.sdkVersion = (*iter)->config.sdkVersion;
+    if (tempConfig == (*iter)->config) {
+      // The two configs are the same, check the sdk version.
+      return sdkVersionToGenerate < (*iter)->config.sdkVersion;
     }
+  }
 
-    // No match was found, so we should generate the versioned resource.
-    return true;
+  // No match was found, so we should generate the versioned resource.
+  return true;
 }
 
 bool AutoVersioner::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            if (type->type != ResourceType::kStyle) {
-                continue;
-            }
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      if (type->type != ResourceType::kStyle) {
+        continue;
+      }
 
-            for (auto& entry : type->entries) {
-                for (size_t i = 0; i < entry->values.size(); i++) {
-                    ResourceConfigValue* configValue = entry->values[i].get();
-                    if (configValue->config.sdkVersion >= SDK_LOLLIPOP_MR1) {
-                        // If this configuration is only used on L-MR1 then we don't need
-                        // to do anything since we use private attributes since that version.
-                        continue;
-                    }
+      for (auto& entry : type->entries) {
+        for (size_t i = 0; i < entry->values.size(); i++) {
+          ResourceConfigValue* configValue = entry->values[i].get();
+          if (configValue->config.sdkVersion >= SDK_LOLLIPOP_MR1) {
+            // If this configuration is only used on L-MR1 then we don't need
+            // to do anything since we use private attributes since that
+            // version.
+            continue;
+          }
 
-                    if (Style* style = valueCast<Style>(configValue->value.get())) {
-                        Maybe<size_t> minSdkStripped;
-                        std::vector<Style::Entry> stripped;
+          if (Style* style = valueCast<Style>(configValue->value.get())) {
+            Maybe<size_t> minSdkStripped;
+            std::vector<Style::Entry> stripped;
 
-                        auto iter = style->entries.begin();
-                        while (iter != style->entries.end()) {
-                            assert(iter->key.id && "IDs must be assigned and linked");
+            auto iter = style->entries.begin();
+            while (iter != style->entries.end()) {
+              assert(iter->key.id && "IDs must be assigned and linked");
 
-                            // Find the SDK level that is higher than the configuration allows.
-                            const size_t sdkLevel = findAttributeSdkLevel(iter->key.id.value());
-                            if (sdkLevel > std::max<size_t>(configValue->config.sdkVersion, 1)) {
-                                // Record that we are about to strip this.
-                                stripped.emplace_back(std::move(*iter));
+              // Find the SDK level that is higher than the configuration
+              // allows.
+              const size_t sdkLevel =
+                  findAttributeSdkLevel(iter->key.id.value());
+              if (sdkLevel >
+                  std::max<size_t>(configValue->config.sdkVersion, 1)) {
+                // Record that we are about to strip this.
+                stripped.emplace_back(std::move(*iter));
 
-                                // We use the smallest SDK level to generate the new style.
-                                if (minSdkStripped) {
-                                    minSdkStripped = std::min(minSdkStripped.value(), sdkLevel);
-                                } else {
-                                    minSdkStripped = sdkLevel;
-                                }
-
-                                // Erase this from this style.
-                                iter = style->entries.erase(iter);
-                                continue;
-                            }
-                            ++iter;
-                        }
-
-                        if (minSdkStripped && !stripped.empty()) {
-                            // We found attributes from a higher SDK level. Check that
-                            // there is no other defined resource for the version we want to
-                            // generate.
-                            if (shouldGenerateVersionedResource(entry.get(),
-                                                                configValue->config,
-                                                                minSdkStripped.value())) {
-                                // Let's create a new Style for this versioned resource.
-                                ConfigDescription newConfig(configValue->config);
-                                newConfig.sdkVersion = minSdkStripped.value();
-
-                                std::unique_ptr<Style> newStyle(style->clone(&table->stringPool));
-                                newStyle->setComment(style->getComment());
-                                newStyle->setSource(style->getSource());
-
-                                // Move the previously stripped attributes into this style.
-                                newStyle->entries.insert(newStyle->entries.end(),
-                                                         std::make_move_iterator(stripped.begin()),
-                                                         std::make_move_iterator(stripped.end()));
-
-                                // Insert the new Resource into the correct place.
-                                entry->findOrCreateValue(newConfig, {})->value =
-                                        std::move(newStyle);
-                            }
-                        }
-                    }
+                // We use the smallest SDK level to generate the new style.
+                if (minSdkStripped) {
+                  minSdkStripped = std::min(minSdkStripped.value(), sdkLevel);
+                } else {
+                  minSdkStripped = sdkLevel;
                 }
+
+                // Erase this from this style.
+                iter = style->entries.erase(iter);
+                continue;
+              }
+              ++iter;
             }
+
+            if (minSdkStripped && !stripped.empty()) {
+              // We found attributes from a higher SDK level. Check that
+              // there is no other defined resource for the version we want to
+              // generate.
+              if (shouldGenerateVersionedResource(entry.get(),
+                                                  configValue->config,
+                                                  minSdkStripped.value())) {
+                // Let's create a new Style for this versioned resource.
+                ConfigDescription newConfig(configValue->config);
+                newConfig.sdkVersion = minSdkStripped.value();
+
+                std::unique_ptr<Style> newStyle(
+                    style->clone(&table->stringPool));
+                newStyle->setComment(style->getComment());
+                newStyle->setSource(style->getSource());
+
+                // Move the previously stripped attributes into this style.
+                newStyle->entries.insert(
+                    newStyle->entries.end(),
+                    std::make_move_iterator(stripped.begin()),
+                    std::make_move_iterator(stripped.end()));
+
+                // Insert the new Resource into the correct place.
+                entry->findOrCreateValue(newConfig, {})->value =
+                    std::move(newStyle);
+              }
+            }
+          }
         }
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/AutoVersioner_test.cpp b/tools/aapt2/link/AutoVersioner_test.cpp
index 3a61da5..04bf9cd 100644
--- a/tools/aapt2/link/AutoVersioner_test.cpp
+++ b/tools/aapt2/link/AutoVersioner_test.cpp
@@ -21,102 +21,114 @@
 namespace aapt {
 
 TEST(AutoVersionerTest, GenerateVersionedResources) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
-    const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  const ConfigDescription sw600dpLandConfig =
+      test::parseConfigOrDie("sw600dp-land");
 
-    ResourceEntry entry("foo");
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
+  ResourceEntry entry("foo");
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(landConfig, ""));
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
 
-    EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
-    EXPECT_TRUE(shouldGenerateVersionedResource(&entry, landConfig, 17));
+  EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
+  EXPECT_TRUE(shouldGenerateVersionedResource(&entry, landConfig, 17));
 }
 
 TEST(AutoVersionerTest, GenerateVersionedResourceWhenHigherVersionExists) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription sw600dpV13Config = test::parseConfigOrDie("sw600dp-v13");
-    const ConfigDescription v21Config = test::parseConfigOrDie("v21");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription sw600dpV13Config =
+      test::parseConfigOrDie("sw600dp-v13");
+  const ConfigDescription v21Config = test::parseConfigOrDie("v21");
 
-    ResourceEntry entry("foo");
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dpV13Config, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(v21Config, ""));
+  ResourceEntry entry("foo");
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpV13Config, ""));
+  entry.values.push_back(util::make_unique<ResourceConfigValue>(v21Config, ""));
 
-    EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
-    EXPECT_FALSE(shouldGenerateVersionedResource(&entry, defaultConfig, 22));
+  EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
+  EXPECT_FALSE(shouldGenerateVersionedResource(&entry, defaultConfig, 22));
 }
 
 TEST(AutoVersionerTest, VersionStylesForTable) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("app", 0x7f)
-            .addValue("app:style/Foo", test::parseConfigOrDie("v4"), ResourceId(0x7f020000),
-                      test::StyleBuilder()
-                            .addItem("android:attr/onClick", ResourceId(0x0101026f),
-                                     util::make_unique<Id>())
-                            .addItem("android:attr/paddingStart", ResourceId(0x010103b3),
-                                     util::make_unique<Id>())
-                            .addItem("android:attr/requiresSmallestWidthDp",
-                                     ResourceId(0x01010364), util::make_unique<Id>())
-                            .addItem("android:attr/colorAccent", ResourceId(0x01010435),
-                                     util::make_unique<Id>())
-                            .build())
-            .addValue("app:style/Foo", test::parseConfigOrDie("v21"), ResourceId(0x7f020000),
-                      test::StyleBuilder()
-                            .addItem("android:attr/paddingEnd", ResourceId(0x010103b4),
-                                     util::make_unique<Id>())
-                            .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("app", 0x7f)
+          .addValue(
+              "app:style/Foo", test::parseConfigOrDie("v4"),
+              ResourceId(0x7f020000),
+              test::StyleBuilder()
+                  .addItem("android:attr/onClick", ResourceId(0x0101026f),
+                           util::make_unique<Id>())
+                  .addItem("android:attr/paddingStart", ResourceId(0x010103b3),
+                           util::make_unique<Id>())
+                  .addItem("android:attr/requiresSmallestWidthDp",
+                           ResourceId(0x01010364), util::make_unique<Id>())
+                  .addItem("android:attr/colorAccent", ResourceId(0x01010435),
+                           util::make_unique<Id>())
+                  .build())
+          .addValue(
+              "app:style/Foo", test::parseConfigOrDie("v21"),
+              ResourceId(0x7f020000),
+              test::StyleBuilder()
+                  .addItem("android:attr/paddingEnd", ResourceId(0x010103b4),
+                           util::make_unique<Id>())
+                  .build())
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("app")
-            .setPackageId(0x7f)
-            .build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+                                              .setCompilationPackage("app")
+                                              .setPackageId(0x7f)
+                                              .build();
 
-    AutoVersioner versioner;
-    ASSERT_TRUE(versioner.consume(context.get(), table.get()));
+  AutoVersioner versioner;
+  ASSERT_TRUE(versioner.consume(context.get(), table.get()));
 
-    Style* style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                                  test::parseConfigOrDie("v4"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 1u);
-    AAPT_ASSERT_TRUE(style->entries.front().key.name);
-    EXPECT_EQ(style->entries.front().key.name.value(),
-              test::parseNameOrDie("android:attr/onClick"));
+  Style* style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                                test::parseConfigOrDie("v4"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 1u);
+  AAPT_ASSERT_TRUE(style->entries.front().key.name);
+  EXPECT_EQ(style->entries.front().key.name.value(),
+            test::parseNameOrDie("android:attr/onClick"));
 
-    style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                           test::parseConfigOrDie("v13"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 2u);
-    AAPT_ASSERT_TRUE(style->entries[0].key.name);
-    EXPECT_EQ(style->entries[0].key.name.value(),
-              test::parseNameOrDie("android:attr/onClick"));
-    AAPT_ASSERT_TRUE(style->entries[1].key.name);
-    EXPECT_EQ(style->entries[1].key.name.value(),
-                  test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
+  style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                         test::parseConfigOrDie("v13"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 2u);
+  AAPT_ASSERT_TRUE(style->entries[0].key.name);
+  EXPECT_EQ(style->entries[0].key.name.value(),
+            test::parseNameOrDie("android:attr/onClick"));
+  AAPT_ASSERT_TRUE(style->entries[1].key.name);
+  EXPECT_EQ(style->entries[1].key.name.value(),
+            test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
 
-    style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                           test::parseConfigOrDie("v17"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 3u);
-    AAPT_ASSERT_TRUE(style->entries[0].key.name);
-    EXPECT_EQ(style->entries[0].key.name.value(),
-                  test::parseNameOrDie("android:attr/onClick"));
-    AAPT_ASSERT_TRUE(style->entries[1].key.name);
-    EXPECT_EQ(style->entries[1].key.name.value(),
-                  test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
-    AAPT_ASSERT_TRUE(style->entries[2].key.name);
-    EXPECT_EQ(style->entries[2].key.name.value(),
-                  test::parseNameOrDie("android:attr/paddingStart"));
+  style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                         test::parseConfigOrDie("v17"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 3u);
+  AAPT_ASSERT_TRUE(style->entries[0].key.name);
+  EXPECT_EQ(style->entries[0].key.name.value(),
+            test::parseNameOrDie("android:attr/onClick"));
+  AAPT_ASSERT_TRUE(style->entries[1].key.name);
+  EXPECT_EQ(style->entries[1].key.name.value(),
+            test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
+  AAPT_ASSERT_TRUE(style->entries[2].key.name);
+  EXPECT_EQ(style->entries[2].key.name.value(),
+            test::parseNameOrDie("android:attr/paddingStart"));
 
-    style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                           test::parseConfigOrDie("v21"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 1u);
-    AAPT_ASSERT_TRUE(style->entries.front().key.name);
-    EXPECT_EQ(style->entries.front().key.name.value(),
-              test::parseNameOrDie("android:attr/paddingEnd"));
+  style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                         test::parseConfigOrDie("v21"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 1u);
+  AAPT_ASSERT_TRUE(style->entries.front().key.name);
+  EXPECT_EQ(style->entries.front().key.name.value(),
+            test::parseNameOrDie("android:attr/paddingEnd"));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp
index b6b4b473..a42d868 100644
--- a/tools/aapt2/link/Link.cpp
+++ b/tools/aapt2/link/Link.cpp
@@ -31,9 +31,9 @@
 #include "java/ManifestClassGenerator.h"
 #include "java/ProguardRules.h"
 #include "link/Linkers.h"
+#include "link/ManifestFixer.h"
 #include "link/ProductFilter.h"
 #include "link/ReferenceLinker.h"
-#include "link/ManifestFixer.h"
 #include "link/TableMerger.h"
 #include "process/IResourceTableConsumer.h"
 #include "process/SymbolTable.h"
@@ -47,9 +47,9 @@
 #include <android-base/file.h>
 #include <google/protobuf/io/coded_stream.h>
 
+#include <sys/stat.h>
 #include <fstream>
 #include <queue>
-#include <sys/stat.h>
 #include <unordered_map>
 #include <vector>
 
@@ -58,1908 +58,2043 @@
 namespace aapt {
 
 struct LinkOptions {
-    std::string outputPath;
-    std::string manifestPath;
-    std::vector<std::string> includePaths;
-    std::vector<std::string> overlayFiles;
+  std::string outputPath;
+  std::string manifestPath;
+  std::vector<std::string> includePaths;
+  std::vector<std::string> overlayFiles;
 
-    // Java/Proguard options.
-    Maybe<std::string> generateJavaClassPath;
-    Maybe<std::string> customJavaPackage;
-    std::set<std::string> extraJavaPackages;
-    Maybe<std::string> generateProguardRulesPath;
-    Maybe<std::string> generateMainDexProguardRulesPath;
+  // Java/Proguard options.
+  Maybe<std::string> generateJavaClassPath;
+  Maybe<std::string> customJavaPackage;
+  std::set<std::string> extraJavaPackages;
+  Maybe<std::string> generateProguardRulesPath;
+  Maybe<std::string> generateMainDexProguardRulesPath;
 
-    bool noAutoVersion = false;
-    bool noVersionVectors = false;
-    bool noResourceDeduping = false;
-    bool staticLib = false;
-    bool noStaticLibPackages = false;
-    bool generateNonFinalIds = false;
-    std::vector<std::string> javadocAnnotations;
-    bool outputToDirectory = false;
-    bool noXmlNamespaces = false;
-    bool autoAddOverlay = false;
-    bool doNotCompressAnything = false;
-    std::unordered_set<std::string> extensionsToNotCompress;
-    Maybe<std::string> privateSymbols;
-    ManifestFixerOptions manifestFixerOptions;
-    std::unordered_set<std::string> products;
+  bool noAutoVersion = false;
+  bool noVersionVectors = false;
+  bool noResourceDeduping = false;
+  bool staticLib = false;
+  bool noStaticLibPackages = false;
+  bool generateNonFinalIds = false;
+  std::vector<std::string> javadocAnnotations;
+  bool outputToDirectory = false;
+  bool noXmlNamespaces = false;
+  bool autoAddOverlay = false;
+  bool doNotCompressAnything = false;
+  std::unordered_set<std::string> extensionsToNotCompress;
+  Maybe<std::string> privateSymbols;
+  ManifestFixerOptions manifestFixerOptions;
+  std::unordered_set<std::string> products;
 
-    // Split APK options.
-    TableSplitterOptions tableSplitterOptions;
-    std::vector<SplitConstraints> splitConstraints;
-    std::vector<std::string> splitPaths;
+  // Split APK options.
+  TableSplitterOptions tableSplitterOptions;
+  std::vector<SplitConstraints> splitConstraints;
+  std::vector<std::string> splitPaths;
 
-    // Stable ID options.
-    std::unordered_map<ResourceName, ResourceId> stableIdMap;
-    Maybe<std::string> resourceIdMapPath;
+  // Stable ID options.
+  std::unordered_map<ResourceName, ResourceId> stableIdMap;
+  Maybe<std::string> resourceIdMapPath;
 };
 
 class LinkContext : public IAaptContext {
-public:
-    LinkContext() : mNameMangler({}) {
-    }
+ public:
+  LinkContext() : mNameMangler({}) {}
 
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-        return &mNameMangler;
-    }
+  NameMangler* getNameMangler() override { return &mNameMangler; }
 
-    void setNameManglerPolicy(const NameManglerPolicy& policy) {
-        mNameMangler = NameMangler(policy);
-    }
+  void setNameManglerPolicy(const NameManglerPolicy& policy) {
+    mNameMangler = NameMangler(policy);
+  }
 
-    const std::string& getCompilationPackage() override {
-        return mCompilationPackage;
-    }
+  const std::string& getCompilationPackage() override {
+    return mCompilationPackage;
+  }
 
-    void setCompilationPackage(const StringPiece& packageName) {
-        mCompilationPackage = packageName.toString();
-    }
+  void setCompilationPackage(const StringPiece& packageName) {
+    mCompilationPackage = packageName.toString();
+  }
 
-    uint8_t getPackageId() override {
-        return mPackageId;
-    }
+  uint8_t getPackageId() override { return mPackageId; }
 
-    void setPackageId(uint8_t id) {
-        mPackageId = id;
-    }
+  void setPackageId(uint8_t id) { mPackageId = id; }
 
-    SymbolTable* getExternalSymbols() override {
-        return &mSymbols;
-    }
+  SymbolTable* getExternalSymbols() override { return &mSymbols; }
 
-    bool verbose() override {
-        return mVerbose;
-    }
+  bool verbose() override { return mVerbose; }
 
-    void setVerbose(bool val) {
-        mVerbose = val;
-    }
+  void setVerbose(bool val) { mVerbose = val; }
 
-    int getMinSdkVersion() override {
-        return mMinSdkVersion;
-    }
+  int getMinSdkVersion() override { return mMinSdkVersion; }
 
-    void setMinSdkVersion(int minSdk) {
-        mMinSdkVersion = minSdk;
-    }
+  void setMinSdkVersion(int minSdk) { mMinSdkVersion = minSdk; }
 
-private:
-    StdErrDiagnostics mDiagnostics;
-    NameMangler mNameMangler;
-    std::string mCompilationPackage;
-    uint8_t mPackageId = 0x0;
-    SymbolTable mSymbols;
-    bool mVerbose = false;
-    int mMinSdkVersion = 0;
+ private:
+  StdErrDiagnostics mDiagnostics;
+  NameMangler mNameMangler;
+  std::string mCompilationPackage;
+  uint8_t mPackageId = 0x0;
+  SymbolTable mSymbols;
+  bool mVerbose = false;
+  int mMinSdkVersion = 0;
 };
 
 static bool copyFileToArchive(io::IFile* file, const std::string& outPath,
-                              uint32_t compressionFlags,
-                              IArchiveWriter* writer, IAaptContext* context) {
-    std::unique_ptr<io::IData> data = file->openAsData();
-    if (!data) {
-        context->getDiagnostics()->error(DiagMessage(file->getSource())
-                                         << "failed to open file");
-        return false;
-    }
-
-    const uint8_t* buffer = reinterpret_cast<const uint8_t*>(data->data());
-    const size_t bufferSize = data->size();
-
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage() << "writing " << outPath << " to archive");
-    }
-
-    if (writer->startEntry(outPath, compressionFlags)) {
-        if (writer->writeEntry(buffer, bufferSize)) {
-            if (writer->finishEntry()) {
-                return true;
-            }
-        }
-    }
-
-    context->getDiagnostics()->error(DiagMessage() << "failed to write file " << outPath);
+                              uint32_t compressionFlags, IArchiveWriter* writer,
+                              IAaptContext* context) {
+  std::unique_ptr<io::IData> data = file->openAsData();
+  if (!data) {
+    context->getDiagnostics()->error(DiagMessage(file->getSource())
+                                     << "failed to open file");
     return false;
+  }
+
+  const uint8_t* buffer = reinterpret_cast<const uint8_t*>(data->data());
+  const size_t bufferSize = data->size();
+
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage() << "writing " << outPath
+                                                  << " to archive");
+  }
+
+  if (writer->startEntry(outPath, compressionFlags)) {
+    if (writer->writeEntry(buffer, bufferSize)) {
+      if (writer->finishEntry()) {
+        return true;
+      }
+    }
+  }
+
+  context->getDiagnostics()->error(DiagMessage() << "failed to write file "
+                                                 << outPath);
+  return false;
 }
 
-static bool flattenXml(xml::XmlResource* xmlRes, const StringPiece& path, Maybe<size_t> maxSdkLevel,
-                       bool keepRawValues, IArchiveWriter* writer, IAaptContext* context) {
-    BigBuffer buffer(1024);
-    XmlFlattenerOptions options = {};
-    options.keepRawValues = keepRawValues;
-    options.maxSdkLevel = maxSdkLevel;
-    XmlFlattener flattener(&buffer, options);
-    if (!flattener.consume(context, xmlRes)) {
-        return false;
-    }
-
-    if (context->verbose()) {
-        DiagMessage msg;
-        msg << "writing " << path << " to archive";
-        if (maxSdkLevel) {
-            msg << " maxSdkLevel=" << maxSdkLevel.value() << " keepRawValues=" << keepRawValues;
-        }
-        context->getDiagnostics()->note(msg);
-    }
-
-    if (writer->startEntry(path, ArchiveEntry::kCompress)) {
-        if (writer->writeEntry(buffer)) {
-            if (writer->finishEntry()) {
-                return true;
-            }
-        }
-    }
-    context->getDiagnostics()->error(DiagMessage() << "failed to write " << path << " to archive");
+static bool flattenXml(xml::XmlResource* xmlRes, const StringPiece& path,
+                       Maybe<size_t> maxSdkLevel, bool keepRawValues,
+                       IArchiveWriter* writer, IAaptContext* context) {
+  BigBuffer buffer(1024);
+  XmlFlattenerOptions options = {};
+  options.keepRawValues = keepRawValues;
+  options.maxSdkLevel = maxSdkLevel;
+  XmlFlattener flattener(&buffer, options);
+  if (!flattener.consume(context, xmlRes)) {
     return false;
+  }
+
+  if (context->verbose()) {
+    DiagMessage msg;
+    msg << "writing " << path << " to archive";
+    if (maxSdkLevel) {
+      msg << " maxSdkLevel=" << maxSdkLevel.value()
+          << " keepRawValues=" << keepRawValues;
+    }
+    context->getDiagnostics()->note(msg);
+  }
+
+  if (writer->startEntry(path, ArchiveEntry::kCompress)) {
+    if (writer->writeEntry(buffer)) {
+      if (writer->finishEntry()) {
+        return true;
+      }
+    }
+  }
+  context->getDiagnostics()->error(DiagMessage() << "failed to write " << path
+                                                 << " to archive");
+  return false;
 }
 
 static std::unique_ptr<ResourceTable> loadTableFromPb(const Source& source,
-                                                      const void* data, size_t len,
+                                                      const void* data,
+                                                      size_t len,
                                                       IDiagnostics* diag) {
-    pb::ResourceTable pbTable;
-    if (!pbTable.ParseFromArray(data, len)) {
-        diag->error(DiagMessage(source) << "invalid compiled table");
-        return {};
-    }
+  pb::ResourceTable pbTable;
+  if (!pbTable.ParseFromArray(data, len)) {
+    diag->error(DiagMessage(source) << "invalid compiled table");
+    return {};
+  }
 
-    std::unique_ptr<ResourceTable> table = deserializeTableFromPb(pbTable, source, diag);
-    if (!table) {
-        return {};
-    }
-    return table;
+  std::unique_ptr<ResourceTable> table =
+      deserializeTableFromPb(pbTable, source, diag);
+  if (!table) {
+    return {};
+  }
+  return table;
 }
 
 /**
  * Inflates an XML file from the source path.
  */
-static std::unique_ptr<xml::XmlResource> loadXml(const std::string& path, IDiagnostics* diag) {
-    std::ifstream fin(path, std::ifstream::binary);
-    if (!fin) {
-        diag->error(DiagMessage(path) << strerror(errno));
-        return {};
-    }
-    return xml::inflate(&fin, diag, Source(path));
+static std::unique_ptr<xml::XmlResource> loadXml(const std::string& path,
+                                                 IDiagnostics* diag) {
+  std::ifstream fin(path, std::ifstream::binary);
+  if (!fin) {
+    diag->error(DiagMessage(path) << strerror(errno));
+    return {};
+  }
+  return xml::inflate(&fin, diag, Source(path));
 }
 
 struct ResourceFileFlattenerOptions {
-    bool noAutoVersion = false;
-    bool noVersionVectors = false;
-    bool noXmlNamespaces = false;
-    bool keepRawValues = false;
-    bool doNotCompressAnything = false;
-    bool updateProguardSpec = false;
-    std::unordered_set<std::string> extensionsToNotCompress;
+  bool noAutoVersion = false;
+  bool noVersionVectors = false;
+  bool noXmlNamespaces = false;
+  bool keepRawValues = false;
+  bool doNotCompressAnything = false;
+  bool updateProguardSpec = false;
+  std::unordered_set<std::string> extensionsToNotCompress;
 };
 
 class ResourceFileFlattener {
-public:
-    ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
-                          IAaptContext* context, proguard::KeepSet* keepSet) :
-            mOptions(options), mContext(context), mKeepSet(keepSet) {
-    }
+ public:
+  ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
+                        IAaptContext* context, proguard::KeepSet* keepSet)
+      : mOptions(options), mContext(context), mKeepSet(keepSet) {}
 
-    bool flatten(ResourceTable* table, IArchiveWriter* archiveWriter);
+  bool flatten(ResourceTable* table, IArchiveWriter* archiveWriter);
 
-private:
-    struct FileOperation {
-        ConfigDescription config;
+ private:
+  struct FileOperation {
+    ConfigDescription config;
 
-        // The entry this file came from.
-        const ResourceEntry* entry;
+    // The entry this file came from.
+    const ResourceEntry* entry;
 
-        // The file to copy as-is.
-        io::IFile* fileToCopy;
+    // The file to copy as-is.
+    io::IFile* fileToCopy;
 
-        // The XML to process and flatten.
-        std::unique_ptr<xml::XmlResource> xmlToFlatten;
+    // The XML to process and flatten.
+    std::unique_ptr<xml::XmlResource> xmlToFlatten;
 
-        // The destination to write this file to.
-        std::string dstPath;
-        bool skipVersion = false;
-    };
+    // The destination to write this file to.
+    std::string dstPath;
+    bool skipVersion = false;
+  };
 
-    uint32_t getCompressionFlags(const StringPiece& str);
+  uint32_t getCompressionFlags(const StringPiece& str);
 
-    bool linkAndVersionXmlFile(ResourceTable* table, FileOperation* fileOp,
-                               std::queue<FileOperation>* outFileOpQueue);
+  bool linkAndVersionXmlFile(ResourceTable* table, FileOperation* fileOp,
+                             std::queue<FileOperation>* outFileOpQueue);
 
-    ResourceFileFlattenerOptions mOptions;
-    IAaptContext* mContext;
-    proguard::KeepSet* mKeepSet;
+  ResourceFileFlattenerOptions mOptions;
+  IAaptContext* mContext;
+  proguard::KeepSet* mKeepSet;
 };
 
 uint32_t ResourceFileFlattener::getCompressionFlags(const StringPiece& str) {
-    if (mOptions.doNotCompressAnything) {
-        return 0;
-    }
+  if (mOptions.doNotCompressAnything) {
+    return 0;
+  }
 
-    for (const std::string& extension : mOptions.extensionsToNotCompress) {
-        if (util::stringEndsWith(str, extension)) {
-            return 0;
-        }
+  for (const std::string& extension : mOptions.extensionsToNotCompress) {
+    if (util::stringEndsWith(str, extension)) {
+      return 0;
     }
-    return ArchiveEntry::kCompress;
+  }
+  return ArchiveEntry::kCompress;
 }
 
-bool ResourceFileFlattener::linkAndVersionXmlFile(ResourceTable* table,
-                                                  FileOperation* fileOp,
-                                                  std::queue<FileOperation>* outFileOpQueue) {
-    xml::XmlResource* doc = fileOp->xmlToFlatten.get();
-    const Source& src = doc->file.source;
+bool ResourceFileFlattener::linkAndVersionXmlFile(
+    ResourceTable* table, FileOperation* fileOp,
+    std::queue<FileOperation>* outFileOpQueue) {
+  xml::XmlResource* doc = fileOp->xmlToFlatten.get();
+  const Source& src = doc->file.source;
 
-    if (mContext->verbose()) {
-        mContext->getDiagnostics()->note(DiagMessage() << "linking " << src.path);
+  if (mContext->verbose()) {
+    mContext->getDiagnostics()->note(DiagMessage() << "linking " << src.path);
+  }
+
+  XmlReferenceLinker xmlLinker;
+  if (!xmlLinker.consume(mContext, doc)) {
+    return false;
+  }
+
+  if (mOptions.updateProguardSpec &&
+      !proguard::collectProguardRules(src, doc, mKeepSet)) {
+    return false;
+  }
+
+  if (mOptions.noXmlNamespaces) {
+    XmlNamespaceRemover namespaceRemover;
+    if (!namespaceRemover.consume(mContext, doc)) {
+      return false;
     }
+  }
 
-    XmlReferenceLinker xmlLinker;
-    if (!xmlLinker.consume(mContext, doc)) {
-        return false;
-    }
-
-    if (mOptions.updateProguardSpec && !proguard::collectProguardRules(src, doc, mKeepSet)) {
-        return false;
-    }
-
-    if (mOptions.noXmlNamespaces) {
-        XmlNamespaceRemover namespaceRemover;
-        if (!namespaceRemover.consume(mContext, doc)) {
-            return false;
+  if (!mOptions.noAutoVersion) {
+    if (mOptions.noVersionVectors) {
+      // Skip this if it is a vector or animated-vector.
+      xml::Element* el = xml::findRootElement(doc);
+      if (el && el->namespaceUri.empty()) {
+        if (el->name == "vector" || el->name == "animated-vector") {
+          // We are NOT going to version this file.
+          fileOp->skipVersion = true;
+          return true;
         }
+      }
     }
 
-    if (!mOptions.noAutoVersion) {
-        if (mOptions.noVersionVectors) {
-            // Skip this if it is a vector or animated-vector.
-            xml::Element* el = xml::findRootElement(doc);
-            if (el && el->namespaceUri.empty()) {
-                if (el->name == "vector" || el->name == "animated-vector") {
-                    // We are NOT going to version this file.
-                    fileOp->skipVersion = true;
-                    return true;
-                }
-            }
+    const ConfigDescription& config = fileOp->config;
+
+    // Find the first SDK level used that is higher than this defined config and
+    // not superseded by a lower or equal SDK level resource.
+    const int minSdkVersion = mContext->getMinSdkVersion();
+    for (int sdkLevel : xmlLinker.getSdkLevels()) {
+      if (sdkLevel > minSdkVersion && sdkLevel > config.sdkVersion) {
+        if (!shouldGenerateVersionedResource(fileOp->entry, config, sdkLevel)) {
+          // If we shouldn't generate a versioned resource, stop checking.
+          break;
         }
 
-        const ConfigDescription& config = fileOp->config;
+        ResourceFile versionedFileDesc = doc->file;
+        versionedFileDesc.config.sdkVersion = (uint16_t)sdkLevel;
 
-        // Find the first SDK level used that is higher than this defined config and
-        // not superseded by a lower or equal SDK level resource.
-        const int minSdkVersion = mContext->getMinSdkVersion();
-        for (int sdkLevel : xmlLinker.getSdkLevels()) {
-            if (sdkLevel > minSdkVersion && sdkLevel > config.sdkVersion) {
-                if (!shouldGenerateVersionedResource(fileOp->entry, config, sdkLevel)) {
-                    // If we shouldn't generate a versioned resource, stop checking.
-                    break;
-                }
+        FileOperation newFileOp;
+        newFileOp.xmlToFlatten = util::make_unique<xml::XmlResource>(
+            versionedFileDesc, doc->root->clone());
+        newFileOp.config = versionedFileDesc.config;
+        newFileOp.entry = fileOp->entry;
+        newFileOp.dstPath = ResourceUtils::buildResourceFileName(
+            versionedFileDesc, mContext->getNameMangler());
 
-                ResourceFile versionedFileDesc = doc->file;
-                versionedFileDesc.config.sdkVersion = (uint16_t) sdkLevel;
-
-                FileOperation newFileOp;
-                newFileOp.xmlToFlatten = util::make_unique<xml::XmlResource>(
-                        versionedFileDesc, doc->root->clone());
-                newFileOp.config = versionedFileDesc.config;
-                newFileOp.entry = fileOp->entry;
-                newFileOp.dstPath = ResourceUtils::buildResourceFileName(
-                        versionedFileDesc, mContext->getNameMangler());
-
-                if (mContext->verbose()) {
-                    mContext->getDiagnostics()->note(DiagMessage(versionedFileDesc.source)
-                                                     << "auto-versioning resource from config '"
-                                                     << config
-                                                     << "' -> '"
-                                                     << versionedFileDesc.config << "'");
-                }
-
-                bool added = table->addFileReferenceAllowMangled(versionedFileDesc.name,
-                                                                 versionedFileDesc.config,
-                                                                 versionedFileDesc.source,
-                                                                 newFileOp.dstPath,
-                                                                 nullptr,
-                                                                 mContext->getDiagnostics());
-                if (!added) {
-                    return false;
-                }
-
-                outFileOpQueue->push(std::move(newFileOp));
-                break;
-            }
+        if (mContext->verbose()) {
+          mContext->getDiagnostics()->note(
+              DiagMessage(versionedFileDesc.source)
+              << "auto-versioning resource from config '" << config << "' -> '"
+              << versionedFileDesc.config << "'");
         }
+
+        bool added = table->addFileReferenceAllowMangled(
+            versionedFileDesc.name, versionedFileDesc.config,
+            versionedFileDesc.source, newFileOp.dstPath, nullptr,
+            mContext->getDiagnostics());
+        if (!added) {
+          return false;
+        }
+
+        outFileOpQueue->push(std::move(newFileOp));
+        break;
+      }
     }
-    return true;
+  }
+  return true;
 }
 
 /**
- * Do not insert or remove any resources while executing in this function. It will
+ * Do not insert or remove any resources while executing in this function. It
+ * will
  * corrupt the iteration order.
  */
-bool ResourceFileFlattener::flatten(ResourceTable* table, IArchiveWriter* archiveWriter) {
-    bool error = false;
-    std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> configSortedFiles;
+bool ResourceFileFlattener::flatten(ResourceTable* table,
+                                    IArchiveWriter* archiveWriter) {
+  bool error = false;
+  std::map<std::pair<ConfigDescription, StringPiece>, FileOperation>
+      configSortedFiles;
 
-    for (auto& pkg : table->packages) {
-        for (auto& type : pkg->types) {
-            // Sort by config and name, so that we get better locality in the zip file.
-            configSortedFiles.clear();
-            std::queue<FileOperation> fileOperations;
+  for (auto& pkg : table->packages) {
+    for (auto& type : pkg->types) {
+      // Sort by config and name, so that we get better locality in the zip
+      // file.
+      configSortedFiles.clear();
+      std::queue<FileOperation> fileOperations;
 
-            // Populate the queue with all files in the ResourceTable.
-            for (auto& entry : type->entries) {
-                for (auto& configValue : entry->values) {
-                    FileReference* fileRef = valueCast<FileReference>(configValue->value.get());
-                    if (!fileRef) {
-                        continue;
-                    }
-
-                    io::IFile* file = fileRef->file;
-                    if (!file) {
-                        mContext->getDiagnostics()->error(DiagMessage(fileRef->getSource())
-                                                          << "file not found");
-                        return false;
-                    }
-
-                    FileOperation fileOp;
-                    fileOp.entry = entry.get();
-                    fileOp.dstPath = *fileRef->path;
-                    fileOp.config = configValue->config;
-
-                    const StringPiece srcPath = file->getSource().path;
-                    if (type->type != ResourceType::kRaw &&
-                            (util::stringEndsWith(srcPath, ".xml.flat") ||
-                            util::stringEndsWith(srcPath, ".xml"))) {
-                        std::unique_ptr<io::IData> data = file->openAsData();
-                        if (!data) {
-                            mContext->getDiagnostics()->error(DiagMessage(file->getSource())
-                                                              << "failed to open file");
-                            return false;
-                        }
-
-                        fileOp.xmlToFlatten = xml::inflate(data->data(), data->size(),
-                                                           mContext->getDiagnostics(),
-                                                           file->getSource());
-
-                        if (!fileOp.xmlToFlatten) {
-                            return false;
-                        }
-
-                        fileOp.xmlToFlatten->file.config = configValue->config;
-                        fileOp.xmlToFlatten->file.source = fileRef->getSource();
-                        fileOp.xmlToFlatten->file.name =
-                                ResourceName(pkg->name, type->type, entry->name);
-
-                        // Enqueue the XML files to be processed.
-                        fileOperations.push(std::move(fileOp));
-                    } else {
-                        fileOp.fileToCopy = file;
-
-                        // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
-                        // we end up copying the string in the std::make_pair() method, then
-                        // creating a StringPiece from the copy, which would cause us to end up
-                        // referencing garbage in the map.
-                        const StringPiece entryName(entry->name);
-                        configSortedFiles[std::make_pair(configValue->config, entryName)] =
-                                std::move(fileOp);
-                    }
-                }
-            }
-
-            // Now process the XML queue
-            for (; !fileOperations.empty(); fileOperations.pop()) {
-                FileOperation& fileOp = fileOperations.front();
-
-                if (!linkAndVersionXmlFile(table, &fileOp, &fileOperations)) {
-                    error = true;
-                    continue;
-                }
-
-                // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
-                // we end up copying the string in the std::make_pair() method, then creating
-                // a StringPiece from the copy, which would cause us to end up referencing
-                // garbage in the map.
-                const StringPiece entryName(fileOp.entry->name);
-                configSortedFiles[std::make_pair(fileOp.config, entryName)] = std::move(fileOp);
-            }
-
-            if (error) {
-                return false;
-            }
-
-            // Now flatten the sorted values.
-            for (auto& mapEntry : configSortedFiles) {
-                const ConfigDescription& config = mapEntry.first.first;
-                const FileOperation& fileOp = mapEntry.second;
-
-                if (fileOp.xmlToFlatten) {
-                    Maybe<size_t> maxSdkLevel;
-                    if (!mOptions.noAutoVersion && !fileOp.skipVersion) {
-                        maxSdkLevel = std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
-                                                       mContext->getMinSdkVersion());
-                    }
-
-                    bool result = flattenXml(fileOp.xmlToFlatten.get(), fileOp.dstPath, maxSdkLevel,
-                                             mOptions.keepRawValues,
-                                             archiveWriter, mContext);
-                    if (!result) {
-                        error = true;
-                    }
-                } else {
-                    bool result = copyFileToArchive(fileOp.fileToCopy, fileOp.dstPath,
-                                                    getCompressionFlags(fileOp.dstPath),
-                                                    archiveWriter, mContext);
-                    if (!result) {
-                        error = true;
-                    }
-                }
-            }
-        }
-    }
-    return !error;
-}
-
-static bool writeStableIdMapToPath(IDiagnostics* diag,
-                                   const std::unordered_map<ResourceName, ResourceId>& idMap,
-                                   const std::string& idMapPath) {
-    std::ofstream fout(idMapPath, std::ofstream::binary);
-    if (!fout) {
-        diag->error(DiagMessage(idMapPath) << strerror(errno));
-        return false;
-    }
-
-    for (const auto& entry : idMap) {
-        const ResourceName& name = entry.first;
-        const ResourceId& id = entry.second;
-        fout << name << " = " << id << "\n";
-    }
-
-    if (!fout) {
-        diag->error(DiagMessage(idMapPath) << "failed writing to file: " << strerror(errno));
-        return false;
-    }
-
-    return true;
-}
-
-static bool loadStableIdMap(IDiagnostics* diag, const std::string& path,
-                            std::unordered_map<ResourceName, ResourceId>* outIdMap) {
-    std::string content;
-    if (!android::base::ReadFileToString(path, &content)) {
-        diag->error(DiagMessage(path) << "failed reading stable ID file");
-        return false;
-    }
-
-    outIdMap->clear();
-    size_t lineNo = 0;
-    for (StringPiece line : util::tokenize(content, '\n')) {
-        lineNo++;
-        line = util::trimWhitespace(line);
-        if (line.empty()) {
+      // Populate the queue with all files in the ResourceTable.
+      for (auto& entry : type->entries) {
+        for (auto& configValue : entry->values) {
+          FileReference* fileRef =
+              valueCast<FileReference>(configValue->value.get());
+          if (!fileRef) {
             continue;
-        }
+          }
 
-        auto iter = std::find(line.begin(), line.end(), '=');
-        if (iter == line.end()) {
-            diag->error(DiagMessage(Source(path, lineNo)) << "missing '='");
+          io::IFile* file = fileRef->file;
+          if (!file) {
+            mContext->getDiagnostics()->error(DiagMessage(fileRef->getSource())
+                                              << "file not found");
             return false;
+          }
+
+          FileOperation fileOp;
+          fileOp.entry = entry.get();
+          fileOp.dstPath = *fileRef->path;
+          fileOp.config = configValue->config;
+
+          const StringPiece srcPath = file->getSource().path;
+          if (type->type != ResourceType::kRaw &&
+              (util::stringEndsWith(srcPath, ".xml.flat") ||
+               util::stringEndsWith(srcPath, ".xml"))) {
+            std::unique_ptr<io::IData> data = file->openAsData();
+            if (!data) {
+              mContext->getDiagnostics()->error(DiagMessage(file->getSource())
+                                                << "failed to open file");
+              return false;
+            }
+
+            fileOp.xmlToFlatten =
+                xml::inflate(data->data(), data->size(),
+                             mContext->getDiagnostics(), file->getSource());
+
+            if (!fileOp.xmlToFlatten) {
+              return false;
+            }
+
+            fileOp.xmlToFlatten->file.config = configValue->config;
+            fileOp.xmlToFlatten->file.source = fileRef->getSource();
+            fileOp.xmlToFlatten->file.name =
+                ResourceName(pkg->name, type->type, entry->name);
+
+            // Enqueue the XML files to be processed.
+            fileOperations.push(std::move(fileOp));
+          } else {
+            fileOp.fileToCopy = file;
+
+            // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
+            // else
+            // we end up copying the string in the std::make_pair() method, then
+            // creating a StringPiece from the copy, which would cause us to end
+            // up
+            // referencing garbage in the map.
+            const StringPiece entryName(entry->name);
+            configSortedFiles[std::make_pair(configValue->config, entryName)] =
+                std::move(fileOp);
+          }
+        }
+      }
+
+      // Now process the XML queue
+      for (; !fileOperations.empty(); fileOperations.pop()) {
+        FileOperation& fileOp = fileOperations.front();
+
+        if (!linkAndVersionXmlFile(table, &fileOp, &fileOperations)) {
+          error = true;
+          continue;
         }
 
-        ResourceNameRef name;
-        StringPiece resNameStr = util::trimWhitespace(
-                line.substr(0, std::distance(line.begin(), iter)));
-        if (!ResourceUtils::parseResourceName(resNameStr, &name)) {
-            diag->error(DiagMessage(Source(path, lineNo))
-                        << "invalid resource name '" << resNameStr << "'");
-            return false;
+        // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
+        // we end up copying the string in the std::make_pair() method, then
+        // creating
+        // a StringPiece from the copy, which would cause us to end up
+        // referencing
+        // garbage in the map.
+        const StringPiece entryName(fileOp.entry->name);
+        configSortedFiles[std::make_pair(fileOp.config, entryName)] =
+            std::move(fileOp);
+      }
+
+      if (error) {
+        return false;
+      }
+
+      // Now flatten the sorted values.
+      for (auto& mapEntry : configSortedFiles) {
+        const ConfigDescription& config = mapEntry.first.first;
+        const FileOperation& fileOp = mapEntry.second;
+
+        if (fileOp.xmlToFlatten) {
+          Maybe<size_t> maxSdkLevel;
+          if (!mOptions.noAutoVersion && !fileOp.skipVersion) {
+            maxSdkLevel =
+                std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
+                                 mContext->getMinSdkVersion());
+          }
+
+          bool result =
+              flattenXml(fileOp.xmlToFlatten.get(), fileOp.dstPath, maxSdkLevel,
+                         mOptions.keepRawValues, archiveWriter, mContext);
+          if (!result) {
+            error = true;
+          }
+        } else {
+          bool result = copyFileToArchive(fileOp.fileToCopy, fileOp.dstPath,
+                                          getCompressionFlags(fileOp.dstPath),
+                                          archiveWriter, mContext);
+          if (!result) {
+            error = true;
+          }
         }
-
-        const size_t resIdStartIdx = std::distance(line.begin(), iter) + 1;
-        const size_t resIdStrLen = line.size() - resIdStartIdx;
-        StringPiece resIdStr = util::trimWhitespace(line.substr(resIdStartIdx, resIdStrLen));
-
-        Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(resIdStr);
-        if (!maybeId) {
-            diag->error(DiagMessage(Source(path, lineNo)) << "invalid resource ID '"
-                        << resIdStr << "'");
-            return false;
-        }
-
-        (*outIdMap)[name.toResourceName()] = maybeId.value();
+      }
     }
-    return true;
+  }
+  return !error;
+}
+
+static bool writeStableIdMapToPath(
+    IDiagnostics* diag,
+    const std::unordered_map<ResourceName, ResourceId>& idMap,
+    const std::string& idMapPath) {
+  std::ofstream fout(idMapPath, std::ofstream::binary);
+  if (!fout) {
+    diag->error(DiagMessage(idMapPath) << strerror(errno));
+    return false;
+  }
+
+  for (const auto& entry : idMap) {
+    const ResourceName& name = entry.first;
+    const ResourceId& id = entry.second;
+    fout << name << " = " << id << "\n";
+  }
+
+  if (!fout) {
+    diag->error(DiagMessage(idMapPath) << "failed writing to file: "
+                                       << strerror(errno));
+    return false;
+  }
+
+  return true;
+}
+
+static bool loadStableIdMap(
+    IDiagnostics* diag, const std::string& path,
+    std::unordered_map<ResourceName, ResourceId>* outIdMap) {
+  std::string content;
+  if (!android::base::ReadFileToString(path, &content)) {
+    diag->error(DiagMessage(path) << "failed reading stable ID file");
+    return false;
+  }
+
+  outIdMap->clear();
+  size_t lineNo = 0;
+  for (StringPiece line : util::tokenize(content, '\n')) {
+    lineNo++;
+    line = util::trimWhitespace(line);
+    if (line.empty()) {
+      continue;
+    }
+
+    auto iter = std::find(line.begin(), line.end(), '=');
+    if (iter == line.end()) {
+      diag->error(DiagMessage(Source(path, lineNo)) << "missing '='");
+      return false;
+    }
+
+    ResourceNameRef name;
+    StringPiece resNameStr =
+        util::trimWhitespace(line.substr(0, std::distance(line.begin(), iter)));
+    if (!ResourceUtils::parseResourceName(resNameStr, &name)) {
+      diag->error(DiagMessage(Source(path, lineNo)) << "invalid resource name '"
+                                                    << resNameStr << "'");
+      return false;
+    }
+
+    const size_t resIdStartIdx = std::distance(line.begin(), iter) + 1;
+    const size_t resIdStrLen = line.size() - resIdStartIdx;
+    StringPiece resIdStr =
+        util::trimWhitespace(line.substr(resIdStartIdx, resIdStrLen));
+
+    Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(resIdStr);
+    if (!maybeId) {
+      diag->error(DiagMessage(Source(path, lineNo)) << "invalid resource ID '"
+                                                    << resIdStr << "'");
+      return false;
+    }
+
+    (*outIdMap)[name.toResourceName()] = maybeId.value();
+  }
+  return true;
 }
 
 static bool parseSplitParameter(const StringPiece& arg, IDiagnostics* diag,
-                                std::string* outPath, SplitConstraints* outSplit) {
-    std::vector<std::string> parts = util::split(arg, ':');
-    if (parts.size() != 2) {
-        diag->error(DiagMessage() << "invalid split parameter '" << arg << "'");
-        diag->note(DiagMessage() << "should be --split path/to/output.apk:<config>[,<config>...]");
-        return false;
+                                std::string* outPath,
+                                SplitConstraints* outSplit) {
+  std::vector<std::string> parts = util::split(arg, ':');
+  if (parts.size() != 2) {
+    diag->error(DiagMessage() << "invalid split parameter '" << arg << "'");
+    diag->note(
+        DiagMessage()
+        << "should be --split path/to/output.apk:<config>[,<config>...]");
+    return false;
+  }
+  *outPath = parts[0];
+  std::vector<ConfigDescription> configs;
+  for (const StringPiece& configStr : util::tokenize(parts[1], ',')) {
+    configs.push_back({});
+    if (!ConfigDescription::parse(configStr, &configs.back())) {
+      diag->error(DiagMessage() << "invalid config '" << configStr
+                                << "' in split parameter '" << arg << "'");
+      return false;
     }
-    *outPath = parts[0];
-    std::vector<ConfigDescription> configs;
-    for (const StringPiece& configStr : util::tokenize(parts[1], ',')) {
-        configs.push_back({});
-        if (!ConfigDescription::parse(configStr, &configs.back())) {
-            diag->error(DiagMessage() << "invalid config '" << configStr
-                        << "' in split parameter '" << arg << "'");
-            return false;
-        }
-    }
-    outSplit->configs.insert(configs.begin(), configs.end());
-    return true;
+  }
+  outSplit->configs.insert(configs.begin(), configs.end());
+  return true;
 }
 
 class LinkCommand {
-public:
-    LinkCommand(LinkContext* context, const LinkOptions& options) :
-            mOptions(options), mContext(context), mFinalTable(),
-            mFileCollection(util::make_unique<io::FileCollection>()) {
-    }
+ public:
+  LinkCommand(LinkContext* context, const LinkOptions& options)
+      : mOptions(options),
+        mContext(context),
+        mFinalTable(),
+        mFileCollection(util::make_unique<io::FileCollection>()) {}
 
-    /**
-     * Creates a SymbolTable that loads symbols from the various APKs and caches the
-     * results for faster lookup.
-     */
-    bool loadSymbolsFromIncludePaths() {
-        std::unique_ptr<AssetManagerSymbolSource> assetSource =
-                util::make_unique<AssetManagerSymbolSource>();
-        for (const std::string& path : mOptions.includePaths) {
-            if (mContext->verbose()) {
-                mContext->getDiagnostics()->note(DiagMessage(path) << "loading include path");
-            }
+  /**
+   * Creates a SymbolTable that loads symbols from the various APKs and caches
+   * the
+   * results for faster lookup.
+   */
+  bool loadSymbolsFromIncludePaths() {
+    std::unique_ptr<AssetManagerSymbolSource> assetSource =
+        util::make_unique<AssetManagerSymbolSource>();
+    for (const std::string& path : mOptions.includePaths) {
+      if (mContext->verbose()) {
+        mContext->getDiagnostics()->note(DiagMessage(path)
+                                         << "loading include path");
+      }
 
-            // First try to load the file as a static lib.
-            std::string errorStr;
-            std::unique_ptr<ResourceTable> staticInclude = loadStaticLibrary(path, &errorStr);
-            if (staticInclude) {
-                if (!mOptions.staticLib) {
-                    // Can't include static libraries when not building a static library.
-                    mContext->getDiagnostics()->error(
-                            DiagMessage(path) << "can't include static library when building app");
-                    return false;
-                }
-
-                // If we are using --no-static-lib-packages, we need to rename the package of this
-                // table to our compilation package.
-                if (mOptions.noStaticLibPackages) {
-                    if (ResourceTablePackage* pkg = staticInclude->findPackageById(0x7f)) {
-                        pkg->name = mContext->getCompilationPackage();
-                    }
-                }
-
-                mContext->getExternalSymbols()->appendSource(
-                        util::make_unique<ResourceTableSymbolSource>(staticInclude.get()));
-
-                mStaticTableIncludes.push_back(std::move(staticInclude));
-
-            } else if (!errorStr.empty()) {
-                // We had an error with reading, so fail.
-                mContext->getDiagnostics()->error(DiagMessage(path) << errorStr);
-                return false;
-            }
-
-            if (!assetSource->addAssetPath(path)) {
-                mContext->getDiagnostics()->error(
-                        DiagMessage(path) << "failed to load include path");
-                return false;
-            }
-        }
-
-        mContext->getExternalSymbols()->appendSource(std::move(assetSource));
-        return true;
-    }
-
-    Maybe<AppInfo> extractAppInfoFromManifest(xml::XmlResource* xmlRes, IDiagnostics* diag) {
-        // Make sure the first element is <manifest> with package attribute.
-        if (xml::Element* manifestEl = xml::findRootElement(xmlRes->root.get())) {
-            AppInfo appInfo;
-
-            if (!manifestEl->namespaceUri.empty() || manifestEl->name != "manifest") {
-                diag->error(DiagMessage(xmlRes->file.source) << "root tag must be <manifest>");
-                return {};
-            }
-
-            xml::Attribute* packageAttr = manifestEl->findAttribute({}, "package");
-            if (!packageAttr) {
-                diag->error(DiagMessage(xmlRes->file.source)
-                            << "<manifest> must have a 'package' attribute");
-                return {};
-            }
-
-            appInfo.package = packageAttr->value;
-
-            if (xml::Attribute* versionCodeAttr =
-                    manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode")) {
-                Maybe<uint32_t> maybeCode = ResourceUtils::parseInt(versionCodeAttr->value);
-                if (!maybeCode) {
-                    diag->error(DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
-                                << "invalid android:versionCode '"
-                                << versionCodeAttr->value << "'");
-                    return {};
-                }
-                appInfo.versionCode = maybeCode.value();
-            }
-
-            if (xml::Attribute* revisionCodeAttr =
-                    manifestEl->findAttribute(xml::kSchemaAndroid, "revisionCode")) {
-                Maybe<uint32_t> maybeCode = ResourceUtils::parseInt(revisionCodeAttr->value);
-                if (!maybeCode) {
-                    diag->error(DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
-                                << "invalid android:revisionCode '"
-                                << revisionCodeAttr->value << "'");
-                    return {};
-                }
-                appInfo.revisionCode = maybeCode.value();
-            }
-
-            if (xml::Element* usesSdkEl = manifestEl->findChild({}, "uses-sdk")) {
-                if (xml::Attribute* minSdk =
-                        usesSdkEl->findAttribute(xml::kSchemaAndroid, "minSdkVersion")) {
-                    appInfo.minSdkVersion = minSdk->value;
-                }
-            }
-
-            return appInfo;
-        }
-        return {};
-    }
-
-    /**
-     * Precondition: ResourceTable doesn't have any IDs assigned yet, nor is it linked.
-     * Postcondition: ResourceTable has only one package left. All others are stripped, or there
-     *                is an error and false is returned.
-     */
-    bool verifyNoExternalPackages() {
-        auto isExtPackageFunc = [&](const std::unique_ptr<ResourceTablePackage>& pkg) -> bool {
-            return mContext->getCompilationPackage() != pkg->name ||
-                    !pkg->id ||
-                    pkg->id.value() != mContext->getPackageId();
-        };
-
-        bool error = false;
-        for (const auto& package : mFinalTable.packages) {
-            if (isExtPackageFunc(package)) {
-                // We have a package that is not related to the one we're building!
-                for (const auto& type : package->types) {
-                    for (const auto& entry : type->entries) {
-                        ResourceNameRef resName(package->name, type->type, entry->name);
-
-                        for (const auto& configValue : entry->values) {
-                            // Special case the occurrence of an ID that is being generated for the
-                            // 'android' package. This is due to legacy reasons.
-                            if (valueCast<Id>(configValue->value.get()) &&
-                                    package->name == "android") {
-                                mContext->getDiagnostics()->warn(
-                                        DiagMessage(configValue->value->getSource())
-                                        << "generated id '" << resName
-                                        << "' for external package '" << package->name
-                                        << "'");
-                            } else {
-                                mContext->getDiagnostics()->error(
-                                        DiagMessage(configValue->value->getSource())
-                                        << "defined resource '" << resName
-                                        << "' for external package '" << package->name
-                                        << "'");
-                                error = true;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        auto newEndIter = std::remove_if(mFinalTable.packages.begin(), mFinalTable.packages.end(),
-                                         isExtPackageFunc);
-        mFinalTable.packages.erase(newEndIter, mFinalTable.packages.end());
-        return !error;
-    }
-
-    /**
-     * Returns true if no IDs have been set, false otherwise.
-     */
-    bool verifyNoIdsSet() {
-        for (const auto& package : mFinalTable.packages) {
-            for (const auto& type : package->types) {
-                if (type->id) {
-                    mContext->getDiagnostics()->error(DiagMessage() << "type " << type->type
-                                                      << " has ID " << std::hex
-                                                      << (int) type->id.value()
-                                                      << std::dec << " assigned");
-                    return false;
-                }
-
-                for (const auto& entry : type->entries) {
-                    if (entry->id) {
-                        ResourceNameRef resName(package->name, type->type, entry->name);
-                        mContext->getDiagnostics()->error(DiagMessage() << "entry " << resName
-                                                          << " has ID " << std::hex
-                                                          << (int) entry->id.value()
-                                                          << std::dec << " assigned");
-                        return false;
-                    }
-                }
-            }
-        }
-        return true;
-    }
-
-    std::unique_ptr<IArchiveWriter> makeArchiveWriter(const StringPiece& out) {
-        if (mOptions.outputToDirectory) {
-            return createDirectoryArchiveWriter(mContext->getDiagnostics(), out);
-        } else {
-            return createZipFileArchiveWriter(mContext->getDiagnostics(), out);
-        }
-    }
-
-    bool flattenTable(ResourceTable* table, IArchiveWriter* writer) {
-        BigBuffer buffer(1024);
-        TableFlattener flattener(&buffer);
-        if (!flattener.consume(mContext, table)) {
-            return false;
-        }
-
-        if (writer->startEntry("resources.arsc", ArchiveEntry::kAlign)) {
-            if (writer->writeEntry(buffer)) {
-                if (writer->finishEntry()) {
-                    return true;
-                }
-            }
-        }
-
-        mContext->getDiagnostics()->error(
-                DiagMessage() << "failed to write resources.arsc to archive");
-        return false;
-    }
-
-    bool flattenTableToPb(ResourceTable* table, IArchiveWriter* writer) {
-        // Create the file/zip entry.
-        if (!writer->startEntry("resources.arsc.flat", 0)) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed to open");
-            return false;
-        }
-
-        // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-        {
-            // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-            // interface.
-            CopyingOutputStreamAdaptor adaptor(writer);
-
-            std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(table);
-            if (!pbTable->SerializeToZeroCopyStream(&adaptor)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed to write");
-                return false;
-            }
-        }
-
-        if (!writer->finishEntry()) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed to finish entry");
-            return false;
-        }
-        return true;
-    }
-
-    bool writeJavaFile(ResourceTable* table, const StringPiece& packageNameToGenerate,
-                       const StringPiece& outPackage, const JavaClassGeneratorOptions& javaOptions) {
-        if (!mOptions.generateJavaClassPath) {
-            return true;
-        }
-
-        std::string outPath = mOptions.generateJavaClassPath.value();
-        file::appendPath(&outPath, file::packageToPath(outPackage));
-        if (!file::mkdirs(outPath)) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed to create directory '" << outPath << "'");
-            return false;
-        }
-
-        file::appendPath(&outPath, "R.java");
-
-        std::ofstream fout(outPath, std::ofstream::binary);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-
-        JavaClassGenerator generator(mContext, table, javaOptions);
-        if (!generator.generate(packageNameToGenerate, outPackage, &fout)) {
-            mContext->getDiagnostics()->error(DiagMessage(outPath) << generator.getError());
-            return false;
-        }
-
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-        }
-        return true;
-    }
-
-    bool writeManifestJavaFile(xml::XmlResource* manifestXml) {
-        if (!mOptions.generateJavaClassPath) {
-            return true;
-        }
-
-        std::unique_ptr<ClassDefinition> manifestClass = generateManifestClass(
-                mContext->getDiagnostics(), manifestXml);
-
-        if (!manifestClass) {
-            // Something bad happened, but we already logged it, so exit.
-            return false;
-        }
-
-        if (manifestClass->empty()) {
-            // Empty Manifest class, no need to generate it.
-            return true;
-        }
-
-        // Add any JavaDoc annotations to the generated class.
-        for (const std::string& annotation : mOptions.javadocAnnotations) {
-            std::string properAnnotation = "@";
-            properAnnotation += annotation;
-            manifestClass->getCommentBuilder()->appendComment(properAnnotation);
-        }
-
-        const std::string& packageUtf8 = mContext->getCompilationPackage();
-
-        std::string outPath = mOptions.generateJavaClassPath.value();
-        file::appendPath(&outPath, file::packageToPath(packageUtf8));
-
-        if (!file::mkdirs(outPath)) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed to create directory '" << outPath << "'");
-            return false;
-        }
-
-        file::appendPath(&outPath, "Manifest.java");
-
-        std::ofstream fout(outPath, std::ofstream::binary);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-
-        if (!ClassDefinition::writeJavaFile(manifestClass.get(), packageUtf8, true, &fout)) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-        return true;
-    }
-
-    bool writeProguardFile(const Maybe<std::string>& out, const proguard::KeepSet& keepSet) {
-        if (!out) {
-            return true;
-        }
-
-        const std::string& outPath = out.value();
-        std::ofstream fout(outPath, std::ofstream::binary);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed to open '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-
-        proguard::writeKeepSet(&fout, keepSet);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-        return true;
-    }
-
-    std::unique_ptr<ResourceTable> loadStaticLibrary(const std::string& input,
-                                                     std::string* outError) {
-        std::unique_ptr<io::ZipFileCollection> collection = io::ZipFileCollection::create(
-                input, outError);
-        if (!collection) {
-            return {};
-        }
-        return loadTablePbFromCollection(collection.get());
-    }
-
-    std::unique_ptr<ResourceTable> loadTablePbFromCollection(io::IFileCollection* collection) {
-        io::IFile* file = collection->findFile("resources.arsc.flat");
-        if (!file) {
-            return {};
-        }
-
-        std::unique_ptr<io::IData> data = file->openAsData();
-        return loadTableFromPb(file->getSource(), data->data(), data->size(),
-                               mContext->getDiagnostics());
-    }
-
-    bool mergeStaticLibrary(const std::string& input, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage() << "merging static library " << input);
-        }
-
-        std::string errorStr;
-        std::unique_ptr<io::ZipFileCollection> collection =
-                io::ZipFileCollection::create(input, &errorStr);
-        if (!collection) {
-            mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
-            return false;
-        }
-
-        std::unique_ptr<ResourceTable> table = loadTablePbFromCollection(collection.get());
-        if (!table) {
-            mContext->getDiagnostics()->error(DiagMessage(input) << "invalid static library");
-            return false;
-        }
-
-        ResourceTablePackage* pkg = table->findPackageById(0x7f);
-        if (!pkg) {
-            mContext->getDiagnostics()->error(DiagMessage(input)
-                                              << "static library has no package");
-            return false;
-        }
-
-        bool result;
-        if (mOptions.noStaticLibPackages) {
-            // Merge all resources as if they were in the compilation package. This is the old
-            // behaviour of aapt.
-
-            // Add the package to the set of --extra-packages so we emit an R.java for each
-            // library package.
-            if (!pkg->name.empty()) {
-                mOptions.extraJavaPackages.insert(pkg->name);
-            }
-
-            pkg->name = "";
-            if (override) {
-                result = mTableMerger->mergeOverlay(Source(input), table.get(), collection.get());
-            } else {
-                result = mTableMerger->merge(Source(input), table.get(), collection.get());
-            }
-
-        } else {
-            // This is the proper way to merge libraries, where the package name is preserved
-            // and resource names are mangled.
-            result = mTableMerger->mergeAndMangle(Source(input), pkg->name, table.get(),
-                                                  collection.get());
-        }
-
-        if (!result) {
-            return false;
-        }
-
-        // Make sure to move the collection into the set of IFileCollections.
-        mCollections.push_back(std::move(collection));
-        return true;
-    }
-
-    bool mergeResourceTable(io::IFile* file, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage() << "merging resource table "
-                                             << file->getSource());
-        }
-
-        std::unique_ptr<io::IData> data = file->openAsData();
-        if (!data) {
-            mContext->getDiagnostics()->error(DiagMessage(file->getSource())
-                                             << "failed to open file");
-            return false;
-        }
-
-        std::unique_ptr<ResourceTable> table = loadTableFromPb(file->getSource(),
-                                                               data->data(), data->size(),
-                                                               mContext->getDiagnostics());
-        if (!table) {
-            return false;
-        }
-
-        bool result = false;
-        if (override) {
-            result = mTableMerger->mergeOverlay(file->getSource(), table.get());
-        } else {
-            result = mTableMerger->merge(file->getSource(), table.get());
-        }
-        return result;
-    }
-
-    bool mergeCompiledFile(io::IFile* file, ResourceFile* fileDesc, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage()
-                                             << "merging '" << fileDesc->name
-                                             << "' from compiled file "
-                                             << file->getSource());
-        }
-
-        bool result = false;
-        if (override) {
-            result = mTableMerger->mergeFileOverlay(*fileDesc, file);
-        } else {
-            result = mTableMerger->mergeFile(*fileDesc, file);
-        }
-
-        if (!result) {
-            return false;
-        }
-
-        // Add the exports of this file to the table.
-        for (SourcedResourceName& exportedSymbol : fileDesc->exportedSymbols) {
-            if (exportedSymbol.name.package.empty()) {
-                exportedSymbol.name.package = mContext->getCompilationPackage();
-            }
-
-            ResourceNameRef resName = exportedSymbol.name;
-
-            Maybe<ResourceName> mangledName = mContext->getNameMangler()->mangleName(
-                    exportedSymbol.name);
-            if (mangledName) {
-                resName = mangledName.value();
-            }
-
-            std::unique_ptr<Id> id = util::make_unique<Id>();
-            id->setSource(fileDesc->source.withLine(exportedSymbol.line));
-            bool result = mFinalTable.addResourceAllowMangled(
-                    resName, ConfigDescription::defaultConfig(), std::string(), std::move(id),
-                    mContext->getDiagnostics());
-            if (!result) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Takes a path to load as a ZIP file and merges the files within into the master ResourceTable.
-     * If override is true, conflicting resources are allowed to override each other, in order of
-     * last seen.
-     *
-     * An io::IFileCollection is created from the ZIP file and added to the set of
-     * io::IFileCollections that are open.
-     */
-    bool mergeArchive(const std::string& input, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage() << "merging archive " << input);
-        }
-
-        std::string errorStr;
-        std::unique_ptr<io::ZipFileCollection> collection =
-                io::ZipFileCollection::create(input, &errorStr);
-        if (!collection) {
-            mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
-            return false;
-        }
-
-        bool error = false;
-        for (auto iter = collection->iterator(); iter->hasNext(); ) {
-            if (!mergeFile(iter->next(), override)) {
-                error = true;
-            }
-        }
-
-        // Make sure to move the collection into the set of IFileCollections.
-        mCollections.push_back(std::move(collection));
-        return !error;
-    }
-
-    /**
-     * Takes a path to load and merge into the master ResourceTable. If override is true,
-     * conflicting resources are allowed to override each other, in order of last seen.
-     *
-     * If the file path ends with .flata, .jar, .jack, or .zip the file is treated as ZIP archive
-     * and the files within are merged individually.
-     *
-     * Otherwise the files is processed on its own.
-     */
-    bool mergePath(const std::string& path, bool override) {
-        if (util::stringEndsWith(path, ".flata") ||
-                util::stringEndsWith(path, ".jar") ||
-                util::stringEndsWith(path, ".jack") ||
-                util::stringEndsWith(path, ".zip")) {
-            return mergeArchive(path, override);
-        } else if (util::stringEndsWith(path, ".apk")) {
-            return mergeStaticLibrary(path, override);
-        }
-
-        io::IFile* file = mFileCollection->insertFile(path);
-        return mergeFile(file, override);
-    }
-
-    /**
-     * Takes a file to load and merge into the master ResourceTable. If override is true,
-     * conflicting resources are allowed to override each other, in order of last seen.
-     *
-     * If the file ends with .arsc.flat, then it is loaded as a ResourceTable and merged into the
-     * master ResourceTable. If the file ends with .flat, then it is treated like a compiled file
-     * and the header data is read and merged into the final ResourceTable.
-     *
-     * All other file types are ignored. This is because these files could be coming from a zip,
-     * where we could have other files like classes.dex.
-     */
-    bool mergeFile(io::IFile* file, bool override) {
-        const Source& src = file->getSource();
-        if (util::stringEndsWith(src.path, ".arsc.flat")) {
-            return mergeResourceTable(file, override);
-
-        } else if (util::stringEndsWith(src.path, ".flat")){
-            // Try opening the file and looking for an Export header.
-            std::unique_ptr<io::IData> data = file->openAsData();
-            if (!data) {
-                mContext->getDiagnostics()->error(DiagMessage(src) << "failed to open");
-                return false;
-            }
-
-            CompiledFileInputStream inputStream(data->data(), data->size());
-            uint32_t numFiles = 0;
-            if (!inputStream.ReadLittleEndian32(&numFiles)) {
-                mContext->getDiagnostics()->error(DiagMessage(src) << "failed read num files");
-                return false;
-            }
-
-            for (uint32_t i = 0; i < numFiles; i++) {
-                pb::CompiledFile compiledFile;
-                if (!inputStream.ReadCompiledFile(&compiledFile)) {
-                    mContext->getDiagnostics()->error(DiagMessage(src)
-                                                      << "failed to read compiled file header");
-                    return false;
-                }
-
-                uint64_t offset, len;
-                if (!inputStream.ReadDataMetaData(&offset, &len)) {
-                    mContext->getDiagnostics()->error(DiagMessage(src)
-                                                      << "failed to read data meta data");
-                    return false;
-                }
-
-                std::unique_ptr<ResourceFile> resourceFile = deserializeCompiledFileFromPb(
-                        compiledFile, file->getSource(), mContext->getDiagnostics());
-                if (!resourceFile) {
-                    return false;
-                }
-
-                if (!mergeCompiledFile(file->createFileSegment(offset, len), resourceFile.get(),
-                                       override)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        // Ignore non .flat files. This could be classes.dex or something else that happens
-        // to be in an archive.
-        return true;
-    }
-
-    std::unique_ptr<xml::XmlResource> generateSplitManifest(const AppInfo& appInfo,
-                                                            const SplitConstraints& constraints) {
-        std::unique_ptr<xml::XmlResource> doc = util::make_unique<xml::XmlResource>();
-
-        std::unique_ptr<xml::Namespace> namespaceAndroid = util::make_unique<xml::Namespace>();
-        namespaceAndroid->namespaceUri = xml::kSchemaAndroid;
-        namespaceAndroid->namespacePrefix = "android";
-
-        std::unique_ptr<xml::Element> manifestEl = util::make_unique<xml::Element>();
-        manifestEl->name = "manifest";
-        manifestEl->attributes.push_back(
-                xml::Attribute{ "", "package", appInfo.package });
-
-        if (appInfo.versionCode) {
-            manifestEl->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid,
-                    "versionCode",
-                    std::to_string(appInfo.versionCode.value()) });
-        }
-
-        if (appInfo.revisionCode) {
-            manifestEl->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid,
-                    "revisionCode", std::to_string(appInfo.revisionCode.value()) });
-        }
-
-        std::stringstream splitName;
-        splitName << "config." << util::joiner(constraints.configs, "_");
-
-        manifestEl->attributes.push_back(
-                xml::Attribute{ "", "split", splitName.str() });
-
-        std::unique_ptr<xml::Element> applicationEl = util::make_unique<xml::Element>();
-        applicationEl->name = "application";
-        applicationEl->attributes.push_back(
-                xml::Attribute{ xml::kSchemaAndroid, "hasCode", "false" });
-
-        manifestEl->addChild(std::move(applicationEl));
-        namespaceAndroid->addChild(std::move(manifestEl));
-        doc->root = std::move(namespaceAndroid);
-        return doc;
-    }
-
-    /**
-     * Writes the AndroidManifest, ResourceTable, and all XML files referenced by the ResourceTable
-     * to the IArchiveWriter.
-     */
-    bool writeApk(IArchiveWriter* writer, proguard::KeepSet* keepSet, xml::XmlResource* manifest,
-                  ResourceTable* table) {
-        const bool keepRawValues = mOptions.staticLib;
-        bool result = flattenXml(manifest, "AndroidManifest.xml", {}, keepRawValues, writer,
-                                 mContext);
-        if (!result) {
-            return false;
-        }
-
-        ResourceFileFlattenerOptions fileFlattenerOptions;
-        fileFlattenerOptions.keepRawValues = keepRawValues;
-        fileFlattenerOptions.doNotCompressAnything = mOptions.doNotCompressAnything;
-        fileFlattenerOptions.extensionsToNotCompress = mOptions.extensionsToNotCompress;
-        fileFlattenerOptions.noAutoVersion = mOptions.noAutoVersion;
-        fileFlattenerOptions.noVersionVectors = mOptions.noVersionVectors;
-        fileFlattenerOptions.noXmlNamespaces = mOptions.noXmlNamespaces;
-        fileFlattenerOptions.updateProguardSpec =
-                static_cast<bool>(mOptions.generateProguardRulesPath);
-
-        ResourceFileFlattener fileFlattener(fileFlattenerOptions, mContext, keepSet);
-
-        if (!fileFlattener.flatten(table, writer)) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed linking file resources");
-            return false;
-        }
-
-        if (mOptions.staticLib) {
-            if (!flattenTableToPb(table, writer)) {
-                mContext->getDiagnostics()->error(DiagMessage()
-                                                  << "failed to write resources.arsc.flat");
-                return false;
-            }
-        } else {
-            if (!flattenTable(table, writer)) {
-                mContext->getDiagnostics()->error(DiagMessage()
-                                                  << "failed to write resources.arsc");
-                return false;
-            }
-        }
-        return true;
-    }
-
-    int run(const std::vector<std::string>& inputFiles) {
-        // Load the AndroidManifest.xml
-        std::unique_ptr<xml::XmlResource> manifestXml = loadXml(mOptions.manifestPath,
-                                                                mContext->getDiagnostics());
-        if (!manifestXml) {
-            return 1;
-        }
-
-        // First extract the Package name without modifying it (via --rename-manifest-package).
-        if (Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(manifestXml.get(),
-                                                                     mContext->getDiagnostics())) {
-            const AppInfo& appInfo = maybeAppInfo.value();
-            mContext->setCompilationPackage(appInfo.package);
-        }
-
-        ManifestFixer manifestFixer(mOptions.manifestFixerOptions);
-        if (!manifestFixer.consume(mContext, manifestXml.get())) {
-            return 1;
-        }
-
-        Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(manifestXml.get(),
-                                                                 mContext->getDiagnostics());
-        if (!maybeAppInfo) {
-            return 1;
-        }
-
-        const AppInfo& appInfo = maybeAppInfo.value();
-        if (appInfo.minSdkVersion) {
-            if (Maybe<int> maybeMinSdkVersion =
-                    ResourceUtils::parseSdkVersion(appInfo.minSdkVersion.value())) {
-                mContext->setMinSdkVersion(maybeMinSdkVersion.value());
-            }
-        }
-
-        mContext->setNameManglerPolicy(NameManglerPolicy{ mContext->getCompilationPackage() });
-        if (mContext->getCompilationPackage() == "android") {
-            mContext->setPackageId(0x01);
-        } else {
-            mContext->setPackageId(0x7f);
-        }
-
-        if (!loadSymbolsFromIncludePaths()) {
-            return 1;
-        }
-
-        TableMergerOptions tableMergerOptions;
-        tableMergerOptions.autoAddOverlay = mOptions.autoAddOverlay;
-        mTableMerger = util::make_unique<TableMerger>(mContext, &mFinalTable, tableMergerOptions);
-
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(
-                    DiagMessage() << "linking package '" << mContext->getCompilationPackage()
-                                  << "' with package ID " << std::hex
-                                  << (int) mContext->getPackageId());
-        }
-
-
-        for (const std::string& input : inputFiles) {
-            if (!mergePath(input, false)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed parsing input");
-                return 1;
-            }
-        }
-
-        for (const std::string& input : mOptions.overlayFiles) {
-            if (!mergePath(input, true)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed parsing overlays");
-                return 1;
-            }
-        }
-
-        if (!verifyNoExternalPackages()) {
-            return 1;
-        }
-
+      // First try to load the file as a static lib.
+      std::string errorStr;
+      std::unique_ptr<ResourceTable> staticInclude =
+          loadStaticLibrary(path, &errorStr);
+      if (staticInclude) {
         if (!mOptions.staticLib) {
-            PrivateAttributeMover mover;
-            if (!mover.consume(mContext, &mFinalTable)) {
+          // Can't include static libraries when not building a static library.
+          mContext->getDiagnostics()->error(
+              DiagMessage(path)
+              << "can't include static library when building app");
+          return false;
+        }
+
+        // If we are using --no-static-lib-packages, we need to rename the
+        // package of this
+        // table to our compilation package.
+        if (mOptions.noStaticLibPackages) {
+          if (ResourceTablePackage* pkg =
+                  staticInclude->findPackageById(0x7f)) {
+            pkg->name = mContext->getCompilationPackage();
+          }
+        }
+
+        mContext->getExternalSymbols()->appendSource(
+            util::make_unique<ResourceTableSymbolSource>(staticInclude.get()));
+
+        mStaticTableIncludes.push_back(std::move(staticInclude));
+
+      } else if (!errorStr.empty()) {
+        // We had an error with reading, so fail.
+        mContext->getDiagnostics()->error(DiagMessage(path) << errorStr);
+        return false;
+      }
+
+      if (!assetSource->addAssetPath(path)) {
+        mContext->getDiagnostics()->error(DiagMessage(path)
+                                          << "failed to load include path");
+        return false;
+      }
+    }
+
+    mContext->getExternalSymbols()->appendSource(std::move(assetSource));
+    return true;
+  }
+
+  Maybe<AppInfo> extractAppInfoFromManifest(xml::XmlResource* xmlRes,
+                                            IDiagnostics* diag) {
+    // Make sure the first element is <manifest> with package attribute.
+    if (xml::Element* manifestEl = xml::findRootElement(xmlRes->root.get())) {
+      AppInfo appInfo;
+
+      if (!manifestEl->namespaceUri.empty() || manifestEl->name != "manifest") {
+        diag->error(DiagMessage(xmlRes->file.source)
+                    << "root tag must be <manifest>");
+        return {};
+      }
+
+      xml::Attribute* packageAttr = manifestEl->findAttribute({}, "package");
+      if (!packageAttr) {
+        diag->error(DiagMessage(xmlRes->file.source)
+                    << "<manifest> must have a 'package' attribute");
+        return {};
+      }
+
+      appInfo.package = packageAttr->value;
+
+      if (xml::Attribute* versionCodeAttr =
+              manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode")) {
+        Maybe<uint32_t> maybeCode =
+            ResourceUtils::parseInt(versionCodeAttr->value);
+        if (!maybeCode) {
+          diag->error(
+              DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
+              << "invalid android:versionCode '" << versionCodeAttr->value
+              << "'");
+          return {};
+        }
+        appInfo.versionCode = maybeCode.value();
+      }
+
+      if (xml::Attribute* revisionCodeAttr =
+              manifestEl->findAttribute(xml::kSchemaAndroid, "revisionCode")) {
+        Maybe<uint32_t> maybeCode =
+            ResourceUtils::parseInt(revisionCodeAttr->value);
+        if (!maybeCode) {
+          diag->error(
+              DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
+              << "invalid android:revisionCode '" << revisionCodeAttr->value
+              << "'");
+          return {};
+        }
+        appInfo.revisionCode = maybeCode.value();
+      }
+
+      if (xml::Element* usesSdkEl = manifestEl->findChild({}, "uses-sdk")) {
+        if (xml::Attribute* minSdk = usesSdkEl->findAttribute(
+                xml::kSchemaAndroid, "minSdkVersion")) {
+          appInfo.minSdkVersion = minSdk->value;
+        }
+      }
+
+      return appInfo;
+    }
+    return {};
+  }
+
+  /**
+   * Precondition: ResourceTable doesn't have any IDs assigned yet, nor is it
+   * linked.
+   * Postcondition: ResourceTable has only one package left. All others are
+   * stripped, or there
+   *                is an error and false is returned.
+   */
+  bool verifyNoExternalPackages() {
+    auto isExtPackageFunc =
+        [&](const std::unique_ptr<ResourceTablePackage>& pkg) -> bool {
+      return mContext->getCompilationPackage() != pkg->name || !pkg->id ||
+             pkg->id.value() != mContext->getPackageId();
+    };
+
+    bool error = false;
+    for (const auto& package : mFinalTable.packages) {
+      if (isExtPackageFunc(package)) {
+        // We have a package that is not related to the one we're building!
+        for (const auto& type : package->types) {
+          for (const auto& entry : type->entries) {
+            ResourceNameRef resName(package->name, type->type, entry->name);
+
+            for (const auto& configValue : entry->values) {
+              // Special case the occurrence of an ID that is being generated
+              // for the
+              // 'android' package. This is due to legacy reasons.
+              if (valueCast<Id>(configValue->value.get()) &&
+                  package->name == "android") {
+                mContext->getDiagnostics()->warn(
+                    DiagMessage(configValue->value->getSource())
+                    << "generated id '" << resName << "' for external package '"
+                    << package->name << "'");
+              } else {
                 mContext->getDiagnostics()->error(
-                        DiagMessage() << "failed moving private attributes");
-                return 1;
-            }
-
-            // Assign IDs if we are building a regular app.
-            IdAssigner idAssigner(&mOptions.stableIdMap);
-            if (!idAssigner.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed assigning IDs");
-                return 1;
-            }
-
-            // Now grab each ID and emit it as a file.
-            if (mOptions.resourceIdMapPath) {
-                for (auto& package : mFinalTable.packages) {
-                    for (auto& type : package->types) {
-                        for (auto& entry : type->entries) {
-                            ResourceName name(package->name, type->type, entry->name);
-                            // The IDs are guaranteed to exist.
-                            mOptions.stableIdMap[std::move(name)] = ResourceId(package->id.value(),
-                                                                               type->id.value(),
-                                                                               entry->id.value());
-                        }
-                    }
-                }
-
-                if (!writeStableIdMapToPath(mContext->getDiagnostics(),
-                                            mOptions.stableIdMap,
-                                            mOptions.resourceIdMapPath.value())) {
-                    return 1;
-                }
-            }
-        } else {
-            // Static libs are merged with other apps, and ID collisions are bad, so verify that
-            // no IDs have been set.
-            if (!verifyNoIdsSet()) {
-                return 1;
-            }
-        }
-
-        // Add the names to mangle based on our source merge earlier.
-        mContext->setNameManglerPolicy(NameManglerPolicy{
-                mContext->getCompilationPackage(), mTableMerger->getMergedPackages() });
-
-        // Add our table to the symbol table.
-        mContext->getExternalSymbols()->prependSource(
-                        util::make_unique<ResourceTableSymbolSource>(&mFinalTable));
-
-        ReferenceLinker linker;
-        if (!linker.consume(mContext, &mFinalTable)) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed linking references");
-            return 1;
-        }
-
-        if (mOptions.staticLib) {
-            if (!mOptions.products.empty()) {
-                mContext->getDiagnostics()->warn(
-                        DiagMessage() << "can't select products when building static library");
-            }
-        } else {
-            ProductFilter productFilter(mOptions.products);
-            if (!productFilter.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed stripping products");
-                return 1;
-            }
-        }
-
-        if (!mOptions.noAutoVersion) {
-            AutoVersioner versioner;
-            if (!versioner.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed versioning styles");
-                return 1;
-            }
-        }
-
-        if (!mOptions.staticLib && mContext->getMinSdkVersion() > 0) {
-            if (mContext->verbose()) {
-                mContext->getDiagnostics()->note(
-                        DiagMessage() << "collapsing resource versions for minimum SDK "
-                        << mContext->getMinSdkVersion());
-            }
-
-            VersionCollapser collapser;
-            if (!collapser.consume(mContext, &mFinalTable)) {
-                return 1;
-            }
-        }
-
-        if (!mOptions.noResourceDeduping) {
-            ResourceDeduper deduper;
-            if (!deduper.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed deduping resources");
-                return 1;
-            }
-        }
-
-        proguard::KeepSet proguardKeepSet;
-        proguard::KeepSet proguardMainDexKeepSet;
-
-        if (mOptions.staticLib) {
-            if (mOptions.tableSplitterOptions.configFilter != nullptr ||
-                    mOptions.tableSplitterOptions.preferredDensity) {
-                mContext->getDiagnostics()->warn(
-                        DiagMessage() << "can't strip resources when building static library");
-            }
-        } else {
-            // Adjust the SplitConstraints so that their SDK version is stripped if it is less
-            // than or equal to the minSdk. Otherwise the resources that have had their SDK version
-            // stripped due to minSdk won't ever match.
-            std::vector<SplitConstraints> adjustedConstraintsList;
-            adjustedConstraintsList.reserve(mOptions.splitConstraints.size());
-            for (const SplitConstraints& constraints : mOptions.splitConstraints) {
-                SplitConstraints adjustedConstraints;
-                for (const ConfigDescription& config : constraints.configs) {
-                    if (config.sdkVersion <= mContext->getMinSdkVersion()) {
-                        adjustedConstraints.configs.insert(config.copyWithoutSdkVersion());
-                    } else {
-                        adjustedConstraints.configs.insert(config);
-                    }
-                }
-                adjustedConstraintsList.push_back(std::move(adjustedConstraints));
-            }
-
-            TableSplitter tableSplitter(adjustedConstraintsList, mOptions.tableSplitterOptions);
-            if (!tableSplitter.verifySplitConstraints(mContext)) {
-                return 1;
-            }
-            tableSplitter.splitTable(&mFinalTable);
-
-            // Now we need to write out the Split APKs.
-            auto pathIter = mOptions.splitPaths.begin();
-            auto splitConstraintsIter = adjustedConstraintsList.begin();
-            for (std::unique_ptr<ResourceTable>& splitTable : tableSplitter.getSplits()) {
-                if (mContext->verbose()) {
-                    mContext->getDiagnostics()->note(
-                            DiagMessage(*pathIter) << "generating split with configurations '"
-                            << util::joiner(splitConstraintsIter->configs, ", ") << "'");
-                }
-
-                std::unique_ptr<IArchiveWriter> archiveWriter = makeArchiveWriter(*pathIter);
-                if (!archiveWriter) {
-                    mContext->getDiagnostics()->error(DiagMessage() << "failed to create archive");
-                    return 1;
-                }
-
-                // Generate an AndroidManifest.xml for each split.
-                std::unique_ptr<xml::XmlResource> splitManifest =
-                        generateSplitManifest(appInfo, *splitConstraintsIter);
-
-                XmlReferenceLinker linker;
-                if (!linker.consume(mContext, splitManifest.get())) {
-                    mContext->getDiagnostics()->error(
-                            DiagMessage() << "failed to create Split AndroidManifest.xml");
-                    return 1;
-                }
-
-                if (!writeApk(archiveWriter.get(), &proguardKeepSet, splitManifest.get(),
-                              splitTable.get())) {
-                    return 1;
-                }
-
-                ++pathIter;
-                ++splitConstraintsIter;
-            }
-        }
-
-        // Start writing the base APK.
-        std::unique_ptr<IArchiveWriter> archiveWriter = makeArchiveWriter(mOptions.outputPath);
-        if (!archiveWriter) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed to create archive");
-            return 1;
-        }
-
-        bool error = false;
-        {
-            // AndroidManifest.xml has no resource name, but the CallSite is built from the name
-            // (aka, which package the AndroidManifest.xml is coming from).
-            // So we give it a package name so it can see local resources.
-            manifestXml->file.name.package = mContext->getCompilationPackage();
-
-            XmlReferenceLinker manifestLinker;
-            if (manifestLinker.consume(mContext, manifestXml.get())) {
-                if (mOptions.generateProguardRulesPath &&
-                        !proguard::collectProguardRulesForManifest(Source(mOptions.manifestPath),
-                                                                   manifestXml.get(),
-                                                                   &proguardKeepSet)) {
-                    error = true;
-                }
-
-                if (mOptions.generateMainDexProguardRulesPath &&
-                        !proguard::collectProguardRulesForManifest(Source(mOptions.manifestPath),
-                                                                   manifestXml.get(),
-                                                                   &proguardMainDexKeepSet,
-                                                                   true)) {
-                    error = true;
-                }
-
-                if (mOptions.generateJavaClassPath) {
-                    if (!writeManifestJavaFile(manifestXml.get())) {
-                        error = true;
-                    }
-                }
-
-                if (mOptions.noXmlNamespaces) {
-                    // PackageParser will fail if URIs are removed from AndroidManifest.xml.
-                    XmlNamespaceRemover namespaceRemover(true /* keepUris */);
-                    if (!namespaceRemover.consume(mContext, manifestXml.get())) {
-                        error = true;
-                    }
-                }
-            } else {
+                    DiagMessage(configValue->value->getSource())
+                    << "defined resource '" << resName
+                    << "' for external package '" << package->name << "'");
                 error = true;
+              }
             }
+          }
+        }
+      }
+    }
+
+    auto newEndIter =
+        std::remove_if(mFinalTable.packages.begin(), mFinalTable.packages.end(),
+                       isExtPackageFunc);
+    mFinalTable.packages.erase(newEndIter, mFinalTable.packages.end());
+    return !error;
+  }
+
+  /**
+   * Returns true if no IDs have been set, false otherwise.
+   */
+  bool verifyNoIdsSet() {
+    for (const auto& package : mFinalTable.packages) {
+      for (const auto& type : package->types) {
+        if (type->id) {
+          mContext->getDiagnostics()->error(
+              DiagMessage() << "type " << type->type << " has ID " << std::hex
+                            << (int)type->id.value() << std::dec
+                            << " assigned");
+          return false;
         }
 
-        if (error) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed processing manifest");
-            return 1;
+        for (const auto& entry : type->entries) {
+          if (entry->id) {
+            ResourceNameRef resName(package->name, type->type, entry->name);
+            mContext->getDiagnostics()->error(
+                DiagMessage() << "entry " << resName << " has ID " << std::hex
+                              << (int)entry->id.value() << std::dec
+                              << " assigned");
+            return false;
+          }
+        }
+      }
+    }
+    return true;
+  }
+
+  std::unique_ptr<IArchiveWriter> makeArchiveWriter(const StringPiece& out) {
+    if (mOptions.outputToDirectory) {
+      return createDirectoryArchiveWriter(mContext->getDiagnostics(), out);
+    } else {
+      return createZipFileArchiveWriter(mContext->getDiagnostics(), out);
+    }
+  }
+
+  bool flattenTable(ResourceTable* table, IArchiveWriter* writer) {
+    BigBuffer buffer(1024);
+    TableFlattener flattener(&buffer);
+    if (!flattener.consume(mContext, table)) {
+      return false;
+    }
+
+    if (writer->startEntry("resources.arsc", ArchiveEntry::kAlign)) {
+      if (writer->writeEntry(buffer)) {
+        if (writer->finishEntry()) {
+          return true;
+        }
+      }
+    }
+
+    mContext->getDiagnostics()->error(
+        DiagMessage() << "failed to write resources.arsc to archive");
+    return false;
+  }
+
+  bool flattenTableToPb(ResourceTable* table, IArchiveWriter* writer) {
+    // Create the file/zip entry.
+    if (!writer->startEntry("resources.arsc.flat", 0)) {
+      mContext->getDiagnostics()->error(DiagMessage() << "failed to open");
+      return false;
+    }
+
+    // Make sure CopyingOutputStreamAdaptor is deleted before we call
+    // writer->finishEntry().
+    {
+      // Wrap our IArchiveWriter with an adaptor that implements the
+      // ZeroCopyOutputStream
+      // interface.
+      CopyingOutputStreamAdaptor adaptor(writer);
+
+      std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(table);
+      if (!pbTable->SerializeToZeroCopyStream(&adaptor)) {
+        mContext->getDiagnostics()->error(DiagMessage() << "failed to write");
+        return false;
+      }
+    }
+
+    if (!writer->finishEntry()) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed to finish entry");
+      return false;
+    }
+    return true;
+  }
+
+  bool writeJavaFile(ResourceTable* table,
+                     const StringPiece& packageNameToGenerate,
+                     const StringPiece& outPackage,
+                     const JavaClassGeneratorOptions& javaOptions) {
+    if (!mOptions.generateJavaClassPath) {
+      return true;
+    }
+
+    std::string outPath = mOptions.generateJavaClassPath.value();
+    file::appendPath(&outPath, file::packageToPath(outPackage));
+    if (!file::mkdirs(outPath)) {
+      mContext->getDiagnostics()->error(
+          DiagMessage() << "failed to create directory '" << outPath << "'");
+      return false;
+    }
+
+    file::appendPath(&outPath, "R.java");
+
+    std::ofstream fout(outPath, std::ofstream::binary);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+
+    JavaClassGenerator generator(mContext, table, javaOptions);
+    if (!generator.generate(packageNameToGenerate, outPackage, &fout)) {
+      mContext->getDiagnostics()->error(DiagMessage(outPath)
+                                        << generator.getError());
+      return false;
+    }
+
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+    }
+    return true;
+  }
+
+  bool writeManifestJavaFile(xml::XmlResource* manifestXml) {
+    if (!mOptions.generateJavaClassPath) {
+      return true;
+    }
+
+    std::unique_ptr<ClassDefinition> manifestClass =
+        generateManifestClass(mContext->getDiagnostics(), manifestXml);
+
+    if (!manifestClass) {
+      // Something bad happened, but we already logged it, so exit.
+      return false;
+    }
+
+    if (manifestClass->empty()) {
+      // Empty Manifest class, no need to generate it.
+      return true;
+    }
+
+    // Add any JavaDoc annotations to the generated class.
+    for (const std::string& annotation : mOptions.javadocAnnotations) {
+      std::string properAnnotation = "@";
+      properAnnotation += annotation;
+      manifestClass->getCommentBuilder()->appendComment(properAnnotation);
+    }
+
+    const std::string& packageUtf8 = mContext->getCompilationPackage();
+
+    std::string outPath = mOptions.generateJavaClassPath.value();
+    file::appendPath(&outPath, file::packageToPath(packageUtf8));
+
+    if (!file::mkdirs(outPath)) {
+      mContext->getDiagnostics()->error(
+          DiagMessage() << "failed to create directory '" << outPath << "'");
+      return false;
+    }
+
+    file::appendPath(&outPath, "Manifest.java");
+
+    std::ofstream fout(outPath, std::ofstream::binary);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+
+    if (!ClassDefinition::writeJavaFile(manifestClass.get(), packageUtf8, true,
+                                        &fout)) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+    return true;
+  }
+
+  bool writeProguardFile(const Maybe<std::string>& out,
+                         const proguard::KeepSet& keepSet) {
+    if (!out) {
+      return true;
+    }
+
+    const std::string& outPath = out.value();
+    std::ofstream fout(outPath, std::ofstream::binary);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed to open '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+
+    proguard::writeKeepSet(&fout, keepSet);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+    return true;
+  }
+
+  std::unique_ptr<ResourceTable> loadStaticLibrary(const std::string& input,
+                                                   std::string* outError) {
+    std::unique_ptr<io::ZipFileCollection> collection =
+        io::ZipFileCollection::create(input, outError);
+    if (!collection) {
+      return {};
+    }
+    return loadTablePbFromCollection(collection.get());
+  }
+
+  std::unique_ptr<ResourceTable> loadTablePbFromCollection(
+      io::IFileCollection* collection) {
+    io::IFile* file = collection->findFile("resources.arsc.flat");
+    if (!file) {
+      return {};
+    }
+
+    std::unique_ptr<io::IData> data = file->openAsData();
+    return loadTableFromPb(file->getSource(), data->data(), data->size(),
+                           mContext->getDiagnostics());
+  }
+
+  bool mergeStaticLibrary(const std::string& input, bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(DiagMessage()
+                                       << "merging static library " << input);
+    }
+
+    std::string errorStr;
+    std::unique_ptr<io::ZipFileCollection> collection =
+        io::ZipFileCollection::create(input, &errorStr);
+    if (!collection) {
+      mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
+      return false;
+    }
+
+    std::unique_ptr<ResourceTable> table =
+        loadTablePbFromCollection(collection.get());
+    if (!table) {
+      mContext->getDiagnostics()->error(DiagMessage(input)
+                                        << "invalid static library");
+      return false;
+    }
+
+    ResourceTablePackage* pkg = table->findPackageById(0x7f);
+    if (!pkg) {
+      mContext->getDiagnostics()->error(DiagMessage(input)
+                                        << "static library has no package");
+      return false;
+    }
+
+    bool result;
+    if (mOptions.noStaticLibPackages) {
+      // Merge all resources as if they were in the compilation package. This is
+      // the old
+      // behaviour of aapt.
+
+      // Add the package to the set of --extra-packages so we emit an R.java for
+      // each
+      // library package.
+      if (!pkg->name.empty()) {
+        mOptions.extraJavaPackages.insert(pkg->name);
+      }
+
+      pkg->name = "";
+      if (override) {
+        result = mTableMerger->mergeOverlay(Source(input), table.get(),
+                                            collection.get());
+      } else {
+        result =
+            mTableMerger->merge(Source(input), table.get(), collection.get());
+      }
+
+    } else {
+      // This is the proper way to merge libraries, where the package name is
+      // preserved
+      // and resource names are mangled.
+      result = mTableMerger->mergeAndMangle(Source(input), pkg->name,
+                                            table.get(), collection.get());
+    }
+
+    if (!result) {
+      return false;
+    }
+
+    // Make sure to move the collection into the set of IFileCollections.
+    mCollections.push_back(std::move(collection));
+    return true;
+  }
+
+  bool mergeResourceTable(io::IFile* file, bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(
+          DiagMessage() << "merging resource table " << file->getSource());
+    }
+
+    std::unique_ptr<io::IData> data = file->openAsData();
+    if (!data) {
+      mContext->getDiagnostics()->error(DiagMessage(file->getSource())
+                                        << "failed to open file");
+      return false;
+    }
+
+    std::unique_ptr<ResourceTable> table =
+        loadTableFromPb(file->getSource(), data->data(), data->size(),
+                        mContext->getDiagnostics());
+    if (!table) {
+      return false;
+    }
+
+    bool result = false;
+    if (override) {
+      result = mTableMerger->mergeOverlay(file->getSource(), table.get());
+    } else {
+      result = mTableMerger->merge(file->getSource(), table.get());
+    }
+    return result;
+  }
+
+  bool mergeCompiledFile(io::IFile* file, ResourceFile* fileDesc,
+                         bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(
+          DiagMessage() << "merging '" << fileDesc->name
+                        << "' from compiled file " << file->getSource());
+    }
+
+    bool result = false;
+    if (override) {
+      result = mTableMerger->mergeFileOverlay(*fileDesc, file);
+    } else {
+      result = mTableMerger->mergeFile(*fileDesc, file);
+    }
+
+    if (!result) {
+      return false;
+    }
+
+    // Add the exports of this file to the table.
+    for (SourcedResourceName& exportedSymbol : fileDesc->exportedSymbols) {
+      if (exportedSymbol.name.package.empty()) {
+        exportedSymbol.name.package = mContext->getCompilationPackage();
+      }
+
+      ResourceNameRef resName = exportedSymbol.name;
+
+      Maybe<ResourceName> mangledName =
+          mContext->getNameMangler()->mangleName(exportedSymbol.name);
+      if (mangledName) {
+        resName = mangledName.value();
+      }
+
+      std::unique_ptr<Id> id = util::make_unique<Id>();
+      id->setSource(fileDesc->source.withLine(exportedSymbol.line));
+      bool result = mFinalTable.addResourceAllowMangled(
+          resName, ConfigDescription::defaultConfig(), std::string(),
+          std::move(id), mContext->getDiagnostics());
+      if (!result) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Takes a path to load as a ZIP file and merges the files within into the
+   * master ResourceTable.
+   * If override is true, conflicting resources are allowed to override each
+   * other, in order of
+   * last seen.
+   *
+   * An io::IFileCollection is created from the ZIP file and added to the set of
+   * io::IFileCollections that are open.
+   */
+  bool mergeArchive(const std::string& input, bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(DiagMessage() << "merging archive "
+                                                     << input);
+    }
+
+    std::string errorStr;
+    std::unique_ptr<io::ZipFileCollection> collection =
+        io::ZipFileCollection::create(input, &errorStr);
+    if (!collection) {
+      mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
+      return false;
+    }
+
+    bool error = false;
+    for (auto iter = collection->iterator(); iter->hasNext();) {
+      if (!mergeFile(iter->next(), override)) {
+        error = true;
+      }
+    }
+
+    // Make sure to move the collection into the set of IFileCollections.
+    mCollections.push_back(std::move(collection));
+    return !error;
+  }
+
+  /**
+   * Takes a path to load and merge into the master ResourceTable. If override
+   * is true,
+   * conflicting resources are allowed to override each other, in order of last
+   * seen.
+   *
+   * If the file path ends with .flata, .jar, .jack, or .zip the file is treated
+   * as ZIP archive
+   * and the files within are merged individually.
+   *
+   * Otherwise the files is processed on its own.
+   */
+  bool mergePath(const std::string& path, bool override) {
+    if (util::stringEndsWith(path, ".flata") ||
+        util::stringEndsWith(path, ".jar") ||
+        util::stringEndsWith(path, ".jack") ||
+        util::stringEndsWith(path, ".zip")) {
+      return mergeArchive(path, override);
+    } else if (util::stringEndsWith(path, ".apk")) {
+      return mergeStaticLibrary(path, override);
+    }
+
+    io::IFile* file = mFileCollection->insertFile(path);
+    return mergeFile(file, override);
+  }
+
+  /**
+   * Takes a file to load and merge into the master ResourceTable. If override
+   * is true,
+   * conflicting resources are allowed to override each other, in order of last
+   * seen.
+   *
+   * If the file ends with .arsc.flat, then it is loaded as a ResourceTable and
+   * merged into the
+   * master ResourceTable. If the file ends with .flat, then it is treated like
+   * a compiled file
+   * and the header data is read and merged into the final ResourceTable.
+   *
+   * All other file types are ignored. This is because these files could be
+   * coming from a zip,
+   * where we could have other files like classes.dex.
+   */
+  bool mergeFile(io::IFile* file, bool override) {
+    const Source& src = file->getSource();
+    if (util::stringEndsWith(src.path, ".arsc.flat")) {
+      return mergeResourceTable(file, override);
+
+    } else if (util::stringEndsWith(src.path, ".flat")) {
+      // Try opening the file and looking for an Export header.
+      std::unique_ptr<io::IData> data = file->openAsData();
+      if (!data) {
+        mContext->getDiagnostics()->error(DiagMessage(src) << "failed to open");
+        return false;
+      }
+
+      CompiledFileInputStream inputStream(data->data(), data->size());
+      uint32_t numFiles = 0;
+      if (!inputStream.ReadLittleEndian32(&numFiles)) {
+        mContext->getDiagnostics()->error(DiagMessage(src)
+                                          << "failed read num files");
+        return false;
+      }
+
+      for (uint32_t i = 0; i < numFiles; i++) {
+        pb::CompiledFile compiledFile;
+        if (!inputStream.ReadCompiledFile(&compiledFile)) {
+          mContext->getDiagnostics()->error(
+              DiagMessage(src) << "failed to read compiled file header");
+          return false;
         }
 
-        if (!writeApk(archiveWriter.get(), &proguardKeepSet, manifestXml.get(), &mFinalTable)) {
-            return 1;
+        uint64_t offset, len;
+        if (!inputStream.ReadDataMetaData(&offset, &len)) {
+          mContext->getDiagnostics()->error(DiagMessage(src)
+                                            << "failed to read data meta data");
+          return false;
+        }
+
+        std::unique_ptr<ResourceFile> resourceFile =
+            deserializeCompiledFileFromPb(compiledFile, file->getSource(),
+                                          mContext->getDiagnostics());
+        if (!resourceFile) {
+          return false;
+        }
+
+        if (!mergeCompiledFile(file->createFileSegment(offset, len),
+                               resourceFile.get(), override)) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    // Ignore non .flat files. This could be classes.dex or something else that
+    // happens
+    // to be in an archive.
+    return true;
+  }
+
+  std::unique_ptr<xml::XmlResource> generateSplitManifest(
+      const AppInfo& appInfo, const SplitConstraints& constraints) {
+    std::unique_ptr<xml::XmlResource> doc =
+        util::make_unique<xml::XmlResource>();
+
+    std::unique_ptr<xml::Namespace> namespaceAndroid =
+        util::make_unique<xml::Namespace>();
+    namespaceAndroid->namespaceUri = xml::kSchemaAndroid;
+    namespaceAndroid->namespacePrefix = "android";
+
+    std::unique_ptr<xml::Element> manifestEl =
+        util::make_unique<xml::Element>();
+    manifestEl->name = "manifest";
+    manifestEl->attributes.push_back(
+        xml::Attribute{"", "package", appInfo.package});
+
+    if (appInfo.versionCode) {
+      manifestEl->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "versionCode",
+                         std::to_string(appInfo.versionCode.value())});
+    }
+
+    if (appInfo.revisionCode) {
+      manifestEl->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "revisionCode",
+                         std::to_string(appInfo.revisionCode.value())});
+    }
+
+    std::stringstream splitName;
+    splitName << "config." << util::joiner(constraints.configs, "_");
+
+    manifestEl->attributes.push_back(
+        xml::Attribute{"", "split", splitName.str()});
+
+    std::unique_ptr<xml::Element> applicationEl =
+        util::make_unique<xml::Element>();
+    applicationEl->name = "application";
+    applicationEl->attributes.push_back(
+        xml::Attribute{xml::kSchemaAndroid, "hasCode", "false"});
+
+    manifestEl->addChild(std::move(applicationEl));
+    namespaceAndroid->addChild(std::move(manifestEl));
+    doc->root = std::move(namespaceAndroid);
+    return doc;
+  }
+
+  /**
+   * Writes the AndroidManifest, ResourceTable, and all XML files referenced by
+   * the ResourceTable
+   * to the IArchiveWriter.
+   */
+  bool writeApk(IArchiveWriter* writer, proguard::KeepSet* keepSet,
+                xml::XmlResource* manifest, ResourceTable* table) {
+    const bool keepRawValues = mOptions.staticLib;
+    bool result = flattenXml(manifest, "AndroidManifest.xml", {}, keepRawValues,
+                             writer, mContext);
+    if (!result) {
+      return false;
+    }
+
+    ResourceFileFlattenerOptions fileFlattenerOptions;
+    fileFlattenerOptions.keepRawValues = keepRawValues;
+    fileFlattenerOptions.doNotCompressAnything = mOptions.doNotCompressAnything;
+    fileFlattenerOptions.extensionsToNotCompress =
+        mOptions.extensionsToNotCompress;
+    fileFlattenerOptions.noAutoVersion = mOptions.noAutoVersion;
+    fileFlattenerOptions.noVersionVectors = mOptions.noVersionVectors;
+    fileFlattenerOptions.noXmlNamespaces = mOptions.noXmlNamespaces;
+    fileFlattenerOptions.updateProguardSpec =
+        static_cast<bool>(mOptions.generateProguardRulesPath);
+
+    ResourceFileFlattener fileFlattener(fileFlattenerOptions, mContext,
+                                        keepSet);
+
+    if (!fileFlattener.flatten(table, writer)) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed linking file resources");
+      return false;
+    }
+
+    if (mOptions.staticLib) {
+      if (!flattenTableToPb(table, writer)) {
+        mContext->getDiagnostics()->error(
+            DiagMessage() << "failed to write resources.arsc.flat");
+        return false;
+      }
+    } else {
+      if (!flattenTable(table, writer)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed to write resources.arsc");
+        return false;
+      }
+    }
+    return true;
+  }
+
+  int run(const std::vector<std::string>& inputFiles) {
+    // Load the AndroidManifest.xml
+    std::unique_ptr<xml::XmlResource> manifestXml =
+        loadXml(mOptions.manifestPath, mContext->getDiagnostics());
+    if (!manifestXml) {
+      return 1;
+    }
+
+    // First extract the Package name without modifying it (via
+    // --rename-manifest-package).
+    if (Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(
+            manifestXml.get(), mContext->getDiagnostics())) {
+      const AppInfo& appInfo = maybeAppInfo.value();
+      mContext->setCompilationPackage(appInfo.package);
+    }
+
+    ManifestFixer manifestFixer(mOptions.manifestFixerOptions);
+    if (!manifestFixer.consume(mContext, manifestXml.get())) {
+      return 1;
+    }
+
+    Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(
+        manifestXml.get(), mContext->getDiagnostics());
+    if (!maybeAppInfo) {
+      return 1;
+    }
+
+    const AppInfo& appInfo = maybeAppInfo.value();
+    if (appInfo.minSdkVersion) {
+      if (Maybe<int> maybeMinSdkVersion =
+              ResourceUtils::parseSdkVersion(appInfo.minSdkVersion.value())) {
+        mContext->setMinSdkVersion(maybeMinSdkVersion.value());
+      }
+    }
+
+    mContext->setNameManglerPolicy(
+        NameManglerPolicy{mContext->getCompilationPackage()});
+    if (mContext->getCompilationPackage() == "android") {
+      mContext->setPackageId(0x01);
+    } else {
+      mContext->setPackageId(0x7f);
+    }
+
+    if (!loadSymbolsFromIncludePaths()) {
+      return 1;
+    }
+
+    TableMergerOptions tableMergerOptions;
+    tableMergerOptions.autoAddOverlay = mOptions.autoAddOverlay;
+    mTableMerger = util::make_unique<TableMerger>(mContext, &mFinalTable,
+                                                  tableMergerOptions);
+
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(DiagMessage()
+                                       << "linking package '"
+                                       << mContext->getCompilationPackage()
+                                       << "' with package ID " << std::hex
+                                       << (int)mContext->getPackageId());
+    }
+
+    for (const std::string& input : inputFiles) {
+      if (!mergePath(input, false)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed parsing input");
+        return 1;
+      }
+    }
+
+    for (const std::string& input : mOptions.overlayFiles) {
+      if (!mergePath(input, true)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed parsing overlays");
+        return 1;
+      }
+    }
+
+    if (!verifyNoExternalPackages()) {
+      return 1;
+    }
+
+    if (!mOptions.staticLib) {
+      PrivateAttributeMover mover;
+      if (!mover.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(
+            DiagMessage() << "failed moving private attributes");
+        return 1;
+      }
+
+      // Assign IDs if we are building a regular app.
+      IdAssigner idAssigner(&mOptions.stableIdMap);
+      if (!idAssigner.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed assigning IDs");
+        return 1;
+      }
+
+      // Now grab each ID and emit it as a file.
+      if (mOptions.resourceIdMapPath) {
+        for (auto& package : mFinalTable.packages) {
+          for (auto& type : package->types) {
+            for (auto& entry : type->entries) {
+              ResourceName name(package->name, type->type, entry->name);
+              // The IDs are guaranteed to exist.
+              mOptions.stableIdMap[std::move(name)] = ResourceId(
+                  package->id.value(), type->id.value(), entry->id.value());
+            }
+          }
+        }
+
+        if (!writeStableIdMapToPath(mContext->getDiagnostics(),
+                                    mOptions.stableIdMap,
+                                    mOptions.resourceIdMapPath.value())) {
+          return 1;
+        }
+      }
+    } else {
+      // Static libs are merged with other apps, and ID collisions are bad, so
+      // verify that
+      // no IDs have been set.
+      if (!verifyNoIdsSet()) {
+        return 1;
+      }
+    }
+
+    // Add the names to mangle based on our source merge earlier.
+    mContext->setNameManglerPolicy(NameManglerPolicy{
+        mContext->getCompilationPackage(), mTableMerger->getMergedPackages()});
+
+    // Add our table to the symbol table.
+    mContext->getExternalSymbols()->prependSource(
+        util::make_unique<ResourceTableSymbolSource>(&mFinalTable));
+
+    ReferenceLinker linker;
+    if (!linker.consume(mContext, &mFinalTable)) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed linking references");
+      return 1;
+    }
+
+    if (mOptions.staticLib) {
+      if (!mOptions.products.empty()) {
+        mContext->getDiagnostics()
+            ->warn(DiagMessage()
+                   << "can't select products when building static library");
+      }
+    } else {
+      ProductFilter productFilter(mOptions.products);
+      if (!productFilter.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed stripping products");
+        return 1;
+      }
+    }
+
+    if (!mOptions.noAutoVersion) {
+      AutoVersioner versioner;
+      if (!versioner.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed versioning styles");
+        return 1;
+      }
+    }
+
+    if (!mOptions.staticLib && mContext->getMinSdkVersion() > 0) {
+      if (mContext->verbose()) {
+        mContext->getDiagnostics()->note(
+            DiagMessage() << "collapsing resource versions for minimum SDK "
+                          << mContext->getMinSdkVersion());
+      }
+
+      VersionCollapser collapser;
+      if (!collapser.consume(mContext, &mFinalTable)) {
+        return 1;
+      }
+    }
+
+    if (!mOptions.noResourceDeduping) {
+      ResourceDeduper deduper;
+      if (!deduper.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed deduping resources");
+        return 1;
+      }
+    }
+
+    proguard::KeepSet proguardKeepSet;
+    proguard::KeepSet proguardMainDexKeepSet;
+
+    if (mOptions.staticLib) {
+      if (mOptions.tableSplitterOptions.configFilter != nullptr ||
+          mOptions.tableSplitterOptions.preferredDensity) {
+        mContext->getDiagnostics()
+            ->warn(DiagMessage()
+                   << "can't strip resources when building static library");
+      }
+    } else {
+      // Adjust the SplitConstraints so that their SDK version is stripped if it
+      // is less
+      // than or equal to the minSdk. Otherwise the resources that have had
+      // their SDK version
+      // stripped due to minSdk won't ever match.
+      std::vector<SplitConstraints> adjustedConstraintsList;
+      adjustedConstraintsList.reserve(mOptions.splitConstraints.size());
+      for (const SplitConstraints& constraints : mOptions.splitConstraints) {
+        SplitConstraints adjustedConstraints;
+        for (const ConfigDescription& config : constraints.configs) {
+          if (config.sdkVersion <= mContext->getMinSdkVersion()) {
+            adjustedConstraints.configs.insert(config.copyWithoutSdkVersion());
+          } else {
+            adjustedConstraints.configs.insert(config);
+          }
+        }
+        adjustedConstraintsList.push_back(std::move(adjustedConstraints));
+      }
+
+      TableSplitter tableSplitter(adjustedConstraintsList,
+                                  mOptions.tableSplitterOptions);
+      if (!tableSplitter.verifySplitConstraints(mContext)) {
+        return 1;
+      }
+      tableSplitter.splitTable(&mFinalTable);
+
+      // Now we need to write out the Split APKs.
+      auto pathIter = mOptions.splitPaths.begin();
+      auto splitConstraintsIter = adjustedConstraintsList.begin();
+      for (std::unique_ptr<ResourceTable>& splitTable :
+           tableSplitter.getSplits()) {
+        if (mContext->verbose()) {
+          mContext->getDiagnostics()->note(
+              DiagMessage(*pathIter)
+              << "generating split with configurations '"
+              << util::joiner(splitConstraintsIter->configs, ", ") << "'");
+        }
+
+        std::unique_ptr<IArchiveWriter> archiveWriter =
+            makeArchiveWriter(*pathIter);
+        if (!archiveWriter) {
+          mContext->getDiagnostics()->error(DiagMessage()
+                                            << "failed to create archive");
+          return 1;
+        }
+
+        // Generate an AndroidManifest.xml for each split.
+        std::unique_ptr<xml::XmlResource> splitManifest =
+            generateSplitManifest(appInfo, *splitConstraintsIter);
+
+        XmlReferenceLinker linker;
+        if (!linker.consume(mContext, splitManifest.get())) {
+          mContext->getDiagnostics()->error(
+              DiagMessage() << "failed to create Split AndroidManifest.xml");
+          return 1;
+        }
+
+        if (!writeApk(archiveWriter.get(), &proguardKeepSet,
+                      splitManifest.get(), splitTable.get())) {
+          return 1;
+        }
+
+        ++pathIter;
+        ++splitConstraintsIter;
+      }
+    }
+
+    // Start writing the base APK.
+    std::unique_ptr<IArchiveWriter> archiveWriter =
+        makeArchiveWriter(mOptions.outputPath);
+    if (!archiveWriter) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed to create archive");
+      return 1;
+    }
+
+    bool error = false;
+    {
+      // AndroidManifest.xml has no resource name, but the CallSite is built
+      // from the name
+      // (aka, which package the AndroidManifest.xml is coming from).
+      // So we give it a package name so it can see local resources.
+      manifestXml->file.name.package = mContext->getCompilationPackage();
+
+      XmlReferenceLinker manifestLinker;
+      if (manifestLinker.consume(mContext, manifestXml.get())) {
+        if (mOptions.generateProguardRulesPath &&
+            !proguard::collectProguardRulesForManifest(
+                Source(mOptions.manifestPath), manifestXml.get(),
+                &proguardKeepSet)) {
+          error = true;
+        }
+
+        if (mOptions.generateMainDexProguardRulesPath &&
+            !proguard::collectProguardRulesForManifest(
+                Source(mOptions.manifestPath), manifestXml.get(),
+                &proguardMainDexKeepSet, true)) {
+          error = true;
         }
 
         if (mOptions.generateJavaClassPath) {
-            JavaClassGeneratorOptions options;
-            options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
-            options.javadocAnnotations = mOptions.javadocAnnotations;
-
-            if (mOptions.staticLib || mOptions.generateNonFinalIds) {
-                options.useFinal = false;
-            }
-
-            const StringPiece actualPackage = mContext->getCompilationPackage();
-            StringPiece outputPackage = mContext->getCompilationPackage();
-            if (mOptions.customJavaPackage) {
-                // Override the output java package to the custom one.
-                outputPackage = mOptions.customJavaPackage.value();
-            }
-
-            if (mOptions.privateSymbols) {
-                // If we defined a private symbols package, we only emit Public symbols
-                // to the original package, and private and public symbols to the private package.
-
-                options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
-                if (!writeJavaFile(&mFinalTable, mContext->getCompilationPackage(),
-                                   outputPackage, options)) {
-                    return 1;
-                }
-
-                options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
-                outputPackage = mOptions.privateSymbols.value();
-            }
-
-            if (!writeJavaFile(&mFinalTable, actualPackage, outputPackage, options)) {
-                return 1;
-            }
-
-            for (const std::string& extraPackage : mOptions.extraJavaPackages) {
-                if (!writeJavaFile(&mFinalTable, actualPackage, extraPackage, options)) {
-                    return 1;
-                }
-            }
+          if (!writeManifestJavaFile(manifestXml.get())) {
+            error = true;
+          }
         }
 
-        if (!writeProguardFile(mOptions.generateProguardRulesPath, proguardKeepSet)) {
-            return 1;
+        if (mOptions.noXmlNamespaces) {
+          // PackageParser will fail if URIs are removed from
+          // AndroidManifest.xml.
+          XmlNamespaceRemover namespaceRemover(true /* keepUris */);
+          if (!namespaceRemover.consume(mContext, manifestXml.get())) {
+            error = true;
+          }
         }
-
-        if (!writeProguardFile(mOptions.generateMainDexProguardRulesPath, proguardMainDexKeepSet)) {
-            return 1;
-        }
-
-        if (mContext->verbose()) {
-            DebugPrintTableOptions debugPrintTableOptions;
-            debugPrintTableOptions.showSources = true;
-            Debug::printTable(&mFinalTable, debugPrintTableOptions);
-        }
-        return 0;
+      } else {
+        error = true;
+      }
     }
 
-private:
-    LinkOptions mOptions;
-    LinkContext* mContext;
-    ResourceTable mFinalTable;
+    if (error) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed processing manifest");
+      return 1;
+    }
 
-    std::unique_ptr<TableMerger> mTableMerger;
+    if (!writeApk(archiveWriter.get(), &proguardKeepSet, manifestXml.get(),
+                  &mFinalTable)) {
+      return 1;
+    }
 
-    // A pointer to the FileCollection representing the filesystem (not archives).
-    std::unique_ptr<io::FileCollection> mFileCollection;
+    if (mOptions.generateJavaClassPath) {
+      JavaClassGeneratorOptions options;
+      options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
+      options.javadocAnnotations = mOptions.javadocAnnotations;
 
-    // A vector of IFileCollections. This is mainly here to keep ownership of the collections.
-    std::vector<std::unique_ptr<io::IFileCollection>> mCollections;
+      if (mOptions.staticLib || mOptions.generateNonFinalIds) {
+        options.useFinal = false;
+      }
 
-    // A vector of ResourceTables. This is here to retain ownership, so that the SymbolTable
-    // can use these.
-    std::vector<std::unique_ptr<ResourceTable>> mStaticTableIncludes;
+      const StringPiece actualPackage = mContext->getCompilationPackage();
+      StringPiece outputPackage = mContext->getCompilationPackage();
+      if (mOptions.customJavaPackage) {
+        // Override the output java package to the custom one.
+        outputPackage = mOptions.customJavaPackage.value();
+      }
+
+      if (mOptions.privateSymbols) {
+        // If we defined a private symbols package, we only emit Public symbols
+        // to the original package, and private and public symbols to the
+        // private package.
+
+        options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
+        if (!writeJavaFile(&mFinalTable, mContext->getCompilationPackage(),
+                           outputPackage, options)) {
+          return 1;
+        }
+
+        options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
+        outputPackage = mOptions.privateSymbols.value();
+      }
+
+      if (!writeJavaFile(&mFinalTable, actualPackage, outputPackage, options)) {
+        return 1;
+      }
+
+      for (const std::string& extraPackage : mOptions.extraJavaPackages) {
+        if (!writeJavaFile(&mFinalTable, actualPackage, extraPackage,
+                           options)) {
+          return 1;
+        }
+      }
+    }
+
+    if (!writeProguardFile(mOptions.generateProguardRulesPath,
+                           proguardKeepSet)) {
+      return 1;
+    }
+
+    if (!writeProguardFile(mOptions.generateMainDexProguardRulesPath,
+                           proguardMainDexKeepSet)) {
+      return 1;
+    }
+
+    if (mContext->verbose()) {
+      DebugPrintTableOptions debugPrintTableOptions;
+      debugPrintTableOptions.showSources = true;
+      Debug::printTable(&mFinalTable, debugPrintTableOptions);
+    }
+    return 0;
+  }
+
+ private:
+  LinkOptions mOptions;
+  LinkContext* mContext;
+  ResourceTable mFinalTable;
+
+  std::unique_ptr<TableMerger> mTableMerger;
+
+  // A pointer to the FileCollection representing the filesystem (not archives).
+  std::unique_ptr<io::FileCollection> mFileCollection;
+
+  // A vector of IFileCollections. This is mainly here to keep ownership of the
+  // collections.
+  std::vector<std::unique_ptr<io::IFileCollection>> mCollections;
+
+  // A vector of ResourceTables. This is here to retain ownership, so that the
+  // SymbolTable
+  // can use these.
+  std::vector<std::unique_ptr<ResourceTable>> mStaticTableIncludes;
 };
 
 int link(const std::vector<StringPiece>& args) {
-    LinkContext context;
-    LinkOptions options;
-    std::vector<std::string> overlayArgList;
-    std::vector<std::string> extraJavaPackages;
-    Maybe<std::string> configs;
-    Maybe<std::string> preferredDensity;
-    Maybe<std::string> productList;
-    bool legacyXFlag = false;
-    bool requireLocalization = false;
-    bool verbose = false;
-    Maybe<std::string> stableIdFilePath;
-    std::vector<std::string> splitArgs;
-    Flags flags = Flags()
-            .requiredFlag("-o", "Output path", &options.outputPath)
-            .requiredFlag("--manifest", "Path to the Android manifest to build",
-                          &options.manifestPath)
-            .optionalFlagList("-I", "Adds an Android APK to link against", &options.includePaths)
-            .optionalFlagList("-R", "Compilation unit to link, using `overlay` semantics.\n"
-                              "The last conflicting resource given takes precedence.",
-                              &overlayArgList)
-            .optionalFlag("--java", "Directory in which to generate R.java",
-                          &options.generateJavaClassPath)
-            .optionalFlag("--proguard", "Output file for generated Proguard rules",
-                          &options.generateProguardRulesPath)
-            .optionalFlag("--proguard-main-dex",
-                          "Output file for generated Proguard rules for the main dex",
-                          &options.generateMainDexProguardRulesPath)
-            .optionalSwitch("--no-auto-version",
-                            "Disables automatic style and layout SDK versioning",
-                            &options.noAutoVersion)
-            .optionalSwitch("--no-version-vectors",
-                            "Disables automatic versioning of vector drawables. Use this only\n"
-                            "when building with vector drawable support library",
-                            &options.noVersionVectors)
-            .optionalSwitch("--no-resource-deduping", "Disables automatic deduping of resources with\n"
-                            "identical values across compatible configurations.",
-                            &options.noResourceDeduping)
-            .optionalSwitch("-x", "Legacy flag that specifies to use the package identifier 0x01",
-                            &legacyXFlag)
-            .optionalSwitch("-z", "Require localization of strings marked 'suggested'",
-                            &requireLocalization)
-            .optionalFlag("-c", "Comma separated list of configurations to include. The default\n"
-                                "is all configurations", &configs)
-            .optionalFlag("--preferred-density",
-                          "Selects the closest matching density and strips out all others.",
-                          &preferredDensity)
-            .optionalFlag("--product", "Comma separated list of product names to keep",
-                          &productList)
-            .optionalSwitch("--output-to-dir", "Outputs the APK contents to a directory specified "
-                            "by -o",
-                            &options.outputToDirectory)
-            .optionalSwitch("--no-xml-namespaces", "Removes XML namespace prefix and URI "
-                            "information from AndroidManifest.xml\nand XML binaries in res/*.",
-                            &options.noXmlNamespaces)
-            .optionalFlag("--min-sdk-version", "Default minimum SDK version to use for "
-                          "AndroidManifest.xml",
-                          &options.manifestFixerOptions.minSdkVersionDefault)
-            .optionalFlag("--target-sdk-version", "Default target SDK version to use for "
-                          "AndroidManifest.xml",
-                          &options.manifestFixerOptions.targetSdkVersionDefault)
-            .optionalFlag("--version-code", "Version code (integer) to inject into the "
-                          "AndroidManifest.xml if none is present",
-                          &options.manifestFixerOptions.versionCodeDefault)
-            .optionalFlag("--version-name", "Version name to inject into the AndroidManifest.xml "
-                          "if none is present",
-                          &options.manifestFixerOptions.versionNameDefault)
-            .optionalSwitch("--static-lib", "Generate a static Android library",
-                            &options.staticLib)
-            .optionalSwitch("--no-static-lib-packages",
-                            "Merge all library resources under the app's package",
-                            &options.noStaticLibPackages)
-            .optionalSwitch("--non-final-ids", "Generates R.java without the final modifier.\n"
-                            "This is implied when --static-lib is specified.",
-                            &options.generateNonFinalIds)
-            .optionalFlag("--stable-ids", "File containing a list of name to ID mapping.",
-                          &stableIdFilePath)
-            .optionalFlag("--emit-ids", "Emit a file at the given path with a list of name to ID\n"
-                          "mappings, suitable for use with --stable-ids.",
-                          &options.resourceIdMapPath)
-            .optionalFlag("--private-symbols", "Package name to use when generating R.java for "
-                          "private symbols.\n"
-                          "If not specified, public and private symbols will use the application's "
-                          "package name",
-                          &options.privateSymbols)
-            .optionalFlag("--custom-package", "Custom Java package under which to generate R.java",
-                          &options.customJavaPackage)
-            .optionalFlagList("--extra-packages", "Generate the same R.java but with different "
-                              "package names",
-                              &extraJavaPackages)
-            .optionalFlagList("--add-javadoc-annotation", "Adds a JavaDoc annotation to all "
+  LinkContext context;
+  LinkOptions options;
+  std::vector<std::string> overlayArgList;
+  std::vector<std::string> extraJavaPackages;
+  Maybe<std::string> configs;
+  Maybe<std::string> preferredDensity;
+  Maybe<std::string> productList;
+  bool legacyXFlag = false;
+  bool requireLocalization = false;
+  bool verbose = false;
+  Maybe<std::string> stableIdFilePath;
+  std::vector<std::string> splitArgs;
+  Flags flags =
+      Flags()
+          .requiredFlag("-o", "Output path", &options.outputPath)
+          .requiredFlag("--manifest", "Path to the Android manifest to build",
+                        &options.manifestPath)
+          .optionalFlagList("-I", "Adds an Android APK to link against",
+                            &options.includePaths)
+          .optionalFlagList(
+              "-R",
+              "Compilation unit to link, using `overlay` semantics.\n"
+              "The last conflicting resource given takes precedence.",
+              &overlayArgList)
+          .optionalFlag("--java", "Directory in which to generate R.java",
+                        &options.generateJavaClassPath)
+          .optionalFlag("--proguard",
+                        "Output file for generated Proguard rules",
+                        &options.generateProguardRulesPath)
+          .optionalFlag(
+              "--proguard-main-dex",
+              "Output file for generated Proguard rules for the main dex",
+              &options.generateMainDexProguardRulesPath)
+          .optionalSwitch("--no-auto-version",
+                          "Disables automatic style and layout SDK versioning",
+                          &options.noAutoVersion)
+          .optionalSwitch("--no-version-vectors",
+                          "Disables automatic versioning of vector drawables. "
+                          "Use this only\n"
+                          "when building with vector drawable support library",
+                          &options.noVersionVectors)
+          .optionalSwitch("--no-resource-deduping",
+                          "Disables automatic deduping of resources with\n"
+                          "identical values across compatible configurations.",
+                          &options.noResourceDeduping)
+          .optionalSwitch(
+              "-x",
+              "Legacy flag that specifies to use the package identifier 0x01",
+              &legacyXFlag)
+          .optionalSwitch("-z",
+                          "Require localization of strings marked 'suggested'",
+                          &requireLocalization)
+          .optionalFlag(
+              "-c",
+              "Comma separated list of configurations to include. The default\n"
+              "is all configurations",
+              &configs)
+          .optionalFlag(
+              "--preferred-density",
+              "Selects the closest matching density and strips out all others.",
+              &preferredDensity)
+          .optionalFlag("--product",
+                        "Comma separated list of product names to keep",
+                        &productList)
+          .optionalSwitch("--output-to-dir",
+                          "Outputs the APK contents to a directory specified "
+                          "by -o",
+                          &options.outputToDirectory)
+          .optionalSwitch("--no-xml-namespaces",
+                          "Removes XML namespace prefix and URI "
+                          "information from AndroidManifest.xml\nand XML "
+                          "binaries in res/*.",
+                          &options.noXmlNamespaces)
+          .optionalFlag("--min-sdk-version",
+                        "Default minimum SDK version to use for "
+                        "AndroidManifest.xml",
+                        &options.manifestFixerOptions.minSdkVersionDefault)
+          .optionalFlag("--target-sdk-version",
+                        "Default target SDK version to use for "
+                        "AndroidManifest.xml",
+                        &options.manifestFixerOptions.targetSdkVersionDefault)
+          .optionalFlag("--version-code",
+                        "Version code (integer) to inject into the "
+                        "AndroidManifest.xml if none is present",
+                        &options.manifestFixerOptions.versionCodeDefault)
+          .optionalFlag("--version-name",
+                        "Version name to inject into the AndroidManifest.xml "
+                        "if none is present",
+                        &options.manifestFixerOptions.versionNameDefault)
+          .optionalSwitch("--static-lib", "Generate a static Android library",
+                          &options.staticLib)
+          .optionalSwitch("--no-static-lib-packages",
+                          "Merge all library resources under the app's package",
+                          &options.noStaticLibPackages)
+          .optionalSwitch("--non-final-ids",
+                          "Generates R.java without the final modifier.\n"
+                          "This is implied when --static-lib is specified.",
+                          &options.generateNonFinalIds)
+          .optionalFlag("--stable-ids",
+                        "File containing a list of name to ID mapping.",
+                        &stableIdFilePath)
+          .optionalFlag(
+              "--emit-ids",
+              "Emit a file at the given path with a list of name to ID\n"
+              "mappings, suitable for use with --stable-ids.",
+              &options.resourceIdMapPath)
+          .optionalFlag("--private-symbols",
+                        "Package name to use when generating R.java for "
+                        "private symbols.\n"
+                        "If not specified, public and private symbols will use "
+                        "the application's "
+                        "package name",
+                        &options.privateSymbols)
+          .optionalFlag("--custom-package",
+                        "Custom Java package under which to generate R.java",
+                        &options.customJavaPackage)
+          .optionalFlagList("--extra-packages",
+                            "Generate the same R.java but with different "
+                            "package names",
+                            &extraJavaPackages)
+          .optionalFlagList("--add-javadoc-annotation",
+                            "Adds a JavaDoc annotation to all "
                             "generated Java classes",
                             &options.javadocAnnotations)
-            .optionalSwitch("--auto-add-overlay", "Allows the addition of new resources in "
-                            "overlays without <add-resource> tags",
-                            &options.autoAddOverlay)
-            .optionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml",
-                          &options.manifestFixerOptions.renameManifestPackage)
-            .optionalFlag("--rename-instrumentation-target-package",
-                          "Changes the name of the target package for instrumentation. Most useful "
-                          "when used\nin conjunction with --rename-manifest-package",
-                          &options.manifestFixerOptions.renameInstrumentationTargetPackage)
-            .optionalFlagList("-0", "File extensions not to compress",
-                              &options.extensionsToNotCompress)
-            .optionalFlagList("--split", "Split resources matching a set of configs out to a "
-                              "Split APK.\nSyntax: path/to/output.apk:<config>[,<config>[...]]",
-                              &splitArgs)
-            .optionalSwitch("-v", "Enables verbose logging",
-                            &verbose);
+          .optionalSwitch("--auto-add-overlay",
+                          "Allows the addition of new resources in "
+                          "overlays without <add-resource> tags",
+                          &options.autoAddOverlay)
+          .optionalFlag("--rename-manifest-package",
+                        "Renames the package in AndroidManifest.xml",
+                        &options.manifestFixerOptions.renameManifestPackage)
+          .optionalFlag(
+              "--rename-instrumentation-target-package",
+              "Changes the name of the target package for instrumentation. "
+              "Most useful "
+              "when used\nin conjunction with --rename-manifest-package",
+              &options.manifestFixerOptions.renameInstrumentationTargetPackage)
+          .optionalFlagList("-0", "File extensions not to compress",
+                            &options.extensionsToNotCompress)
+          .optionalFlagList(
+              "--split",
+              "Split resources matching a set of configs out to a "
+              "Split APK.\nSyntax: path/to/output.apk:<config>[,<config>[...]]",
+              &splitArgs)
+          .optionalSwitch("-v", "Enables verbose logging", &verbose);
 
-    if (!flags.parse("aapt2 link", args, &std::cerr)) {
+  if (!flags.parse("aapt2 link", args, &std::cerr)) {
+    return 1;
+  }
+
+  // Expand all argument-files passed into the command line. These start with
+  // '@'.
+  std::vector<std::string> argList;
+  for (const std::string& arg : flags.getArgs()) {
+    if (util::stringStartsWith(arg, "@")) {
+      const std::string path = arg.substr(1, arg.size() - 1);
+      std::string error;
+      if (!file::appendArgsFromFile(path, &argList, &error)) {
+        context.getDiagnostics()->error(DiagMessage(path) << error);
         return 1;
+      }
+    } else {
+      argList.push_back(arg);
+    }
+  }
+
+  // Expand all argument-files passed to -R.
+  for (const std::string& arg : overlayArgList) {
+    if (util::stringStartsWith(arg, "@")) {
+      const std::string path = arg.substr(1, arg.size() - 1);
+      std::string error;
+      if (!file::appendArgsFromFile(path, &options.overlayFiles, &error)) {
+        context.getDiagnostics()->error(DiagMessage(path) << error);
+        return 1;
+      }
+    } else {
+      options.overlayFiles.push_back(arg);
+    }
+  }
+
+  if (verbose) {
+    context.setVerbose(verbose);
+  }
+
+  // Populate the set of extra packages for which to generate R.java.
+  for (std::string& extraPackage : extraJavaPackages) {
+    // A given package can actually be a colon separated list of packages.
+    for (StringPiece package : util::split(extraPackage, ':')) {
+      options.extraJavaPackages.insert(package.toString());
+    }
+  }
+
+  if (productList) {
+    for (StringPiece product : util::tokenize(productList.value(), ',')) {
+      if (product != "" && product != "default") {
+        options.products.insert(product.toString());
+      }
+    }
+  }
+
+  AxisConfigFilter filter;
+  if (configs) {
+    for (const StringPiece& configStr : util::tokenize(configs.value(), ',')) {
+      ConfigDescription config;
+      LocaleValue lv;
+      if (lv.initFromFilterString(configStr)) {
+        lv.writeTo(&config);
+      } else if (!ConfigDescription::parse(configStr, &config)) {
+        context.getDiagnostics()->error(DiagMessage() << "invalid config '"
+                                                      << configStr
+                                                      << "' for -c option");
+        return 1;
+      }
+
+      if (config.density != 0) {
+        context.getDiagnostics()->warn(DiagMessage() << "ignoring density '"
+                                                     << config
+                                                     << "' for -c option");
+      } else {
+        filter.addConfig(config);
+      }
     }
 
-    // Expand all argument-files passed into the command line. These start with '@'.
-    std::vector<std::string> argList;
-    for (const std::string& arg : flags.getArgs()) {
-        if (util::stringStartsWith(arg, "@")) {
-            const std::string path = arg.substr(1, arg.size() - 1);
-            std::string error;
-            if (!file::appendArgsFromFile(path, &argList, &error)) {
-                context.getDiagnostics()->error(DiagMessage(path) << error);
-                return 1;
-            }
-        } else {
-            argList.push_back(arg);
-        }
+    options.tableSplitterOptions.configFilter = &filter;
+  }
+
+  if (preferredDensity) {
+    ConfigDescription preferredDensityConfig;
+    if (!ConfigDescription::parse(preferredDensity.value(),
+                                  &preferredDensityConfig)) {
+      context.getDiagnostics()->error(
+          DiagMessage() << "invalid density '" << preferredDensity.value()
+                        << "' for --preferred-density option");
+      return 1;
     }
 
-    // Expand all argument-files passed to -R.
-    for (const std::string& arg : overlayArgList) {
-        if (util::stringStartsWith(arg, "@")) {
-            const std::string path = arg.substr(1, arg.size() - 1);
-            std::string error;
-            if (!file::appendArgsFromFile(path, &options.overlayFiles, &error)) {
-                context.getDiagnostics()->error(DiagMessage(path) << error);
-                return 1;
-            }
-        } else {
-            options.overlayFiles.push_back(arg);
-        }
+    // Clear the version that can be automatically added.
+    preferredDensityConfig.sdkVersion = 0;
+
+    if (preferredDensityConfig.diff(ConfigDescription::defaultConfig()) !=
+        ConfigDescription::CONFIG_DENSITY) {
+      context.getDiagnostics()->error(
+          DiagMessage() << "invalid preferred density '"
+                        << preferredDensity.value() << "'. "
+                        << "Preferred density must only be a density value");
+      return 1;
     }
+    options.tableSplitterOptions.preferredDensity =
+        preferredDensityConfig.density;
+  }
 
-    if (verbose) {
-        context.setVerbose(verbose);
+  if (!options.staticLib && stableIdFilePath) {
+    if (!loadStableIdMap(context.getDiagnostics(), stableIdFilePath.value(),
+                         &options.stableIdMap)) {
+      return 1;
     }
+  }
 
-    // Populate the set of extra packages for which to generate R.java.
-    for (std::string& extraPackage : extraJavaPackages) {
-        // A given package can actually be a colon separated list of packages.
-        for (StringPiece package : util::split(extraPackage, ':')) {
-            options.extraJavaPackages.insert(package.toString());
-        }
+  // Populate some default no-compress extensions that are already compressed.
+  options.extensionsToNotCompress.insert(
+      {".jpg",   ".jpeg", ".png",  ".gif", ".wav",  ".mp2",  ".mp3",  ".ogg",
+       ".aac",   ".mpg",  ".mpeg", ".mid", ".midi", ".smf",  ".jet",  ".rtttl",
+       ".imy",   ".xmf",  ".mp4",  ".m4a", ".m4v",  ".3gp",  ".3gpp", ".3g2",
+       ".3gpp2", ".amr",  ".awb",  ".wma", ".wmv",  ".webm", ".mkv"});
+
+  // Parse the split parameters.
+  for (const std::string& splitArg : splitArgs) {
+    options.splitPaths.push_back({});
+    options.splitConstraints.push_back({});
+    if (!parseSplitParameter(splitArg, context.getDiagnostics(),
+                             &options.splitPaths.back(),
+                             &options.splitConstraints.back())) {
+      return 1;
     }
+  }
 
-    if (productList) {
-        for (StringPiece product : util::tokenize(productList.value(), ',')) {
-            if (product != "" && product != "default") {
-                options.products.insert(product.toString());
-            }
-        }
-    }
+  // Turn off auto versioning for static-libs.
+  if (options.staticLib) {
+    options.noAutoVersion = true;
+    options.noVersionVectors = true;
+  }
 
-    AxisConfigFilter filter;
-    if (configs) {
-        for (const StringPiece& configStr : util::tokenize(configs.value(), ',')) {
-            ConfigDescription config;
-            LocaleValue lv;
-            if (lv.initFromFilterString(configStr)) {
-                lv.writeTo(&config);
-            } else if (!ConfigDescription::parse(configStr, &config)) {
-                context.getDiagnostics()->error(
-                        DiagMessage() << "invalid config '" << configStr << "' for -c option");
-                return 1;
-            }
-
-            if (config.density != 0) {
-                context.getDiagnostics()->warn(
-                        DiagMessage() << "ignoring density '" << config << "' for -c option");
-            } else {
-                filter.addConfig(config);
-            }
-        }
-
-        options.tableSplitterOptions.configFilter = &filter;
-    }
-
-    if (preferredDensity) {
-        ConfigDescription preferredDensityConfig;
-        if (!ConfigDescription::parse(preferredDensity.value(), &preferredDensityConfig)) {
-            context.getDiagnostics()->error(DiagMessage() << "invalid density '"
-                                            << preferredDensity.value()
-                                            << "' for --preferred-density option");
-            return 1;
-        }
-
-        // Clear the version that can be automatically added.
-        preferredDensityConfig.sdkVersion = 0;
-
-        if (preferredDensityConfig.diff(ConfigDescription::defaultConfig())
-                != ConfigDescription::CONFIG_DENSITY) {
-            context.getDiagnostics()->error(DiagMessage() << "invalid preferred density '"
-                                            << preferredDensity.value() << "'. "
-                                            << "Preferred density must only be a density value");
-            return 1;
-        }
-        options.tableSplitterOptions.preferredDensity = preferredDensityConfig.density;
-    }
-
-    if (!options.staticLib && stableIdFilePath) {
-        if (!loadStableIdMap(context.getDiagnostics(), stableIdFilePath.value(),
-                             &options.stableIdMap)) {
-            return 1;
-        }
-    }
-
-    // Populate some default no-compress extensions that are already compressed.
-    options.extensionsToNotCompress.insert({
-            ".jpg", ".jpeg", ".png", ".gif",
-            ".wav", ".mp2", ".mp3", ".ogg", ".aac",
-            ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
-            ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
-            ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
-            ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"});
-
-    // Parse the split parameters.
-    for (const std::string& splitArg : splitArgs) {
-        options.splitPaths.push_back({});
-        options.splitConstraints.push_back({});
-        if (!parseSplitParameter(splitArg, context.getDiagnostics(), &options.splitPaths.back(),
-                                 &options.splitConstraints.back())) {
-            return 1;
-        }
-    }
-
-    // Turn off auto versioning for static-libs.
-    if (options.staticLib) {
-        options.noAutoVersion = true;
-        options.noVersionVectors = true;
-    }
-
-    LinkCommand cmd(&context, options);
-    return cmd.run(argList);
+  LinkCommand cmd(&context, options);
+  return cmd.run(argList);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/Linkers.h b/tools/aapt2/link/Linkers.h
index ce455da..f40c0e8 100644
--- a/tools/aapt2/link/Linkers.h
+++ b/tools/aapt2/link/Linkers.h
@@ -30,106 +30,121 @@
 struct ConfigDescription;
 
 /**
- * Defines the location in which a value exists. This determines visibility of other
+ * Defines the location in which a value exists. This determines visibility of
+ * other
  * package's private symbols.
  */
 struct CallSite {
-    ResourceNameRef resource;
+  ResourceNameRef resource;
 };
 
 /**
- * Determines whether a versioned resource should be created. If a versioned resource already
+ * Determines whether a versioned resource should be created. If a versioned
+ * resource already
  * exists, it takes precedence.
  */
-bool shouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+bool shouldGenerateVersionedResource(const ResourceEntry* entry,
+                                     const ConfigDescription& config,
                                      const int sdkVersionToGenerate);
 
 class AutoVersioner : public IResourceTableConsumer {
-public:
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+ public:
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 class XmlAutoVersioner : public IXmlResourceConsumer {
-public:
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+ public:
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 };
 
 class VersionCollapser : public IResourceTableConsumer {
-public:
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+ public:
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 /**
  * Removes duplicated key-value entries from dominated resources.
  */
 class ResourceDeduper : public IResourceTableConsumer {
-public:
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+ public:
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 /**
- * If any attribute resource values are defined as public, this consumer will move all private
- * attribute resource values to a private ^private-attr type, avoiding backwards compatibility
+ * If any attribute resource values are defined as public, this consumer will
+ * move all private
+ * attribute resource values to a private ^private-attr type, avoiding backwards
+ * compatibility
  * issues with new apps running on old platforms.
  *
- * The Android platform ignores resource attributes it doesn't recognize, so an app developer can
- * use new attributes in their layout XML files without worrying about versioning. This assumption
- * actually breaks on older platforms. OEMs may add private attributes that are used internally.
- * AAPT originally assigned all private attributes IDs immediately proceeding the public attributes'
+ * The Android platform ignores resource attributes it doesn't recognize, so an
+ * app developer can
+ * use new attributes in their layout XML files without worrying about
+ * versioning. This assumption
+ * actually breaks on older platforms. OEMs may add private attributes that are
+ * used internally.
+ * AAPT originally assigned all private attributes IDs immediately proceeding
+ * the public attributes'
  * IDs.
  *
- * This means that on a newer Android platform, an ID previously assigned to a private attribute
+ * This means that on a newer Android platform, an ID previously assigned to a
+ * private attribute
  * may end up assigned to a public attribute.
  *
- * App developers assume using the newer attribute is safe on older platforms because it will
- * be ignored. Instead, the platform thinks the new attribute is an older, private attribute and
- * will interpret it as such. This leads to unintended styling and exceptions thrown due to
+ * App developers assume using the newer attribute is safe on older platforms
+ * because it will
+ * be ignored. Instead, the platform thinks the new attribute is an older,
+ * private attribute and
+ * will interpret it as such. This leads to unintended styling and exceptions
+ * thrown due to
  * unexpected types.
  *
- * By moving the private attributes to a completely different type, this ID conflict will never
+ * By moving the private attributes to a completely different type, this ID
+ * conflict will never
  * occur.
  */
 struct PrivateAttributeMover : public IResourceTableConsumer {
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 /**
  * Removes namespace nodes and URI information from the XmlResource.
  *
- * Once an XmlResource is processed by this consumer, it is no longer able to have its attributes
- * parsed. As such, this XmlResource must have already been processed by XmlReferenceLinker.
+ * Once an XmlResource is processed by this consumer, it is no longer able to
+ * have its attributes
+ * parsed. As such, this XmlResource must have already been processed by
+ * XmlReferenceLinker.
  */
 class XmlNamespaceRemover : public IXmlResourceConsumer {
-private:
-    bool mKeepUris;
+ private:
+  bool mKeepUris;
 
-public:
-    XmlNamespaceRemover(bool keepUris = false) : mKeepUris(keepUris) {
-    };
+ public:
+  XmlNamespaceRemover(bool keepUris = false) : mKeepUris(keepUris){};
 
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 };
 
 /**
- * Resolves attributes in the XmlResource and compiles string values to resource values.
+ * Resolves attributes in the XmlResource and compiles string values to resource
+ * values.
  * Once an XmlResource is processed by this linker, it is ready to be flattened.
  */
 class XmlReferenceLinker : public IXmlResourceConsumer {
-private:
-    std::set<int> mSdkLevelsFound;
+ private:
+  std::set<int> mSdkLevelsFound;
 
-public:
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+ public:
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 
-    /**
-     * Once the XmlResource has been consumed, this returns the various SDK levels in which
-     * framework attributes used within the XML document were defined.
-     */
-    inline const std::set<int>& getSdkLevels() const {
-        return mSdkLevelsFound;
-    }
+  /**
+   * Once the XmlResource has been consumed, this returns the various SDK levels
+   * in which
+   * framework attributes used within the XML document were defined.
+   */
+  inline const std::set<int>& getSdkLevels() const { return mSdkLevelsFound; }
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINKER_LINKERS_H */
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 45f5acd..3c9298b 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceUtils.h"
 #include "link/ManifestFixer.h"
+#include "ResourceUtils.h"
 #include "util/Util.h"
 #include "xml/XmlActionExecutor.h"
 #include "xml/XmlDom.h"
@@ -25,295 +25,310 @@
 namespace aapt {
 
 /**
- * This is how PackageManager builds class names from AndroidManifest.xml entries.
+ * This is how PackageManager builds class names from AndroidManifest.xml
+ * entries.
  */
 static bool nameIsJavaClassName(xml::Element* el, xml::Attribute* attr,
                                 SourcePathDiagnostics* diag) {
-    // We allow unqualified class names (ie: .HelloActivity)
-    // Since we don't know the package name, we can just make a fake one here and
-    // the test will be identical as long as the real package name is valid too.
-    Maybe<std::string> fullyQualifiedClassName =
-            util::getFullyQualifiedClassName("a", attr->value);
+  // We allow unqualified class names (ie: .HelloActivity)
+  // Since we don't know the package name, we can just make a fake one here and
+  // the test will be identical as long as the real package name is valid too.
+  Maybe<std::string> fullyQualifiedClassName =
+      util::getFullyQualifiedClassName("a", attr->value);
 
-    StringPiece qualifiedClassName = fullyQualifiedClassName
-            ? fullyQualifiedClassName.value() : attr->value;
+  StringPiece qualifiedClassName =
+      fullyQualifiedClassName ? fullyQualifiedClassName.value() : attr->value;
 
-    if (!util::isJavaClassName(qualifiedClassName)) {
-        diag->error(DiagMessage(el->lineNumber)
-                    << "attribute 'android:name' in <"
-                    << el->name << "> tag must be a valid Java class name");
-        return false;
-    }
-    return true;
-}
-
-static bool optionalNameIsJavaClassName(xml::Element* el, SourcePathDiagnostics* diag) {
-    if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
-        return nameIsJavaClassName(el, attr, diag);
-    }
-    return true;
-}
-
-static bool requiredNameIsJavaClassName(xml::Element* el, SourcePathDiagnostics* diag) {
-    if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
-        return nameIsJavaClassName(el, attr, diag);
-    }
+  if (!util::isJavaClassName(qualifiedClassName)) {
     diag->error(DiagMessage(el->lineNumber)
-                << "<" << el->name << "> is missing attribute 'android:name'");
+                << "attribute 'android:name' in <" << el->name
+                << "> tag must be a valid Java class name");
     return false;
+  }
+  return true;
+}
+
+static bool optionalNameIsJavaClassName(xml::Element* el,
+                                        SourcePathDiagnostics* diag) {
+  if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
+    return nameIsJavaClassName(el, attr, diag);
+  }
+  return true;
+}
+
+static bool requiredNameIsJavaClassName(xml::Element* el,
+                                        SourcePathDiagnostics* diag) {
+  if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
+    return nameIsJavaClassName(el, attr, diag);
+  }
+  diag->error(DiagMessage(el->lineNumber)
+              << "<" << el->name << "> is missing attribute 'android:name'");
+  return false;
 }
 
 static bool verifyManifest(xml::Element* el, SourcePathDiagnostics* diag) {
-    xml::Attribute* attr = el->findAttribute({}, "package");
-    if (!attr) {
-        diag->error(DiagMessage(el->lineNumber) << "<manifest> tag is missing 'package' attribute");
-        return false;
-    } else if (ResourceUtils::isReference(attr->value)) {
-        diag->error(DiagMessage(el->lineNumber)
-                    << "attribute 'package' in <manifest> tag must not be a reference");
-        return false;
-    } else if (!util::isJavaPackageName(attr->value)) {
-        diag->error(DiagMessage(el->lineNumber)
-                    << "attribute 'package' in <manifest> tag is not a valid Java package name: '"
-                    << attr->value << "'");
-        return false;
-    }
-    return true;
+  xml::Attribute* attr = el->findAttribute({}, "package");
+  if (!attr) {
+    diag->error(DiagMessage(el->lineNumber)
+                << "<manifest> tag is missing 'package' attribute");
+    return false;
+  } else if (ResourceUtils::isReference(attr->value)) {
+    diag->error(
+        DiagMessage(el->lineNumber)
+        << "attribute 'package' in <manifest> tag must not be a reference");
+    return false;
+  } else if (!util::isJavaPackageName(attr->value)) {
+    diag->error(DiagMessage(el->lineNumber)
+                << "attribute 'package' in <manifest> tag is not a valid Java "
+                   "package name: '"
+                << attr->value << "'");
+    return false;
+  }
+  return true;
 }
 
 /**
- * The coreApp attribute in <manifest> is not a regular AAPT attribute, so type checking on it
+ * The coreApp attribute in <manifest> is not a regular AAPT attribute, so type
+ * checking on it
  * is manual.
  */
 static bool fixCoreAppAttribute(xml::Element* el, SourcePathDiagnostics* diag) {
-    if (xml::Attribute* attr = el->findAttribute("", "coreApp")) {
-        std::unique_ptr<BinaryPrimitive> result = ResourceUtils::tryParseBool(attr->value);
-        if (!result) {
-            diag->error(DiagMessage(el->lineNumber) << "attribute coreApp must be a boolean");
-            return false;
-        }
-        attr->compiledValue = std::move(result);
+  if (xml::Attribute* attr = el->findAttribute("", "coreApp")) {
+    std::unique_ptr<BinaryPrimitive> result =
+        ResourceUtils::tryParseBool(attr->value);
+    if (!result) {
+      diag->error(DiagMessage(el->lineNumber)
+                  << "attribute coreApp must be a boolean");
+      return false;
     }
-    return true;
+    attr->compiledValue = std::move(result);
+  }
+  return true;
 }
 
-bool ManifestFixer::buildRules(xml::XmlActionExecutor* executor, IDiagnostics* diag) {
-    // First verify some options.
-    if (mOptions.renameManifestPackage) {
-        if (!util::isJavaPackageName(mOptions.renameManifestPackage.value())) {
-            diag->error(DiagMessage() << "invalid manifest package override '"
-                        << mOptions.renameManifestPackage.value() << "'");
-            return false;
-        }
+bool ManifestFixer::buildRules(xml::XmlActionExecutor* executor,
+                               IDiagnostics* diag) {
+  // First verify some options.
+  if (mOptions.renameManifestPackage) {
+    if (!util::isJavaPackageName(mOptions.renameManifestPackage.value())) {
+      diag->error(DiagMessage() << "invalid manifest package override '"
+                                << mOptions.renameManifestPackage.value()
+                                << "'");
+      return false;
+    }
+  }
+
+  if (mOptions.renameInstrumentationTargetPackage) {
+    if (!util::isJavaPackageName(
+            mOptions.renameInstrumentationTargetPackage.value())) {
+      diag->error(DiagMessage()
+                  << "invalid instrumentation target package override '"
+                  << mOptions.renameInstrumentationTargetPackage.value()
+                  << "'");
+      return false;
+    }
+  }
+
+  // Common intent-filter actions.
+  xml::XmlNodeAction intentFilterAction;
+  intentFilterAction["action"];
+  intentFilterAction["category"];
+  intentFilterAction["data"];
+
+  // Common meta-data actions.
+  xml::XmlNodeAction metaDataAction;
+
+  // Manifest actions.
+  xml::XmlNodeAction& manifestAction = (*executor)["manifest"];
+  manifestAction.action(verifyManifest);
+  manifestAction.action(fixCoreAppAttribute);
+  manifestAction.action([&](xml::Element* el) -> bool {
+    if (mOptions.versionNameDefault) {
+      if (el->findAttribute(xml::kSchemaAndroid, "versionName") == nullptr) {
+        el->attributes.push_back(
+            xml::Attribute{xml::kSchemaAndroid, "versionName",
+                           mOptions.versionNameDefault.value()});
+      }
     }
 
-    if (mOptions.renameInstrumentationTargetPackage) {
-        if (!util::isJavaPackageName(mOptions.renameInstrumentationTargetPackage.value())) {
-            diag->error(DiagMessage() << "invalid instrumentation target package override '"
-                        << mOptions.renameInstrumentationTargetPackage.value() << "'");
-            return false;
-        }
+    if (mOptions.versionCodeDefault) {
+      if (el->findAttribute(xml::kSchemaAndroid, "versionCode") == nullptr) {
+        el->attributes.push_back(
+            xml::Attribute{xml::kSchemaAndroid, "versionCode",
+                           mOptions.versionCodeDefault.value()});
+      }
     }
-
-    // Common intent-filter actions.
-    xml::XmlNodeAction intentFilterAction;
-    intentFilterAction["action"];
-    intentFilterAction["category"];
-    intentFilterAction["data"];
-
-    // Common meta-data actions.
-    xml::XmlNodeAction metaDataAction;
-
-    // Manifest actions.
-    xml::XmlNodeAction& manifestAction = (*executor)["manifest"];
-    manifestAction.action(verifyManifest);
-    manifestAction.action(fixCoreAppAttribute);
-    manifestAction.action([&](xml::Element* el) -> bool {
-        if (mOptions.versionNameDefault) {
-            if (el->findAttribute(xml::kSchemaAndroid, "versionName") == nullptr) {
-                el->attributes.push_back(xml::Attribute{
-                        xml::kSchemaAndroid,
-                        "versionName",
-                        mOptions.versionNameDefault.value() });
-            }
-        }
-
-        if (mOptions.versionCodeDefault) {
-            if (el->findAttribute(xml::kSchemaAndroid, "versionCode") == nullptr) {
-                el->attributes.push_back(xml::Attribute{
-                        xml::kSchemaAndroid,
-                        "versionCode",
-                        mOptions.versionCodeDefault.value() });
-            }
-        }
-        return true;
-    });
-
-    // Meta tags.
-    manifestAction["eat-comment"];
-
-    // Uses-sdk actions.
-    manifestAction["uses-sdk"].action([&](xml::Element* el) -> bool {
-        if (mOptions.minSdkVersionDefault &&
-                el->findAttribute(xml::kSchemaAndroid, "minSdkVersion") == nullptr) {
-            // There was no minSdkVersion defined and we have a default to assign.
-            el->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid, "minSdkVersion",
-                    mOptions.minSdkVersionDefault.value() });
-        }
-
-        if (mOptions.targetSdkVersionDefault &&
-                el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion") == nullptr) {
-            // There was no targetSdkVersion defined and we have a default to assign.
-            el->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid, "targetSdkVersion",
-                    mOptions.targetSdkVersionDefault.value() });
-        }
-        return true;
-    });
-
-    // Instrumentation actions.
-    manifestAction["instrumentation"].action([&](xml::Element* el) -> bool {
-        if (!mOptions.renameInstrumentationTargetPackage) {
-            return true;
-        }
-
-        if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "targetPackage")) {
-            attr->value = mOptions.renameInstrumentationTargetPackage.value();
-        }
-        return true;
-    });
-
-    manifestAction["original-package"];
-    manifestAction["protected-broadcast"];
-    manifestAction["uses-permission"];
-    manifestAction["permission"];
-    manifestAction["permission-tree"];
-    manifestAction["permission-group"];
-
-    manifestAction["uses-configuration"];
-    manifestAction["uses-feature"];
-    manifestAction["supports-screens"];
-
-    manifestAction["compatible-screens"];
-    manifestAction["compatible-screens"]["screen"];
-
-    manifestAction["supports-gl-texture"];
-
-    // Application actions.
-    xml::XmlNodeAction& applicationAction = manifestAction["application"];
-    applicationAction.action(optionalNameIsJavaClassName);
-
-    // Uses library actions.
-    applicationAction["uses-library"];
-
-    // Meta-data.
-    applicationAction["meta-data"] = metaDataAction;
-
-    // Activity actions.
-    applicationAction["activity"].action(requiredNameIsJavaClassName);
-    applicationAction["activity"]["intent-filter"] = intentFilterAction;
-    applicationAction["activity"]["meta-data"] = metaDataAction;
-
-    // Activity alias actions.
-    applicationAction["activity-alias"]["intent-filter"] = intentFilterAction;
-    applicationAction["activity-alias"]["meta-data"] = metaDataAction;
-
-    // Service actions.
-    applicationAction["service"].action(requiredNameIsJavaClassName);
-    applicationAction["service"]["intent-filter"] = intentFilterAction;
-    applicationAction["service"]["meta-data"] = metaDataAction;
-
-    // Receiver actions.
-    applicationAction["receiver"].action(requiredNameIsJavaClassName);
-    applicationAction["receiver"]["intent-filter"] = intentFilterAction;
-    applicationAction["receiver"]["meta-data"] = metaDataAction;
-
-    // Provider actions.
-    applicationAction["provider"].action(requiredNameIsJavaClassName);
-    applicationAction["provider"]["intent-filter"] = intentFilterAction;
-    applicationAction["provider"]["meta-data"] = metaDataAction;
-    applicationAction["provider"]["grant-uri-permissions"];
-    applicationAction["provider"]["path-permissions"];
-
     return true;
+  });
+
+  // Meta tags.
+  manifestAction["eat-comment"];
+
+  // Uses-sdk actions.
+  manifestAction["uses-sdk"].action([&](xml::Element* el) -> bool {
+    if (mOptions.minSdkVersionDefault &&
+        el->findAttribute(xml::kSchemaAndroid, "minSdkVersion") == nullptr) {
+      // There was no minSdkVersion defined and we have a default to assign.
+      el->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "minSdkVersion",
+                         mOptions.minSdkVersionDefault.value()});
+    }
+
+    if (mOptions.targetSdkVersionDefault &&
+        el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion") == nullptr) {
+      // There was no targetSdkVersion defined and we have a default to assign.
+      el->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "targetSdkVersion",
+                         mOptions.targetSdkVersionDefault.value()});
+    }
+    return true;
+  });
+
+  // Instrumentation actions.
+  manifestAction["instrumentation"].action([&](xml::Element* el) -> bool {
+    if (!mOptions.renameInstrumentationTargetPackage) {
+      return true;
+    }
+
+    if (xml::Attribute* attr =
+            el->findAttribute(xml::kSchemaAndroid, "targetPackage")) {
+      attr->value = mOptions.renameInstrumentationTargetPackage.value();
+    }
+    return true;
+  });
+
+  manifestAction["original-package"];
+  manifestAction["protected-broadcast"];
+  manifestAction["uses-permission"];
+  manifestAction["permission"];
+  manifestAction["permission-tree"];
+  manifestAction["permission-group"];
+
+  manifestAction["uses-configuration"];
+  manifestAction["uses-feature"];
+  manifestAction["supports-screens"];
+
+  manifestAction["compatible-screens"];
+  manifestAction["compatible-screens"]["screen"];
+
+  manifestAction["supports-gl-texture"];
+
+  // Application actions.
+  xml::XmlNodeAction& applicationAction = manifestAction["application"];
+  applicationAction.action(optionalNameIsJavaClassName);
+
+  // Uses library actions.
+  applicationAction["uses-library"];
+
+  // Meta-data.
+  applicationAction["meta-data"] = metaDataAction;
+
+  // Activity actions.
+  applicationAction["activity"].action(requiredNameIsJavaClassName);
+  applicationAction["activity"]["intent-filter"] = intentFilterAction;
+  applicationAction["activity"]["meta-data"] = metaDataAction;
+
+  // Activity alias actions.
+  applicationAction["activity-alias"]["intent-filter"] = intentFilterAction;
+  applicationAction["activity-alias"]["meta-data"] = metaDataAction;
+
+  // Service actions.
+  applicationAction["service"].action(requiredNameIsJavaClassName);
+  applicationAction["service"]["intent-filter"] = intentFilterAction;
+  applicationAction["service"]["meta-data"] = metaDataAction;
+
+  // Receiver actions.
+  applicationAction["receiver"].action(requiredNameIsJavaClassName);
+  applicationAction["receiver"]["intent-filter"] = intentFilterAction;
+  applicationAction["receiver"]["meta-data"] = metaDataAction;
+
+  // Provider actions.
+  applicationAction["provider"].action(requiredNameIsJavaClassName);
+  applicationAction["provider"]["intent-filter"] = intentFilterAction;
+  applicationAction["provider"]["meta-data"] = metaDataAction;
+  applicationAction["provider"]["grant-uri-permissions"];
+  applicationAction["provider"]["path-permissions"];
+
+  return true;
 }
 
 class FullyQualifiedClassNameVisitor : public xml::Visitor {
-public:
-    using xml::Visitor::visit;
+ public:
+  using xml::Visitor::visit;
 
-    explicit FullyQualifiedClassNameVisitor(const StringPiece& package) : mPackage(package) {
-    }
+  explicit FullyQualifiedClassNameVisitor(const StringPiece& package)
+      : mPackage(package) {}
 
-    void visit(xml::Element* el) override {
-        for (xml::Attribute& attr : el->attributes) {
-            if (attr.namespaceUri == xml::kSchemaAndroid
-                    && mClassAttributes.find(attr.name) != mClassAttributes.end()) {
-                if (Maybe<std::string> newValue =
-                        util::getFullyQualifiedClassName(mPackage, attr.value)) {
-                    attr.value = std::move(newValue.value());
-                }
-            }
+  void visit(xml::Element* el) override {
+    for (xml::Attribute& attr : el->attributes) {
+      if (attr.namespaceUri == xml::kSchemaAndroid &&
+          mClassAttributes.find(attr.name) != mClassAttributes.end()) {
+        if (Maybe<std::string> newValue =
+                util::getFullyQualifiedClassName(mPackage, attr.value)) {
+          attr.value = std::move(newValue.value());
         }
-
-        // Super implementation to iterate over the children.
-        xml::Visitor::visit(el);
+      }
     }
 
-private:
-    StringPiece mPackage;
-    std::unordered_set<StringPiece> mClassAttributes = { "name" };
+    // Super implementation to iterate over the children.
+    xml::Visitor::visit(el);
+  }
+
+ private:
+  StringPiece mPackage;
+  std::unordered_set<StringPiece> mClassAttributes = {"name"};
 };
 
-static bool renameManifestPackage(const StringPiece& packageOverride, xml::Element* manifestEl) {
-    xml::Attribute* attr = manifestEl->findAttribute({}, "package");
+static bool renameManifestPackage(const StringPiece& packageOverride,
+                                  xml::Element* manifestEl) {
+  xml::Attribute* attr = manifestEl->findAttribute({}, "package");
 
-    // We've already verified that the manifest element is present, with a package name specified.
-    assert(attr);
+  // We've already verified that the manifest element is present, with a package
+  // name specified.
+  assert(attr);
 
-    std::string originalPackage = std::move(attr->value);
-    attr->value = packageOverride.toString();
+  std::string originalPackage = std::move(attr->value);
+  attr->value = packageOverride.toString();
 
-    FullyQualifiedClassNameVisitor visitor(originalPackage);
-    manifestEl->accept(&visitor);
-    return true;
+  FullyQualifiedClassNameVisitor visitor(originalPackage);
+  manifestEl->accept(&visitor);
+  return true;
 }
 
 bool ManifestFixer::consume(IAaptContext* context, xml::XmlResource* doc) {
-    xml::Element* root = xml::findRootElement(doc->root.get());
-    if (!root || !root->namespaceUri.empty() || root->name != "manifest") {
-        context->getDiagnostics()->error(DiagMessage(doc->file.source)
-                                         << "root tag must be <manifest>");
-        return false;
-    }
+  xml::Element* root = xml::findRootElement(doc->root.get());
+  if (!root || !root->namespaceUri.empty() || root->name != "manifest") {
+    context->getDiagnostics()->error(DiagMessage(doc->file.source)
+                                     << "root tag must be <manifest>");
+    return false;
+  }
 
-    if ((mOptions.minSdkVersionDefault || mOptions.targetSdkVersionDefault)
-            && root->findChild({}, "uses-sdk") == nullptr) {
-        // Auto insert a <uses-sdk> element.
-        std::unique_ptr<xml::Element> usesSdk = util::make_unique<xml::Element>();
-        usesSdk->name = "uses-sdk";
-        root->addChild(std::move(usesSdk));
-    }
+  if ((mOptions.minSdkVersionDefault || mOptions.targetSdkVersionDefault) &&
+      root->findChild({}, "uses-sdk") == nullptr) {
+    // Auto insert a <uses-sdk> element.
+    std::unique_ptr<xml::Element> usesSdk = util::make_unique<xml::Element>();
+    usesSdk->name = "uses-sdk";
+    root->addChild(std::move(usesSdk));
+  }
 
-    xml::XmlActionExecutor executor;
-    if (!buildRules(&executor, context->getDiagnostics())) {
-        return false;
-    }
+  xml::XmlActionExecutor executor;
+  if (!buildRules(&executor, context->getDiagnostics())) {
+    return false;
+  }
 
-    if (!executor.execute(xml::XmlActionExecutorPolicy::Whitelist, context->getDiagnostics(),
-                          doc)) {
-        return false;
-    }
+  if (!executor.execute(xml::XmlActionExecutorPolicy::Whitelist,
+                        context->getDiagnostics(), doc)) {
+    return false;
+  }
 
-    if (mOptions.renameManifestPackage) {
-        // Rename manifest package outside of the XmlActionExecutor.
-        // We need to extract the old package name and FullyQualify all class names.
-        if (!renameManifestPackage(mOptions.renameManifestPackage.value(), root)) {
-            return false;
-        }
+  if (mOptions.renameManifestPackage) {
+    // Rename manifest package outside of the XmlActionExecutor.
+    // We need to extract the old package name and FullyQualify all class names.
+    if (!renameManifestPackage(mOptions.renameManifestPackage.value(), root)) {
+      return false;
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h
index 2e81266..c3a114b 100644
--- a/tools/aapt2/link/ManifestFixer.h
+++ b/tools/aapt2/link/ManifestFixer.h
@@ -27,12 +27,12 @@
 namespace aapt {
 
 struct ManifestFixerOptions {
-    Maybe<std::string> minSdkVersionDefault;
-    Maybe<std::string> targetSdkVersionDefault;
-    Maybe<std::string> renameManifestPackage;
-    Maybe<std::string> renameInstrumentationTargetPackage;
-    Maybe<std::string> versionNameDefault;
-    Maybe<std::string> versionCodeDefault;
+  Maybe<std::string> minSdkVersionDefault;
+  Maybe<std::string> targetSdkVersionDefault;
+  Maybe<std::string> renameManifestPackage;
+  Maybe<std::string> renameInstrumentationTargetPackage;
+  Maybe<std::string> versionNameDefault;
+  Maybe<std::string> versionCodeDefault;
 };
 
 /**
@@ -40,18 +40,18 @@
  * where specified with ManifestFixerOptions.
  */
 class ManifestFixer : public IXmlResourceConsumer {
-public:
-    explicit ManifestFixer(const ManifestFixerOptions& options) : mOptions(options) {
-    }
+ public:
+  explicit ManifestFixer(const ManifestFixerOptions& options)
+      : mOptions(options) {}
 
-    bool consume(IAaptContext* context, xml::XmlResource* doc) override;
+  bool consume(IAaptContext* context, xml::XmlResource* doc) override;
 
-private:
-    bool buildRules(xml::XmlActionExecutor* executor, IDiagnostics* diag);
+ private:
+  bool buildRules(xml::XmlActionExecutor* executor, IDiagnostics* diag);
 
-    ManifestFixerOptions mOptions;
+  ManifestFixerOptions mOptions;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINK_MANIFESTFIXER_H */
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index 16ab9ab..dc78d98 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -23,254 +23,274 @@
 namespace aapt {
 
 struct ManifestFixerTest : public ::testing::Test {
-    std::unique_ptr<IAaptContext> mContext;
+  std::unique_ptr<IAaptContext> mContext;
 
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("android")
-                .setPackageId(0x01)
-                .setNameManglerPolicy(NameManglerPolicy{ "android" })
-                .addSymbolSource(test::StaticSymbolSourceBuilder()
-                        .addSymbol("android:attr/package", ResourceId(0x01010000),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
-                                        .build())
-                        .addSymbol("android:attr/minSdkVersion", ResourceId(0x01010001),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
-                                                     android::ResTable_map::TYPE_INTEGER)
-                                        .build())
-                        .addSymbol("android:attr/targetSdkVersion", ResourceId(0x01010002),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
-                                                     android::ResTable_map::TYPE_INTEGER)
-                                        .build())
-                        .addSymbol("android:string/str", ResourceId(0x01060000))
-                        .build())
-                .build();
-    }
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            .setCompilationPackage("android")
+            .setPackageId(0x01)
+            .setNameManglerPolicy(NameManglerPolicy{"android"})
+            .addSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .addSymbol(
+                        "android:attr/package", ResourceId(0x01010000),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING)
+                            .build())
+                    .addSymbol(
+                        "android:attr/minSdkVersion", ResourceId(0x01010001),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING |
+                                         android::ResTable_map::TYPE_INTEGER)
+                            .build())
+                    .addSymbol(
+                        "android:attr/targetSdkVersion", ResourceId(0x01010002),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING |
+                                         android::ResTable_map::TYPE_INTEGER)
+                            .build())
+                    .addSymbol("android:string/str", ResourceId(0x01060000))
+                    .build())
+            .build();
+  }
 
-    std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) {
-        return verifyWithOptions(str, {});
-    }
+  std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) {
+    return verifyWithOptions(str, {});
+  }
 
-    std::unique_ptr<xml::XmlResource> verifyWithOptions(const StringPiece& str,
-                                                        const ManifestFixerOptions& options) {
-        std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str);
-        ManifestFixer fixer(options);
-        if (fixer.consume(mContext.get(), doc.get())) {
-            return doc;
-        }
-        return {};
+  std::unique_ptr<xml::XmlResource> verifyWithOptions(
+      const StringPiece& str, const ManifestFixerOptions& options) {
+    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str);
+    ManifestFixer fixer(options);
+    if (fixer.consume(mContext.get(), doc.get())) {
+      return doc;
     }
+    return {};
+  }
 };
 
 TEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
-    EXPECT_EQ(nullptr, verify("<other-tag />"));
-    EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
-    EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
+  EXPECT_EQ(nullptr, verify("<other-tag />"));
+  EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
 }
 
 TEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
-    EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
-    EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
-    EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
-    EXPECT_EQ(nullptr, verify("<manifest package=\"com.android.google.Class$1\" />"));
-    EXPECT_EQ(nullptr,
-              verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
-                     "android:package=\"com.android\" />"));
-    EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
+  EXPECT_EQ(nullptr,
+            verify("<manifest package=\"com.android.google.Class$1\" />"));
+  EXPECT_EQ(nullptr, verify("<manifest "
+                            "xmlns:android=\"http://schemas.android.com/apk/"
+                            "res/android\" "
+                            "android:package=\"com.android\" />"));
+  EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
 }
 
 TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
-    ManifestFixerOptions options = { std::string("8"), std::string("22") };
+  ManifestFixerOptions options = {std::string("8"), std::string("22")};
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* el;
-    xml::Attribute* attr;
+  xml::Element* el;
+  xml::Attribute* attr;
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("7", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("21", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("7", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("21", attr->value);
 
-    doc = verifyWithOptions(R"EOF(
+  doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <uses-sdk android:targetSdkVersion="21" />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                          options);
+  ASSERT_NE(nullptr, doc);
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("8", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("21", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("8", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("21", attr->value);
 
-    doc = verifyWithOptions(R"EOF(
+  doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <uses-sdk />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                          options);
+  ASSERT_NE(nullptr, doc);
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("8", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("22", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("8", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("22", attr->value);
 
-    doc = verifyWithOptions(R"EOF(
+  doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-                package="android" />)EOF", options);
-    ASSERT_NE(nullptr, doc);
+                package="android" />)EOF",
+                          options);
+  ASSERT_NE(nullptr, doc);
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("8", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("22", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("8", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("22", attr->value);
 }
 
 TEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
-    ManifestFixerOptions options;
-    options.renameManifestPackage = std::string("com.android");
+  ManifestFixerOptions options;
+  options.renameManifestPackage = std::string("com.android");
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <application android:name=".MainApplication" text="hello">
           <activity android:name=".activity.Start" />
           <receiver android:name="com.google.android.Receiver" />
         </application>
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* manifestEl = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, manifestEl);
+  xml::Element* manifestEl = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, manifestEl);
 
-    xml::Attribute* attr = nullptr;
+  xml::Attribute* attr = nullptr;
 
-    attr = manifestEl->findAttribute({},"package");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("com.android"), attr->value);
+  attr = manifestEl->findAttribute({}, "package");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("com.android"), attr->value);
 
-    xml::Element* applicationEl = manifestEl->findChild({}, "application");
-    ASSERT_NE(nullptr, applicationEl);
+  xml::Element* applicationEl = manifestEl->findChild({}, "application");
+  ASSERT_NE(nullptr, applicationEl);
 
-    attr = applicationEl->findAttribute(xml::kSchemaAndroid, "name");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("android.MainApplication"), attr->value);
+  attr = applicationEl->findAttribute(xml::kSchemaAndroid, "name");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("android.MainApplication"), attr->value);
 
-    attr = applicationEl->findAttribute({}, "text");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("hello"), attr->value);
+  attr = applicationEl->findAttribute({}, "text");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("hello"), attr->value);
 
-    xml::Element* el;
-    el = applicationEl->findChild({}, "activity");
-    ASSERT_NE(nullptr, el);
+  xml::Element* el;
+  el = applicationEl->findChild({}, "activity");
+  ASSERT_NE(nullptr, el);
 
-    attr = el->findAttribute(xml::kSchemaAndroid, "name");
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ(std::string("android.activity.Start"), attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "name");
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(std::string("android.activity.Start"), attr->value);
 
-    el = applicationEl->findChild({}, "receiver");
-    ASSERT_NE(nullptr, el);
+  el = applicationEl->findChild({}, "receiver");
+  ASSERT_NE(nullptr, el);
 
-    attr = el->findAttribute(xml::kSchemaAndroid, "name");
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "name");
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
 }
 
-TEST_F(ManifestFixerTest, RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
-    ManifestFixerOptions options;
-    options.renameInstrumentationTargetPackage = std::string("com.android");
+TEST_F(ManifestFixerTest,
+       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
+  ManifestFixerOptions options;
+  options.renameInstrumentationTargetPackage = std::string("com.android");
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <instrumentation android:targetPackage="android" />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* manifestEl = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, manifestEl);
+  xml::Element* manifestEl = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, manifestEl);
 
-    xml::Element* instrumentationEl = manifestEl->findChild({}, "instrumentation");
-    ASSERT_NE(nullptr, instrumentationEl);
+  xml::Element* instrumentationEl =
+      manifestEl->findChild({}, "instrumentation");
+  ASSERT_NE(nullptr, instrumentationEl);
 
-    xml::Attribute* attr = instrumentationEl->findAttribute(xml::kSchemaAndroid, "targetPackage");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("com.android"), attr->value);
+  xml::Attribute* attr =
+      instrumentationEl->findAttribute(xml::kSchemaAndroid, "targetPackage");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("com.android"), attr->value);
 }
 
 TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
-    ManifestFixerOptions options;
-    options.versionNameDefault = std::string("Beta");
-    options.versionCodeDefault = std::string("0x10000000");
+  ManifestFixerOptions options;
+  options.versionNameDefault = std::string("Beta");
+  options.versionCodeDefault = std::string("0x10000000");
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-                package="android" />)EOF", options);
-    ASSERT_NE(nullptr, doc);
+                package="android" />)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* manifestEl = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, manifestEl);
+  xml::Element* manifestEl = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, manifestEl);
 
-    xml::Attribute* attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionName");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("Beta"), attr->value);
+  xml::Attribute* attr =
+      manifestEl->findAttribute(xml::kSchemaAndroid, "versionName");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("Beta"), attr->value);
 
-    attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("0x10000000"), attr->value);
+  attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("0x10000000"), attr->value);
 }
 
 TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
-    EXPECT_EQ(nullptr, verify("<manifest package=\"android\" coreApp=\"hello\" />"));
-    EXPECT_EQ(nullptr, verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
+  EXPECT_EQ(nullptr,
+            verify("<manifest package=\"android\" coreApp=\"hello\" />"));
+  EXPECT_EQ(nullptr,
+            verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
 
-    std::unique_ptr<xml::XmlResource> doc =
-            verify("<manifest package=\"android\" coreApp=\"true\" />");
-    ASSERT_NE(nullptr, doc);
+  std::unique_ptr<xml::XmlResource> doc =
+      verify("<manifest package=\"android\" coreApp=\"true\" />");
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
+  xml::Element* el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
 
-    EXPECT_EQ("manifest", el->name);
+  EXPECT_EQ("manifest", el->name);
 
-    xml::Attribute* attr = el->findAttribute("", "coreApp");
-    ASSERT_NE(nullptr, attr);
+  xml::Attribute* attr = el->findAttribute("", "coreApp");
+  ASSERT_NE(nullptr, attr);
 
-    EXPECT_NE(nullptr, attr->compiledValue);
-    EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(attr->compiledValue.get()));
+  EXPECT_NE(nullptr, attr->compiledValue);
+  EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(attr->compiledValue.get()));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/PrivateAttributeMover.cpp b/tools/aapt2/link/PrivateAttributeMover.cpp
index 3c8af4f..174b41f 100644
--- a/tools/aapt2/link/PrivateAttributeMover.cpp
+++ b/tools/aapt2/link/PrivateAttributeMover.cpp
@@ -25,56 +25,61 @@
 template <typename InputContainer, typename OutputIterator, typename Predicate>
 OutputIterator moveIf(InputContainer& inputContainer, OutputIterator result,
                       Predicate pred) {
-    const auto last = inputContainer.end();
-    auto newEnd = std::find_if(inputContainer.begin(), inputContainer.end(), pred);
-    if (newEnd == last) {
-        return result;
-    }
-
-    *result = std::move(*newEnd);
-
-    auto first = newEnd;
-    ++first;
-
-    for (; first != last; ++first) {
-        if (bool(pred(*first))) {
-            // We want to move this guy
-            *result = std::move(*first);
-            ++result;
-        } else {
-            // We want to keep this guy, but we will need to move it up the list to replace
-            // missing items.
-            *newEnd = std::move(*first);
-            ++newEnd;
-        }
-    }
-
-    inputContainer.erase(newEnd, last);
+  const auto last = inputContainer.end();
+  auto newEnd =
+      std::find_if(inputContainer.begin(), inputContainer.end(), pred);
+  if (newEnd == last) {
     return result;
-}
+  }
 
-bool PrivateAttributeMover::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        ResourceTableType* type = package->findType(ResourceType::kAttr);
-        if (!type) {
-            continue;
-        }
+  *result = std::move(*newEnd);
 
-        if (type->symbolStatus.state != SymbolState::kPublic) {
-            // No public attributes, so we can safely leave these private attributes where they are.
-            return true;
-        }
+  auto first = newEnd;
+  ++first;
 
-        ResourceTableType* privAttrType = package->findOrCreateType(ResourceType::kAttrPrivate);
-        assert(privAttrType->entries.empty());
-
-        moveIf(type->entries, std::back_inserter(privAttrType->entries),
-               [](const std::unique_ptr<ResourceEntry>& entry) -> bool {
-                   return entry->symbolStatus.state != SymbolState::kPublic;
-               });
-        break;
+  for (; first != last; ++first) {
+    if (bool(pred(*first))) {
+      // We want to move this guy
+      *result = std::move(*first);
+      ++result;
+    } else {
+      // We want to keep this guy, but we will need to move it up the list to
+      // replace
+      // missing items.
+      *newEnd = std::move(*first);
+      ++newEnd;
     }
-    return true;
+  }
+
+  inputContainer.erase(newEnd, last);
+  return result;
 }
 
-} // namespace aapt
+bool PrivateAttributeMover::consume(IAaptContext* context,
+                                    ResourceTable* table) {
+  for (auto& package : table->packages) {
+    ResourceTableType* type = package->findType(ResourceType::kAttr);
+    if (!type) {
+      continue;
+    }
+
+    if (type->symbolStatus.state != SymbolState::kPublic) {
+      // No public attributes, so we can safely leave these private attributes
+      // where they are.
+      return true;
+    }
+
+    ResourceTableType* privAttrType =
+        package->findOrCreateType(ResourceType::kAttrPrivate);
+    assert(privAttrType->entries.empty());
+
+    moveIf(type->entries, std::back_inserter(privAttrType->entries),
+           [](const std::unique_ptr<ResourceEntry>& entry) -> bool {
+             return entry->symbolStatus.state != SymbolState::kPublic;
+           });
+    break;
+  }
+  return true;
+}
+
+}  // namespace aapt
diff --git a/tools/aapt2/link/PrivateAttributeMover_test.cpp b/tools/aapt2/link/PrivateAttributeMover_test.cpp
index c9d1a08..a7a1013 100644
--- a/tools/aapt2/link/PrivateAttributeMover_test.cpp
+++ b/tools/aapt2/link/PrivateAttributeMover_test.cpp
@@ -20,56 +20,60 @@
 namespace aapt {
 
 TEST(PrivateAttributeMoverTest, MovePrivateAttributes) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/publicA")
-            .addSimple("android:attr/privateA")
-            .addSimple("android:attr/publicB")
-            .addSimple("android:attr/privateB")
-            .setSymbolState("android:attr/publicA", ResourceId(0x01010000), SymbolState::kPublic)
-            .setSymbolState("android:attr/publicB", ResourceId(0x01010000), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:attr/publicA")
+          .addSimple("android:attr/privateA")
+          .addSimple("android:attr/publicB")
+          .addSimple("android:attr/privateB")
+          .setSymbolState("android:attr/publicA", ResourceId(0x01010000),
+                          SymbolState::kPublic)
+          .setSymbolState("android:attr/publicB", ResourceId(0x01010000),
+                          SymbolState::kPublic)
+          .build();
 
-    PrivateAttributeMover mover;
-    ASSERT_TRUE(mover.consume(context.get(), table.get()));
+  PrivateAttributeMover mover;
+  ASSERT_TRUE(mover.consume(context.get(), table.get()));
 
-    ResourceTablePackage* package = table->findPackage("android");
-    ASSERT_NE(package, nullptr);
+  ResourceTablePackage* package = table->findPackage("android");
+  ASSERT_NE(package, nullptr);
 
-    ResourceTableType* type = package->findType(ResourceType::kAttr);
-    ASSERT_NE(type, nullptr);
-    ASSERT_EQ(type->entries.size(), 2u);
-    EXPECT_NE(type->findEntry("publicA"), nullptr);
-    EXPECT_NE(type->findEntry("publicB"), nullptr);
+  ResourceTableType* type = package->findType(ResourceType::kAttr);
+  ASSERT_NE(type, nullptr);
+  ASSERT_EQ(type->entries.size(), 2u);
+  EXPECT_NE(type->findEntry("publicA"), nullptr);
+  EXPECT_NE(type->findEntry("publicB"), nullptr);
 
-    type = package->findType(ResourceType::kAttrPrivate);
-    ASSERT_NE(type, nullptr);
-    ASSERT_EQ(type->entries.size(), 2u);
-    EXPECT_NE(type->findEntry("privateA"), nullptr);
-    EXPECT_NE(type->findEntry("privateB"), nullptr);
+  type = package->findType(ResourceType::kAttrPrivate);
+  ASSERT_NE(type, nullptr);
+  ASSERT_EQ(type->entries.size(), 2u);
+  EXPECT_NE(type->findEntry("privateA"), nullptr);
+  EXPECT_NE(type->findEntry("privateB"), nullptr);
 }
 
-TEST(PrivateAttributeMoverTest, LeavePrivateAttributesWhenNoPublicAttributesDefined) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+TEST(PrivateAttributeMoverTest,
+     LeavePrivateAttributesWhenNoPublicAttributesDefined) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/privateA")
-            .addSimple("android:attr/privateB")
-            .build();
+  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+                                             .addSimple("android:attr/privateA")
+                                             .addSimple("android:attr/privateB")
+                                             .build();
 
-    PrivateAttributeMover mover;
-    ASSERT_TRUE(mover.consume(context.get(), table.get()));
+  PrivateAttributeMover mover;
+  ASSERT_TRUE(mover.consume(context.get(), table.get()));
 
-    ResourceTablePackage* package = table->findPackage("android");
-    ASSERT_NE(package, nullptr);
+  ResourceTablePackage* package = table->findPackage("android");
+  ASSERT_NE(package, nullptr);
 
-    ResourceTableType* type = package->findType(ResourceType::kAttr);
-    ASSERT_NE(type, nullptr);
-    ASSERT_EQ(type->entries.size(), 2u);
+  ResourceTableType* type = package->findType(ResourceType::kAttr);
+  ASSERT_NE(type, nullptr);
+  ASSERT_EQ(type->entries.size(), 2u);
 
-    type = package->findType(ResourceType::kAttrPrivate);
-    ASSERT_EQ(type, nullptr);
+  type = package->findType(ResourceType::kAttrPrivate);
+  ASSERT_EQ(type, nullptr);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ProductFilter.cpp b/tools/aapt2/link/ProductFilter.cpp
index 8784e89..d59b682 100644
--- a/tools/aapt2/link/ProductFilter.cpp
+++ b/tools/aapt2/link/ProductFilter.cpp
@@ -18,101 +18,103 @@
 
 namespace aapt {
 
-ProductFilter::ResourceConfigValueIter
-ProductFilter::selectProductToKeep(const ResourceNameRef& name,
-                                   const ResourceConfigValueIter begin,
-                                   const ResourceConfigValueIter end,
-                                   IDiagnostics* diag) {
-    ResourceConfigValueIter defaultProductIter = end;
-    ResourceConfigValueIter selectedProductIter = end;
+ProductFilter::ResourceConfigValueIter ProductFilter::selectProductToKeep(
+    const ResourceNameRef& name, const ResourceConfigValueIter begin,
+    const ResourceConfigValueIter end, IDiagnostics* diag) {
+  ResourceConfigValueIter defaultProductIter = end;
+  ResourceConfigValueIter selectedProductIter = end;
 
-    for (ResourceConfigValueIter iter = begin; iter != end; ++iter) {
-        ResourceConfigValue* configValue = iter->get();
-        if (mProducts.find(configValue->product) != mProducts.end()) {
-            if (selectedProductIter != end) {
-                // We have two possible values for this product!
-                diag->error(DiagMessage(configValue->value->getSource())
-                            << "selection of product '" << configValue->product
-                            << "' for resource " << name << " is ambiguous");
+  for (ResourceConfigValueIter iter = begin; iter != end; ++iter) {
+    ResourceConfigValue* configValue = iter->get();
+    if (mProducts.find(configValue->product) != mProducts.end()) {
+      if (selectedProductIter != end) {
+        // We have two possible values for this product!
+        diag->error(DiagMessage(configValue->value->getSource())
+                    << "selection of product '" << configValue->product
+                    << "' for resource " << name << " is ambiguous");
 
-                ResourceConfigValue* previouslySelectedConfigValue = selectedProductIter->get();
-                diag->note(DiagMessage(previouslySelectedConfigValue->value->getSource())
-                           << "product '" << previouslySelectedConfigValue->product
-                           << "' is also a candidate");
-                return end;
-            }
-
-            // Select this product.
-            selectedProductIter = iter;
-        }
-
-        if (configValue->product.empty() || configValue->product == "default") {
-            if (defaultProductIter != end) {
-                // We have two possible default values.
-                diag->error(DiagMessage(configValue->value->getSource())
-                            << "multiple default products defined for resource " << name);
-
-                ResourceConfigValue* previouslyDefaultConfigValue = defaultProductIter->get();
-                diag->note(DiagMessage(previouslyDefaultConfigValue->value->getSource())
-                           << "default product also defined here");
-                return end;
-            }
-
-            // Mark the default.
-            defaultProductIter = iter;
-        }
-    }
-
-    if (defaultProductIter == end) {
-        diag->error(DiagMessage() << "no default product defined for resource " << name);
+        ResourceConfigValue* previouslySelectedConfigValue =
+            selectedProductIter->get();
+        diag->note(
+            DiagMessage(previouslySelectedConfigValue->value->getSource())
+            << "product '" << previouslySelectedConfigValue->product
+            << "' is also a candidate");
         return end;
+      }
+
+      // Select this product.
+      selectedProductIter = iter;
     }
 
-    if (selectedProductIter == end) {
-        selectedProductIter = defaultProductIter;
+    if (configValue->product.empty() || configValue->product == "default") {
+      if (defaultProductIter != end) {
+        // We have two possible default values.
+        diag->error(DiagMessage(configValue->value->getSource())
+                    << "multiple default products defined for resource "
+                    << name);
+
+        ResourceConfigValue* previouslyDefaultConfigValue =
+            defaultProductIter->get();
+        diag->note(DiagMessage(previouslyDefaultConfigValue->value->getSource())
+                   << "default product also defined here");
+        return end;
+      }
+
+      // Mark the default.
+      defaultProductIter = iter;
     }
-    return selectedProductIter;
+  }
+
+  if (defaultProductIter == end) {
+    diag->error(DiagMessage() << "no default product defined for resource "
+                              << name);
+    return end;
+  }
+
+  if (selectedProductIter == end) {
+    selectedProductIter = defaultProductIter;
+  }
+  return selectedProductIter;
 }
 
 bool ProductFilter::consume(IAaptContext* context, ResourceTable* table) {
-    bool error = false;
-    for (auto& pkg : table->packages) {
-        for (auto& type : pkg->types) {
-            for (auto& entry : type->entries) {
-                std::vector<std::unique_ptr<ResourceConfigValue>> newValues;
+  bool error = false;
+  for (auto& pkg : table->packages) {
+    for (auto& type : pkg->types) {
+      for (auto& entry : type->entries) {
+        std::vector<std::unique_ptr<ResourceConfigValue>> newValues;
 
-                ResourceConfigValueIter iter = entry->values.begin();
-                ResourceConfigValueIter startRangeIter = iter;
-                while (iter != entry->values.end()) {
-                    ++iter;
-                    if (iter == entry->values.end() ||
-                            (*iter)->config != (*startRangeIter)->config) {
-
-                        // End of the array, or we saw a different config,
-                        // so this must be the end of a range of products.
-                        // Select the product to keep from the set of products defined.
-                        ResourceNameRef name(pkg->name, type->type, entry->name);
-                        auto valueToKeep = selectProductToKeep(name, startRangeIter, iter,
-                                                               context->getDiagnostics());
-                        if (valueToKeep == iter) {
-                            // An error occurred, we could not pick a product.
-                            error = true;
-                        } else {
-                            // We selected a product to keep. Move it to the new array.
-                            newValues.push_back(std::move(*valueToKeep));
-                        }
-
-                        // Start the next range of products.
-                        startRangeIter = iter;
-                    }
-                }
-
-                // Now move the new values in to place.
-                entry->values = std::move(newValues);
+        ResourceConfigValueIter iter = entry->values.begin();
+        ResourceConfigValueIter startRangeIter = iter;
+        while (iter != entry->values.end()) {
+          ++iter;
+          if (iter == entry->values.end() ||
+              (*iter)->config != (*startRangeIter)->config) {
+            // End of the array, or we saw a different config,
+            // so this must be the end of a range of products.
+            // Select the product to keep from the set of products defined.
+            ResourceNameRef name(pkg->name, type->type, entry->name);
+            auto valueToKeep = selectProductToKeep(name, startRangeIter, iter,
+                                                   context->getDiagnostics());
+            if (valueToKeep == iter) {
+              // An error occurred, we could not pick a product.
+              error = true;
+            } else {
+              // We selected a product to keep. Move it to the new array.
+              newValues.push_back(std::move(*valueToKeep));
             }
+
+            // Start the next range of products.
+            startRangeIter = iter;
+          }
         }
+
+        // Now move the new values in to place.
+        entry->values = std::move(newValues);
+      }
     }
-    return !error;
+  }
+  return !error;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ProductFilter.h b/tools/aapt2/link/ProductFilter.h
index 7724e14..cc8b8c2 100644
--- a/tools/aapt2/link/ProductFilter.h
+++ b/tools/aapt2/link/ProductFilter.h
@@ -26,24 +26,25 @@
 namespace aapt {
 
 class ProductFilter {
-public:
-    using ResourceConfigValueIter = std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
+ public:
+  using ResourceConfigValueIter =
+      std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
 
-    explicit ProductFilter(std::unordered_set<std::string> products) : mProducts(products) { }
+  explicit ProductFilter(std::unordered_set<std::string> products)
+      : mProducts(products) {}
 
-    ResourceConfigValueIter selectProductToKeep(const ResourceNameRef& name,
-                                                const ResourceConfigValueIter begin,
-                                                const ResourceConfigValueIter end,
-                                                IDiagnostics* diag);
+  ResourceConfigValueIter selectProductToKeep(
+      const ResourceNameRef& name, const ResourceConfigValueIter begin,
+      const ResourceConfigValueIter end, IDiagnostics* diag);
 
-    bool consume(IAaptContext* context, ResourceTable* table);
+  bool consume(IAaptContext* context, ResourceTable* table);
 
-private:
-    std::unordered_set<std::string> mProducts;
+ private:
+  std::unordered_set<std::string> mProducts;
 
-    DISALLOW_COPY_AND_ASSIGN(ProductFilter);
+  DISALLOW_COPY_AND_ASSIGN(ProductFilter);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINK_PRODUCTFILTER_H */
diff --git a/tools/aapt2/link/ProductFilter_test.cpp b/tools/aapt2/link/ProductFilter_test.cpp
index a3376ac..7f78f8b 100644
--- a/tools/aapt2/link/ProductFilter_test.cpp
+++ b/tools/aapt2/link/ProductFilter_test.cpp
@@ -20,114 +20,110 @@
 namespace aapt {
 
 TEST(ProductFilterTest, SelectTwoProducts) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    const ConfigDescription land = test::parseConfigOrDie("land");
-    const ConfigDescription port = test::parseConfigOrDie("port");
+  const ConfigDescription land = test::parseConfigOrDie("land");
+  const ConfigDescription port = test::parseConfigOrDie("port");
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  land, "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("land/default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  land, "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("land/tablet.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), land, "",
+      test::ValueBuilder<Id>().setSource(Source("land/default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), land, "tablet",
+      test::ValueBuilder<Id>().setSource(Source("land/tablet.xml")).build(),
+      context->getDiagnostics()));
 
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  port, "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("port/default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  port, "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("port/tablet.xml")).build(),
-                                  context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), port, "",
+      test::ValueBuilder<Id>().setSource(Source("port/default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), port, "tablet",
+      test::ValueBuilder<Id>().setSource(Source("port/tablet.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({ "tablet" });
-    ASSERT_TRUE(filter.consume(context.get(), &table));
+  ProductFilter filter({"tablet"});
+  ASSERT_TRUE(filter.consume(context.get(), &table));
 
-    EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             land, ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             land, "tablet"));
-    EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             port, ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             port, "tablet"));
+  EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", land, ""));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", land, "tablet"));
+  EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", port, ""));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", port, "tablet"));
 }
 
 TEST(ProductFilterTest, SelectDefaultProduct) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("tablet.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "",
+      test::ValueBuilder<Id>().setSource(Source("default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "tablet",
+      test::ValueBuilder<Id>().setSource(Source("tablet.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({});
-    ASSERT_TRUE(filter.consume(context.get(), &table));
+  ProductFilter filter({});
+  ASSERT_TRUE(filter.consume(context.get(), &table));
 
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             ConfigDescription::defaultConfig(),
-                                                             ""));
-    EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             ConfigDescription::defaultConfig(),
-                                                             "tablet"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one",
+                         ConfigDescription::defaultConfig(), ""));
+  EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one",
+                         ConfigDescription::defaultConfig(), "tablet"));
 }
 
 TEST(ProductFilterTest, FailOnAmbiguousProduct) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("tablet.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "no-sdcard",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("no-sdcard.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "",
+      test::ValueBuilder<Id>().setSource(Source("default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "tablet",
+      test::ValueBuilder<Id>().setSource(Source("tablet.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "no-sdcard",
+      test::ValueBuilder<Id>().setSource(Source("no-sdcard.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({ "tablet", "no-sdcard" });
-    ASSERT_FALSE(filter.consume(context.get(), &table));
+  ProductFilter filter({"tablet", "no-sdcard"});
+  ASSERT_FALSE(filter.consume(context.get(), &table));
 }
 
 TEST(ProductFilterTest, FailOnMultipleDefaults) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source(".xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "default",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("default.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "",
+      test::ValueBuilder<Id>().setSource(Source(".xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "default",
+      test::ValueBuilder<Id>().setSource(Source("default.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({});
-    ASSERT_FALSE(filter.consume(context.get(), &table));
+  ProductFilter filter({});
+  ASSERT_FALSE(filter.consume(context.get(), &table));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index be7aca3..7fe0956 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "Diagnostics.h"
 #include "ReferenceLinker.h"
+#include "Diagnostics.h"
 #include "ResourceTable.h"
 #include "ResourceUtils.h"
 #include "ResourceValues.h"
@@ -34,302 +34,335 @@
 namespace {
 
 /**
- * The ReferenceLinkerVisitor will follow all references and make sure they point
- * to resources that actually exist, either in the local resource table, or as external
- * symbols. Once the target resource has been found, the ID of the resource will be assigned
+ * The ReferenceLinkerVisitor will follow all references and make sure they
+ * point
+ * to resources that actually exist, either in the local resource table, or as
+ * external
+ * symbols. Once the target resource has been found, the ID of the resource will
+ * be assigned
  * to the reference object.
  *
  * NOTE: All of the entries in the ResourceTable must be assigned IDs.
  */
 class ReferenceLinkerVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    ReferenceLinkerVisitor(IAaptContext* context, SymbolTable* symbols, StringPool* stringPool,
-                           xml::IPackageDeclStack* decl,CallSite* callSite) :
-            mContext(context), mSymbols(symbols), mPackageDecls(decl), mStringPool(stringPool),
-            mCallSite(callSite) {
+  ReferenceLinkerVisitor(IAaptContext* context, SymbolTable* symbols,
+                         StringPool* stringPool, xml::IPackageDeclStack* decl,
+                         CallSite* callSite)
+      : mContext(context),
+        mSymbols(symbols),
+        mPackageDecls(decl),
+        mStringPool(stringPool),
+        mCallSite(callSite) {}
+
+  void visit(Reference* ref) override {
+    if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mPackageDecls,
+                                        mCallSite)) {
+      mError = true;
+    }
+  }
+
+  /**
+   * We visit the Style specially because during this phase, values of
+   * attributes are
+   * all RawString values. Now that we are expected to resolve all symbols, we
+   * can
+   * lookup the attributes to find out which types are allowed for the
+   * attributes' values.
+   */
+  void visit(Style* style) override {
+    if (style->parent) {
+      visit(&style->parent.value());
     }
 
-    void visit(Reference* ref) override {
-        if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mPackageDecls, mCallSite)) {
-            mError = true;
-        }
-    }
+    for (Style::Entry& entry : style->entries) {
+      std::string errStr;
 
-    /**
-     * We visit the Style specially because during this phase, values of attributes are
-     * all RawString values. Now that we are expected to resolve all symbols, we can
-     * lookup the attributes to find out which types are allowed for the attributes' values.
-     */
-    void visit(Style* style) override {
-        if (style->parent) {
-            visit(&style->parent.value());
+      // Transform the attribute reference so that it is using the fully
+      // qualified package
+      // name. This will also mark the reference as being able to see private
+      // resources if
+      // there was a '*' in the reference or if the package came from the
+      // private namespace.
+      Reference transformedReference = entry.key;
+      transformReferenceFromNamespace(mPackageDecls,
+                                      mContext->getCompilationPackage(),
+                                      &transformedReference);
+
+      // Find the attribute in the symbol table and check if it is visible from
+      // this callsite.
+      const SymbolTable::Symbol* symbol =
+          ReferenceLinker::resolveAttributeCheckVisibility(
+              transformedReference, mContext->getNameMangler(), mSymbols,
+              mCallSite, &errStr);
+      if (symbol) {
+        // Assign our style key the correct ID.
+        // The ID may not exist.
+        entry.key.id = symbol->id;
+
+        // Try to convert the value to a more specific, typed value based on the
+        // attribute it is set to.
+        entry.value = parseValueWithAttribute(std::move(entry.value),
+                                              symbol->attribute.get());
+
+        // Link/resolve the final value (mostly if it's a reference).
+        entry.value->accept(this);
+
+        // Now verify that the type of this item is compatible with the
+        // attribute it
+        // is defined for. We pass `nullptr` as the DiagMessage so that this
+        // check is
+        // fast and we avoid creating a DiagMessage when the match is
+        // successful.
+        if (!symbol->attribute->matches(entry.value.get(), nullptr)) {
+          // The actual type of this item is incompatible with the attribute.
+          DiagMessage msg(entry.key.getSource());
+
+          // Call the matches method again, this time with a DiagMessage so we
+          // fill
+          // in the actual error message.
+          symbol->attribute->matches(entry.value.get(), &msg);
+          mContext->getDiagnostics()->error(msg);
+          mError = true;
         }
 
-        for (Style::Entry& entry : style->entries) {
-            std::string errStr;
+      } else {
+        DiagMessage msg(entry.key.getSource());
+        msg << "style attribute '";
+        ReferenceLinker::writeResourceName(&msg, entry.key,
+                                           transformedReference);
+        msg << "' " << errStr;
+        mContext->getDiagnostics()->error(msg);
+        mError = true;
+      }
+    }
+  }
 
-            // Transform the attribute reference so that it is using the fully qualified package
-            // name. This will also mark the reference as being able to see private resources if
-            // there was a '*' in the reference or if the package came from the private namespace.
-            Reference transformedReference = entry.key;
-            transformReferenceFromNamespace(mPackageDecls, mContext->getCompilationPackage(),
-                                            &transformedReference);
+  bool hasError() { return mError; }
 
-            // Find the attribute in the symbol table and check if it is visible from this callsite.
-            const SymbolTable::Symbol* symbol = ReferenceLinker::resolveAttributeCheckVisibility(
-                    transformedReference, mContext->getNameMangler(), mSymbols, mCallSite, &errStr);
-            if (symbol) {
-                // Assign our style key the correct ID.
-                // The ID may not exist.
-                entry.key.id = symbol->id;
+ private:
+  IAaptContext* mContext;
+  SymbolTable* mSymbols;
+  xml::IPackageDeclStack* mPackageDecls;
+  StringPool* mStringPool;
+  CallSite* mCallSite;
+  bool mError = false;
 
-                // Try to convert the value to a more specific, typed value based on the
-                // attribute it is set to.
-                entry.value = parseValueWithAttribute(std::move(entry.value),
-                                                      symbol->attribute.get());
+  /**
+   * Transform a RawString value into a more specific, appropriate value, based
+   * on the
+   * Attribute. If a non RawString value is passed in, this is an identity
+   * transform.
+   */
+  std::unique_ptr<Item> parseValueWithAttribute(std::unique_ptr<Item> value,
+                                                const Attribute* attr) {
+    if (RawString* rawString = valueCast<RawString>(value.get())) {
+      std::unique_ptr<Item> transformed =
+          ResourceUtils::tryParseItemForAttribute(*rawString->value, attr);
 
-                // Link/resolve the final value (mostly if it's a reference).
-                entry.value->accept(this);
-
-                // Now verify that the type of this item is compatible with the attribute it
-                // is defined for. We pass `nullptr` as the DiagMessage so that this check is
-                // fast and we avoid creating a DiagMessage when the match is successful.
-                if (!symbol->attribute->matches(entry.value.get(), nullptr)) {
-                    // The actual type of this item is incompatible with the attribute.
-                    DiagMessage msg(entry.key.getSource());
-
-                    // Call the matches method again, this time with a DiagMessage so we fill
-                    // in the actual error message.
-                    symbol->attribute->matches(entry.value.get(), &msg);
-                    mContext->getDiagnostics()->error(msg);
-                    mError = true;
-                }
-
-            } else {
-                DiagMessage msg(entry.key.getSource());
-                msg << "style attribute '";
-                ReferenceLinker::writeResourceName(&msg, entry.key, transformedReference);
-                msg << "' " << errStr;
-                mContext->getDiagnostics()->error(msg);
-                mError = true;
-            }
+      // If we could not parse as any specific type, try a basic STRING.
+      if (!transformed &&
+          (attr->typeMask & android::ResTable_map::TYPE_STRING)) {
+        util::StringBuilder stringBuilder;
+        stringBuilder.append(*rawString->value);
+        if (stringBuilder) {
+          transformed = util::make_unique<String>(
+              mStringPool->makeRef(stringBuilder.str()));
         }
-    }
+      }
 
-    bool hasError() {
-        return mError;
-    }
-
-private:
-    IAaptContext* mContext;
-    SymbolTable* mSymbols;
-    xml::IPackageDeclStack* mPackageDecls;
-    StringPool* mStringPool;
-    CallSite* mCallSite;
-    bool mError = false;
-
-    /**
-     * Transform a RawString value into a more specific, appropriate value, based on the
-     * Attribute. If a non RawString value is passed in, this is an identity transform.
-     */
-    std::unique_ptr<Item> parseValueWithAttribute(std::unique_ptr<Item> value,
-                                                  const Attribute* attr) {
-        if (RawString* rawString = valueCast<RawString>(value.get())) {
-            std::unique_ptr<Item> transformed =
-                    ResourceUtils::tryParseItemForAttribute(*rawString->value, attr);
-
-            // If we could not parse as any specific type, try a basic STRING.
-            if (!transformed && (attr->typeMask & android::ResTable_map::TYPE_STRING)) {
-                util::StringBuilder stringBuilder;
-                stringBuilder.append(*rawString->value);
-                if (stringBuilder) {
-                    transformed = util::make_unique<String>(
-                            mStringPool->makeRef(stringBuilder.str()));
-                }
-            }
-
-            if (transformed) {
-                return transformed;
-            }
-        };
-        return value;
-    }
+      if (transformed) {
+        return transformed;
+      }
+    };
+    return value;
+  }
 };
 
-} // namespace
+}  // namespace
 
 /**
- * The symbol is visible if it is public, or if the reference to it is requesting private access
+ * The symbol is visible if it is public, or if the reference to it is
+ * requesting private access
  * or if the callsite comes from the same package.
  */
-bool ReferenceLinker::isSymbolVisible(const SymbolTable::Symbol& symbol, const Reference& ref,
+bool ReferenceLinker::isSymbolVisible(const SymbolTable::Symbol& symbol,
+                                      const Reference& ref,
                                       const CallSite& callSite) {
-    if (!symbol.isPublic && !ref.privateReference) {
-        if (ref.name) {
-            return callSite.resource.package == ref.name.value().package;
-        } else if (ref.id && symbol.id) {
-            return ref.id.value().packageId() == symbol.id.value().packageId();
-        } else {
-            return false;
-        }
+  if (!symbol.isPublic && !ref.privateReference) {
+    if (ref.name) {
+      return callSite.resource.package == ref.name.value().package;
+    } else if (ref.id && symbol.id) {
+      return ref.id.value().packageId() == symbol.id.value().packageId();
+    } else {
+      return false;
     }
-    return true;
+  }
+  return true;
 }
 
-const SymbolTable::Symbol* ReferenceLinker::resolveSymbol(const Reference& reference,
-                                                          NameMangler* mangler,
-                                                          SymbolTable* symbols) {
-    if (reference.name) {
-        Maybe<ResourceName> mangled = mangler->mangleName(reference.name.value());
-        return symbols->findByName(mangled ? mangled.value() : reference.name.value());
-    } else if (reference.id) {
-        return symbols->findById(reference.id.value());
-    } else {
-        return nullptr;
-    }
+const SymbolTable::Symbol* ReferenceLinker::resolveSymbol(
+    const Reference& reference, NameMangler* mangler, SymbolTable* symbols) {
+  if (reference.name) {
+    Maybe<ResourceName> mangled = mangler->mangleName(reference.name.value());
+    return symbols->findByName(mangled ? mangled.value()
+                                       : reference.name.value());
+  } else if (reference.id) {
+    return symbols->findById(reference.id.value());
+  } else {
+    return nullptr;
+  }
 }
 
 const SymbolTable::Symbol* ReferenceLinker::resolveSymbolCheckVisibility(
-        const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
-        CallSite* callSite, std::string* outError) {
-    const SymbolTable::Symbol* symbol = resolveSymbol(reference, nameMangler, symbols);
-    if (!symbol) {
-        if (outError) *outError = "not found";
-        return nullptr;
-    }
+    const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
+    CallSite* callSite, std::string* outError) {
+  const SymbolTable::Symbol* symbol =
+      resolveSymbol(reference, nameMangler, symbols);
+  if (!symbol) {
+    if (outError) *outError = "not found";
+    return nullptr;
+  }
 
-    if (!isSymbolVisible(*symbol, reference, *callSite)) {
-        if (outError) *outError = "is private";
-        return nullptr;
-    }
-    return symbol;
+  if (!isSymbolVisible(*symbol, reference, *callSite)) {
+    if (outError) *outError = "is private";
+    return nullptr;
+  }
+  return symbol;
 }
 
 const SymbolTable::Symbol* ReferenceLinker::resolveAttributeCheckVisibility(
-        const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
-        CallSite* callSite, std::string* outError) {
-    const SymbolTable::Symbol* symbol = resolveSymbolCheckVisibility(reference, nameMangler,
-                                                                     symbols, callSite,
-                                                                     outError);
-    if (!symbol) {
-        return nullptr;
-    }
+    const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
+    CallSite* callSite, std::string* outError) {
+  const SymbolTable::Symbol* symbol = resolveSymbolCheckVisibility(
+      reference, nameMangler, symbols, callSite, outError);
+  if (!symbol) {
+    return nullptr;
+  }
 
-    if (!symbol->attribute) {
-        if (outError) *outError = "is not an attribute";
-        return nullptr;
-    }
-    return symbol;
+  if (!symbol->attribute) {
+    if (outError) *outError = "is not an attribute";
+    return nullptr;
+  }
+  return symbol;
 }
 
-Maybe<xml::AaptAttribute> ReferenceLinker::compileXmlAttribute(const Reference& reference,
-                                                               NameMangler* nameMangler,
-                                                               SymbolTable* symbols,
-                                                               CallSite* callSite,
-                                                               std::string* outError) {
-    const SymbolTable::Symbol* symbol = resolveSymbol(reference, nameMangler, symbols);
-    if (!symbol) {
-        if (outError) *outError = "not found";
-        return {};
-    }
+Maybe<xml::AaptAttribute> ReferenceLinker::compileXmlAttribute(
+    const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
+    CallSite* callSite, std::string* outError) {
+  const SymbolTable::Symbol* symbol =
+      resolveSymbol(reference, nameMangler, symbols);
+  if (!symbol) {
+    if (outError) *outError = "not found";
+    return {};
+  }
 
-    if (!symbol->attribute) {
-        if (outError) *outError = "is not an attribute";
-        return {};
-    }
-    return xml::AaptAttribute{ symbol->id, *symbol->attribute };
+  if (!symbol->attribute) {
+    if (outError) *outError = "is not an attribute";
+    return {};
+  }
+  return xml::AaptAttribute{symbol->id, *symbol->attribute};
 }
 
-void ReferenceLinker::writeResourceName(DiagMessage* outMsg, const Reference& orig,
+void ReferenceLinker::writeResourceName(DiagMessage* outMsg,
+                                        const Reference& orig,
                                         const Reference& transformed) {
-    assert(outMsg);
+  assert(outMsg);
 
-    if (orig.name) {
-        *outMsg << orig.name.value();
-        if (transformed.name.value() != orig.name.value()) {
-            *outMsg << " (aka " << transformed.name.value() << ")";
-        }
-    } else {
-        *outMsg << orig.id.value();
+  if (orig.name) {
+    *outMsg << orig.name.value();
+    if (transformed.name.value() != orig.name.value()) {
+      *outMsg << " (aka " << transformed.name.value() << ")";
     }
+  } else {
+    *outMsg << orig.id.value();
+  }
 }
 
 bool ReferenceLinker::linkReference(Reference* reference, IAaptContext* context,
-                                    SymbolTable* symbols, xml::IPackageDeclStack* decls,
+                                    SymbolTable* symbols,
+                                    xml::IPackageDeclStack* decls,
                                     CallSite* callSite) {
-    assert(reference);
-    assert(reference->name || reference->id);
+  assert(reference);
+  assert(reference->name || reference->id);
 
-    Reference transformedReference = *reference;
-    transformReferenceFromNamespace(decls, context->getCompilationPackage(),
-                                    &transformedReference);
+  Reference transformedReference = *reference;
+  transformReferenceFromNamespace(decls, context->getCompilationPackage(),
+                                  &transformedReference);
 
-    std::string errStr;
-    const SymbolTable::Symbol* s = resolveSymbolCheckVisibility(
-            transformedReference, context->getNameMangler(), symbols, callSite, &errStr);
-    if (s) {
-        // The ID may not exist. This is fine because of the possibility of building against
-        // libraries without assigned IDs.
-        // Ex: Linking against own resources when building a static library.
-        reference->id = s->id;
-        return true;
-    }
+  std::string errStr;
+  const SymbolTable::Symbol* s = resolveSymbolCheckVisibility(
+      transformedReference, context->getNameMangler(), symbols, callSite,
+      &errStr);
+  if (s) {
+    // The ID may not exist. This is fine because of the possibility of building
+    // against
+    // libraries without assigned IDs.
+    // Ex: Linking against own resources when building a static library.
+    reference->id = s->id;
+    return true;
+  }
 
-    DiagMessage errorMsg(reference->getSource());
-    errorMsg << "resource ";
-    writeResourceName(&errorMsg, *reference, transformedReference);
-    errorMsg << " " << errStr;
-    context->getDiagnostics()->error(errorMsg);
-    return false;
+  DiagMessage errorMsg(reference->getSource());
+  errorMsg << "resource ";
+  writeResourceName(&errorMsg, *reference, transformedReference);
+  errorMsg << " " << errStr;
+  context->getDiagnostics()->error(errorMsg);
+  return false;
 }
 
 namespace {
 
 struct EmptyDeclStack : public xml::IPackageDeclStack {
-    Maybe<xml::ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const override {
-        if (alias.empty()) {
-            return xml::ExtractedPackage{ localPackage.toString(), true /* private */ };
-        }
-        return {};
+  Maybe<xml::ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias,
+      const StringPiece& localPackage) const override {
+    if (alias.empty()) {
+      return xml::ExtractedPackage{localPackage.toString(), true /* private */};
     }
+    return {};
+  }
 };
 
-} // namespace
+}  // namespace
 
 bool ReferenceLinker::consume(IAaptContext* context, ResourceTable* table) {
-    EmptyDeclStack declStack;
-    bool error = false;
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                // Symbol state information may be lost if there is no value for the resource.
-                if (entry->symbolStatus.state != SymbolState::kUndefined && entry->values.empty()) {
-                    context->getDiagnostics()->error(
-                            DiagMessage(entry->symbolStatus.source)
-                            << "no definition for declared symbol '"
-                            << ResourceNameRef(package->name, type->type, entry->name)
-                            << "'");
-                    error = true;
-                }
-
-                CallSite callSite = { ResourceNameRef(package->name, type->type, entry->name) };
-                ReferenceLinkerVisitor visitor(context, context->getExternalSymbols(),
-                                               &table->stringPool, &declStack, &callSite);
-
-                for (auto& configValue : entry->values) {
-                    configValue->value->accept(&visitor);
-                }
-
-                if (visitor.hasError()) {
-                    error = true;
-                }
-            }
+  EmptyDeclStack declStack;
+  bool error = false;
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        // Symbol state information may be lost if there is no value for the
+        // resource.
+        if (entry->symbolStatus.state != SymbolState::kUndefined &&
+            entry->values.empty()) {
+          context->getDiagnostics()->error(
+              DiagMessage(entry->symbolStatus.source)
+              << "no definition for declared symbol '"
+              << ResourceNameRef(package->name, type->type, entry->name)
+              << "'");
+          error = true;
         }
+
+        CallSite callSite = {
+            ResourceNameRef(package->name, type->type, entry->name)};
+        ReferenceLinkerVisitor visitor(context, context->getExternalSymbols(),
+                                       &table->stringPool, &declStack,
+                                       &callSite);
+
+        for (auto& configValue : entry->values) {
+          configValue->value->accept(&visitor);
+        }
+
+        if (visitor.hasError()) {
+          error = true;
+        }
+      }
     }
-    return !error;
+  }
+  return !error;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.h b/tools/aapt2/link/ReferenceLinker.h
index 7993aaf..8f6604f 100644
--- a/tools/aapt2/link/ReferenceLinker.h
+++ b/tools/aapt2/link/ReferenceLinker.h
@@ -30,77 +30,86 @@
 namespace aapt {
 
 /**
- * Resolves all references to resources in the ResourceTable and assigns them IDs.
+ * Resolves all references to resources in the ResourceTable and assigns them
+ * IDs.
  * The ResourceTable must already have IDs assigned to each resource.
- * Once the ResourceTable is processed by this linker, it is ready to be flattened.
+ * Once the ResourceTable is processed by this linker, it is ready to be
+ * flattened.
  */
 struct ReferenceLinker : public IResourceTableConsumer {
-    /**
-     * Returns true if the symbol is visible by the reference and from the callsite.
-     */
-    static bool isSymbolVisible(const SymbolTable::Symbol& symbol, const Reference& ref,
-                                const CallSite& callSite);
+  /**
+   * Returns true if the symbol is visible by the reference and from the
+   * callsite.
+   */
+  static bool isSymbolVisible(const SymbolTable::Symbol& symbol,
+                              const Reference& ref, const CallSite& callSite);
 
-    /**
-     * Performs name mangling and looks up the resource in the symbol table. Returns nullptr
-     * if the symbol was not found.
-     */
-    static const SymbolTable::Symbol* resolveSymbol(const Reference& reference,
-                                                    NameMangler* mangler, SymbolTable* symbols);
+  /**
+   * Performs name mangling and looks up the resource in the symbol table.
+   * Returns nullptr
+   * if the symbol was not found.
+   */
+  static const SymbolTable::Symbol* resolveSymbol(const Reference& reference,
+                                                  NameMangler* mangler,
+                                                  SymbolTable* symbols);
 
-    /**
-     * Performs name mangling and looks up the resource in the symbol table. If the symbol is
-     * not visible by the reference at the callsite, nullptr is returned. outError holds
-     * the error message.
-     */
-    static const SymbolTable::Symbol* resolveSymbolCheckVisibility(const Reference& reference,
-                                                                   NameMangler* nameMangler,
-                                                                   SymbolTable* symbols,
-                                                                   CallSite* callSite,
-                                                                   std::string* outError);
+  /**
+   * Performs name mangling and looks up the resource in the symbol table. If
+   * the symbol is
+   * not visible by the reference at the callsite, nullptr is returned. outError
+   * holds
+   * the error message.
+   */
+  static const SymbolTable::Symbol* resolveSymbolCheckVisibility(
+      const Reference& reference, NameMangler* nameMangler,
+      SymbolTable* symbols, CallSite* callSite, std::string* outError);
 
-    /**
-     * Same as resolveSymbolCheckVisibility(), but also makes sure the symbol is an attribute.
-     * That is, the return value will have a non-null value for ISymbolTable::Symbol::attribute.
-     */
-    static const SymbolTable::Symbol* resolveAttributeCheckVisibility(const Reference& reference,
-                                                                      NameMangler* nameMangler,
-                                                                      SymbolTable* symbols,
-                                                                      CallSite* callSite,
-                                                                      std::string* outError);
+  /**
+   * Same as resolveSymbolCheckVisibility(), but also makes sure the symbol is
+   * an attribute.
+   * That is, the return value will have a non-null value for
+   * ISymbolTable::Symbol::attribute.
+   */
+  static const SymbolTable::Symbol* resolveAttributeCheckVisibility(
+      const Reference& reference, NameMangler* nameMangler,
+      SymbolTable* symbols, CallSite* callSite, std::string* outError);
 
-    /**
-     * Resolves the attribute reference and returns an xml::AaptAttribute if successful.
-     * If resolution fails, outError holds the error message.
-     */
-    static Maybe<xml::AaptAttribute> compileXmlAttribute(const Reference& reference,
-                                                         NameMangler* nameMangler,
-                                                         SymbolTable* symbols,
-                                                         CallSite* callSite,
-                                                         std::string* outError);
+  /**
+   * Resolves the attribute reference and returns an xml::AaptAttribute if
+   * successful.
+   * If resolution fails, outError holds the error message.
+   */
+  static Maybe<xml::AaptAttribute> compileXmlAttribute(
+      const Reference& reference, NameMangler* nameMangler,
+      SymbolTable* symbols, CallSite* callSite, std::string* outError);
 
-    /**
-     * Writes the resource name to the DiagMessage, using the "orig_name (aka <transformed_name>)"
-     * syntax.
-     */
-    static void writeResourceName(DiagMessage* outMsg, const Reference& orig,
-                                  const Reference& transformed);
+  /**
+   * Writes the resource name to the DiagMessage, using the "orig_name (aka
+   * <transformed_name>)"
+   * syntax.
+   */
+  static void writeResourceName(DiagMessage* outMsg, const Reference& orig,
+                                const Reference& transformed);
 
-    /**
-     * Transforms the package name of the reference to the fully qualified package name using
-     * the xml::IPackageDeclStack, then mangles and looks up the symbol. If the symbol is visible
-     * to the reference at the callsite, the reference is updated with an ID.
-     * Returns false on failure, and an error message is logged to the IDiagnostics in the context.
-     */
-    static bool linkReference(Reference* reference, IAaptContext* context, SymbolTable* symbols,
-                              xml::IPackageDeclStack* decls, CallSite* callSite);
+  /**
+   * Transforms the package name of the reference to the fully qualified package
+   * name using
+   * the xml::IPackageDeclStack, then mangles and looks up the symbol. If the
+   * symbol is visible
+   * to the reference at the callsite, the reference is updated with an ID.
+   * Returns false on failure, and an error message is logged to the
+   * IDiagnostics in the context.
+   */
+  static bool linkReference(Reference* reference, IAaptContext* context,
+                            SymbolTable* symbols, xml::IPackageDeclStack* decls,
+                            CallSite* callSite);
 
-    /**
-     * Links all references in the ResourceTable.
-     */
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  /**
+   * Links all references in the ResourceTable.
+   */
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINKER_REFERENCELINKER_H */
diff --git a/tools/aapt2/link/ReferenceLinker_test.cpp b/tools/aapt2/link/ReferenceLinker_test.cpp
index 5c1511f..8aa3616 100644
--- a/tools/aapt2/link/ReferenceLinker_test.cpp
+++ b/tools/aapt2/link/ReferenceLinker_test.cpp
@@ -22,206 +22,238 @@
 namespace aapt {
 
 TEST(ReferenceLinkerTest, LinkSimpleReferences) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
-                          "com.app.test:string/bar")
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
+                        "com.app.test:string/bar")
 
-            // Test use of local reference (w/o package name).
-            .addReference("com.app.test:string/bar", ResourceId(0x7f020001), "string/baz")
+          // Test use of local reference (w/o package name).
+          .addReference("com.app.test:string/bar", ResourceId(0x7f020001),
+                        "string/baz")
 
-            .addReference("com.app.test:string/baz", ResourceId(0x7f020002),
-                          "android:string/ok")
-            .build();
+          .addReference("com.app.test:string/baz", ResourceId(0x7f020002),
+                        "android:string/ok")
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addPublicSymbol("android:string/ok", ResourceId(0x01040034))
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addPublicSymbol("android:string/ok", ResourceId(0x01040034))
+                  .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(context.get(), table.get()));
 
-    Reference* ref = test::getValue<Reference>(table.get(), "com.app.test:string/foo");
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
+  Reference* ref =
+      test::getValue<Reference>(table.get(), "com.app.test:string/foo");
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
 
-    ref = test::getValue<Reference>(table.get(), "com.app.test:string/bar");
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020002));
+  ref = test::getValue<Reference>(table.get(), "com.app.test:string/bar");
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020002));
 
-    ref = test::getValue<Reference>(table.get(), "com.app.test:string/baz");
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x01040034));
+  ref = test::getValue<Reference>(table.get(), "com.app.test:string/baz");
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x01040034));
 }
 
 TEST(ReferenceLinkerTest, LinkStyleAttributes) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addValue("com.app.test:style/Theme", test::StyleBuilder()
-                    .setParent("android:style/Theme.Material")
-                    .addItem("android:attr/foo", ResourceUtils::tryParseColor("#ff00ff"))
-                    .addItem("android:attr/bar", {} /* placeholder */)
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addValue("com.app.test:style/Theme",
+                    test::StyleBuilder()
+                        .setParent("android:style/Theme.Material")
+                        .addItem("android:attr/foo",
+                                 ResourceUtils::tryParseColor("#ff00ff"))
+                        .addItem("android:attr/bar", {} /* placeholder */)
+                        .build())
+          .build();
 
-    {
-        // We need to fill in the value for the attribute android:attr/bar after we build the
-        // table, because we need access to the string pool.
-        Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
-        ASSERT_NE(style, nullptr);
-        style->entries.back().value = util::make_unique<RawString>(
-                table->stringPool.makeRef("one|two"));
-    }
-
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addPublicSymbol("android:style/Theme.Material",
-                                                      ResourceId(0x01060000))
-                                     .addPublicSymbol("android:attr/foo", ResourceId(0x01010001),
-                                                      test::AttributeBuilder()
-                                                              .setTypeMask(ResTable_map::TYPE_COLOR)
-                                                              .build())
-                                     .addPublicSymbol("android:attr/bar", ResourceId(0x01010002),
-                                                      test::AttributeBuilder()
-                                                              .setTypeMask(ResTable_map::TYPE_FLAGS)
-                                                              .addItem("one", 0x01)
-                                                              .addItem("two", 0x02)
-                                                              .build())
-                                     .build())
-            .build();
-
-    ReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(context.get(), table.get()));
-
-    Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
+  {
+    // We need to fill in the value for the attribute android:attr/bar after we
+    // build the
+    // table, because we need access to the string pool.
+    Style* style =
+        test::getValue<Style>(table.get(), "com.app.test:style/Theme");
     ASSERT_NE(style, nullptr);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().id);
-    EXPECT_EQ(style->parent.value().id.value(), ResourceId(0x01060000));
+    style->entries.back().value =
+        util::make_unique<RawString>(table->stringPool.makeRef("one|two"));
+  }
 
-    ASSERT_EQ(2u, style->entries.size());
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addPublicSymbol("android:style/Theme.Material",
+                                   ResourceId(0x01060000))
+                  .addPublicSymbol("android:attr/foo", ResourceId(0x01010001),
+                                   test::AttributeBuilder()
+                                       .setTypeMask(ResTable_map::TYPE_COLOR)
+                                       .build())
+                  .addPublicSymbol("android:attr/bar", ResourceId(0x01010002),
+                                   test::AttributeBuilder()
+                                       .setTypeMask(ResTable_map::TYPE_FLAGS)
+                                       .addItem("one", 0x01)
+                                       .addItem("two", 0x02)
+                                       .build())
+                  .build())
+          .build();
 
-    AAPT_ASSERT_TRUE(style->entries[0].key.id);
-    EXPECT_EQ(style->entries[0].key.id.value(), ResourceId(0x01010001));
-    ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[0].value.get()), nullptr);
+  ReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(context.get(), table.get()));
 
-    AAPT_ASSERT_TRUE(style->entries[1].key.id);
-    EXPECT_EQ(style->entries[1].key.id.value(), ResourceId(0x01010002));
-    ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[1].value.get()), nullptr);
+  Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
+  ASSERT_NE(style, nullptr);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().id);
+  EXPECT_EQ(style->parent.value().id.value(), ResourceId(0x01060000));
+
+  ASSERT_EQ(2u, style->entries.size());
+
+  AAPT_ASSERT_TRUE(style->entries[0].key.id);
+  EXPECT_EQ(style->entries[0].key.id.value(), ResourceId(0x01010001));
+  ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[0].value.get()), nullptr);
+
+  AAPT_ASSERT_TRUE(style->entries[1].key.id);
+  EXPECT_EQ(style->entries[1].key.id.value(), ResourceId(0x01010002));
+  ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[1].value.get()), nullptr);
 }
 
 TEST(ReferenceLinkerTest, LinkMangledReferencesAndAttributes) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test", { "com.android.support" } })
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addPublicSymbol("com.app.test:attr/com.android.support$foo",
-                                                      ResourceId(0x7f010000),
-                                                      test::AttributeBuilder()
-                                                              .setTypeMask(ResTable_map::TYPE_COLOR)
-                                                              .build())
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(
+              NameManglerPolicy{"com.app.test", {"com.android.support"}})
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addPublicSymbol("com.app.test:attr/com.android.support$foo",
+                                   ResourceId(0x7f010000),
+                                   test::AttributeBuilder()
+                                       .setTypeMask(ResTable_map::TYPE_COLOR)
+                                       .build())
+                  .build())
+          .build();
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addValue("com.app.test:style/Theme", ResourceId(0x7f020000),
-                      test::StyleBuilder().addItem("com.android.support:attr/foo",
-                                                   ResourceUtils::tryParseColor("#ff0000"))
-                                          .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addValue("com.app.test:style/Theme", ResourceId(0x7f020000),
+                    test::StyleBuilder()
+                        .addItem("com.android.support:attr/foo",
+                                 ResourceUtils::tryParseColor("#ff0000"))
+                        .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(context.get(), table.get()));
 
-    Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(1u, style->entries.size());
-    AAPT_ASSERT_TRUE(style->entries.front().key.id);
-    EXPECT_EQ(style->entries.front().key.id.value(), ResourceId(0x7f010000));
+  Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(1u, style->entries.size());
+  AAPT_ASSERT_TRUE(style->entries.front().key.id);
+  EXPECT_EQ(style->entries.front().key.id.value(), ResourceId(0x7f010000));
 }
 
 TEST(ReferenceLinkerTest, FailToLinkPrivateSymbols) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
-                          "android:string/hidden")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
+                        "android:string/hidden")
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addSymbol("android:string/hidden", ResourceId(0x01040034))
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addSymbol("android:string/hidden", ResourceId(0x01040034))
+                  .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(context.get(), table.get()));
 }
 
 TEST(ReferenceLinkerTest, FailToLinkPrivateMangledSymbols) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
-                          "com.app.lib:string/hidden")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
+                        "com.app.lib:string/hidden")
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test", { "com.app.lib" } })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addSymbol("com.app.test:string/com.app.lib$hidden",
-                                                ResourceId(0x7f040034))
-                                     .build())
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(
+              NameManglerPolicy{"com.app.test", {"com.app.lib"}})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addSymbol("com.app.test:string/com.app.lib$hidden",
+                             ResourceId(0x7f040034))
+                  .build())
 
-            .build();
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(context.get(), table.get()));
 }
 
 TEST(ReferenceLinkerTest, FailToLinkPrivateStyleAttributes) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addValue("com.app.test:style/Theme", test::StyleBuilder()
-                    .addItem("android:attr/hidden", ResourceUtils::tryParseColor("#ff00ff"))
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addValue("com.app.test:style/Theme",
+                    test::StyleBuilder()
+                        .addItem("android:attr/hidden",
+                                 ResourceUtils::tryParseColor("#ff00ff"))
+                        .build())
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addSymbol("android:attr/hidden", ResourceId(0x01010001),
-                                                test::AttributeBuilder()
-                                                        .setTypeMask(
-                                                                android::ResTable_map::TYPE_COLOR)
-                                                        .build())
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addSymbol("android:attr/hidden", ResourceId(0x01010001),
+                             test::AttributeBuilder()
+                                 .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                                 .build())
+                  .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(context.get(), table.get()));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ResourceDeduper.cpp b/tools/aapt2/link/ResourceDeduper.cpp
index 0276261..f565359 100644
--- a/tools/aapt2/link/ResourceDeduper.cpp
+++ b/tools/aapt2/link/ResourceDeduper.cpp
@@ -36,79 +36,81 @@
  *    an equivalent entry value.
  */
 class DominatedKeyValueRemover : public DominatorTree::BottomUpVisitor {
-public:
-    using Node = DominatorTree::Node;
+ public:
+  using Node = DominatorTree::Node;
 
-    explicit DominatedKeyValueRemover(IAaptContext* context, ResourceEntry* entry) :
-            mContext(context), mEntry(entry) {
+  explicit DominatedKeyValueRemover(IAaptContext* context, ResourceEntry* entry)
+      : mContext(context), mEntry(entry) {}
+
+  void visitConfig(Node* node) {
+    Node* parent = node->parent();
+    if (!parent) {
+      return;
+    }
+    ResourceConfigValue* nodeValue = node->value();
+    ResourceConfigValue* parentValue = parent->value();
+    if (!nodeValue || !parentValue) {
+      return;
+    }
+    if (!nodeValue->value->equals(parentValue->value.get())) {
+      return;
     }
 
-    void visitConfig(Node* node) {
-        Node* parent = node->parent();
-        if (!parent) {
-            return;
-        }
-        ResourceConfigValue* nodeValue = node->value();
-        ResourceConfigValue* parentValue = parent->value();
-        if (!nodeValue || !parentValue) {
-            return;
-        }
-        if (!nodeValue->value->equals(parentValue->value.get())) {
-            return;
-        }
-
-        // Compare compatible configs for this entry and ensure the values are
-        // equivalent.
-        const ConfigDescription& nodeConfiguration = nodeValue->config;
-        for (const auto& sibling : mEntry->values) {
-            if (!sibling->value) {
-                // Sibling was already removed.
-                continue;
-            }
-            if (nodeConfiguration.isCompatibleWith(sibling->config)
-                    && !nodeValue->value->equals(sibling->value.get())) {
-                // The configurations are compatible, but the value is
-                // different, so we can't remove this value.
-                return;
-            }
-        }
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(
-                    DiagMessage(nodeValue->value->getSource())
-                            << "removing dominated duplicate resource with name \""
-                            << mEntry->name << "\"");
-        }
-        nodeValue->value = {};
+    // Compare compatible configs for this entry and ensure the values are
+    // equivalent.
+    const ConfigDescription& nodeConfiguration = nodeValue->config;
+    for (const auto& sibling : mEntry->values) {
+      if (!sibling->value) {
+        // Sibling was already removed.
+        continue;
+      }
+      if (nodeConfiguration.isCompatibleWith(sibling->config) &&
+          !nodeValue->value->equals(sibling->value.get())) {
+        // The configurations are compatible, but the value is
+        // different, so we can't remove this value.
+        return;
+      }
     }
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(
+          DiagMessage(nodeValue->value->getSource())
+          << "removing dominated duplicate resource with name \""
+          << mEntry->name << "\"");
+    }
+    nodeValue->value = {};
+  }
 
-private:
-    IAaptContext* mContext;
-    ResourceEntry* mEntry;
+ private:
+  IAaptContext* mContext;
+  ResourceEntry* mEntry;
 };
 
 static void dedupeEntry(IAaptContext* context, ResourceEntry* entry) {
-    DominatorTree tree(entry->values);
-    DominatedKeyValueRemover remover(context, entry);
-    tree.accept(&remover);
+  DominatorTree tree(entry->values);
+  DominatedKeyValueRemover remover(context, entry);
+  tree.accept(&remover);
 
-    // Erase the values that were removed.
-    entry->values.erase(std::remove_if(entry->values.begin(), entry->values.end(),
-            [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
-        return val == nullptr || val->value == nullptr;
-    }), entry->values.end());
+  // Erase the values that were removed.
+  entry->values.erase(
+      std::remove_if(
+          entry->values.begin(), entry->values.end(),
+          [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
+            return val == nullptr || val->value == nullptr;
+          }),
+      entry->values.end());
 }
 
-} // namespace
+}  // namespace
 
 bool ResourceDeduper::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                dedupeEntry(context, entry.get());
-            }
-        }
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        dedupeEntry(context, entry.get());
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // aapt
+}  // aapt
diff --git a/tools/aapt2/link/ResourceDeduper_test.cpp b/tools/aapt2/link/ResourceDeduper_test.cpp
index 47071a51..7e2d476 100644
--- a/tools/aapt2/link/ResourceDeduper_test.cpp
+++ b/tools/aapt2/link/ResourceDeduper_test.cpp
@@ -21,63 +21,63 @@
 namespace aapt {
 
 TEST(ResourceDeduperTest, SameValuesAreDeduped) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription enConfig = test::parseConfigOrDie("en");
-    const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
-    // Chosen because this configuration is compatible with en.
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription enConfig = test::parseConfigOrDie("en");
+  const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
+  // Chosen because this configuration is compatible with en.
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addString("android:string/dedupe", ResourceId{}, defaultConfig, "dedupe")
-            .addString("android:string/dedupe", ResourceId{}, enConfig, "dedupe")
-            .addString("android:string/dedupe", ResourceId{}, landConfig, "dedupe")
-            .addString("android:string/dedupe2", ResourceId{}, defaultConfig, "dedupe")
-            .addString("android:string/dedupe2", ResourceId{}, enConfig, "dedupe")
-            .addString("android:string/dedupe2", ResourceId{}, enV21Config, "keep")
-            .addString("android:string/dedupe2", ResourceId{}, landConfig, "dedupe")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addString("android:string/dedupe", ResourceId{}, defaultConfig,
+                     "dedupe")
+          .addString("android:string/dedupe", ResourceId{}, enConfig, "dedupe")
+          .addString("android:string/dedupe", ResourceId{}, landConfig,
+                     "dedupe")
+          .addString("android:string/dedupe2", ResourceId{}, defaultConfig,
+                     "dedupe")
+          .addString("android:string/dedupe2", ResourceId{}, enConfig, "dedupe")
+          .addString("android:string/dedupe2", ResourceId{}, enV21Config,
+                     "keep")
+          .addString("android:string/dedupe2", ResourceId{}, landConfig,
+                     "dedupe")
+          .build();
 
-    ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
-    EXPECT_EQ(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe", enConfig));
-    EXPECT_EQ(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe", landConfig));
-    EXPECT_EQ(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe2", enConfig));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe2", enV21Config));
+  ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
+  EXPECT_EQ(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe", enConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe", landConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe2", enConfig));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe2", enV21Config));
 }
 
 TEST(ResourceDeduperTest, DifferentValuesAreKept) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription enConfig = test::parseConfigOrDie("en");
-    const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
-    // Chosen because this configuration is compatible with en.
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription enConfig = test::parseConfigOrDie("en");
+  const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
+  // Chosen because this configuration is compatible with en.
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addString("android:string/keep", ResourceId{}, defaultConfig, "keep")
-            .addString("android:string/keep", ResourceId{}, enConfig, "keep")
-            .addString("android:string/keep", ResourceId{}, enV21Config, "keep2")
-            .addString("android:string/keep", ResourceId{}, landConfig, "keep2")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addString("android:string/keep", ResourceId{}, defaultConfig, "keep")
+          .addString("android:string/keep", ResourceId{}, enConfig, "keep")
+          .addString("android:string/keep", ResourceId{}, enV21Config, "keep2")
+          .addString("android:string/keep", ResourceId{}, landConfig, "keep2")
+          .build();
 
-    ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/keep", enConfig));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/keep", enV21Config));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/keep", landConfig));
+  ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/keep", enConfig));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/keep", enV21Config));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/keep", landConfig));
 }
 
 }  // namespace aapt
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index eea4306..adf83a4 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
+#include "link/TableMerger.h"
 #include "ResourceTable.h"
 #include "ResourceUtils.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
-#include "link/TableMerger.h"
 #include "util/Util.h"
 
 #include <cassert>
@@ -26,348 +26,365 @@
 namespace aapt {
 
 TableMerger::TableMerger(IAaptContext* context, ResourceTable* outTable,
-                         const TableMergerOptions& options) :
-        mContext(context), mMasterTable(outTable), mOptions(options) {
-    // Create the desired package that all tables will be merged into.
-    mMasterPackage = mMasterTable->createPackage(
-            mContext->getCompilationPackage(), mContext->getPackageId());
-    assert(mMasterPackage && "package name or ID already taken");
+                         const TableMergerOptions& options)
+    : mContext(context), mMasterTable(outTable), mOptions(options) {
+  // Create the desired package that all tables will be merged into.
+  mMasterPackage = mMasterTable->createPackage(
+      mContext->getCompilationPackage(), mContext->getPackageId());
+  assert(mMasterPackage && "package name or ID already taken");
 }
 
 bool TableMerger::merge(const Source& src, ResourceTable* table,
                         io::IFileCollection* collection) {
-    return mergeImpl(src, table, collection, false /* overlay */, true /* allow new */);
+  return mergeImpl(src, table, collection, false /* overlay */,
+                   true /* allow new */);
 }
 
 bool TableMerger::mergeOverlay(const Source& src, ResourceTable* table,
                                io::IFileCollection* collection) {
-    return mergeImpl(src, table, collection, true /* overlay */, mOptions.autoAddOverlay);
+  return mergeImpl(src, table, collection, true /* overlay */,
+                   mOptions.autoAddOverlay);
 }
 
 /**
  * This will merge packages with the same package name (or no package name).
  */
 bool TableMerger::mergeImpl(const Source& src, ResourceTable* table,
-                            io::IFileCollection* collection,
-                            bool overlay, bool allowNew) {
-    const uint8_t desiredPackageId = mContext->getPackageId();
+                            io::IFileCollection* collection, bool overlay,
+                            bool allowNew) {
+  const uint8_t desiredPackageId = mContext->getPackageId();
 
-    bool error = false;
-    for (auto& package : table->packages) {
-        // Warn of packages with an unrelated ID.
-        const Maybe<ResourceId>& id = package->id;
-        if (id && id.value() != 0x0 && id.value() != desiredPackageId) {
-            mContext->getDiagnostics()->warn(DiagMessage(src)
-                                             << "ignoring package " << package->name);
-            continue;
-        }
-
-        // Only merge an empty package or the package we're building.
-        // Other packages may exist, which likely contain attribute definitions.
-        // This is because at compile time it is unknown if the attributes are simply
-        // uses of the attribute or definitions.
-        if (package->name.empty() || mContext->getCompilationPackage() == package->name) {
-            FileMergeCallback callback;
-            if (collection) {
-                callback = [&](const ResourceNameRef& name, const ConfigDescription& config,
-                               FileReference* newFile, FileReference* oldFile) -> bool {
-                    // The old file's path points inside the APK, so we can use it as is.
-                    io::IFile* f = collection->findFile(*oldFile->path);
-                    if (!f) {
-                        mContext->getDiagnostics()->error(DiagMessage(src) << "file '"
-                                                          << *oldFile->path
-                                                          << "' not found");
-                        return false;
-                    }
-
-                    newFile->file = f;
-                    return true;
-                };
-            }
-
-            // Merge here. Once the entries are merged and mangled, any references to
-            // them are still valid. This is because un-mangled references are
-            // mangled, then looked up at resolution time.
-            // Also, when linking, we convert references with no package name to use
-            // the compilation package name.
-            error |= !doMerge(src, table, package.get(), false /* mangle */, overlay, allowNew,
-                              callback);
-        }
+  bool error = false;
+  for (auto& package : table->packages) {
+    // Warn of packages with an unrelated ID.
+    const Maybe<ResourceId>& id = package->id;
+    if (id && id.value() != 0x0 && id.value() != desiredPackageId) {
+      mContext->getDiagnostics()->warn(DiagMessage(src) << "ignoring package "
+                                                        << package->name);
+      continue;
     }
-    return !error;
+
+    // Only merge an empty package or the package we're building.
+    // Other packages may exist, which likely contain attribute definitions.
+    // This is because at compile time it is unknown if the attributes are
+    // simply
+    // uses of the attribute or definitions.
+    if (package->name.empty() ||
+        mContext->getCompilationPackage() == package->name) {
+      FileMergeCallback callback;
+      if (collection) {
+        callback = [&](const ResourceNameRef& name,
+                       const ConfigDescription& config, FileReference* newFile,
+                       FileReference* oldFile) -> bool {
+          // The old file's path points inside the APK, so we can use it as is.
+          io::IFile* f = collection->findFile(*oldFile->path);
+          if (!f) {
+            mContext->getDiagnostics()->error(DiagMessage(src)
+                                              << "file '" << *oldFile->path
+                                              << "' not found");
+            return false;
+          }
+
+          newFile->file = f;
+          return true;
+        };
+      }
+
+      // Merge here. Once the entries are merged and mangled, any references to
+      // them are still valid. This is because un-mangled references are
+      // mangled, then looked up at resolution time.
+      // Also, when linking, we convert references with no package name to use
+      // the compilation package name.
+      error |= !doMerge(src, table, package.get(), false /* mangle */, overlay,
+                        allowNew, callback);
+    }
+  }
+  return !error;
 }
 
 /**
  * This will merge and mangle resources from a static library.
  */
-bool TableMerger::mergeAndMangle(const Source& src, const StringPiece& packageName,
-                                 ResourceTable* table, io::IFileCollection* collection) {
-    bool error = false;
-    for (auto& package : table->packages) {
-        // Warn of packages with an unrelated ID.
-        if (packageName != package->name) {
-            mContext->getDiagnostics()->warn(DiagMessage(src)
-                                             << "ignoring package " << package->name);
-            continue;
-        }
-
-        bool mangle = packageName != mContext->getCompilationPackage();
-        mMergedPackages.insert(package->name);
-
-        auto callback = [&](const ResourceNameRef& name, const ConfigDescription& config,
-                            FileReference* newFile, FileReference* oldFile) -> bool {
-            // The old file's path points inside the APK, so we can use it as is.
-            io::IFile* f = collection->findFile(*oldFile->path);
-            if (!f) {
-                mContext->getDiagnostics()->error(DiagMessage(src) << "file '" << *oldFile->path
-                                                  << "' not found");
-                return false;
-            }
-
-            newFile->file = f;
-            return true;
-        };
-
-        error |= !doMerge(src, table, package.get(),
-                          mangle, false /* overlay */, true /* allow new */, callback);
+bool TableMerger::mergeAndMangle(const Source& src,
+                                 const StringPiece& packageName,
+                                 ResourceTable* table,
+                                 io::IFileCollection* collection) {
+  bool error = false;
+  for (auto& package : table->packages) {
+    // Warn of packages with an unrelated ID.
+    if (packageName != package->name) {
+      mContext->getDiagnostics()->warn(DiagMessage(src) << "ignoring package "
+                                                        << package->name);
+      continue;
     }
-    return !error;
+
+    bool mangle = packageName != mContext->getCompilationPackage();
+    mMergedPackages.insert(package->name);
+
+    auto callback = [&](const ResourceNameRef& name,
+                        const ConfigDescription& config, FileReference* newFile,
+                        FileReference* oldFile) -> bool {
+      // The old file's path points inside the APK, so we can use it as is.
+      io::IFile* f = collection->findFile(*oldFile->path);
+      if (!f) {
+        mContext->getDiagnostics()->error(
+            DiagMessage(src) << "file '" << *oldFile->path << "' not found");
+        return false;
+      }
+
+      newFile->file = f;
+      return true;
+    };
+
+    error |= !doMerge(src, table, package.get(), mangle, false /* overlay */,
+                      true /* allow new */, callback);
+  }
+  return !error;
 }
 
-static bool mergeType(IAaptContext* context, const Source& src, ResourceTableType* dstType,
-                      ResourceTableType* srcType) {
-    if (dstType->symbolStatus.state < srcType->symbolStatus.state) {
-        // The incoming type's visibility is stronger, so we should override
-        // the visibility.
-        if (srcType->symbolStatus.state == SymbolState::kPublic) {
-            // Only copy the ID if the source is public, or else the ID is meaningless.
-            dstType->id = srcType->id;
-        }
-        dstType->symbolStatus = std::move(srcType->symbolStatus);
-    } else if (dstType->symbolStatus.state == SymbolState::kPublic
-            && srcType->symbolStatus.state == SymbolState::kPublic
-            && dstType->id && srcType->id
-            && dstType->id.value() != srcType->id.value()) {
-        // Both types are public and have different IDs.
-        context->getDiagnostics()->error(DiagMessage(src)
-                                         << "cannot merge type '" << srcType->type
-                                         << "': conflicting public IDs");
-        return false;
+static bool mergeType(IAaptContext* context, const Source& src,
+                      ResourceTableType* dstType, ResourceTableType* srcType) {
+  if (dstType->symbolStatus.state < srcType->symbolStatus.state) {
+    // The incoming type's visibility is stronger, so we should override
+    // the visibility.
+    if (srcType->symbolStatus.state == SymbolState::kPublic) {
+      // Only copy the ID if the source is public, or else the ID is
+      // meaningless.
+      dstType->id = srcType->id;
     }
-    return true;
+    dstType->symbolStatus = std::move(srcType->symbolStatus);
+  } else if (dstType->symbolStatus.state == SymbolState::kPublic &&
+             srcType->symbolStatus.state == SymbolState::kPublic &&
+             dstType->id && srcType->id &&
+             dstType->id.value() != srcType->id.value()) {
+    // Both types are public and have different IDs.
+    context->getDiagnostics()->error(DiagMessage(src)
+                                     << "cannot merge type '" << srcType->type
+                                     << "': conflicting public IDs");
+    return false;
+  }
+  return true;
 }
 
-static bool mergeEntry(IAaptContext* context, const Source& src, ResourceEntry* dstEntry,
-                       ResourceEntry* srcEntry) {
-    if (dstEntry->symbolStatus.state < srcEntry->symbolStatus.state) {
-        // The incoming type's visibility is stronger, so we should override
-        // the visibility.
-        if (srcEntry->symbolStatus.state == SymbolState::kPublic) {
-            // Only copy the ID if the source is public, or else the ID is meaningless.
-            dstEntry->id = srcEntry->id;
-        }
-        dstEntry->symbolStatus = std::move(srcEntry->symbolStatus);
-    } else if (srcEntry->symbolStatus.state == SymbolState::kPublic
-            && dstEntry->symbolStatus.state == SymbolState::kPublic
-            && dstEntry->id && srcEntry->id
-            && dstEntry->id.value() != srcEntry->id.value()) {
-        // Both entries are public and have different IDs.
-        context->getDiagnostics()->error(DiagMessage(src)
-                                         << "cannot merge entry '" << srcEntry->name
-                                         << "': conflicting public IDs");
-        return false;
+static bool mergeEntry(IAaptContext* context, const Source& src,
+                       ResourceEntry* dstEntry, ResourceEntry* srcEntry) {
+  if (dstEntry->symbolStatus.state < srcEntry->symbolStatus.state) {
+    // The incoming type's visibility is stronger, so we should override
+    // the visibility.
+    if (srcEntry->symbolStatus.state == SymbolState::kPublic) {
+      // Only copy the ID if the source is public, or else the ID is
+      // meaningless.
+      dstEntry->id = srcEntry->id;
     }
-    return true;
+    dstEntry->symbolStatus = std::move(srcEntry->symbolStatus);
+  } else if (srcEntry->symbolStatus.state == SymbolState::kPublic &&
+             dstEntry->symbolStatus.state == SymbolState::kPublic &&
+             dstEntry->id && srcEntry->id &&
+             dstEntry->id.value() != srcEntry->id.value()) {
+    // Both entries are public and have different IDs.
+    context->getDiagnostics()->error(DiagMessage(src)
+                                     << "cannot merge entry '" << srcEntry->name
+                                     << "': conflicting public IDs");
+    return false;
+  }
+  return true;
 }
 
 /**
  * Modified CollisionResolver which will merge Styleables. Used with overlays.
  *
  * Styleables are not actual resources, but they are treated as such during the
- * compilation phase. Styleables don't simply overlay each other, their definitions merge
- * and accumulate. If both values are Styleables, we just merge them into the existing value.
+ * compilation phase. Styleables don't simply overlay each other, their
+ * definitions merge
+ * and accumulate. If both values are Styleables, we just merge them into the
+ * existing value.
  */
-static ResourceTable::CollisionResult resolveMergeCollision(Value* existing, Value* incoming) {
-    if (Styleable* existingStyleable = valueCast<Styleable>(existing)) {
-        if (Styleable* incomingStyleable = valueCast<Styleable>(incoming)) {
-            // Styleables get merged.
-            existingStyleable->mergeWith(incomingStyleable);
-            return ResourceTable::CollisionResult::kKeepOriginal;
-        }
+static ResourceTable::CollisionResult resolveMergeCollision(Value* existing,
+                                                            Value* incoming) {
+  if (Styleable* existingStyleable = valueCast<Styleable>(existing)) {
+    if (Styleable* incomingStyleable = valueCast<Styleable>(incoming)) {
+      // Styleables get merged.
+      existingStyleable->mergeWith(incomingStyleable);
+      return ResourceTable::CollisionResult::kKeepOriginal;
     }
-    // Delegate to the default handler.
-    return ResourceTable::resolveValueCollision(existing, incoming);
+  }
+  // Delegate to the default handler.
+  return ResourceTable::resolveValueCollision(existing, incoming);
 }
 
-static ResourceTable::CollisionResult mergeConfigValue(IAaptContext* context,
-                                                       const ResourceNameRef& resName,
-                                                       const bool overlay,
-                                                       ResourceConfigValue* dstConfigValue,
-                                                       ResourceConfigValue* srcConfigValue) {
-    using CollisionResult = ResourceTable::CollisionResult;
+static ResourceTable::CollisionResult mergeConfigValue(
+    IAaptContext* context, const ResourceNameRef& resName, const bool overlay,
+    ResourceConfigValue* dstConfigValue, ResourceConfigValue* srcConfigValue) {
+  using CollisionResult = ResourceTable::CollisionResult;
 
-    Value* dstValue = dstConfigValue->value.get();
-    Value* srcValue = srcConfigValue->value.get();
+  Value* dstValue = dstConfigValue->value.get();
+  Value* srcValue = srcConfigValue->value.get();
 
-    CollisionResult collisionResult;
+  CollisionResult collisionResult;
+  if (overlay) {
+    collisionResult = resolveMergeCollision(dstValue, srcValue);
+  } else {
+    collisionResult = ResourceTable::resolveValueCollision(dstValue, srcValue);
+  }
+
+  if (collisionResult == CollisionResult::kConflict) {
     if (overlay) {
-        collisionResult = resolveMergeCollision(dstValue, srcValue);
-    } else {
-        collisionResult = ResourceTable::resolveValueCollision(dstValue, srcValue);
+      return CollisionResult::kTakeNew;
     }
 
-    if (collisionResult == CollisionResult::kConflict) {
-        if (overlay) {
-            return CollisionResult::kTakeNew;
-        }
-
-        // Error!
-        context->getDiagnostics()->error(DiagMessage(srcValue->getSource())
-                                         << "resource '" << resName
-                                         << "' has a conflicting value for "
-                                         << "configuration ("
-                                         << srcConfigValue->config << ")");
-        context->getDiagnostics()->note(DiagMessage(dstValue->getSource())
-                                        << "originally defined here");
-        return CollisionResult::kConflict;
-    }
-    return collisionResult;
+    // Error!
+    context->getDiagnostics()->error(
+        DiagMessage(srcValue->getSource())
+        << "resource '" << resName << "' has a conflicting value for "
+        << "configuration (" << srcConfigValue->config << ")");
+    context->getDiagnostics()->note(DiagMessage(dstValue->getSource())
+                                    << "originally defined here");
+    return CollisionResult::kConflict;
+  }
+  return collisionResult;
 }
 
-bool TableMerger::doMerge(const Source& src,
-                          ResourceTable* srcTable,
+bool TableMerger::doMerge(const Source& src, ResourceTable* srcTable,
                           ResourceTablePackage* srcPackage,
-                          const bool manglePackage,
-                          const bool overlay,
+                          const bool manglePackage, const bool overlay,
                           const bool allowNewResources,
                           const FileMergeCallback& callback) {
-    bool error = false;
+  bool error = false;
 
-    for (auto& srcType : srcPackage->types) {
-        ResourceTableType* dstType = mMasterPackage->findOrCreateType(srcType->type);
-        if (!mergeType(mContext, src, dstType, srcType.get())) {
+  for (auto& srcType : srcPackage->types) {
+    ResourceTableType* dstType =
+        mMasterPackage->findOrCreateType(srcType->type);
+    if (!mergeType(mContext, src, dstType, srcType.get())) {
+      error = true;
+      continue;
+    }
+
+    for (auto& srcEntry : srcType->entries) {
+      std::string entryName = srcEntry->name;
+      if (manglePackage) {
+        entryName = NameMangler::mangleEntry(srcPackage->name, srcEntry->name);
+      }
+
+      ResourceEntry* dstEntry;
+      if (allowNewResources) {
+        dstEntry = dstType->findOrCreateEntry(entryName);
+      } else {
+        dstEntry = dstType->findEntry(entryName);
+      }
+
+      const ResourceNameRef resName(srcPackage->name, srcType->type,
+                                    srcEntry->name);
+
+      if (!dstEntry) {
+        mContext->getDiagnostics()->error(
+            DiagMessage(src) << "resource " << resName
+                             << " does not override an existing resource");
+        mContext->getDiagnostics()->note(
+            DiagMessage(src) << "define an <add-resource> tag or use "
+                             << "--auto-add-overlay");
+        error = true;
+        continue;
+      }
+
+      if (!mergeEntry(mContext, src, dstEntry, srcEntry.get())) {
+        error = true;
+        continue;
+      }
+
+      for (auto& srcConfigValue : srcEntry->values) {
+        using CollisionResult = ResourceTable::CollisionResult;
+
+        ResourceConfigValue* dstConfigValue = dstEntry->findValue(
+            srcConfigValue->config, srcConfigValue->product);
+        if (dstConfigValue) {
+          CollisionResult collisionResult = mergeConfigValue(
+              mContext, resName, overlay, dstConfigValue, srcConfigValue.get());
+          if (collisionResult == CollisionResult::kConflict) {
             error = true;
             continue;
+          } else if (collisionResult == CollisionResult::kKeepOriginal) {
+            continue;
+          }
+        } else {
+          dstConfigValue = dstEntry->findOrCreateValue(srcConfigValue->config,
+                                                       srcConfigValue->product);
         }
 
-        for (auto& srcEntry : srcType->entries) {
-            std::string entryName = srcEntry->name;
-            if (manglePackage) {
-                entryName = NameMangler::mangleEntry(srcPackage->name, srcEntry->name);
+        // Continue if we're taking the new resource.
+
+        if (FileReference* f =
+                valueCast<FileReference>(srcConfigValue->value.get())) {
+          std::unique_ptr<FileReference> newFileRef;
+          if (manglePackage) {
+            newFileRef = cloneAndMangleFile(srcPackage->name, *f);
+          } else {
+            newFileRef = std::unique_ptr<FileReference>(
+                f->clone(&mMasterTable->stringPool));
+          }
+
+          if (callback) {
+            if (!callback(resName, srcConfigValue->config, newFileRef.get(),
+                          f)) {
+              error = true;
+              continue;
             }
+          }
+          dstConfigValue->value = std::move(newFileRef);
 
-            ResourceEntry* dstEntry;
-            if (allowNewResources) {
-                dstEntry = dstType->findOrCreateEntry(entryName);
-            } else {
-                dstEntry = dstType->findEntry(entryName);
-            }
-
-            const ResourceNameRef resName(srcPackage->name, srcType->type, srcEntry->name);
-
-            if (!dstEntry) {
-                mContext->getDiagnostics()->error(DiagMessage(src)
-                                                  << "resource " << resName
-                                                  << " does not override an existing resource");
-                mContext->getDiagnostics()->note(DiagMessage(src)
-                                                 << "define an <add-resource> tag or use "
-                                                 << "--auto-add-overlay");
-                error = true;
-                continue;
-            }
-
-            if (!mergeEntry(mContext, src, dstEntry, srcEntry.get())) {
-                error = true;
-                continue;
-            }
-
-            for (auto& srcConfigValue : srcEntry->values) {
-                using CollisionResult = ResourceTable::CollisionResult;
-
-                ResourceConfigValue* dstConfigValue = dstEntry->findValue(srcConfigValue->config,
-                                                                          srcConfigValue->product);
-                if (dstConfigValue) {
-                    CollisionResult collisionResult = mergeConfigValue(
-                            mContext, resName, overlay, dstConfigValue, srcConfigValue.get());
-                    if (collisionResult == CollisionResult::kConflict) {
-                        error = true;
-                        continue;
-                    } else if (collisionResult == CollisionResult::kKeepOriginal) {
-                        continue;
-                    }
-                } else {
-                    dstConfigValue = dstEntry->findOrCreateValue(srcConfigValue->config,
-                                                                 srcConfigValue->product);
-                }
-
-                // Continue if we're taking the new resource.
-
-                if (FileReference* f = valueCast<FileReference>(srcConfigValue->value.get())) {
-                    std::unique_ptr<FileReference> newFileRef;
-                    if (manglePackage) {
-                        newFileRef = cloneAndMangleFile(srcPackage->name, *f);
-                    } else {
-                        newFileRef = std::unique_ptr<FileReference>(f->clone(
-                                &mMasterTable->stringPool));
-                    }
-
-                    if (callback) {
-                        if (!callback(resName, srcConfigValue->config, newFileRef.get(), f)) {
-                            error = true;
-                            continue;
-                        }
-                    }
-                    dstConfigValue->value = std::move(newFileRef);
-
-                } else {
-                    dstConfigValue->value = std::unique_ptr<Value>(srcConfigValue->value->clone(
-                            &mMasterTable->stringPool));
-                }
-            }
+        } else {
+          dstConfigValue->value = std::unique_ptr<Value>(
+              srcConfigValue->value->clone(&mMasterTable->stringPool));
         }
+      }
     }
-    return !error;
+  }
+  return !error;
 }
 
-std::unique_ptr<FileReference> TableMerger::cloneAndMangleFile(const std::string& package,
-                                                               const FileReference& fileRef) {
-    StringPiece prefix, entry, suffix;
-    if (util::extractResFilePathParts(*fileRef.path, &prefix, &entry, &suffix)) {
-        std::string mangledEntry = NameMangler::mangleEntry(package, entry.toString());
-        std::string newPath = prefix.toString() + mangledEntry + suffix.toString();
-        std::unique_ptr<FileReference> newFileRef = util::make_unique<FileReference>(
-                mMasterTable->stringPool.makeRef(newPath));
-        newFileRef->setComment(fileRef.getComment());
-        newFileRef->setSource(fileRef.getSource());
-        return newFileRef;
-    }
-    return std::unique_ptr<FileReference>(fileRef.clone(&mMasterTable->stringPool));
+std::unique_ptr<FileReference> TableMerger::cloneAndMangleFile(
+    const std::string& package, const FileReference& fileRef) {
+  StringPiece prefix, entry, suffix;
+  if (util::extractResFilePathParts(*fileRef.path, &prefix, &entry, &suffix)) {
+    std::string mangledEntry =
+        NameMangler::mangleEntry(package, entry.toString());
+    std::string newPath = prefix.toString() + mangledEntry + suffix.toString();
+    std::unique_ptr<FileReference> newFileRef =
+        util::make_unique<FileReference>(
+            mMasterTable->stringPool.makeRef(newPath));
+    newFileRef->setComment(fileRef.getComment());
+    newFileRef->setSource(fileRef.getSource());
+    return newFileRef;
+  }
+  return std::unique_ptr<FileReference>(
+      fileRef.clone(&mMasterTable->stringPool));
 }
 
-bool TableMerger::mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file, bool overlay) {
-    ResourceTable table;
-    std::string path = ResourceUtils::buildResourceFileName(fileDesc, nullptr);
-    std::unique_ptr<FileReference> fileRef = util::make_unique<FileReference>(
-            table.stringPool.makeRef(path));
-    fileRef->setSource(fileDesc.source);
-    fileRef->file = file;
+bool TableMerger::mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file,
+                                bool overlay) {
+  ResourceTable table;
+  std::string path = ResourceUtils::buildResourceFileName(fileDesc, nullptr);
+  std::unique_ptr<FileReference> fileRef =
+      util::make_unique<FileReference>(table.stringPool.makeRef(path));
+  fileRef->setSource(fileDesc.source);
+  fileRef->file = file;
 
-    ResourceTablePackage* pkg = table.createPackage(fileDesc.name.package, 0x0);
-    pkg->findOrCreateType(fileDesc.name.type)
-            ->findOrCreateEntry(fileDesc.name.entry)
-            ->findOrCreateValue(fileDesc.config, {})
-            ->value = std::move(fileRef);
+  ResourceTablePackage* pkg = table.createPackage(fileDesc.name.package, 0x0);
+  pkg->findOrCreateType(fileDesc.name.type)
+      ->findOrCreateEntry(fileDesc.name.entry)
+      ->findOrCreateValue(fileDesc.config, {})
+      ->value = std::move(fileRef);
 
-    return doMerge(file->getSource(), &table, pkg,
-                   false /* mangle */, overlay /* overlay */, true /* allow new */, {});
+  return doMerge(file->getSource(), &table, pkg, false /* mangle */,
+                 overlay /* overlay */, true /* allow new */, {});
 }
 
 bool TableMerger::mergeFile(const ResourceFile& fileDesc, io::IFile* file) {
-    return mergeFileImpl(fileDesc, file, false /* overlay */);
+  return mergeFileImpl(fileDesc, file, false /* overlay */);
 }
 
-bool TableMerger::mergeFileOverlay(const ResourceFile& fileDesc, io::IFile* file) {
-    return mergeFileImpl(fileDesc, file, true /* overlay */);
+bool TableMerger::mergeFileOverlay(const ResourceFile& fileDesc,
+                                   io::IFile* file) {
+  return mergeFileImpl(fileDesc, file, true /* overlay */);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/TableMerger.h b/tools/aapt2/link/TableMerger.h
index 3473a27..c2e7181 100644
--- a/tools/aapt2/link/TableMerger.h
+++ b/tools/aapt2/link/TableMerger.h
@@ -31,96 +31,111 @@
 namespace aapt {
 
 struct TableMergerOptions {
-    /**
-     * If true, resources in overlays can be added without previously having existed.
-     */
-    bool autoAddOverlay = false;
+  /**
+   * If true, resources in overlays can be added without previously having
+   * existed.
+   */
+  bool autoAddOverlay = false;
 };
 
 /**
- * TableMerger takes resource tables and merges all packages within the tables that have the same
+ * TableMerger takes resource tables and merges all packages within the tables
+ * that have the same
  * package ID.
  *
- * If a package has a different name, all the entries in that table have their names mangled
- * to include the package name. This way there are no collisions. In order to do this correctly,
- * the TableMerger needs to also mangle any FileReference paths. Once these are mangled,
- * the original source path of the file, along with the new destination path is recorded in the
+ * If a package has a different name, all the entries in that table have their
+ * names mangled
+ * to include the package name. This way there are no collisions. In order to do
+ * this correctly,
+ * the TableMerger needs to also mangle any FileReference paths. Once these are
+ * mangled,
+ * the original source path of the file, along with the new destination path is
+ * recorded in the
  * queue returned from getFileMergeQueue().
  *
- * Once the merging is complete, a separate process can go collect the files from the various
- * source APKs and either copy or process their XML and put them in the correct location in
+ * Once the merging is complete, a separate process can go collect the files
+ * from the various
+ * source APKs and either copy or process their XML and put them in the correct
+ * location in
  * the final APK.
  */
 class TableMerger {
-public:
-    /**
-     * Note: The outTable ResourceTable must live longer than this TableMerger. References
-     * are made to this ResourceTable for efficiency reasons.
-     */
-    TableMerger(IAaptContext* context, ResourceTable* outTable, const TableMergerOptions& options);
+ public:
+  /**
+   * Note: The outTable ResourceTable must live longer than this TableMerger.
+   * References
+   * are made to this ResourceTable for efficiency reasons.
+   */
+  TableMerger(IAaptContext* context, ResourceTable* outTable,
+              const TableMergerOptions& options);
 
-    const std::set<std::string>& getMergedPackages() const {
-        return mMergedPackages;
-    }
+  const std::set<std::string>& getMergedPackages() const {
+    return mMergedPackages;
+  }
 
-    /**
-     * Merges resources from the same or empty package. This is for local sources.
-     * An io::IFileCollection is optional and used to find the referenced Files and process them.
-     */
-    bool merge(const Source& src, ResourceTable* table,
-               io::IFileCollection* collection = nullptr);
+  /**
+   * Merges resources from the same or empty package. This is for local sources.
+   * An io::IFileCollection is optional and used to find the referenced Files
+   * and process them.
+   */
+  bool merge(const Source& src, ResourceTable* table,
+             io::IFileCollection* collection = nullptr);
 
-    /**
-     * Merges resources from an overlay ResourceTable.
-     * An io::IFileCollection is optional and used to find the referenced Files and process them.
-     */
-    bool mergeOverlay(const Source& src, ResourceTable* table,
-                      io::IFileCollection* collection = nullptr);
+  /**
+   * Merges resources from an overlay ResourceTable.
+   * An io::IFileCollection is optional and used to find the referenced Files
+   * and process them.
+   */
+  bool mergeOverlay(const Source& src, ResourceTable* table,
+                    io::IFileCollection* collection = nullptr);
 
-    /**
-     * Merges resources from the given package, mangling the name. This is for static libraries.
-     * An io::IFileCollection is needed in order to find the referenced Files and process them.
-     */
-    bool mergeAndMangle(const Source& src, const StringPiece& package, ResourceTable* table,
-                        io::IFileCollection* collection);
+  /**
+   * Merges resources from the given package, mangling the name. This is for
+   * static libraries.
+   * An io::IFileCollection is needed in order to find the referenced Files and
+   * process them.
+   */
+  bool mergeAndMangle(const Source& src, const StringPiece& package,
+                      ResourceTable* table, io::IFileCollection* collection);
 
-    /**
-     * Merges a compiled file that belongs to this same or empty package. This is for local sources.
-     */
-    bool mergeFile(const ResourceFile& fileDesc, io::IFile* file);
+  /**
+   * Merges a compiled file that belongs to this same or empty package. This is
+   * for local sources.
+   */
+  bool mergeFile(const ResourceFile& fileDesc, io::IFile* file);
 
-    /**
-     * Merges a compiled file from an overlay, overriding an existing definition.
-     */
-    bool mergeFileOverlay(const ResourceFile& fileDesc, io::IFile* file);
+  /**
+   * Merges a compiled file from an overlay, overriding an existing definition.
+   */
+  bool mergeFileOverlay(const ResourceFile& fileDesc, io::IFile* file);
 
-private:
-    using FileMergeCallback = std::function<bool(const ResourceNameRef&,
-                                                 const ConfigDescription& config,
-                                                 FileReference*, FileReference*)>;
+ private:
+  using FileMergeCallback = std::function<bool(const ResourceNameRef&,
+                                               const ConfigDescription& config,
+                                               FileReference*, FileReference*)>;
 
-    IAaptContext* mContext;
-    ResourceTable* mMasterTable;
-    TableMergerOptions mOptions;
-    ResourceTablePackage* mMasterPackage;
+  IAaptContext* mContext;
+  ResourceTable* mMasterTable;
+  TableMergerOptions mOptions;
+  ResourceTablePackage* mMasterPackage;
 
-    std::set<std::string> mMergedPackages;
+  std::set<std::string> mMergedPackages;
 
-    bool mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file, bool overlay);
+  bool mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file,
+                     bool overlay);
 
-    bool mergeImpl(const Source& src, ResourceTable* srcTable, io::IFileCollection* collection,
-                   bool overlay, bool allowNew);
+  bool mergeImpl(const Source& src, ResourceTable* srcTable,
+                 io::IFileCollection* collection, bool overlay, bool allowNew);
 
-    bool doMerge(const Source& src, ResourceTable* srcTable, ResourceTablePackage* srcPackage,
-                 const bool manglePackage,
-                 const bool overlay,
-                 const bool allowNewResources,
-                 const FileMergeCallback& callback);
+  bool doMerge(const Source& src, ResourceTable* srcTable,
+               ResourceTablePackage* srcPackage, const bool manglePackage,
+               const bool overlay, const bool allowNewResources,
+               const FileMergeCallback& callback);
 
-    std::unique_ptr<FileReference> cloneAndMangleFile(const std::string& package,
-                                                      const FileReference& value);
+  std::unique_ptr<FileReference> cloneAndMangleFile(const std::string& package,
+                                                    const FileReference& value);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_TABLEMERGER_H */
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index fb1cb21..e0b2b66 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+#include "link/TableMerger.h"
 #include "filter/ConfigFilter.h"
 #include "io/FileSystem.h"
-#include "link/TableMerger.h"
 #include "test/Builders.h"
 #include "test/Context.h"
 
@@ -25,292 +25,327 @@
 namespace aapt {
 
 struct TableMergerTest : public ::testing::Test {
-    std::unique_ptr<IAaptContext> mContext;
+  std::unique_ptr<IAaptContext> mContext;
 
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                // We are compiling this package.
-                .setCompilationPackage("com.app.a")
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            // We are compiling this package.
+            .setCompilationPackage("com.app.a")
 
-                // Merge all packages that have this package ID.
-                .setPackageId(0x7f)
+            // Merge all packages that have this package ID.
+            .setPackageId(0x7f)
 
-                // Mangle all packages that do not have this package name.
-                .setNameManglerPolicy(NameManglerPolicy{ "com.app.a", { "com.app.b" } })
+            // Mangle all packages that do not have this package name.
+            .setNameManglerPolicy(NameManglerPolicy{"com.app.a", {"com.app.b"}})
 
-                .build();
-    }
+            .build();
+  }
 };
 
 TEST_F(TableMergerTest, SimpleMerge) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addReference("com.app.a:id/foo", "com.app.a:id/bar")
-            .addReference("com.app.a:id/bar", "com.app.b:id/foo")
-            .addValue("com.app.a:styleable/view", test::StyleableBuilder()
-                    .addItem("com.app.b:id/foo")
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addReference("com.app.a:id/foo", "com.app.a:id/bar")
+          .addReference("com.app.a:id/bar", "com.app.b:id/foo")
+          .addValue(
+              "com.app.a:styleable/view",
+              test::StyleableBuilder().addItem("com.app.b:id/foo").build())
+          .build();
 
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("com.app.b", 0x7f)
-            .addSimple("com.app.b:id/foo")
-            .build();
+  std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
+                                              .setPackageId("com.app.b", 0x7f)
+                                              .addSimple("com.app.b:id/foo")
+                                              .build();
 
-    ResourceTable finalTable;
-    TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
-    io::FileCollection collection;
+  ResourceTable finalTable;
+  TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
+  io::FileCollection collection;
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(
+      merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
 
-    EXPECT_TRUE(merger.getMergedPackages().count("com.app.b") != 0);
+  EXPECT_TRUE(merger.getMergedPackages().count("com.app.b") != 0);
 
-    // Entries from com.app.a should not be mangled.
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/foo")));
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/bar")));
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:styleable/view")));
+  // Entries from com.app.a should not be mangled.
+  AAPT_EXPECT_TRUE(
+      finalTable.findResource(test::parseNameOrDie("com.app.a:id/foo")));
+  AAPT_EXPECT_TRUE(
+      finalTable.findResource(test::parseNameOrDie("com.app.a:id/bar")));
+  AAPT_EXPECT_TRUE(finalTable.findResource(
+      test::parseNameOrDie("com.app.a:styleable/view")));
 
-    // The unmangled name should not be present.
-    AAPT_EXPECT_FALSE(finalTable.findResource(test::parseNameOrDie("com.app.b:id/foo")));
+  // The unmangled name should not be present.
+  AAPT_EXPECT_FALSE(
+      finalTable.findResource(test::parseNameOrDie("com.app.b:id/foo")));
 
-    // Look for the mangled name.
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/com.app.b$foo")));
+  // Look for the mangled name.
+  AAPT_EXPECT_TRUE(finalTable.findResource(
+      test::parseNameOrDie("com.app.a:id/com.app.b$foo")));
 }
 
 TEST_F(TableMergerTest, MergeFile) {
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ResourceFile fileDesc;
-    fileDesc.config = test::parseConfigOrDie("hdpi-v4");
-    fileDesc.name = test::parseNameOrDie("layout/main");
-    fileDesc.source = Source("res/layout-hdpi/main.xml");
-    test::TestFile testFile("path/to/res/layout-hdpi/main.xml.flat");
+  ResourceFile fileDesc;
+  fileDesc.config = test::parseConfigOrDie("hdpi-v4");
+  fileDesc.name = test::parseNameOrDie("layout/main");
+  fileDesc.source = Source("res/layout-hdpi/main.xml");
+  test::TestFile testFile("path/to/res/layout-hdpi/main.xml.flat");
 
-    ASSERT_TRUE(merger.mergeFile(fileDesc, &testFile));
+  ASSERT_TRUE(merger.mergeFile(fileDesc, &testFile));
 
-    FileReference* file = test::getValueForConfig<FileReference>(&finalTable,
-                                                                 "com.app.a:layout/main",
-                                                                 test::parseConfigOrDie("hdpi-v4"));
-    ASSERT_NE(nullptr, file);
-    EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path);
+  FileReference* file = test::getValueForConfig<FileReference>(
+      &finalTable, "com.app.a:layout/main", test::parseConfigOrDie("hdpi-v4"));
+  ASSERT_NE(nullptr, file);
+  EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path);
 }
 
 TEST_F(TableMergerTest, MergeFileOverlay) {
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ResourceFile fileDesc;
-    fileDesc.name = test::parseNameOrDie("xml/foo");
-    test::TestFile fileA("path/to/fileA.xml.flat");
-    test::TestFile fileB("path/to/fileB.xml.flat");
+  ResourceFile fileDesc;
+  fileDesc.name = test::parseNameOrDie("xml/foo");
+  test::TestFile fileA("path/to/fileA.xml.flat");
+  test::TestFile fileB("path/to/fileB.xml.flat");
 
-    ASSERT_TRUE(merger.mergeFile(fileDesc, &fileA));
-    ASSERT_TRUE(merger.mergeFileOverlay(fileDesc, &fileB));
+  ASSERT_TRUE(merger.mergeFile(fileDesc, &fileA));
+  ASSERT_TRUE(merger.mergeFileOverlay(fileDesc, &fileB));
 }
 
 TEST_F(TableMergerTest, MergeFileReferences) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addFileReference("com.app.a:xml/file", "res/xml/file.xml")
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("com.app.b", 0x7f)
-            .addFileReference("com.app.b:xml/file", "res/xml/file.xml")
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addFileReference("com.app.a:xml/file", "res/xml/file.xml")
+          .build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.b", 0x7f)
+          .addFileReference("com.app.b:xml/file", "res/xml/file.xml")
+          .build();
 
-    ResourceTable finalTable;
-    TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
-    io::FileCollection collection;
-    collection.insertFile("res/xml/file.xml");
+  ResourceTable finalTable;
+  TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
+  io::FileCollection collection;
+  collection.insertFile("res/xml/file.xml");
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(
+      merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
 
-    FileReference* f = test::getValue<FileReference>(&finalTable, "com.app.a:xml/file");
-    ASSERT_NE(f, nullptr);
-    EXPECT_EQ(std::string("res/xml/file.xml"), *f->path);
+  FileReference* f =
+      test::getValue<FileReference>(&finalTable, "com.app.a:xml/file");
+  ASSERT_NE(f, nullptr);
+  EXPECT_EQ(std::string("res/xml/file.xml"), *f->path);
 
-    f = test::getValue<FileReference>(&finalTable, "com.app.a:xml/com.app.b$file");
-    ASSERT_NE(f, nullptr);
-    EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path);
+  f = test::getValue<FileReference>(&finalTable,
+                                    "com.app.a:xml/com.app.b$file");
+  ASSERT_NE(f, nullptr);
+  EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path);
 }
 
 TEST_F(TableMergerTest, OverrideResourceWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x00)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x00)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("false"))
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x00)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x00)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("false"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
 
-    BinaryPrimitive* foo = test::getValue<BinaryPrimitive>(&finalTable, "com.app.a:bool/foo");
-    ASSERT_NE(nullptr, foo);
-    EXPECT_EQ(0x0u, foo->value.data);
+  BinaryPrimitive* foo =
+      test::getValue<BinaryPrimitive>(&finalTable, "com.app.a:bool/foo");
+  ASSERT_NE(nullptr, foo);
+  EXPECT_EQ(0x0u, foo->value.data);
 }
 
 TEST_F(TableMergerTest, OverrideSameResourceIdsWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
 }
 
 TEST_F(TableMergerTest, FailToOverrideConflictingTypeIdsWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x02, 0x0001), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x02, 0x0001),
+                          SymbolState::kPublic)
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
 }
 
 TEST_F(TableMergerTest, FailToOverrideConflictingEntryIdsWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0002), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0002),
+                          SymbolState::kPublic)
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
 }
 
 TEST_F(TableMergerTest, MergeAddResourceFromOverlay) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", {}, SymbolState::kUndefined)
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", {}, SymbolState::kUndefined)
+          .build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
+  ResourceTable finalTable;
+  TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
 }
 
 TEST_F(TableMergerTest, MergeAddResourceFromOverlayWithAutoAddOverlay) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder().setPackageId("", 0x7f).build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = true;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = true;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
 }
 
 TEST_F(TableMergerTest, FailToMergeNewResourceWithoutAutoAddOverlay) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder().setPackageId("", 0x7f).build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_FALSE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_FALSE(merger.mergeOverlay({}, tableB.get()));
 }
 
 TEST_F(TableMergerTest, OverlaidStyleablesShouldBeMerged) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addValue("com.app.a:styleable/Foo", test::StyleableBuilder()
-                    .addItem("com.app.a:attr/bar")
-                    .addItem("com.app.a:attr/foo", ResourceId(0x01010000))
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addValue("com.app.a:styleable/Foo",
+                    test::StyleableBuilder()
+                        .addItem("com.app.a:attr/bar")
+                        .addItem("com.app.a:attr/foo", ResourceId(0x01010000))
+                        .build())
+          .build();
 
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addValue("com.app.a:styleable/Foo", test::StyleableBuilder()
-                    .addItem("com.app.a:attr/bat")
-                    .addItem("com.app.a:attr/foo")
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addValue("com.app.a:styleable/Foo",
+                    test::StyleableBuilder()
+                        .addItem("com.app.a:attr/bat")
+                        .addItem("com.app.a:attr/foo")
+                        .build())
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = true;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = true;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
 
-    Debug::printTable(&finalTable, {});
+  Debug::printTable(&finalTable, {});
 
-    Styleable* styleable = test::getValue<Styleable>(&finalTable, "com.app.a:styleable/Foo");
-    ASSERT_NE(nullptr, styleable);
+  Styleable* styleable =
+      test::getValue<Styleable>(&finalTable, "com.app.a:styleable/Foo");
+  ASSERT_NE(nullptr, styleable);
 
-    std::vector<Reference> expectedRefs = {
-            Reference(test::parseNameOrDie("com.app.a:attr/bar")),
-            Reference(test::parseNameOrDie("com.app.a:attr/bat")),
-            Reference(test::parseNameOrDie("com.app.a:attr/foo"), ResourceId(0x01010000)),
-    };
+  std::vector<Reference> expectedRefs = {
+      Reference(test::parseNameOrDie("com.app.a:attr/bar")),
+      Reference(test::parseNameOrDie("com.app.a:attr/bat")),
+      Reference(test::parseNameOrDie("com.app.a:attr/foo"),
+                ResourceId(0x01010000)),
+  };
 
-    EXPECT_EQ(expectedRefs, styleable->entries);
+  EXPECT_EQ(expectedRefs, styleable->entries);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/VersionCollapser.cpp b/tools/aapt2/link/VersionCollapser.cpp
index 949d656..61a1f86 100644
--- a/tools/aapt2/link/VersionCollapser.cpp
+++ b/tools/aapt2/link/VersionCollapser.cpp
@@ -24,129 +24,140 @@
 
 template <typename Iterator, typename Pred>
 class FilterIterator {
-public:
-    FilterIterator(Iterator begin, Iterator end, Pred pred=Pred()) :
-            mCurrent(begin), mEnd(end), mPred(pred) {
-        advance();
-    }
+ public:
+  FilterIterator(Iterator begin, Iterator end, Pred pred = Pred())
+      : mCurrent(begin), mEnd(end), mPred(pred) {
+    advance();
+  }
 
-    bool hasNext() {
-        return mCurrent != mEnd;
-    }
+  bool hasNext() { return mCurrent != mEnd; }
 
-    Iterator nextIter() {
-        Iterator iter = mCurrent;
-        ++mCurrent;
-        advance();
-        return iter;
-    }
+  Iterator nextIter() {
+    Iterator iter = mCurrent;
+    ++mCurrent;
+    advance();
+    return iter;
+  }
 
-    typename Iterator::reference next() {
-        return *nextIter();
-    }
+  typename Iterator::reference next() { return *nextIter(); }
 
-private:
-    void advance() {
-        for (; mCurrent != mEnd; ++mCurrent) {
-            if (mPred(*mCurrent)) {
-                return;
-            }
-        }
+ private:
+  void advance() {
+    for (; mCurrent != mEnd; ++mCurrent) {
+      if (mPred(*mCurrent)) {
+        return;
+      }
     }
+  }
 
-    Iterator mCurrent, mEnd;
-    Pred mPred;
+  Iterator mCurrent, mEnd;
+  Pred mPred;
 };
 
 template <typename Iterator, typename Pred>
-FilterIterator<Iterator, Pred> makeFilterIterator(Iterator begin, Iterator end=Iterator(),
-                                                  Pred pred=Pred()) {
-    return FilterIterator<Iterator, Pred>(begin, end, pred);
+FilterIterator<Iterator, Pred> makeFilterIterator(Iterator begin,
+                                                  Iterator end = Iterator(),
+                                                  Pred pred = Pred()) {
+  return FilterIterator<Iterator, Pred>(begin, end, pred);
 }
 
 /**
- * Every Configuration with an SDK version specified that is less than minSdk will be removed.
- * The exception is when there is no exact matching resource for the minSdk. The next smallest
+ * Every Configuration with an SDK version specified that is less than minSdk
+ * will be removed.
+ * The exception is when there is no exact matching resource for the minSdk. The
+ * next smallest
  * one will be kept.
  */
 static void collapseVersions(int minSdk, ResourceEntry* entry) {
-    // First look for all sdks less than minSdk.
-    for (auto iter = entry->values.rbegin(); iter != entry->values.rend(); ++iter) {
-        // Check if the item was already marked for removal.
-        if (!(*iter)) {
-            continue;
-        }
-
-        const ConfigDescription& config = (*iter)->config;
-        if (config.sdkVersion <= minSdk) {
-            // This is the first configuration we've found with a smaller or equal SDK level
-            // to the minimum. We MUST keep this one, but remove all others we find, which get
-            // overridden by this one.
-
-            ConfigDescription configWithoutSdk = config;
-            configWithoutSdk.sdkVersion = 0;
-            auto pred = [&](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
-                // Check that the value hasn't already been marked for removal.
-                if (!val) {
-                    return false;
-                }
-
-                // Only return Configs that differ in SDK version.
-                configWithoutSdk.sdkVersion = val->config.sdkVersion;
-                return configWithoutSdk == val->config && val->config.sdkVersion <= minSdk;
-            };
-
-            // Remove the rest that match.
-            auto filterIter = makeFilterIterator(iter + 1, entry->values.rend(), pred);
-            while (filterIter.hasNext()) {
-                filterIter.next() = {};
-            }
-        }
+  // First look for all sdks less than minSdk.
+  for (auto iter = entry->values.rbegin(); iter != entry->values.rend();
+       ++iter) {
+    // Check if the item was already marked for removal.
+    if (!(*iter)) {
+      continue;
     }
 
-    // Now erase the nullptr values.
-    entry->values.erase(std::remove_if(entry->values.begin(), entry->values.end(),
-                   [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
-        return val == nullptr;
-    }), entry->values.end());
+    const ConfigDescription& config = (*iter)->config;
+    if (config.sdkVersion <= minSdk) {
+      // This is the first configuration we've found with a smaller or equal SDK
+      // level
+      // to the minimum. We MUST keep this one, but remove all others we find,
+      // which get
+      // overridden by this one.
 
-    // Strip the version qualifiers for every resource with version <= minSdk. This will ensure
-    // that the resource entries are all packed together in the same ResTable_type struct
-    // and take up less space in the resources.arsc table.
-    bool modified = false;
-    for (std::unique_ptr<ResourceConfigValue>& configValue : entry->values) {
-        if (configValue->config.sdkVersion != 0 && configValue->config.sdkVersion <= minSdk) {
-            // Override the resource with a Configuration without an SDK.
-            std::unique_ptr<ResourceConfigValue> newValue = util::make_unique<ResourceConfigValue>(
-                    configValue->config.copyWithoutSdkVersion(), configValue->product);
-            newValue->value = std::move(configValue->value);
-            configValue = std::move(newValue);
-
-            modified = true;
+      ConfigDescription configWithoutSdk = config;
+      configWithoutSdk.sdkVersion = 0;
+      auto pred = [&](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
+        // Check that the value hasn't already been marked for removal.
+        if (!val) {
+          return false;
         }
-    }
 
-    if (modified) {
-        // We've modified the keys (ConfigDescription) by changing the sdkVersion to 0.
-        // We MUST re-sort to ensure ordering guarantees hold.
-        std::sort(entry->values.begin(), entry->values.end(),
-                  [](const std::unique_ptr<ResourceConfigValue>& a,
-                     const std::unique_ptr<ResourceConfigValue>& b) -> bool {
-            return a->config.compare(b->config) < 0;
-        });
+        // Only return Configs that differ in SDK version.
+        configWithoutSdk.sdkVersion = val->config.sdkVersion;
+        return configWithoutSdk == val->config &&
+               val->config.sdkVersion <= minSdk;
+      };
+
+      // Remove the rest that match.
+      auto filterIter =
+          makeFilterIterator(iter + 1, entry->values.rend(), pred);
+      while (filterIter.hasNext()) {
+        filterIter.next() = {};
+      }
     }
+  }
+
+  // Now erase the nullptr values.
+  entry->values.erase(
+      std::remove_if(entry->values.begin(), entry->values.end(),
+                     [](const std::unique_ptr<ResourceConfigValue>& val)
+                         -> bool { return val == nullptr; }),
+      entry->values.end());
+
+  // Strip the version qualifiers for every resource with version <= minSdk.
+  // This will ensure
+  // that the resource entries are all packed together in the same ResTable_type
+  // struct
+  // and take up less space in the resources.arsc table.
+  bool modified = false;
+  for (std::unique_ptr<ResourceConfigValue>& configValue : entry->values) {
+    if (configValue->config.sdkVersion != 0 &&
+        configValue->config.sdkVersion <= minSdk) {
+      // Override the resource with a Configuration without an SDK.
+      std::unique_ptr<ResourceConfigValue> newValue =
+          util::make_unique<ResourceConfigValue>(
+              configValue->config.copyWithoutSdkVersion(),
+              configValue->product);
+      newValue->value = std::move(configValue->value);
+      configValue = std::move(newValue);
+
+      modified = true;
+    }
+  }
+
+  if (modified) {
+    // We've modified the keys (ConfigDescription) by changing the sdkVersion to
+    // 0.
+    // We MUST re-sort to ensure ordering guarantees hold.
+    std::sort(entry->values.begin(), entry->values.end(),
+              [](const std::unique_ptr<ResourceConfigValue>& a,
+                 const std::unique_ptr<ResourceConfigValue>& b) -> bool {
+                return a->config.compare(b->config) < 0;
+              });
+  }
 }
 
 bool VersionCollapser::consume(IAaptContext* context, ResourceTable* table) {
-    const int minSdk = context->getMinSdkVersion();
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                collapseVersions(minSdk, entry.get());
-            }
-        }
+  const int minSdk = context->getMinSdkVersion();
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        collapseVersions(minSdk, entry.get());
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/VersionCollapser_test.cpp b/tools/aapt2/link/VersionCollapser_test.cpp
index dd5f1d1..c0e0ddb 100644
--- a/tools/aapt2/link/VersionCollapser_test.cpp
+++ b/tools/aapt2/link/VersionCollapser_test.cpp
@@ -22,82 +22,96 @@
 template <typename T>
 using uptr = std::unique_ptr<T>;
 
-static uptr<ResourceTable> buildTableWithConfigs(const StringPiece& name,
-                                                 std::initializer_list<std::string> list) {
-    test::ResourceTableBuilder builder;
-    for (const std::string& item : list) {
-        builder.addSimple(name, test::parseConfigOrDie(item));
-    }
-    return builder.build();
+static uptr<ResourceTable> buildTableWithConfigs(
+    const StringPiece& name, std::initializer_list<std::string> list) {
+  test::ResourceTableBuilder builder;
+  for (const std::string& item : list) {
+    builder.addSimple(name, test::parseConfigOrDie(item));
+  }
+  return builder.build();
 }
 
 TEST(VersionCollapserTest, CollapseVersions) {
-    uptr<IAaptContext> context = test::ContextBuilder().setMinSdkVersion(7).build();
+  uptr<IAaptContext> context =
+      test::ContextBuilder().setMinSdkVersion(7).build();
 
-    const StringPiece resName = "@android:string/foo";
+  const StringPiece resName = "@android:string/foo";
 
-    uptr<ResourceTable> table =
-            buildTableWithConfigs(resName,
-                                  { "land-v4", "land-v5", "sw600dp", "land-v6",
-                                          "land-v14", "land-v21" });
+  uptr<ResourceTable> table = buildTableWithConfigs(
+      resName,
+      {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14", "land-v21"});
 
-    VersionCollapser collapser;
-    ASSERT_TRUE(collapser.consume(context.get(), table.get()));
+  VersionCollapser collapser;
+  ASSERT_TRUE(collapser.consume(context.get(), table.get()));
 
-    // These should be removed.
-    EXPECT_EQ(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v4")));
-    EXPECT_EQ(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v5")));
-    // This one should be removed because it was renamed to 'land', with the version dropped.
-    EXPECT_EQ(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v6")));
+  // These should be removed.
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v4")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v5")));
+  // This one should be removed because it was renamed to 'land', with the
+  // version dropped.
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v6")));
 
-    // These should remain.
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("sw600dp")));
+  // These should remain.
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("sw600dp")));
 
-    // 'land' should be present because it was renamed from 'land-v6'.
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land")));
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v14")));
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v21")));
+  // 'land' should be present because it was renamed from 'land-v6'.
+  EXPECT_NE(nullptr, test::getValueForConfig<Id>(
+                         table.get(), resName, test::parseConfigOrDie("land")));
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v14")));
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v21")));
 }
 
 TEST(VersionCollapserTest, CollapseVersionsWhenMinSdkIsHighest) {
-    uptr<IAaptContext> context = test::ContextBuilder().setMinSdkVersion(21).build();
+  uptr<IAaptContext> context =
+      test::ContextBuilder().setMinSdkVersion(21).build();
 
-    const StringPiece resName = "@android:string/foo";
+  const StringPiece resName = "@android:string/foo";
 
-    uptr<ResourceTable> table =
-                buildTableWithConfigs(resName,
-                                      { "land-v4", "land-v5", "sw600dp", "land-v6",
-                                              "land-v14", "land-v21", "land-v22" });
-    VersionCollapser collapser;
-    ASSERT_TRUE(collapser.consume(context.get(), table.get()));
+  uptr<ResourceTable> table = buildTableWithConfigs(
+      resName, {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14",
+                "land-v21", "land-v22"});
+  VersionCollapser collapser;
+  ASSERT_TRUE(collapser.consume(context.get(), table.get()));
 
-    // These should all be removed.
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v4")));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v5")));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v6")));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v14")));
+  // These should all be removed.
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v4")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v5")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v6")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v14")));
 
-    // These should remain.
-    EXPECT_NE(nullptr, test::getValueForConfig<Id>(
-            table.get(), resName, test::parseConfigOrDie("sw600dp").copyWithoutSdkVersion()));
+  // These should remain.
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(
+                table.get(), resName,
+                test::parseConfigOrDie("sw600dp").copyWithoutSdkVersion()));
 
-    // land-v21 should have been converted to land.
-    EXPECT_NE(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land")));
-    // land-v22 should remain as-is.
-    EXPECT_NE(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v22")));
+  // land-v21 should have been converted to land.
+  EXPECT_NE(nullptr, test::getValueForConfig<Id>(
+                         table.get(), resName, test::parseConfigOrDie("land")));
+  // land-v22 should remain as-is.
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v22")));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlNamespaceRemover.cpp b/tools/aapt2/link/XmlNamespaceRemover.cpp
index 9f95177..6e8d80d 100644
--- a/tools/aapt2/link/XmlNamespaceRemover.cpp
+++ b/tools/aapt2/link/XmlNamespaceRemover.cpp
@@ -27,57 +27,59 @@
  * Visits each xml Node, removing URI references and nested namespaces.
  */
 class XmlVisitor : public xml::Visitor {
-public:
-    XmlVisitor(bool keepUris) : mKeepUris(keepUris) {
-    }
+ public:
+  XmlVisitor(bool keepUris) : mKeepUris(keepUris) {}
 
-    void visit(xml::Element* el) override {
-        // Strip namespaces
-        for (auto& child : el->children) {
-            while (child && xml::nodeCast<xml::Namespace>(child.get())) {
-                if (child->children.empty()) {
-                    child = {};
-                } else {
-                    child = std::move(child->children.front());
-                    child->parent = el;
-                }
-            }
+  void visit(xml::Element* el) override {
+    // Strip namespaces
+    for (auto& child : el->children) {
+      while (child && xml::nodeCast<xml::Namespace>(child.get())) {
+        if (child->children.empty()) {
+          child = {};
+        } else {
+          child = std::move(child->children.front());
+          child->parent = el;
         }
-        el->children.erase(std::remove_if(el->children.begin(), el->children.end(),
-                [](const std::unique_ptr<xml::Node>& child) -> bool {
-            return child == nullptr;
-        }), el->children.end());
-
-        if (!mKeepUris) {
-            for (xml::Attribute& attr : el->attributes) {
-                attr.namespaceUri = std::string();
-            }
-            el->namespaceUri = std::string();
-        }
-        xml::Visitor::visit(el);
+      }
     }
+    el->children.erase(
+        std::remove_if(el->children.begin(), el->children.end(),
+                       [](const std::unique_ptr<xml::Node>& child) -> bool {
+                         return child == nullptr;
+                       }),
+        el->children.end());
 
-private:
-    bool mKeepUris;
+    if (!mKeepUris) {
+      for (xml::Attribute& attr : el->attributes) {
+        attr.namespaceUri = std::string();
+      }
+      el->namespaceUri = std::string();
+    }
+    xml::Visitor::visit(el);
+  }
+
+ private:
+  bool mKeepUris;
 };
 
-} // namespace
+}  // namespace
 
-bool XmlNamespaceRemover::consume(IAaptContext* context, xml::XmlResource* resource) {
-    if (!resource->root) {
-        return false;
+bool XmlNamespaceRemover::consume(IAaptContext* context,
+                                  xml::XmlResource* resource) {
+  if (!resource->root) {
+    return false;
+  }
+  // Replace any root namespaces until the root is a non-namespace node
+  while (xml::nodeCast<xml::Namespace>(resource->root.get())) {
+    if (resource->root->children.empty()) {
+      break;
     }
-    // Replace any root namespaces until the root is a non-namespace node
-    while (xml::nodeCast<xml::Namespace>(resource->root.get())) {
-        if (resource->root->children.empty()) {
-            break;
-        }
-        resource->root = std::move(resource->root->children.front());
-        resource->root->parent = nullptr;
-    }
-    XmlVisitor visitor(mKeepUris);
-    resource->root->accept(&visitor);
-    return true;
+    resource->root = std::move(resource->root->children.front());
+    resource->root->parent = nullptr;
+  }
+  XmlVisitor visitor(mKeepUris);
+  resource->root->accept(&visitor);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlNamespaceRemover_test.cpp b/tools/aapt2/link/XmlNamespaceRemover_test.cpp
index e72ea439..d2daaee 100644
--- a/tools/aapt2/link/XmlNamespaceRemover_test.cpp
+++ b/tools/aapt2/link/XmlNamespaceRemover_test.cpp
@@ -20,90 +20,92 @@
 namespace aapt {
 
 class XmlUriTestVisitor : public xml::Visitor {
-public:
-    void visit(xml::Element* el) override {
-        for (const auto& attr : el->attributes) {
-            EXPECT_EQ(std::string(), attr.namespaceUri);
-        }
-        EXPECT_EQ(std::string(), el->namespaceUri);
-        xml::Visitor::visit(el);
+ public:
+  void visit(xml::Element* el) override {
+    for (const auto& attr : el->attributes) {
+      EXPECT_EQ(std::string(), attr.namespaceUri);
     }
+    EXPECT_EQ(std::string(), el->namespaceUri);
+    xml::Visitor::visit(el);
+  }
 
-    void visit(xml::Namespace* ns) override {
-        EXPECT_EQ(std::string(), ns->namespaceUri);
-        xml::Visitor::visit(ns);
-    }
+  void visit(xml::Namespace* ns) override {
+    EXPECT_EQ(std::string(), ns->namespaceUri);
+    xml::Visitor::visit(ns);
+  }
 };
 
 class XmlNamespaceTestVisitor : public xml::Visitor {
-public:
-    void visit(xml::Namespace* ns) override {
-        ADD_FAILURE() << "Detected namespace: "
-                << ns->namespacePrefix << "=\"" << ns->namespaceUri << "\"";
-        xml::Visitor::visit(ns);
-    }
+ public:
+  void visit(xml::Namespace* ns) override {
+    ADD_FAILURE() << "Detected namespace: " << ns->namespacePrefix << "=\""
+                  << ns->namespaceUri << "\"";
+    xml::Visitor::visit(ns);
+  }
 };
 
 class XmlNamespaceRemoverTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .build();
-    }
+ public:
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder().setCompilationPackage("com.app.test").build();
+  }
 
-protected:
-    std::unique_ptr<IAaptContext> mContext;
+ protected:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(XmlNamespaceRemoverTest, RemoveUris) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:text="hello" />)EOF");
 
-    XmlNamespaceRemover remover;
-    ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
+  XmlNamespaceRemover remover;
+  ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
 
-    xml::Node* root = doc.get()->root.get();
-    ASSERT_NE(root, nullptr);
+  xml::Node* root = doc.get()->root.get();
+  ASSERT_NE(root, nullptr);
 
-    XmlUriTestVisitor visitor;
-    root->accept(&visitor);
+  XmlUriTestVisitor visitor;
+  root->accept(&visitor);
 }
 
 TEST_F(XmlNamespaceRemoverTest, RemoveNamespaces) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   xmlns:foo="http://schemas.android.com/apk/res/foo"
                   foo:bar="foobar"
                   android:text="hello" />)EOF");
 
-    XmlNamespaceRemover remover;
-    ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
+  XmlNamespaceRemover remover;
+  ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
 
-    xml::Node* root = doc.get()->root.get();
-    ASSERT_NE(root, nullptr);
+  xml::Node* root = doc.get()->root.get();
+  ASSERT_NE(root, nullptr);
 
-    XmlNamespaceTestVisitor visitor;
-    root->accept(&visitor);
+  XmlNamespaceTestVisitor visitor;
+  root->accept(&visitor);
 }
 
 TEST_F(XmlNamespaceRemoverTest, RemoveNestedNamespaces) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:text="hello">
               <View xmlns:foo="http://schemas.example.com/foo"
                     android:text="foo"/>
             </View>)EOF");
 
-    XmlNamespaceRemover remover;
-    ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
+  XmlNamespaceRemover remover;
+  ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
 
-    xml::Node* root = doc.get()->root.get();
-    ASSERT_NE(root, nullptr);
+  xml::Node* root = doc.get()->root.get();
+  ASSERT_NE(root, nullptr);
 
-    XmlNamespaceTestVisitor visitor;
-    root->accept(&visitor);
+  XmlNamespaceTestVisitor visitor;
+  root->accept(&visitor);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 59ffe15..945f98a 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -29,146 +29,156 @@
 namespace {
 
 /**
- * Visits all references (including parents of styles, references in styles, arrays, etc) and
- * links their symbolic name to their Resource ID, performing mangling and package aliasing
+ * Visits all references (including parents of styles, references in styles,
+ * arrays, etc) and
+ * links their symbolic name to their Resource ID, performing mangling and
+ * package aliasing
  * as needed.
  */
 class ReferenceVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    ReferenceVisitor(IAaptContext* context, SymbolTable* symbols, xml::IPackageDeclStack* decls,
-                     CallSite* callSite) :
-             mContext(context), mSymbols(symbols), mDecls(decls), mCallSite(callSite),
-             mError(false) {
+  ReferenceVisitor(IAaptContext* context, SymbolTable* symbols,
+                   xml::IPackageDeclStack* decls, CallSite* callSite)
+      : mContext(context),
+        mSymbols(symbols),
+        mDecls(decls),
+        mCallSite(callSite),
+        mError(false) {}
+
+  void visit(Reference* ref) override {
+    if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mDecls,
+                                        mCallSite)) {
+      mError = true;
     }
+  }
 
-    void visit(Reference* ref) override {
-        if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mDecls, mCallSite)) {
-            mError = true;
-        }
-    }
+  bool hasError() const { return mError; }
 
-    bool hasError() const {
-        return mError;
-    }
-
-private:
-    IAaptContext* mContext;
-    SymbolTable* mSymbols;
-    xml::IPackageDeclStack* mDecls;
-    CallSite* mCallSite;
-    bool mError;
+ private:
+  IAaptContext* mContext;
+  SymbolTable* mSymbols;
+  xml::IPackageDeclStack* mDecls;
+  CallSite* mCallSite;
+  bool mError;
 };
 
 /**
  * Visits each xml Element and compiles the attributes within.
  */
 class XmlVisitor : public xml::PackageAwareVisitor {
-public:
-    using xml::PackageAwareVisitor::visit;
+ public:
+  using xml::PackageAwareVisitor::visit;
 
-    XmlVisitor(IAaptContext* context, SymbolTable* symbols, const Source& source,
-               std::set<int>* sdkLevelsFound, CallSite* callSite) :
-            mContext(context), mSymbols(symbols), mSource(source), mSdkLevelsFound(sdkLevelsFound),
-            mCallSite(callSite), mReferenceVisitor(context, symbols, this, callSite) {
-    }
+  XmlVisitor(IAaptContext* context, SymbolTable* symbols, const Source& source,
+             std::set<int>* sdkLevelsFound, CallSite* callSite)
+      : mContext(context),
+        mSymbols(symbols),
+        mSource(source),
+        mSdkLevelsFound(sdkLevelsFound),
+        mCallSite(callSite),
+        mReferenceVisitor(context, symbols, this, callSite) {}
 
-    void visit(xml::Element* el) override {
-        const Source source = mSource.withLine(el->lineNumber);
-        for (xml::Attribute& attr : el->attributes) {
-            Maybe<xml::ExtractedPackage> maybePackage =
-                    xml::extractPackageFromNamespace(attr.namespaceUri);
-            if (maybePackage) {
-                // There is a valid package name for this attribute. We will look this up.
-                StringPiece package = maybePackage.value().package;
-                if (package.empty()) {
-                    // Empty package means the 'current' or 'local' package.
-                    package = mContext->getCompilationPackage();
-                }
-
-                Reference attrRef(ResourceNameRef(package, ResourceType::kAttr, attr.name));
-                attrRef.privateReference = maybePackage.value().privateNamespace;
-
-                std::string errStr;
-                attr.compiledAttribute = ReferenceLinker::compileXmlAttribute(
-                        attrRef, mContext->getNameMangler(), mSymbols, mCallSite, &errStr);
-
-                // Convert the string value into a compiled Value if this is a valid attribute.
-                if (attr.compiledAttribute) {
-                    if (attr.compiledAttribute.value().id) {
-                        // Record all SDK levels from which the attributes were defined.
-                        const size_t sdkLevel = findAttributeSdkLevel(
-                                attr.compiledAttribute.value().id.value());
-                        if (sdkLevel > 1) {
-                            mSdkLevelsFound->insert(sdkLevel);
-                        }
-                    }
-
-                    const Attribute* attribute = &attr.compiledAttribute.value().attribute;
-                    attr.compiledValue = ResourceUtils::tryParseItemForAttribute(attr.value,
-                                                                              attribute);
-                    if (!attr.compiledValue &&
-                            !(attribute->typeMask & android::ResTable_map::TYPE_STRING)) {
-                        // We won't be able to encode this as a string.
-                        mContext->getDiagnostics()->error(
-                                DiagMessage(source) << "'" << attr.value << "' "
-                                                    << "is incompatible with attribute "
-                                                    << package << ":" << attr.name << " "
-                                                    << *attribute);
-                        mError = true;
-                    }
-
-                } else {
-                    mContext->getDiagnostics()->error(DiagMessage(source)
-                                                      << "attribute '" << package << ":"
-                                                      << attr.name << "' " << errStr);
-                    mError = true;
-
-                }
-            } else if (!attr.compiledValue) {
-                // We still encode references, but only if we haven't manually set this to
-                // another compiled value.
-                attr.compiledValue = ResourceUtils::tryParseReference(attr.value);
-            }
-
-            if (attr.compiledValue) {
-                // With a compiledValue, we must resolve the reference and assign it an ID.
-                attr.compiledValue->setSource(source);
-                attr.compiledValue->accept(&mReferenceVisitor);
-            }
+  void visit(xml::Element* el) override {
+    const Source source = mSource.withLine(el->lineNumber);
+    for (xml::Attribute& attr : el->attributes) {
+      Maybe<xml::ExtractedPackage> maybePackage =
+          xml::extractPackageFromNamespace(attr.namespaceUri);
+      if (maybePackage) {
+        // There is a valid package name for this attribute. We will look this
+        // up.
+        StringPiece package = maybePackage.value().package;
+        if (package.empty()) {
+          // Empty package means the 'current' or 'local' package.
+          package = mContext->getCompilationPackage();
         }
 
-        // Call the super implementation.
-        xml::PackageAwareVisitor::visit(el);
+        Reference attrRef(
+            ResourceNameRef(package, ResourceType::kAttr, attr.name));
+        attrRef.privateReference = maybePackage.value().privateNamespace;
+
+        std::string errStr;
+        attr.compiledAttribute = ReferenceLinker::compileXmlAttribute(
+            attrRef, mContext->getNameMangler(), mSymbols, mCallSite, &errStr);
+
+        // Convert the string value into a compiled Value if this is a valid
+        // attribute.
+        if (attr.compiledAttribute) {
+          if (attr.compiledAttribute.value().id) {
+            // Record all SDK levels from which the attributes were defined.
+            const size_t sdkLevel = findAttributeSdkLevel(
+                attr.compiledAttribute.value().id.value());
+            if (sdkLevel > 1) {
+              mSdkLevelsFound->insert(sdkLevel);
+            }
+          }
+
+          const Attribute* attribute =
+              &attr.compiledAttribute.value().attribute;
+          attr.compiledValue =
+              ResourceUtils::tryParseItemForAttribute(attr.value, attribute);
+          if (!attr.compiledValue &&
+              !(attribute->typeMask & android::ResTable_map::TYPE_STRING)) {
+            // We won't be able to encode this as a string.
+            mContext->getDiagnostics()->error(
+                DiagMessage(source) << "'" << attr.value << "' "
+                                    << "is incompatible with attribute "
+                                    << package << ":" << attr.name << " "
+                                    << *attribute);
+            mError = true;
+          }
+
+        } else {
+          mContext->getDiagnostics()->error(DiagMessage(source)
+                                            << "attribute '" << package << ":"
+                                            << attr.name << "' " << errStr);
+          mError = true;
+        }
+      } else if (!attr.compiledValue) {
+        // We still encode references, but only if we haven't manually set this
+        // to
+        // another compiled value.
+        attr.compiledValue = ResourceUtils::tryParseReference(attr.value);
+      }
+
+      if (attr.compiledValue) {
+        // With a compiledValue, we must resolve the reference and assign it an
+        // ID.
+        attr.compiledValue->setSource(source);
+        attr.compiledValue->accept(&mReferenceVisitor);
+      }
     }
 
-    bool hasError() {
-        return mError || mReferenceVisitor.hasError();
-    }
+    // Call the super implementation.
+    xml::PackageAwareVisitor::visit(el);
+  }
 
-private:
-    IAaptContext* mContext;
-    SymbolTable* mSymbols;
-    Source mSource;
-    std::set<int>* mSdkLevelsFound;
-    CallSite* mCallSite;
-    ReferenceVisitor mReferenceVisitor;
-    bool mError = false;
+  bool hasError() { return mError || mReferenceVisitor.hasError(); }
+
+ private:
+  IAaptContext* mContext;
+  SymbolTable* mSymbols;
+  Source mSource;
+  std::set<int>* mSdkLevelsFound;
+  CallSite* mCallSite;
+  ReferenceVisitor mReferenceVisitor;
+  bool mError = false;
 };
 
-} // namespace
+}  // namespace
 
-bool XmlReferenceLinker::consume(IAaptContext* context, xml::XmlResource* resource) {
-    mSdkLevelsFound.clear();
-    CallSite callSite = { resource->file.name };
-    XmlVisitor visitor(context, context->getExternalSymbols(), resource->file.source,
-                       &mSdkLevelsFound, &callSite);
-    if (resource->root) {
-        resource->root->accept(&visitor);
-        return !visitor.hasError();
-    }
-    return false;
+bool XmlReferenceLinker::consume(IAaptContext* context,
+                                 xml::XmlResource* resource) {
+  mSdkLevelsFound.clear();
+  CallSite callSite = {resource->file.name};
+  XmlVisitor visitor(context, context->getExternalSymbols(),
+                     resource->file.source, &mSdkLevelsFound, &callSite);
+  if (resource->root) {
+    resource->root->accept(&visitor);
+    return !visitor.hasError();
+  }
+  return false;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index 51eb62c..35d479f 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -20,237 +20,276 @@
 namespace aapt {
 
 class XmlReferenceLinkerTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .setNameManglerPolicy(
-                        NameManglerPolicy{ "com.app.test", { "com.android.support" } })
-                .addSymbolSource(test::StaticSymbolSourceBuilder()
-                        .addPublicSymbol("android:attr/layout_width", ResourceId(0x01010000),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_ENUM |
-                                                     android::ResTable_map::TYPE_DIMENSION)
-                                        .addItem("match_parent", 0xffffffff)
-                                        .build())
-                        .addPublicSymbol("android:attr/background", ResourceId(0x01010001),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_COLOR).build())
-                        .addPublicSymbol("android:attr/attr", ResourceId(0x01010002),
-                                   test::AttributeBuilder().build())
-                        .addPublicSymbol("android:attr/text", ResourceId(0x01010003),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
-                                        .build())
+ public:
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            .setCompilationPackage("com.app.test")
+            .setNameManglerPolicy(
+                NameManglerPolicy{"com.app.test", {"com.android.support"}})
+            .addSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .addPublicSymbol(
+                        "android:attr/layout_width", ResourceId(0x01010000),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_ENUM |
+                                         android::ResTable_map::TYPE_DIMENSION)
+                            .addItem("match_parent", 0xffffffff)
+                            .build())
+                    .addPublicSymbol(
+                        "android:attr/background", ResourceId(0x01010001),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                            .build())
+                    .addPublicSymbol("android:attr/attr",
+                                     ResourceId(0x01010002),
+                                     test::AttributeBuilder().build())
+                    .addPublicSymbol(
+                        "android:attr/text", ResourceId(0x01010003),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING)
+                            .build())
 
-                         // Add one real symbol that was introduces in v21
-                        .addPublicSymbol("android:attr/colorAccent", ResourceId(0x01010435),
-                                   test::AttributeBuilder().build())
+                    // Add one real symbol that was introduces in v21
+                    .addPublicSymbol("android:attr/colorAccent",
+                                     ResourceId(0x01010435),
+                                     test::AttributeBuilder().build())
 
-                        // Private symbol.
-                        .addSymbol("android:color/hidden", ResourceId(0x01020001))
+                    // Private symbol.
+                    .addSymbol("android:color/hidden", ResourceId(0x01020001))
 
-                        .addPublicSymbol("android:id/id", ResourceId(0x01030000))
-                        .addSymbol("com.app.test:id/id", ResourceId(0x7f030000))
-                        .addSymbol("com.app.test:color/green", ResourceId(0x7f020000))
-                        .addSymbol("com.app.test:color/red", ResourceId(0x7f020001))
-                        .addSymbol("com.app.test:attr/colorAccent", ResourceId(0x7f010000),
-                                   test::AttributeBuilder()
-                                       .setTypeMask(android::ResTable_map::TYPE_COLOR).build())
-                        .addPublicSymbol("com.app.test:attr/com.android.support$colorAccent",
-                                   ResourceId(0x7f010001), test::AttributeBuilder()
-                                       .setTypeMask(android::ResTable_map::TYPE_COLOR).build())
-                        .addPublicSymbol("com.app.test:attr/attr", ResourceId(0x7f010002),
-                                   test::AttributeBuilder().build())
-                        .build())
-                .build();
-    }
+                    .addPublicSymbol("android:id/id", ResourceId(0x01030000))
+                    .addSymbol("com.app.test:id/id", ResourceId(0x7f030000))
+                    .addSymbol("com.app.test:color/green",
+                               ResourceId(0x7f020000))
+                    .addSymbol("com.app.test:color/red", ResourceId(0x7f020001))
+                    .addSymbol(
+                        "com.app.test:attr/colorAccent", ResourceId(0x7f010000),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                            .build())
+                    .addPublicSymbol(
+                        "com.app.test:attr/com.android.support$colorAccent",
+                        ResourceId(0x7f010001),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                            .build())
+                    .addPublicSymbol("com.app.test:attr/attr",
+                                     ResourceId(0x7f010002),
+                                     test::AttributeBuilder().build())
+                    .build())
+            .build();
+  }
 
-protected:
-    std::unique_ptr<IAaptContext> mContext;
+ protected:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(XmlReferenceLinkerTest, LinkBasicAttributes) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
         <View xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:background="@color/green"
               android:text="hello"
               class="hello" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "layout_width");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x01010000));
-    ASSERT_NE(xmlAttr->compiledValue, nullptr);
-    ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
+  xml::Attribute* xmlAttr =
+      viewEl->findAttribute(xml::kSchemaAndroid, "layout_width");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x01010000));
+  ASSERT_NE(xmlAttr->compiledValue, nullptr);
+  ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
 
-    xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "background");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x01010001));
-    ASSERT_NE(xmlAttr->compiledValue, nullptr);
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->name);
-    EXPECT_EQ(ref->name.value(), test::parseNameOrDie("color/green")); // Make sure the name
-                                                                        // didn't change.
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020000));
+  xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "background");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x01010001));
+  ASSERT_NE(xmlAttr->compiledValue, nullptr);
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->name);
+  EXPECT_EQ(ref->name.value(),
+            test::parseNameOrDie("color/green"));  // Make sure the name
+                                                   // didn't change.
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020000));
 
-    xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "text");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    ASSERT_FALSE(xmlAttr->compiledValue);   // Strings don't get compiled for memory sake.
+  xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "text");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  ASSERT_FALSE(
+      xmlAttr->compiledValue);  // Strings don't get compiled for memory sake.
 
-    xmlAttr = viewEl->findAttribute("", "class");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_FALSE(xmlAttr->compiledAttribute);
-    ASSERT_EQ(xmlAttr->compiledValue, nullptr);
+  xmlAttr = viewEl->findAttribute("", "class");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_FALSE(xmlAttr->compiledAttribute);
+  ASSERT_EQ(xmlAttr->compiledValue, nullptr);
 }
 
 TEST_F(XmlReferenceLinkerTest, PrivateSymbolsAreNotLinked) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
         <View xmlns:android="http://schemas.android.com/apk/res/android"
               android:colorAccent="@android:color/hidden" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(mContext.get(), doc.get()));
 }
 
-TEST_F(XmlReferenceLinkerTest, PrivateSymbolsAreLinkedWhenReferenceHasStarPrefix) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+TEST_F(XmlReferenceLinkerTest,
+       PrivateSymbolsAreLinkedWhenReferenceHasStarPrefix) {
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
     <View xmlns:android="http://schemas.android.com/apk/res/android"
           android:colorAccent="@*android:color/hidden" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 }
 
 TEST_F(XmlReferenceLinkerTest, SdkLevelsAreRecorded) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
         <View xmlns:android="http://schemas.android.com/apk/res/android"
               android:colorAccent="#ffffff" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
-    EXPECT_TRUE(linker.getSdkLevels().count(21) == 1);
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  EXPECT_TRUE(linker.getSdkLevels().count(21) == 1);
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkMangledAttributes) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:support="http://schemas.android.com/apk/res/com.android.support"
                   support:colorAccent="#ff0000" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    xml::Attribute* xmlAttr = viewEl->findAttribute(
-            xml::buildPackageNamespace("com.android.support"), "colorAccent");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010001));
-    ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
+  xml::Attribute* xmlAttr = viewEl->findAttribute(
+      xml::buildPackageNamespace("com.android.support"), "colorAccent");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010001));
+  ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkAutoResReference) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:app="http://schemas.android.com/apk/res-auto"
                   app:colorAccent="@app:color/red" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAuto, "colorAccent");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010000));
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->name);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
+  xml::Attribute* xmlAttr =
+      viewEl->findAttribute(xml::kSchemaAuto, "colorAccent");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010000));
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->name);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkViewWithShadowedPackageAlias) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:app="http://schemas.android.com/apk/res/android"
                   app:attr="@app:id/id">
               <View xmlns:app="http://schemas.android.com/apk/res/com.app.test"
                     app:attr="@app:id/id"/>
             </View>)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    // All attributes and references in this element should be referring to "android" (0x01).
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "attr");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x01010002));
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x01030000));
+  // All attributes and references in this element should be referring to
+  // "android" (0x01).
+  xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "attr");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x01010002));
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x01030000));
 
-    ASSERT_FALSE(viewEl->getChildElements().empty());
-    viewEl = viewEl->getChildElements().front();
-    ASSERT_NE(viewEl, nullptr);
+  ASSERT_FALSE(viewEl->getChildElements().empty());
+  viewEl = viewEl->getChildElements().front();
+  ASSERT_NE(viewEl, nullptr);
 
-    // All attributes and references in this element should be referring to "com.app.test" (0x7f).
-    xmlAttr = viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"), "attr");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010002));
-    ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
+  // All attributes and references in this element should be referring to
+  // "com.app.test" (0x7f).
+  xmlAttr =
+      viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"), "attr");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010002));
+  ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkViewWithLocalPackageAndAliasOfTheSameName) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/com.app.test"
                   android:attr="@id/id"/>)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    // All attributes and references in this element should be referring to "com.app.test" (0x7f).
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"),
-                                                    "attr");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010002));
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
+  // All attributes and references in this element should be referring to
+  // "com.app.test" (0x7f).
+  xml::Attribute* xmlAttr =
+      viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"), "attr");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010002));
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/process/IResourceTableConsumer.h b/tools/aapt2/process/IResourceTableConsumer.h
index a7e752a..a9bde39 100644
--- a/tools/aapt2/process/IResourceTableConsumer.h
+++ b/tools/aapt2/process/IResourceTableConsumer.h
@@ -33,21 +33,21 @@
 class SymbolTable;
 
 struct IAaptContext {
-    virtual ~IAaptContext() = default;
+  virtual ~IAaptContext() = default;
 
-    virtual SymbolTable* getExternalSymbols() = 0;
-    virtual IDiagnostics* getDiagnostics() = 0;
-    virtual const std::string& getCompilationPackage() = 0;
-    virtual uint8_t getPackageId() = 0;
-    virtual NameMangler* getNameMangler() = 0;
-    virtual bool verbose() = 0;
-    virtual int getMinSdkVersion() = 0;
+  virtual SymbolTable* getExternalSymbols() = 0;
+  virtual IDiagnostics* getDiagnostics() = 0;
+  virtual const std::string& getCompilationPackage() = 0;
+  virtual uint8_t getPackageId() = 0;
+  virtual NameMangler* getNameMangler() = 0;
+  virtual bool verbose() = 0;
+  virtual int getMinSdkVersion() = 0;
 };
 
 struct IResourceTableConsumer {
-    virtual ~IResourceTableConsumer() = default;
+  virtual ~IResourceTableConsumer() = default;
 
-    virtual bool consume(IAaptContext* context, ResourceTable* table) = 0;
+  virtual bool consume(IAaptContext* context, ResourceTable* table) = 0;
 };
 
 namespace xml {
@@ -55,11 +55,11 @@
 }
 
 struct IXmlResourceConsumer {
-    virtual ~IXmlResourceConsumer() = default;
+  virtual ~IXmlResourceConsumer() = default;
 
-    virtual bool consume(IAaptContext* context, xml::XmlResource* resource) = 0;
+  virtual bool consume(IAaptContext* context, xml::XmlResource* resource) = 0;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_PROCESS_IRESOURCETABLECONSUMER_H */
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 0c92718..00ffeb2 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
+#include "process/SymbolTable.h"
 #include "ConfigDescription.h"
 #include "Resource.h"
 #include "ResourceUtils.h"
 #include "ValueVisitor.h"
-#include "process/SymbolTable.h"
 #include "util/Util.h"
 
 #include <androidfw/AssetManager.h>
@@ -27,254 +27,273 @@
 namespace aapt {
 
 void SymbolTable::appendSource(std::unique_ptr<ISymbolSource> source) {
-    mSources.push_back(std::move(source));
+  mSources.push_back(std::move(source));
 
-    // We do not clear the cache, because sources earlier in the list take precedent.
+  // We do not clear the cache, because sources earlier in the list take
+  // precedent.
 }
 
 void SymbolTable::prependSource(std::unique_ptr<ISymbolSource> source) {
-    mSources.insert(mSources.begin(), std::move(source));
+  mSources.insert(mSources.begin(), std::move(source));
 
-    // We must clear the cache in case we did a lookup before adding this resource.
-    mCache.clear();
+  // We must clear the cache in case we did a lookup before adding this
+  // resource.
+  mCache.clear();
 }
 
 const SymbolTable::Symbol* SymbolTable::findByName(const ResourceName& name) {
-    if (const std::shared_ptr<Symbol>& s = mCache.get(name)) {
-        return s.get();
-    }
+  if (const std::shared_ptr<Symbol>& s = mCache.get(name)) {
+    return s.get();
+  }
 
-    // We did not find it in the cache, so look through the sources.
-    for (auto& symbolSource : mSources) {
-        std::unique_ptr<Symbol> symbol = symbolSource->findByName(name);
-        if (symbol) {
-            // Take ownership of the symbol into a shared_ptr. We do this because LruCache
-            // doesn't support unique_ptr.
-            std::shared_ptr<Symbol> sharedSymbol = std::shared_ptr<Symbol>(symbol.release());
-            mCache.put(name, sharedSymbol);
+  // We did not find it in the cache, so look through the sources.
+  for (auto& symbolSource : mSources) {
+    std::unique_ptr<Symbol> symbol = symbolSource->findByName(name);
+    if (symbol) {
+      // Take ownership of the symbol into a shared_ptr. We do this because
+      // LruCache
+      // doesn't support unique_ptr.
+      std::shared_ptr<Symbol> sharedSymbol =
+          std::shared_ptr<Symbol>(symbol.release());
+      mCache.put(name, sharedSymbol);
 
-            if (sharedSymbol->id) {
-                // The symbol has an ID, so we can also cache this!
-                mIdCache.put(sharedSymbol->id.value(), sharedSymbol);
-            }
-            return sharedSymbol.get();
-        }
+      if (sharedSymbol->id) {
+        // The symbol has an ID, so we can also cache this!
+        mIdCache.put(sharedSymbol->id.value(), sharedSymbol);
+      }
+      return sharedSymbol.get();
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
 const SymbolTable::Symbol* SymbolTable::findById(const ResourceId& id) {
-    if (const std::shared_ptr<Symbol>& s = mIdCache.get(id)) {
-        return s.get();
-    }
+  if (const std::shared_ptr<Symbol>& s = mIdCache.get(id)) {
+    return s.get();
+  }
 
-    // We did not find it in the cache, so look through the sources.
-    for (auto& symbolSource : mSources) {
-        std::unique_ptr<Symbol> symbol = symbolSource->findById(id);
-        if (symbol) {
-            // Take ownership of the symbol into a shared_ptr. We do this because LruCache
-            // doesn't support unique_ptr.
-            std::shared_ptr<Symbol> sharedSymbol = std::shared_ptr<Symbol>(symbol.release());
-            mIdCache.put(id, sharedSymbol);
-            return sharedSymbol.get();
-        }
+  // We did not find it in the cache, so look through the sources.
+  for (auto& symbolSource : mSources) {
+    std::unique_ptr<Symbol> symbol = symbolSource->findById(id);
+    if (symbol) {
+      // Take ownership of the symbol into a shared_ptr. We do this because
+      // LruCache
+      // doesn't support unique_ptr.
+      std::shared_ptr<Symbol> sharedSymbol =
+          std::shared_ptr<Symbol>(symbol.release());
+      mIdCache.put(id, sharedSymbol);
+      return sharedSymbol.get();
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
 const SymbolTable::Symbol* SymbolTable::findByReference(const Reference& ref) {
-    // First try the ID. This is because when we lookup by ID, we only fill in the ID cache.
-    // Looking up by name fills in the name and ID cache. So a cache miss will cause a failed
-    // ID lookup, then a successful name lookup. Subsequent look ups will hit immediately
-    // because the ID is cached too.
-    //
-    // If we looked up by name first, a cache miss would mean we failed to lookup by name, then
-    // succeeded to lookup by ID. Subsequent lookups will miss then hit.
-    const SymbolTable::Symbol* symbol = nullptr;
-    if (ref.id) {
-        symbol = findById(ref.id.value());
-    }
+  // First try the ID. This is because when we lookup by ID, we only fill in the
+  // ID cache.
+  // Looking up by name fills in the name and ID cache. So a cache miss will
+  // cause a failed
+  // ID lookup, then a successful name lookup. Subsequent look ups will hit
+  // immediately
+  // because the ID is cached too.
+  //
+  // If we looked up by name first, a cache miss would mean we failed to lookup
+  // by name, then
+  // succeeded to lookup by ID. Subsequent lookups will miss then hit.
+  const SymbolTable::Symbol* symbol = nullptr;
+  if (ref.id) {
+    symbol = findById(ref.id.value());
+  }
 
-    if (ref.name && !symbol) {
-        symbol = findByName(ref.name.value());
-    }
-    return symbol;
+  if (ref.name && !symbol) {
+    symbol = findByName(ref.name.value());
+  }
+  return symbol;
 }
 
 std::unique_ptr<SymbolTable::Symbol> ResourceTableSymbolSource::findByName(
-        const ResourceName& name) {
-    Maybe<ResourceTable::SearchResult> result = mTable->findResource(name);
-    if (!result) {
-        if (name.type == ResourceType::kAttr) {
-            // Recurse and try looking up a private attribute.
-            return findByName(ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
-        }
+    const ResourceName& name) {
+  Maybe<ResourceTable::SearchResult> result = mTable->findResource(name);
+  if (!result) {
+    if (name.type == ResourceType::kAttr) {
+      // Recurse and try looking up a private attribute.
+      return findByName(
+          ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
+    }
+    return {};
+  }
+
+  ResourceTable::SearchResult sr = result.value();
+
+  std::unique_ptr<SymbolTable::Symbol> symbol =
+      util::make_unique<SymbolTable::Symbol>();
+  symbol->isPublic = (sr.entry->symbolStatus.state == SymbolState::kPublic);
+
+  if (sr.package->id && sr.type->id && sr.entry->id) {
+    symbol->id = ResourceId(sr.package->id.value(), sr.type->id.value(),
+                            sr.entry->id.value());
+  }
+
+  if (name.type == ResourceType::kAttr ||
+      name.type == ResourceType::kAttrPrivate) {
+    const ConfigDescription kDefaultConfig;
+    ResourceConfigValue* configValue = sr.entry->findValue(kDefaultConfig);
+    if (configValue) {
+      // This resource has an Attribute.
+      if (Attribute* attr = valueCast<Attribute>(configValue->value.get())) {
+        symbol->attribute = std::make_shared<Attribute>(*attr);
+      } else {
         return {};
+      }
     }
-
-    ResourceTable::SearchResult sr = result.value();
-
-    std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>();
-    symbol->isPublic = (sr.entry->symbolStatus.state == SymbolState::kPublic);
-
-    if (sr.package->id && sr.type->id && sr.entry->id) {
-        symbol->id = ResourceId(sr.package->id.value(), sr.type->id.value(), sr.entry->id.value());
-    }
-
-    if (name.type == ResourceType::kAttr || name.type == ResourceType::kAttrPrivate) {
-        const ConfigDescription kDefaultConfig;
-        ResourceConfigValue* configValue = sr.entry->findValue(kDefaultConfig);
-        if (configValue) {
-            // This resource has an Attribute.
-            if (Attribute* attr = valueCast<Attribute>(configValue->value.get())) {
-                symbol->attribute = std::make_shared<Attribute>(*attr);
-            } else {
-                return {};
-            }
-        }
-    }
-    return symbol;
+  }
+  return symbol;
 }
 
 bool AssetManagerSymbolSource::addAssetPath(const StringPiece& path) {
-    int32_t cookie = 0;
-    return mAssets.addAssetPath(android::String8(path.data(), path.size()), &cookie);
+  int32_t cookie = 0;
+  return mAssets.addAssetPath(android::String8(path.data(), path.size()),
+                              &cookie);
 }
 
-static std::unique_ptr<SymbolTable::Symbol> lookupAttributeInTable(const android::ResTable& table,
-                                                                   ResourceId id) {
-    // Try as a bag.
-    const android::ResTable::bag_entry* entry;
-    ssize_t count = table.lockBag(id.id, &entry);
-    if (count < 0) {
-        table.unlockBag(entry);
-        return nullptr;
+static std::unique_ptr<SymbolTable::Symbol> lookupAttributeInTable(
+    const android::ResTable& table, ResourceId id) {
+  // Try as a bag.
+  const android::ResTable::bag_entry* entry;
+  ssize_t count = table.lockBag(id.id, &entry);
+  if (count < 0) {
+    table.unlockBag(entry);
+    return nullptr;
+  }
+
+  // We found a resource.
+  std::unique_ptr<SymbolTable::Symbol> s =
+      util::make_unique<SymbolTable::Symbol>();
+  s->id = id;
+
+  // Check to see if it is an attribute.
+  for (size_t i = 0; i < (size_t)count; i++) {
+    if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
+      s->attribute = std::make_shared<Attribute>(false);
+      s->attribute->typeMask = entry[i].map.value.data;
+      break;
     }
+  }
 
-    // We found a resource.
-    std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>();
-    s->id = id;
-
-    // Check to see if it is an attribute.
-    for (size_t i = 0; i < (size_t) count; i++) {
-        if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
-            s->attribute = std::make_shared<Attribute>(false);
-            s->attribute->typeMask = entry[i].map.value.data;
+  if (s->attribute) {
+    for (size_t i = 0; i < (size_t)count; i++) {
+      const android::ResTable_map& mapEntry = entry[i].map;
+      if (Res_INTERNALID(mapEntry.name.ident)) {
+        switch (mapEntry.name.ident) {
+          case android::ResTable_map::ATTR_MIN:
+            s->attribute->minInt = static_cast<int32_t>(mapEntry.value.data);
+            break;
+          case android::ResTable_map::ATTR_MAX:
+            s->attribute->maxInt = static_cast<int32_t>(mapEntry.value.data);
             break;
         }
+        continue;
+      }
+
+      android::ResTable::resource_name entryName;
+      if (!table.getResourceName(mapEntry.name.ident, false, &entryName)) {
+        table.unlockBag(entry);
+        return nullptr;
+      }
+
+      Maybe<ResourceName> parsedName = ResourceUtils::toResourceName(entryName);
+      if (!parsedName) {
+        return nullptr;
+      }
+
+      Attribute::Symbol symbol;
+      symbol.symbol.name = parsedName.value();
+      symbol.symbol.id = ResourceId(mapEntry.name.ident);
+      symbol.value = mapEntry.value.data;
+      s->attribute->symbols.push_back(std::move(symbol));
     }
-
-    if (s->attribute) {
-        for (size_t i = 0; i < (size_t) count; i++) {
-            const android::ResTable_map& mapEntry = entry[i].map;
-            if (Res_INTERNALID(mapEntry.name.ident)) {
-                switch (mapEntry.name.ident) {
-                case android::ResTable_map::ATTR_MIN:
-                    s->attribute->minInt = static_cast<int32_t>(mapEntry.value.data);
-                    break;
-                case android::ResTable_map::ATTR_MAX:
-                    s->attribute->maxInt = static_cast<int32_t>(mapEntry.value.data);
-                    break;
-                }
-                continue;
-            }
-
-            android::ResTable::resource_name entryName;
-            if (!table.getResourceName(mapEntry.name.ident, false, &entryName)) {
-                table.unlockBag(entry);
-                return nullptr;
-            }
-
-            Maybe<ResourceName> parsedName = ResourceUtils::toResourceName(entryName);
-            if (!parsedName) {
-                return nullptr;
-            }
-
-            Attribute::Symbol symbol;
-            symbol.symbol.name = parsedName.value();
-            symbol.symbol.id = ResourceId(mapEntry.name.ident);
-            symbol.value = mapEntry.value.data;
-            s->attribute->symbols.push_back(std::move(symbol));
-        }
-    }
-    table.unlockBag(entry);
-    return s;
+  }
+  table.unlockBag(entry);
+  return s;
 }
 
 std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findByName(
-        const ResourceName& name) {
-    const android::ResTable& table = mAssets.getResources(false);
+    const ResourceName& name) {
+  const android::ResTable& table = mAssets.getResources(false);
 
-    const std::u16string package16 = util::utf8ToUtf16(name.package);
-    const std::u16string type16 = util::utf8ToUtf16(toString(name.type));
-    const std::u16string entry16 = util::utf8ToUtf16(name.entry);
+  const std::u16string package16 = util::utf8ToUtf16(name.package);
+  const std::u16string type16 = util::utf8ToUtf16(toString(name.type));
+  const std::u16string entry16 = util::utf8ToUtf16(name.entry);
 
-    uint32_t typeSpecFlags = 0;
-    ResourceId resId = table.identifierForName(entry16.data(), entry16.size(),
-                                               type16.data(), type16.size(),
-                                               package16.data(), package16.size(),
-                                               &typeSpecFlags);
-    if (!resId.isValid()) {
-        return {};
-    }
-
-    std::unique_ptr<SymbolTable::Symbol> s;
-    if (name.type == ResourceType::kAttr) {
-        s = lookupAttributeInTable(table, resId);
-    } else {
-        s = util::make_unique<SymbolTable::Symbol>();
-        s->id = resId;
-    }
-
-    if (s) {
-        s->isPublic = (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
-        return s;
-    }
+  uint32_t typeSpecFlags = 0;
+  ResourceId resId = table.identifierForName(
+      entry16.data(), entry16.size(), type16.data(), type16.size(),
+      package16.data(), package16.size(), &typeSpecFlags);
+  if (!resId.isValid()) {
     return {};
+  }
+
+  std::unique_ptr<SymbolTable::Symbol> s;
+  if (name.type == ResourceType::kAttr) {
+    s = lookupAttributeInTable(table, resId);
+  } else {
+    s = util::make_unique<SymbolTable::Symbol>();
+    s->id = resId;
+  }
+
+  if (s) {
+    s->isPublic =
+        (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
+    return s;
+  }
+  return {};
 }
 
-static Maybe<ResourceName> getResourceName(const android::ResTable& table, ResourceId id) {
-    android::ResTable::resource_name resName = {};
-    if (!table.getResourceName(id.id, true, &resName)) {
-        return {};
-    }
-    return ResourceUtils::toResourceName(resName);
+static Maybe<ResourceName> getResourceName(const android::ResTable& table,
+                                           ResourceId id) {
+  android::ResTable::resource_name resName = {};
+  if (!table.getResourceName(id.id, true, &resName)) {
+    return {};
+  }
+  return ResourceUtils::toResourceName(resName);
 }
 
-std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findById(ResourceId id) {
-    const android::ResTable& table = mAssets.getResources(false);
-    Maybe<ResourceName> maybeName = getResourceName(table, id);
-    if (!maybeName) {
-        return {};
-    }
-
-    uint32_t typeSpecFlags = 0;
-    table.getResourceFlags(id.id, &typeSpecFlags);
-
-    std::unique_ptr<SymbolTable::Symbol> s;
-    if (maybeName.value().type == ResourceType::kAttr) {
-        s = lookupAttributeInTable(table, id);
-    } else {
-        s = util::make_unique<SymbolTable::Symbol>();
-        s->id = id;
-    }
-
-    if (s) {
-        s->isPublic = (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
-        return s;
-    }
+std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findById(
+    ResourceId id) {
+  const android::ResTable& table = mAssets.getResources(false);
+  Maybe<ResourceName> maybeName = getResourceName(table, id);
+  if (!maybeName) {
     return {};
+  }
+
+  uint32_t typeSpecFlags = 0;
+  table.getResourceFlags(id.id, &typeSpecFlags);
+
+  std::unique_ptr<SymbolTable::Symbol> s;
+  if (maybeName.value().type == ResourceType::kAttr) {
+    s = lookupAttributeInTable(table, id);
+  } else {
+    s = util::make_unique<SymbolTable::Symbol>();
+    s->id = id;
+  }
+
+  if (s) {
+    s->isPublic =
+        (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
+    return s;
+  }
+  return {};
 }
 
 std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findByReference(
-        const Reference& ref) {
-    // AssetManager always prefers IDs.
-    if (ref.id) {
-        return findById(ref.id.value());
-    } else if (ref.name) {
-        return findByName(ref.name.value());
-    }
-    return {};
+    const Reference& ref) {
+  // AssetManager always prefers IDs.
+  if (ref.id) {
+    return findById(ref.id.value());
+  } else if (ref.name) {
+    return findByName(ref.name.value());
+  }
+  return {};
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index bd31416..89d87de 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -34,99 +34,100 @@
 namespace aapt {
 
 inline android::hash_t hash_type(const ResourceName& name) {
-    std::hash<std::string> strHash;
-    android::hash_t hash = 0;
-    hash = android::JenkinsHashMix(hash, (uint32_t) strHash(name.package));
-    hash = android::JenkinsHashMix(hash, (uint32_t) name.type);
-    hash = android::JenkinsHashMix(hash, (uint32_t) strHash(name.entry));
-    return hash;
+  std::hash<std::string> strHash;
+  android::hash_t hash = 0;
+  hash = android::JenkinsHashMix(hash, (uint32_t)strHash(name.package));
+  hash = android::JenkinsHashMix(hash, (uint32_t)name.type);
+  hash = android::JenkinsHashMix(hash, (uint32_t)strHash(name.entry));
+  return hash;
 }
 
 inline android::hash_t hash_type(const ResourceId& id) {
-    return android::hash_type(id.id);
+  return android::hash_type(id.id);
 }
 
 class ISymbolSource;
 
 class SymbolTable {
-public:
-    struct Symbol {
-        Symbol() : Symbol(Maybe<ResourceId>{}) {
-        }
+ public:
+  struct Symbol {
+    Symbol() : Symbol(Maybe<ResourceId>{}) {}
 
-        explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {
-        }
+    explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {}
 
-        Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr) :
-                Symbol(i, attr, false) {
-        }
+    Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr)
+        : Symbol(i, attr, false) {}
 
-        Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr, bool pub) :
-                id(i), attribute(attr), isPublic(pub) {
-        }
+    Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr,
+           bool pub)
+        : id(i), attribute(attr), isPublic(pub) {}
 
-        Symbol(const Symbol&) = default;
-        Symbol(Symbol&&) = default;
-        Symbol& operator=(const Symbol&) = default;
-        Symbol& operator=(Symbol&&) = default;
+    Symbol(const Symbol&) = default;
+    Symbol(Symbol&&) = default;
+    Symbol& operator=(const Symbol&) = default;
+    Symbol& operator=(Symbol&&) = default;
 
-        Maybe<ResourceId> id;
-        std::shared_ptr<Attribute> attribute;
-        bool isPublic = false;
-    };
+    Maybe<ResourceId> id;
+    std::shared_ptr<Attribute> attribute;
+    bool isPublic = false;
+  };
 
-    SymbolTable() : mCache(200), mIdCache(200) {
-    }
+  SymbolTable() : mCache(200), mIdCache(200) {}
 
-    void appendSource(std::unique_ptr<ISymbolSource> source);
-    void prependSource(std::unique_ptr<ISymbolSource> source);
+  void appendSource(std::unique_ptr<ISymbolSource> source);
+  void prependSource(std::unique_ptr<ISymbolSource> source);
 
-    /**
-     * Never hold on to the result between calls to findByName or findById. The results
-     * are typically stored in a cache which may evict entries.
-     */
-    const Symbol* findByName(const ResourceName& name);
-    const Symbol* findById(const ResourceId& id);
+  /**
+   * Never hold on to the result between calls to findByName or findById. The
+   * results
+   * are typically stored in a cache which may evict entries.
+   */
+  const Symbol* findByName(const ResourceName& name);
+  const Symbol* findById(const ResourceId& id);
 
-    /**
-     * Let's the ISymbolSource decide whether looking up by name or ID is faster, if both
-     * are available.
-     */
-    const Symbol* findByReference(const Reference& ref);
+  /**
+   * Let's the ISymbolSource decide whether looking up by name or ID is faster,
+   * if both
+   * are available.
+   */
+  const Symbol* findByReference(const Reference& ref);
 
-private:
-    std::vector<std::unique_ptr<ISymbolSource>> mSources;
+ private:
+  std::vector<std::unique_ptr<ISymbolSource>> mSources;
 
-    // We use shared_ptr because unique_ptr is not supported and
-    // we need automatic deletion.
-    android::LruCache<ResourceName, std::shared_ptr<Symbol>> mCache;
-    android::LruCache<ResourceId, std::shared_ptr<Symbol>> mIdCache;
+  // We use shared_ptr because unique_ptr is not supported and
+  // we need automatic deletion.
+  android::LruCache<ResourceName, std::shared_ptr<Symbol>> mCache;
+  android::LruCache<ResourceId, std::shared_ptr<Symbol>> mIdCache;
 
-    DISALLOW_COPY_AND_ASSIGN(SymbolTable);
+  DISALLOW_COPY_AND_ASSIGN(SymbolTable);
 };
 
 /**
- * An interface that a symbol source implements in order to surface symbol information
+ * An interface that a symbol source implements in order to surface symbol
+ * information
  * to the symbol table.
  */
 class ISymbolSource {
-public:
-    virtual ~ISymbolSource() = default;
+ public:
+  virtual ~ISymbolSource() = default;
 
-    virtual std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) = 0;
-    virtual std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) = 0;
+  virtual std::unique_ptr<SymbolTable::Symbol> findByName(
+      const ResourceName& name) = 0;
+  virtual std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) = 0;
 
-    /**
-     * Default implementation tries the name if it exists, else the ID.
-     */
-    virtual std::unique_ptr<SymbolTable::Symbol> findByReference(const Reference& ref) {
-        if (ref.name) {
-            return findByName(ref.name.value());
-        } else if (ref.id) {
-            return findById(ref.id.value());
-        }
-        return {};
+  /**
+   * Default implementation tries the name if it exists, else the ID.
+   */
+  virtual std::unique_ptr<SymbolTable::Symbol> findByReference(
+      const Reference& ref) {
+    if (ref.name) {
+      return findByName(ref.name.value());
+    } else if (ref.id) {
+      return findById(ref.id.value());
     }
+    return {};
+  }
 };
 
 /**
@@ -135,38 +136,40 @@
  * Lookups by ID are ignored.
  */
 class ResourceTableSymbolSource : public ISymbolSource {
-public:
-    explicit ResourceTableSymbolSource(ResourceTable* table) : mTable(table) {
-    }
+ public:
+  explicit ResourceTableSymbolSource(ResourceTable* table) : mTable(table) {}
 
-    std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override;
+  std::unique_ptr<SymbolTable::Symbol> findByName(
+      const ResourceName& name) override;
 
-    std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
-        return {};
-    }
+  std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
+    return {};
+  }
 
-private:
-    ResourceTable* mTable;
+ private:
+  ResourceTable* mTable;
 
-    DISALLOW_COPY_AND_ASSIGN(ResourceTableSymbolSource);
+  DISALLOW_COPY_AND_ASSIGN(ResourceTableSymbolSource);
 };
 
 class AssetManagerSymbolSource : public ISymbolSource {
-public:
-    AssetManagerSymbolSource() = default;
+ public:
+  AssetManagerSymbolSource() = default;
 
-    bool addAssetPath(const StringPiece& path);
+  bool addAssetPath(const StringPiece& path);
 
-    std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override;
-    std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override;
-    std::unique_ptr<SymbolTable::Symbol> findByReference(const Reference& ref) override;
+  std::unique_ptr<SymbolTable::Symbol> findByName(
+      const ResourceName& name) override;
+  std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override;
+  std::unique_ptr<SymbolTable::Symbol> findByReference(
+      const Reference& ref) override;
 
-private:
-    android::AssetManager mAssets;
+ private:
+  android::AssetManager mAssets;
 
-    DISALLOW_COPY_AND_ASSIGN(AssetManagerSymbolSource);
+  DISALLOW_COPY_AND_ASSIGN(AssetManagerSymbolSource);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_PROCESS_SYMBOLTABLE_H */
diff --git a/tools/aapt2/process/SymbolTable_test.cpp b/tools/aapt2/process/SymbolTable_test.cpp
index 1626352..00474f7 100644
--- a/tools/aapt2/process/SymbolTable_test.cpp
+++ b/tools/aapt2/process/SymbolTable_test.cpp
@@ -20,34 +20,38 @@
 namespace aapt {
 
 TEST(ResourceTableSymbolSourceTest, FindSymbols) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:id/foo", ResourceId(0x01020000))
-            .addSimple("android:id/bar")
-            .addValue("android:attr/foo", ResourceId(0x01010000),
-                      test::AttributeBuilder().build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:id/foo", ResourceId(0x01020000))
+          .addSimple("android:id/bar")
+          .addValue("android:attr/foo", ResourceId(0x01010000),
+                    test::AttributeBuilder().build())
+          .build();
 
-    ResourceTableSymbolSource symbolSource(table.get());
-    EXPECT_NE(nullptr, symbolSource.findByName(test::parseNameOrDie("android:id/foo")));
-    EXPECT_NE(nullptr, symbolSource.findByName(test::parseNameOrDie("android:id/bar")));
+  ResourceTableSymbolSource symbolSource(table.get());
+  EXPECT_NE(nullptr,
+            symbolSource.findByName(test::parseNameOrDie("android:id/foo")));
+  EXPECT_NE(nullptr,
+            symbolSource.findByName(test::parseNameOrDie("android:id/bar")));
 
-    std::unique_ptr<SymbolTable::Symbol> s = symbolSource.findByName(
-            test::parseNameOrDie("android:attr/foo"));
-    ASSERT_NE(nullptr, s);
-    EXPECT_NE(nullptr, s->attribute);
+  std::unique_ptr<SymbolTable::Symbol> s =
+      symbolSource.findByName(test::parseNameOrDie("android:attr/foo"));
+  ASSERT_NE(nullptr, s);
+  EXPECT_NE(nullptr, s->attribute);
 }
 
 TEST(ResourceTableSymbolSourceTest, FindPrivateAttrSymbol) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addValue("android:^attr-private/foo", ResourceId(0x01010000),
-                      test::AttributeBuilder().build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addValue("android:^attr-private/foo", ResourceId(0x01010000),
+                    test::AttributeBuilder().build())
+          .build();
 
-    ResourceTableSymbolSource symbolSource(table.get());
-    std::unique_ptr<SymbolTable::Symbol> s = symbolSource.findByName(
-                test::parseNameOrDie("android:attr/foo"));
-    ASSERT_NE(nullptr, s);
-    EXPECT_NE(nullptr, s->attribute);
+  ResourceTableSymbolSource symbolSource(table.get());
+  std::unique_ptr<SymbolTable::Symbol> s =
+      symbolSource.findByName(test::parseNameOrDie("android:attr/foo"));
+  ASSERT_NE(nullptr, s);
+  EXPECT_NE(nullptr, s->attribute);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/proto/ProtoHelpers.h b/tools/aapt2/proto/ProtoHelpers.h
index 02e67f1..7271e8b 100644
--- a/tools/aapt2/proto/ProtoHelpers.h
+++ b/tools/aapt2/proto/ProtoHelpers.h
@@ -30,14 +30,18 @@
 
 void serializeStringPoolToPb(const StringPool& pool, pb::StringPool* outPbPool);
 
-void serializeSourceToPb(const Source& source, StringPool* srcPool, pb::Source* outPbSource);
-void deserializeSourceFromPb(const pb::Source& pbSource, const android::ResStringPool& srcPool,
+void serializeSourceToPb(const Source& source, StringPool* srcPool,
+                         pb::Source* outPbSource);
+void deserializeSourceFromPb(const pb::Source& pbSource,
+                             const android::ResStringPool& srcPool,
                              Source* outSource);
 
 pb::SymbolStatus_Visibility serializeVisibilityToPb(SymbolState state);
-SymbolState deserializeVisibilityFromPb(pb::SymbolStatus_Visibility pbVisibility);
+SymbolState deserializeVisibilityFromPb(
+    pb::SymbolStatus_Visibility pbVisibility);
 
-void serializeConfig(const ConfigDescription& config, pb::ConfigDescription* outPbConfig);
+void serializeConfig(const ConfigDescription& config,
+                     pb::ConfigDescription* outPbConfig);
 bool deserializeConfigDescriptionFromPb(const pb::ConfigDescription& pbConfig,
                                         ConfigDescription* outConfig);
 
@@ -47,6 +51,6 @@
 pb::Plural_Arity serializePluralEnumToPb(size_t pluralIdx);
 size_t deserializePluralEnumFromPb(pb::Plural_Arity arity);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_PROTO_PROTOHELPERS_H */
diff --git a/tools/aapt2/proto/ProtoSerialize.h b/tools/aapt2/proto/ProtoSerialize.h
index cc7c251..378dafd 100644
--- a/tools/aapt2/proto/ProtoSerialize.h
+++ b/tools/aapt2/proto/ProtoSerialize.h
@@ -29,49 +29,49 @@
 namespace aapt {
 
 class CompiledFileOutputStream {
-public:
-    explicit CompiledFileOutputStream(google::protobuf::io::ZeroCopyOutputStream* out);
+ public:
+  explicit CompiledFileOutputStream(
+      google::protobuf::io::ZeroCopyOutputStream* out);
 
-    void WriteLittleEndian32(uint32_t value);
-    void WriteCompiledFile(const pb::CompiledFile* compiledFile);
-    void WriteData(const BigBuffer* buffer);
-    void WriteData(const void* data, size_t len);
-    bool HadError();
+  void WriteLittleEndian32(uint32_t value);
+  void WriteCompiledFile(const pb::CompiledFile* compiledFile);
+  void WriteData(const BigBuffer* buffer);
+  void WriteData(const void* data, size_t len);
+  bool HadError();
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(CompiledFileOutputStream);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CompiledFileOutputStream);
 
-    void ensureAlignedWrite();
+  void ensureAlignedWrite();
 
-    google::protobuf::io::CodedOutputStream mOut;
+  google::protobuf::io::CodedOutputStream mOut;
 };
 
 class CompiledFileInputStream {
-public:
-    explicit CompiledFileInputStream(const void* data, size_t size);
+ public:
+  explicit CompiledFileInputStream(const void* data, size_t size);
 
-    bool ReadLittleEndian32(uint32_t* outVal);
-    bool ReadCompiledFile(pb::CompiledFile* outVal);
-    bool ReadDataMetaData(uint64_t* outOffset, uint64_t* outLen);
+  bool ReadLittleEndian32(uint32_t* outVal);
+  bool ReadCompiledFile(pb::CompiledFile* outVal);
+  bool ReadDataMetaData(uint64_t* outOffset, uint64_t* outLen);
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(CompiledFileInputStream);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CompiledFileInputStream);
 
-    void ensureAlignedRead();
+  void ensureAlignedRead();
 
-    google::protobuf::io::CodedInputStream mIn;
+  google::protobuf::io::CodedInputStream mIn;
 };
 
 std::unique_ptr<pb::ResourceTable> serializeTableToPb(ResourceTable* table);
-std::unique_ptr<ResourceTable> deserializeTableFromPb(const pb::ResourceTable& pbTable,
-                                                      const Source& source,
-                                                      IDiagnostics* diag);
+std::unique_ptr<ResourceTable> deserializeTableFromPb(
+    const pb::ResourceTable& pbTable, const Source& source, IDiagnostics* diag);
 
-std::unique_ptr<pb::CompiledFile> serializeCompiledFileToPb(const ResourceFile& file);
-std::unique_ptr<ResourceFile> deserializeCompiledFileFromPb(const pb::CompiledFile& pbFile,
-                                                            const Source& source,
-                                                            IDiagnostics* diag);
+std::unique_ptr<pb::CompiledFile> serializeCompiledFileToPb(
+    const ResourceFile& file);
+std::unique_ptr<ResourceFile> deserializeCompiledFileFromPb(
+    const pb::CompiledFile& pbFile, const Source& source, IDiagnostics* diag);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_TABLEPROTOSERIALIZER_H */
diff --git a/tools/aapt2/split/TableSplitter.h b/tools/aapt2/split/TableSplitter.h
index 2fa5c47..d7ecc82 100644
--- a/tools/aapt2/split/TableSplitter.h
+++ b/tools/aapt2/split/TableSplitter.h
@@ -29,50 +29,49 @@
 namespace aapt {
 
 struct SplitConstraints {
-    std::set<ConfigDescription> configs;
+  std::set<ConfigDescription> configs;
 };
 
 struct TableSplitterOptions {
-    /**
-     * The preferred density to keep in the table, stripping out all others.
-     */
-    Maybe<uint16_t> preferredDensity;
+  /**
+   * The preferred density to keep in the table, stripping out all others.
+   */
+  Maybe<uint16_t> preferredDensity;
 
-    /**
-     * Configuration filter that determines which resource configuration values end up in
-     * the final table.
-     */
-    IConfigFilter* configFilter = nullptr;
+  /**
+   * Configuration filter that determines which resource configuration values
+   * end up in
+   * the final table.
+   */
+  IConfigFilter* configFilter = nullptr;
 };
 
 class TableSplitter {
-public:
-    TableSplitter(const std::vector<SplitConstraints>& splits,
-                  const TableSplitterOptions& options) :
-            mSplitConstraints(splits), mPreferredDensity(options.preferredDensity),
-            mConfigFilter(options.configFilter) {
-        for (size_t i = 0; i < mSplitConstraints.size(); i++) {
-            mSplits.push_back(util::make_unique<ResourceTable>());
-        }
+ public:
+  TableSplitter(const std::vector<SplitConstraints>& splits,
+                const TableSplitterOptions& options)
+      : mSplitConstraints(splits),
+        mPreferredDensity(options.preferredDensity),
+        mConfigFilter(options.configFilter) {
+    for (size_t i = 0; i < mSplitConstraints.size(); i++) {
+      mSplits.push_back(util::make_unique<ResourceTable>());
     }
+  }
 
-    bool verifySplitConstraints(IAaptContext* context);
+  bool verifySplitConstraints(IAaptContext* context);
 
-    void splitTable(ResourceTable* originalTable);
+  void splitTable(ResourceTable* originalTable);
 
-    std::vector<std::unique_ptr<ResourceTable>>& getSplits() {
-        return mSplits;
-    }
+  std::vector<std::unique_ptr<ResourceTable>>& getSplits() { return mSplits; }
 
-private:
-    std::vector<SplitConstraints> mSplitConstraints;
-    std::vector<std::unique_ptr<ResourceTable>> mSplits;
-    Maybe<uint16_t> mPreferredDensity;
-    IConfigFilter* mConfigFilter;
+ private:
+  std::vector<SplitConstraints> mSplitConstraints;
+  std::vector<std::unique_ptr<ResourceTable>> mSplits;
+  Maybe<uint16_t> mPreferredDensity;
+  IConfigFilter* mConfigFilter;
 
-    DISALLOW_COPY_AND_ASSIGN(TableSplitter);
+  DISALLOW_COPY_AND_ASSIGN(TableSplitter);
 };
-
 }
 
 #endif /* AAPT_SPLIT_TABLESPLITTER_H */
diff --git a/tools/aapt2/test/Builders.h b/tools/aapt2/test/Builders.h
index 637e991..c647159 100644
--- a/tools/aapt2/test/Builders.h
+++ b/tools/aapt2/test/Builders.h
@@ -29,232 +29,242 @@
 namespace test {
 
 class ResourceTableBuilder {
-private:
-    DummyDiagnosticsImpl mDiagnostics;
-    std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
+ private:
+  DummyDiagnosticsImpl mDiagnostics;
+  std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
 
-public:
-    ResourceTableBuilder() = default;
+ public:
+  ResourceTableBuilder() = default;
 
-    StringPool* getStringPool() {
-        return &mTable->stringPool;
-    }
+  StringPool* getStringPool() { return &mTable->stringPool; }
 
-    ResourceTableBuilder& setPackageId(const StringPiece& packageName, uint8_t id) {
-        ResourceTablePackage* package = mTable->createPackage(packageName, id);
-        assert(package);
-        return *this;
-    }
+  ResourceTableBuilder& setPackageId(const StringPiece& packageName,
+                                     uint8_t id) {
+    ResourceTablePackage* package = mTable->createPackage(packageName, id);
+    assert(package);
+    return *this;
+  }
 
-    ResourceTableBuilder& addSimple(const StringPiece& name, const ResourceId& id = {}) {
-        return addValue(name, id, util::make_unique<Id>());
-    }
+  ResourceTableBuilder& addSimple(const StringPiece& name,
+                                  const ResourceId& id = {}) {
+    return addValue(name, id, util::make_unique<Id>());
+  }
 
-    ResourceTableBuilder& addSimple(const StringPiece& name, const ConfigDescription& config,
-                                    const ResourceId& id = {}) {
-        return addValue(name, config, id, util::make_unique<Id>());
-    }
+  ResourceTableBuilder& addSimple(const StringPiece& name,
+                                  const ConfigDescription& config,
+                                  const ResourceId& id = {}) {
+    return addValue(name, config, id, util::make_unique<Id>());
+  }
 
-    ResourceTableBuilder& addReference(const StringPiece& name, const StringPiece& ref) {
-        return addReference(name, {}, ref);
-    }
+  ResourceTableBuilder& addReference(const StringPiece& name,
+                                     const StringPiece& ref) {
+    return addReference(name, {}, ref);
+  }
 
-    ResourceTableBuilder& addReference(const StringPiece& name, const ResourceId& id,
-                                       const StringPiece& ref) {
-        return addValue(name, id, util::make_unique<Reference>(parseNameOrDie(ref)));
-    }
+  ResourceTableBuilder& addReference(const StringPiece& name,
+                                     const ResourceId& id,
+                                     const StringPiece& ref) {
+    return addValue(name, id,
+                    util::make_unique<Reference>(parseNameOrDie(ref)));
+  }
 
-    ResourceTableBuilder& addString(const StringPiece& name, const StringPiece& str) {
-        return addString(name, {}, str);
-    }
+  ResourceTableBuilder& addString(const StringPiece& name,
+                                  const StringPiece& str) {
+    return addString(name, {}, str);
+  }
 
-    ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
-                                    const StringPiece& str) {
-        return addValue(name, id, util::make_unique<String>(mTable->stringPool.makeRef(str)));
-    }
+  ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
+                                  const StringPiece& str) {
+    return addValue(name, id,
+                    util::make_unique<String>(mTable->stringPool.makeRef(str)));
+  }
 
-    ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
-                                    const ConfigDescription& config, const StringPiece& str) {
-        return addValue(name, config, id,
-                        util::make_unique<String>(mTable->stringPool.makeRef(str)));
-    }
+  ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
+                                  const ConfigDescription& config,
+                                  const StringPiece& str) {
+    return addValue(name, config, id,
+                    util::make_unique<String>(mTable->stringPool.makeRef(str)));
+  }
 
-    ResourceTableBuilder& addFileReference(const StringPiece& name, const StringPiece& path) {
-        return addFileReference(name, {}, path);
-    }
+  ResourceTableBuilder& addFileReference(const StringPiece& name,
+                                         const StringPiece& path) {
+    return addFileReference(name, {}, path);
+  }
 
-    ResourceTableBuilder& addFileReference(const StringPiece& name, const ResourceId& id,
-                                           const StringPiece& path) {
-        return addValue(name, id,
-                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
-    }
+  ResourceTableBuilder& addFileReference(const StringPiece& name,
+                                         const ResourceId& id,
+                                         const StringPiece& path) {
+    return addValue(name, id, util::make_unique<FileReference>(
+                                  mTable->stringPool.makeRef(path)));
+  }
 
-    ResourceTableBuilder& addFileReference(const StringPiece& name, const StringPiece& path,
-                                           const ConfigDescription& config) {
-        return addValue(name, config, {},
-                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
-    }
+  ResourceTableBuilder& addFileReference(const StringPiece& name,
+                                         const StringPiece& path,
+                                         const ConfigDescription& config) {
+    return addValue(name, config, {}, util::make_unique<FileReference>(
+                                          mTable->stringPool.makeRef(path)));
+  }
 
-    ResourceTableBuilder& addValue(const StringPiece& name,
-                                   std::unique_ptr<Value> value) {
-        return addValue(name, {}, std::move(value));
-    }
+  ResourceTableBuilder& addValue(const StringPiece& name,
+                                 std::unique_ptr<Value> value) {
+    return addValue(name, {}, std::move(value));
+  }
 
-    ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
-                                   std::unique_ptr<Value> value) {
-        return addValue(name, {}, id, std::move(value));
-    }
+  ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
+                                 std::unique_ptr<Value> value) {
+    return addValue(name, {}, id, std::move(value));
+  }
 
-    ResourceTableBuilder& addValue(const StringPiece& name, const ConfigDescription& config,
-                                   const ResourceId& id, std::unique_ptr<Value> value) {
-        ResourceName resName = parseNameOrDie(name);
-        bool result = mTable->addResourceAllowMangled(resName, id, config, {},
-                                                      std::move(value), &mDiagnostics);
-        assert(result);
-        return *this;
-    }
+  ResourceTableBuilder& addValue(const StringPiece& name,
+                                 const ConfigDescription& config,
+                                 const ResourceId& id,
+                                 std::unique_ptr<Value> value) {
+    ResourceName resName = parseNameOrDie(name);
+    bool result = mTable->addResourceAllowMangled(
+        resName, id, config, {}, std::move(value), &mDiagnostics);
+    assert(result);
+    return *this;
+  }
 
-    ResourceTableBuilder& setSymbolState(const StringPiece& name, const ResourceId& id,
-                                         SymbolState state) {
-        ResourceName resName = parseNameOrDie(name);
-        Symbol symbol;
-        symbol.state = state;
-        bool result = mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
-        assert(result);
-        return *this;
-    }
+  ResourceTableBuilder& setSymbolState(const StringPiece& name,
+                                       const ResourceId& id,
+                                       SymbolState state) {
+    ResourceName resName = parseNameOrDie(name);
+    Symbol symbol;
+    symbol.state = state;
+    bool result =
+        mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
+    assert(result);
+    return *this;
+  }
 
-    std::unique_ptr<ResourceTable> build() {
-        return std::move(mTable);
-    }
+  std::unique_ptr<ResourceTable> build() { return std::move(mTable); }
 };
 
-inline std::unique_ptr<Reference> buildReference(const StringPiece& ref,
-                                                 const Maybe<ResourceId>& id = {}) {
-    std::unique_ptr<Reference> reference = util::make_unique<Reference>(parseNameOrDie(ref));
-    reference->id = id;
-    return reference;
+inline std::unique_ptr<Reference> buildReference(
+    const StringPiece& ref, const Maybe<ResourceId>& id = {}) {
+  std::unique_ptr<Reference> reference =
+      util::make_unique<Reference>(parseNameOrDie(ref));
+  reference->id = id;
+  return reference;
 }
 
-inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type, uint32_t data) {
-    android::Res_value value = {};
-    value.size = sizeof(value);
-    value.dataType = type;
-    value.data = data;
-    return util::make_unique<BinaryPrimitive>(value);
+inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type,
+                                                       uint32_t data) {
+  android::Res_value value = {};
+  value.size = sizeof(value);
+  value.dataType = type;
+  value.data = data;
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 template <typename T>
 class ValueBuilder {
-private:
-    std::unique_ptr<Value> mValue;
+ private:
+  std::unique_ptr<Value> mValue;
 
-public:
-    template <typename... Args>
-    explicit ValueBuilder(Args&&... args) : mValue(new T{ std::forward<Args>(args)... }) {
-    }
+ public:
+  template <typename... Args>
+  explicit ValueBuilder(Args&&... args)
+      : mValue(new T{std::forward<Args>(args)...}) {}
 
-    template <typename... Args>
-    ValueBuilder& setSource(Args&&... args) {
-        mValue->setSource(Source{ std::forward<Args>(args)... });
-        return *this;
-    }
+  template <typename... Args>
+  ValueBuilder& setSource(Args&&... args) {
+    mValue->setSource(Source{std::forward<Args>(args)...});
+    return *this;
+  }
 
-    ValueBuilder& setComment(const StringPiece& str) {
-        mValue->setComment(str);
-        return *this;
-    }
+  ValueBuilder& setComment(const StringPiece& str) {
+    mValue->setComment(str);
+    return *this;
+  }
 
-    std::unique_ptr<Value> build() {
-        return std::move(mValue);
-    }
+  std::unique_ptr<Value> build() { return std::move(mValue); }
 };
 
 class AttributeBuilder {
-private:
-    std::unique_ptr<Attribute> mAttr;
+ private:
+  std::unique_ptr<Attribute> mAttr;
 
-public:
-    explicit AttributeBuilder(bool weak = false) : mAttr(util::make_unique<Attribute>(weak)) {
-        mAttr->typeMask = android::ResTable_map::TYPE_ANY;
-    }
+ public:
+  explicit AttributeBuilder(bool weak = false)
+      : mAttr(util::make_unique<Attribute>(weak)) {
+    mAttr->typeMask = android::ResTable_map::TYPE_ANY;
+  }
 
-    AttributeBuilder& setTypeMask(uint32_t typeMask) {
-        mAttr->typeMask = typeMask;
-        return *this;
-    }
+  AttributeBuilder& setTypeMask(uint32_t typeMask) {
+    mAttr->typeMask = typeMask;
+    return *this;
+  }
 
-    AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
-        mAttr->symbols.push_back(Attribute::Symbol{
-                Reference(ResourceName({}, ResourceType::kId, name)),
-                value});
-        return *this;
-    }
+  AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
+    mAttr->symbols.push_back(Attribute::Symbol{
+        Reference(ResourceName({}, ResourceType::kId, name)), value});
+    return *this;
+  }
 
-    std::unique_ptr<Attribute> build() {
-        return std::move(mAttr);
-    }
+  std::unique_ptr<Attribute> build() { return std::move(mAttr); }
 };
 
 class StyleBuilder {
-private:
-    std::unique_ptr<Style> mStyle = util::make_unique<Style>();
+ private:
+  std::unique_ptr<Style> mStyle = util::make_unique<Style>();
 
-public:
-    StyleBuilder& setParent(const StringPiece& str) {
-        mStyle->parent = Reference(parseNameOrDie(str));
-        return *this;
-    }
+ public:
+  StyleBuilder& setParent(const StringPiece& str) {
+    mStyle->parent = Reference(parseNameOrDie(str));
+    return *this;
+  }
 
-    StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
-        mStyle->entries.push_back(Style::Entry{ Reference(parseNameOrDie(str)), std::move(value) });
-        return *this;
-    }
+  StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
+    mStyle->entries.push_back(
+        Style::Entry{Reference(parseNameOrDie(str)), std::move(value)});
+    return *this;
+  }
 
-    StyleBuilder& addItem(const StringPiece& str, const ResourceId& id, std::unique_ptr<Item> value) {
-        addItem(str, std::move(value));
-        mStyle->entries.back().key.id = id;
-        return *this;
-    }
+  StyleBuilder& addItem(const StringPiece& str, const ResourceId& id,
+                        std::unique_ptr<Item> value) {
+    addItem(str, std::move(value));
+    mStyle->entries.back().key.id = id;
+    return *this;
+  }
 
-    std::unique_ptr<Style> build() {
-        return std::move(mStyle);
-    }
+  std::unique_ptr<Style> build() { return std::move(mStyle); }
 };
 
 class StyleableBuilder {
-private:
-    std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
+ private:
+  std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
 
-public:
-    StyleableBuilder& addItem(const StringPiece& str, const Maybe<ResourceId>& id = {}) {
-        mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
-        mStyleable->entries.back().id = id;
-        return *this;
-    }
+ public:
+  StyleableBuilder& addItem(const StringPiece& str,
+                            const Maybe<ResourceId>& id = {}) {
+    mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
+    mStyleable->entries.back().id = id;
+    return *this;
+  }
 
-    std::unique_ptr<Styleable> build() {
-        return std::move(mStyleable);
-    }
+  std::unique_ptr<Styleable> build() { return std::move(mStyleable); }
 };
 
 inline std::unique_ptr<xml::XmlResource> buildXmlDom(const StringPiece& str) {
-    std::stringstream in;
-    in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
-    StdErrDiagnostics diag;
-    std::unique_ptr<xml::XmlResource> doc = xml::inflate(&in, &diag, Source("test.xml"));
-    assert(doc);
-    return doc;
+  std::stringstream in;
+  in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
+  StdErrDiagnostics diag;
+  std::unique_ptr<xml::XmlResource> doc =
+      xml::inflate(&in, &diag, Source("test.xml"));
+  assert(doc);
+  return doc;
 }
 
-inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(IAaptContext* context,
-                                                                   const StringPiece& str) {
-    std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
-    doc->file.name.package = context->getCompilationPackage();
-    return doc;
+inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(
+    IAaptContext* context, const StringPiece& str) {
+  std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
+  doc->file.name.package = context->getCompilationPackage();
+  return doc;
 }
 
-} // namespace test
-} // namespace aapt
+}  // namespace test
+}  // namespace aapt
 
 #endif /* AAPT_TEST_BUILDERS_H */
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index 7fafcbe..2d571e7 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -30,7 +30,8 @@
 #include <iostream>
 
 //
-// GTEST 1.7 doesn't explicitly cast to bool, which causes explicit operators to fail to compile.
+// GTEST 1.7 doesn't explicitly cast to bool, which causes explicit operators to
+// fail to compile.
 //
 #define AAPT_ASSERT_TRUE(v) ASSERT_TRUE(bool(v))
 #define AAPT_ASSERT_FALSE(v) ASSERT_FALSE(bool(v))
@@ -41,81 +42,83 @@
 namespace test {
 
 struct DummyDiagnosticsImpl : public IDiagnostics {
-    void log(Level level, DiagMessageActual& actualMsg) override {
-        switch (level) {
-        case Level::Note:
-            return;
+  void log(Level level, DiagMessageActual& actualMsg) override {
+    switch (level) {
+      case Level::Note:
+        return;
 
-        case Level::Warn:
-            std::cerr << actualMsg.source << ": warn: " << actualMsg.message << "." << std::endl;
-            break;
+      case Level::Warn:
+        std::cerr << actualMsg.source << ": warn: " << actualMsg.message << "."
+                  << std::endl;
+        break;
 
-        case Level::Error:
-            std::cerr << actualMsg.source << ": error: " << actualMsg.message << "." << std::endl;
-            break;
-        }
+      case Level::Error:
+        std::cerr << actualMsg.source << ": error: " << actualMsg.message << "."
+                  << std::endl;
+        break;
     }
+  }
 };
 
 inline IDiagnostics* getDiagnostics() {
-    static DummyDiagnosticsImpl diag;
-    return &diag;
+  static DummyDiagnosticsImpl diag;
+  return &diag;
 }
 
 inline ResourceName parseNameOrDie(const StringPiece& str) {
-    ResourceNameRef ref;
-    bool result = ResourceUtils::parseResourceName(str, &ref);
-    assert(result && "invalid resource name");
-    return ref.toResourceName();
+  ResourceNameRef ref;
+  bool result = ResourceUtils::parseResourceName(str, &ref);
+  assert(result && "invalid resource name");
+  return ref.toResourceName();
 }
 
 inline ConfigDescription parseConfigOrDie(const StringPiece& str) {
-    ConfigDescription config;
-    bool result = ConfigDescription::parse(str, &config);
-    assert(result && "invalid configuration");
-    return config;
+  ConfigDescription config;
+  bool result = ConfigDescription::parse(str, &config);
+  assert(result && "invalid configuration");
+  return config;
 }
 
-template <typename T> T* getValueForConfigAndProduct(ResourceTable* table,
-                                                     const StringPiece& resName,
-                                                     const ConfigDescription& config,
-                                                     const StringPiece& product) {
-    Maybe<ResourceTable::SearchResult> result = table->findResource(parseNameOrDie(resName));
-    if (result) {
-        ResourceConfigValue* configValue = result.value().entry->findValue(config, product);
-        if (configValue) {
-            return valueCast<T>(configValue->value.get());
-        }
+template <typename T>
+T* getValueForConfigAndProduct(ResourceTable* table, const StringPiece& resName,
+                               const ConfigDescription& config,
+                               const StringPiece& product) {
+  Maybe<ResourceTable::SearchResult> result =
+      table->findResource(parseNameOrDie(resName));
+  if (result) {
+    ResourceConfigValue* configValue =
+        result.value().entry->findValue(config, product);
+    if (configValue) {
+      return valueCast<T>(configValue->value.get());
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
-template <typename T> T* getValueForConfig(ResourceTable* table, const StringPiece& resName,
-                                           const ConfigDescription& config) {
-    return getValueForConfigAndProduct<T>(table, resName, config, {});
+template <typename T>
+T* getValueForConfig(ResourceTable* table, const StringPiece& resName,
+                     const ConfigDescription& config) {
+  return getValueForConfigAndProduct<T>(table, resName, config, {});
 }
 
-template <typename T> T* getValue(ResourceTable* table, const StringPiece& resName) {
-    return getValueForConfig<T>(table, resName, {});
+template <typename T>
+T* getValue(ResourceTable* table, const StringPiece& resName) {
+  return getValueForConfig<T>(table, resName, {});
 }
 
 class TestFile : public io::IFile {
-private:
-    Source mSource;
+ private:
+  Source mSource;
 
-public:
-    explicit TestFile(const StringPiece& path) : mSource(path) {}
+ public:
+  explicit TestFile(const StringPiece& path) : mSource(path) {}
 
-    std::unique_ptr<io::IData> openAsData() override {
-        return {};
-    }
+  std::unique_ptr<io::IData> openAsData() override { return {}; }
 
-    const Source& getSource() const override {
-        return mSource;
-    }
+  const Source& getSource() const override { return mSource; }
 };
 
-} // namespace test
-} // namespace aapt
+}  // namespace test
+}  // namespace aapt
 
 #endif /* AAPT_TEST_COMMON_H */
diff --git a/tools/aapt2/test/Context.h b/tools/aapt2/test/Context.h
index 54f16db..6c7f6f7 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -18,10 +18,10 @@
 #define AAPT_TEST_CONTEXT_H
 
 #include "NameMangler.h"
-#include "util/Util.h"
 #include "process/IResourceTableConsumer.h"
 #include "process/SymbolTable.h"
 #include "test/Common.h"
+#include "util/Util.h"
 
 #include <cassert>
 #include <list>
@@ -30,152 +30,143 @@
 namespace test {
 
 class Context : public IAaptContext {
-public:
-    SymbolTable* getExternalSymbols() override {
-        return &mSymbols;
-    }
+ public:
+  SymbolTable* getExternalSymbols() override { return &mSymbols; }
 
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    const std::string& getCompilationPackage() override {
-        assert(mCompilationPackage && "package name not set");
-        return mCompilationPackage.value();
-    }
+  const std::string& getCompilationPackage() override {
+    assert(mCompilationPackage && "package name not set");
+    return mCompilationPackage.value();
+  }
 
-    uint8_t getPackageId() override {
-        assert(mPackageId && "package ID not set");
-        return mPackageId.value();
-    }
+  uint8_t getPackageId() override {
+    assert(mPackageId && "package ID not set");
+    return mPackageId.value();
+  }
 
-    NameMangler* getNameMangler() override {
-        return &mNameMangler;
-    }
+  NameMangler* getNameMangler() override { return &mNameMangler; }
 
-    bool verbose() override {
-        return false;
-    }
+  bool verbose() override { return false; }
 
-    int getMinSdkVersion() override {
-        return mMinSdkVersion;
-    }
+  int getMinSdkVersion() override { return mMinSdkVersion; }
 
-private:
-    friend class ContextBuilder;
+ private:
+  friend class ContextBuilder;
 
-    Maybe<std::string> mCompilationPackage;
-    Maybe<uint8_t> mPackageId;
-    StdErrDiagnostics mDiagnostics;
-    SymbolTable mSymbols;
-    NameMangler mNameMangler = NameMangler({});
-    int mMinSdkVersion = 0;
+  Maybe<std::string> mCompilationPackage;
+  Maybe<uint8_t> mPackageId;
+  StdErrDiagnostics mDiagnostics;
+  SymbolTable mSymbols;
+  NameMangler mNameMangler = NameMangler({});
+  int mMinSdkVersion = 0;
 };
 
 class ContextBuilder {
-private:
-    std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
+ private:
+  std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
 
-public:
-    ContextBuilder& setCompilationPackage(const StringPiece& package) {
-        mContext->mCompilationPackage = package.toString();
-        return *this;
-    }
+ public:
+  ContextBuilder& setCompilationPackage(const StringPiece& package) {
+    mContext->mCompilationPackage = package.toString();
+    return *this;
+  }
 
-    ContextBuilder& setPackageId(uint8_t id) {
-        mContext->mPackageId = id;
-        return *this;
-    }
+  ContextBuilder& setPackageId(uint8_t id) {
+    mContext->mPackageId = id;
+    return *this;
+  }
 
-    ContextBuilder& setNameManglerPolicy(const NameManglerPolicy& policy) {
-        mContext->mNameMangler = NameMangler(policy);
-        return *this;
-    }
+  ContextBuilder& setNameManglerPolicy(const NameManglerPolicy& policy) {
+    mContext->mNameMangler = NameMangler(policy);
+    return *this;
+  }
 
-    ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
-        mContext->getExternalSymbols()->appendSource(std::move(src));
-        return *this;
-    }
+  ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
+    mContext->getExternalSymbols()->appendSource(std::move(src));
+    return *this;
+  }
 
-    ContextBuilder& setMinSdkVersion(int minSdk) {
-        mContext->mMinSdkVersion = minSdk;
-        return *this;
-    }
+  ContextBuilder& setMinSdkVersion(int minSdk) {
+    mContext->mMinSdkVersion = minSdk;
+    return *this;
+  }
 
-    std::unique_ptr<Context> build() {
-        return std::move(mContext);
-    }
+  std::unique_ptr<Context> build() { return std::move(mContext); }
 };
 
 class StaticSymbolSourceBuilder {
-public:
-    StaticSymbolSourceBuilder& addPublicSymbol(const StringPiece& name, ResourceId id,
-                                               std::unique_ptr<Attribute> attr = {}) {
-        std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
-                id, std::move(attr), true);
-        mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
-        mSymbolSource->mIdMap[id] = symbol.get();
-        mSymbolSource->mSymbols.push_back(std::move(symbol));
-        return *this;
+ public:
+  StaticSymbolSourceBuilder& addPublicSymbol(
+      const StringPiece& name, ResourceId id,
+      std::unique_ptr<Attribute> attr = {}) {
+    std::unique_ptr<SymbolTable::Symbol> symbol =
+        util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
+    mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
+    mSymbolSource->mIdMap[id] = symbol.get();
+    mSymbolSource->mSymbols.push_back(std::move(symbol));
+    return *this;
+  }
+
+  StaticSymbolSourceBuilder& addSymbol(const StringPiece& name, ResourceId id,
+                                       std::unique_ptr<Attribute> attr = {}) {
+    std::unique_ptr<SymbolTable::Symbol> symbol =
+        util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
+    mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
+    mSymbolSource->mIdMap[id] = symbol.get();
+    mSymbolSource->mSymbols.push_back(std::move(symbol));
+    return *this;
+  }
+
+  std::unique_ptr<ISymbolSource> build() { return std::move(mSymbolSource); }
+
+ private:
+  class StaticSymbolSource : public ISymbolSource {
+   public:
+    StaticSymbolSource() = default;
+
+    std::unique_ptr<SymbolTable::Symbol> findByName(
+        const ResourceName& name) override {
+      auto iter = mNameMap.find(name);
+      if (iter != mNameMap.end()) {
+        return cloneSymbol(iter->second);
+      }
+      return nullptr;
     }
 
-    StaticSymbolSourceBuilder& addSymbol(const StringPiece& name, ResourceId id,
-                                         std::unique_ptr<Attribute> attr = {}) {
-        std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
-                id, std::move(attr), false);
-        mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
-        mSymbolSource->mIdMap[id] = symbol.get();
-        mSymbolSource->mSymbols.push_back(std::move(symbol));
-        return *this;
+    std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
+      auto iter = mIdMap.find(id);
+      if (iter != mIdMap.end()) {
+        return cloneSymbol(iter->second);
+      }
+      return nullptr;
     }
 
-    std::unique_ptr<ISymbolSource> build() {
-        return std::move(mSymbolSource);
+    std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
+    std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
+    std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
+
+   private:
+    std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
+      std::unique_ptr<SymbolTable::Symbol> clone =
+          util::make_unique<SymbolTable::Symbol>();
+      clone->id = sym->id;
+      if (sym->attribute) {
+        clone->attribute =
+            std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
+      }
+      clone->isPublic = sym->isPublic;
+      return clone;
     }
 
-private:
-    class StaticSymbolSource : public ISymbolSource {
-    public:
-        StaticSymbolSource() = default;
+    DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
+  };
 
-        std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override {
-            auto iter = mNameMap.find(name);
-            if (iter != mNameMap.end()) {
-                return cloneSymbol(iter->second);
-            }
-            return nullptr;
-        }
-
-        std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
-            auto iter = mIdMap.find(id);
-            if (iter != mIdMap.end()) {
-                return cloneSymbol(iter->second);
-            }
-            return nullptr;
-        }
-
-        std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
-        std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
-        std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
-
-    private:
-        std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
-            std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
-            clone->id = sym->id;
-            if (sym->attribute) {
-                clone->attribute = std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
-            }
-            clone->isPublic = sym->isPublic;
-            return clone;
-        }
-
-        DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
-    };
-
-    std::unique_ptr<StaticSymbolSource> mSymbolSource = util::make_unique<StaticSymbolSource>();
+  std::unique_ptr<StaticSymbolSource> mSymbolSource =
+      util::make_unique<StaticSymbolSource>();
 };
 
-} // namespace test
-} // namespace aapt
+}  // namespace test
+}  // namespace aapt
 
 #endif /* AAPT_TEST_CONTEXT_H */
diff --git a/tools/aapt2/test/Test.h b/tools/aapt2/test/Test.h
index d4845cf..c9188bf 100644
--- a/tools/aapt2/test/Test.h
+++ b/tools/aapt2/test/Test.h
@@ -24,9 +24,7 @@
 #include <gtest/gtest.h>
 
 namespace aapt {
-namespace test {
+namespace test {}  // namespace test
+}  // namespace aapt
 
-} // namespace test
-} // namespace aapt
-
-#endif // AAPT_TEST_TEST_H
+#endif  // AAPT_TEST_TEST_H
diff --git a/tools/aapt2/unflatten/BinaryResourceParser.h b/tools/aapt2/unflatten/BinaryResourceParser.h
index 12bc13d..99f2bd4 100644
--- a/tools/aapt2/unflatten/BinaryResourceParser.h
+++ b/tools/aapt2/unflatten/BinaryResourceParser.h
@@ -39,80 +39,86 @@
  * chunks and types.
  */
 class BinaryResourceParser {
-public:
-    /*
-     * Creates a parser, which will read `len` bytes from `data`, and
-     * add any resources parsed to `table`. `source` is for logging purposes.
-     */
-    BinaryResourceParser(IAaptContext* context, ResourceTable* table, const Source& source,
-                         const void* data, size_t dataLen);
+ public:
+  /*
+   * Creates a parser, which will read `len` bytes from `data`, and
+   * add any resources parsed to `table`. `source` is for logging purposes.
+   */
+  BinaryResourceParser(IAaptContext* context, ResourceTable* table,
+                       const Source& source, const void* data, size_t dataLen);
 
-    BinaryResourceParser(const BinaryResourceParser&) = delete; // No copy.
+  BinaryResourceParser(const BinaryResourceParser&) = delete;  // No copy.
 
-    /*
-     * Parses the binary resource table and returns true if successful.
-     */
-    bool parse();
+  /*
+   * Parses the binary resource table and returns true if successful.
+   */
+  bool parse();
 
-private:
-    bool parseTable(const android::ResChunk_header* chunk);
-    bool parsePackage(const android::ResChunk_header* chunk);
-    bool parseTypeSpec(const android::ResChunk_header* chunk);
-    bool parseType(const ResourceTablePackage* package, const android::ResChunk_header* chunk);
+ private:
+  bool parseTable(const android::ResChunk_header* chunk);
+  bool parsePackage(const android::ResChunk_header* chunk);
+  bool parseTypeSpec(const android::ResChunk_header* chunk);
+  bool parseType(const ResourceTablePackage* package,
+                 const android::ResChunk_header* chunk);
 
-    std::unique_ptr<Item> parseValue(const ResourceNameRef& name, const ConfigDescription& config,
-                                     const android::Res_value* value, uint16_t flags);
+  std::unique_ptr<Item> parseValue(const ResourceNameRef& name,
+                                   const ConfigDescription& config,
+                                   const android::Res_value* value,
+                                   uint16_t flags);
 
-    std::unique_ptr<Value> parseMapEntry(const ResourceNameRef& name,
-                                         const ConfigDescription& config,
-                                         const android::ResTable_map_entry* map);
+  std::unique_ptr<Value> parseMapEntry(const ResourceNameRef& name,
+                                       const ConfigDescription& config,
+                                       const android::ResTable_map_entry* map);
 
-    std::unique_ptr<Style> parseStyle(const ResourceNameRef& name, const ConfigDescription& config,
+  std::unique_ptr<Style> parseStyle(const ResourceNameRef& name,
+                                    const ConfigDescription& config,
+                                    const android::ResTable_map_entry* map);
+
+  std::unique_ptr<Attribute> parseAttr(const ResourceNameRef& name,
+                                       const ConfigDescription& config,
+                                       const android::ResTable_map_entry* map);
+
+  std::unique_ptr<Array> parseArray(const ResourceNameRef& name,
+                                    const ConfigDescription& config,
+                                    const android::ResTable_map_entry* map);
+
+  std::unique_ptr<Plural> parsePlural(const ResourceNameRef& name,
+                                      const ConfigDescription& config,
                                       const android::ResTable_map_entry* map);
 
-    std::unique_ptr<Attribute> parseAttr(const ResourceNameRef& name,
-                                         const ConfigDescription& config,
-                                         const android::ResTable_map_entry* map);
+  /**
+   * If the mapEntry is a special type that denotes meta data (source, comment),
+   * then it is
+   * read and added to the Value.
+   * Returns true if the mapEntry was meta data.
+   */
+  bool collectMetaData(const android::ResTable_map& mapEntry, Value* value);
 
-    std::unique_ptr<Array> parseArray(const ResourceNameRef& name, const ConfigDescription& config,
-                                      const android::ResTable_map_entry* map);
+  IAaptContext* mContext;
+  ResourceTable* mTable;
 
-    std::unique_ptr<Plural> parsePlural(const ResourceNameRef& name,
-                                        const ConfigDescription& config,
-                                        const android::ResTable_map_entry* map);
+  const Source mSource;
 
-    /**
-     * If the mapEntry is a special type that denotes meta data (source, comment), then it is
-     * read and added to the Value.
-     * Returns true if the mapEntry was meta data.
-     */
-    bool collectMetaData(const android::ResTable_map& mapEntry, Value* value);
+  const void* mData;
+  const size_t mDataLen;
 
-    IAaptContext* mContext;
-    ResourceTable* mTable;
+  // The standard value string pool for resource values.
+  android::ResStringPool mValuePool;
 
-    const Source mSource;
+  // The string pool that holds the names of the types defined
+  // in this table.
+  android::ResStringPool mTypePool;
 
-    const void* mData;
-    const size_t mDataLen;
+  // The string pool that holds the names of the entries defined
+  // in this table.
+  android::ResStringPool mKeyPool;
 
-    // The standard value string pool for resource values.
-    android::ResStringPool mValuePool;
-
-    // The string pool that holds the names of the types defined
-    // in this table.
-    android::ResStringPool mTypePool;
-
-    // The string pool that holds the names of the entries defined
-    // in this table.
-    android::ResStringPool mKeyPool;
-
-    // A mapping of resource ID to resource name. When we finish parsing
-    // we use this to convert all resource IDs to symbolic references.
-    std::map<ResourceId, ResourceName> mIdIndex;
+  // A mapping of resource ID to resource name. When we finish parsing
+  // we use this to convert all resource IDs to symbolic references.
+  std::map<ResourceId, ResourceName> mIdIndex;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 namespace android {
 
@@ -121,13 +127,14 @@
  */
 
 inline const ResTable_map* begin(const ResTable_map_entry* map) {
-    return (const ResTable_map*)((const uint8_t*) map + aapt::util::deviceToHost32(map->size));
+  return (const ResTable_map*)((const uint8_t*)map +
+                               aapt::util::deviceToHost32(map->size));
 }
 
 inline const ResTable_map* end(const ResTable_map_entry* map) {
-    return begin(map) + aapt::util::deviceToHost32(map->count);
+  return begin(map) + aapt::util::deviceToHost32(map->count);
 }
 
-} // namespace android
+}  // namespace android
 
-#endif // AAPT_BINARY_RESOURCE_PARSER_H
+#endif  // AAPT_BINARY_RESOURCE_PARSER_H
diff --git a/tools/aapt2/unflatten/ResChunkPullParser.h b/tools/aapt2/unflatten/ResChunkPullParser.h
index a51d5bf..24fa63d 100644
--- a/tools/aapt2/unflatten/ResChunkPullParser.h
+++ b/tools/aapt2/unflatten/ResChunkPullParser.h
@@ -37,59 +37,62 @@
  * pointing to the data portion of a chunk.
  */
 class ResChunkPullParser {
-public:
-    enum class Event {
-        StartDocument,
-        EndDocument,
-        BadDocument,
+ public:
+  enum class Event {
+    StartDocument,
+    EndDocument,
+    BadDocument,
 
-        Chunk,
-    };
+    Chunk,
+  };
 
-    /**
-     * Returns false if the event is EndDocument or BadDocument.
-     */
-    static bool isGoodEvent(Event event);
+  /**
+   * Returns false if the event is EndDocument or BadDocument.
+   */
+  static bool isGoodEvent(Event event);
 
-    /**
-     * Create a ResChunkPullParser to read android::ResChunk_headers
-     * from the memory pointed to by data, of len bytes.
-     */
-    ResChunkPullParser(const void* data, size_t len);
+  /**
+   * Create a ResChunkPullParser to read android::ResChunk_headers
+   * from the memory pointed to by data, of len bytes.
+   */
+  ResChunkPullParser(const void* data, size_t len);
 
-    ResChunkPullParser(const ResChunkPullParser&) = delete;
+  ResChunkPullParser(const ResChunkPullParser&) = delete;
 
-    Event getEvent() const;
-    const std::string& getLastError() const;
-    const android::ResChunk_header* getChunk() const;
+  Event getEvent() const;
+  const std::string& getLastError() const;
+  const android::ResChunk_header* getChunk() const;
 
-    /**
-     * Move to the next android::ResChunk_header.
-     */
-    Event next();
+  /**
+   * Move to the next android::ResChunk_header.
+   */
+  Event next();
 
-private:
-    Event mEvent;
-    const android::ResChunk_header* mData;
-    size_t mLen;
-    const android::ResChunk_header* mCurrentChunk;
-    std::string mLastError;
+ private:
+  Event mEvent;
+  const android::ResChunk_header* mData;
+  size_t mLen;
+  const android::ResChunk_header* mCurrentChunk;
+  std::string mLastError;
 };
 
 template <typename T>
 inline static const T* convertTo(const android::ResChunk_header* chunk) {
-    if (util::deviceToHost16(chunk->headerSize) < sizeof(T)) {
-        return nullptr;
-    }
-    return reinterpret_cast<const T*>(chunk);
+  if (util::deviceToHost16(chunk->headerSize) < sizeof(T)) {
+    return nullptr;
+  }
+  return reinterpret_cast<const T*>(chunk);
 }
 
-inline static const uint8_t* getChunkData(const android::ResChunk_header* chunk) {
-    return reinterpret_cast<const uint8_t*>(chunk) + util::deviceToHost16(chunk->headerSize);
+inline static const uint8_t* getChunkData(
+    const android::ResChunk_header* chunk) {
+  return reinterpret_cast<const uint8_t*>(chunk) +
+         util::deviceToHost16(chunk->headerSize);
 }
 
 inline static uint32_t getChunkDataLen(const android::ResChunk_header* chunk) {
-    return util::deviceToHost32(chunk->size) - util::deviceToHost16(chunk->headerSize);
+  return util::deviceToHost32(chunk->size) -
+         util::deviceToHost16(chunk->headerSize);
 }
 
 //
@@ -97,28 +100,27 @@
 //
 
 inline bool ResChunkPullParser::isGoodEvent(ResChunkPullParser::Event event) {
-    return event != Event::EndDocument && event != Event::BadDocument;
+  return event != Event::EndDocument && event != Event::BadDocument;
 }
 
-inline ResChunkPullParser::ResChunkPullParser(const void* data, size_t len) :
-        mEvent(Event::StartDocument),
-        mData(reinterpret_cast<const android::ResChunk_header*>(data)),
-        mLen(len),
-        mCurrentChunk(nullptr) {
-}
+inline ResChunkPullParser::ResChunkPullParser(const void* data, size_t len)
+    : mEvent(Event::StartDocument),
+      mData(reinterpret_cast<const android::ResChunk_header*>(data)),
+      mLen(len),
+      mCurrentChunk(nullptr) {}
 
 inline ResChunkPullParser::Event ResChunkPullParser::getEvent() const {
-    return mEvent;
+  return mEvent;
 }
 
 inline const std::string& ResChunkPullParser::getLastError() const {
-    return mLastError;
+  return mLastError;
 }
 
 inline const android::ResChunk_header* ResChunkPullParser::getChunk() const {
-    return mCurrentChunk;
+  return mCurrentChunk;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RES_CHUNK_PULL_PARSER_H
+#endif  // AAPT_RES_CHUNK_PULL_PARSER_H
diff --git a/tools/aapt2/util/BigBuffer.h b/tools/aapt2/util/BigBuffer.h
index 685614f..b273733 100644
--- a/tools/aapt2/util/BigBuffer.h
+++ b/tools/aapt2/util/BigBuffer.h
@@ -32,156 +32,153 @@
  * block is allocated and appended to the end of the list.
  */
 class BigBuffer {
-public:
+ public:
+  /**
+   * A contiguous block of allocated memory.
+   */
+  struct Block {
     /**
-     * A contiguous block of allocated memory.
+     * Pointer to the memory.
      */
-    struct Block {
-        /**
-         * Pointer to the memory.
-         */
-        std::unique_ptr<uint8_t[]> buffer;
-
-        /**
-         * Size of memory that is currently occupied. The actual
-         * allocation may be larger.
-         */
-        size_t size;
-
-    private:
-        friend class BigBuffer;
-
-        /**
-         * The size of the memory block allocation.
-         */
-        size_t mBlockSize;
-    };
-
-    typedef std::vector<Block>::const_iterator const_iterator;
+    std::unique_ptr<uint8_t[]> buffer;
 
     /**
-     * Create a BigBuffer with block allocation sizes
-     * of blockSize.
+     * Size of memory that is currently occupied. The actual
+     * allocation may be larger.
      */
-    explicit BigBuffer(size_t blockSize);
+    size_t size;
 
-    BigBuffer(const BigBuffer&) = delete; // No copying.
-
-    BigBuffer(BigBuffer&& rhs);
+   private:
+    friend class BigBuffer;
 
     /**
-     * Number of occupied bytes in all the allocated blocks.
+     * The size of the memory block allocation.
      */
-    size_t size() const;
-
-    /**
-     * Returns a pointer to an array of T, where T is
-     * a POD type. The elements are zero-initialized.
-     */
-    template <typename T>
-    T* nextBlock(size_t count = 1);
-
-    /**
-     * Returns the next block available and puts the size in outCount.
-     * This is useful for grabbing blocks where the size doesn't matter.
-     * Use backUp() to give back any bytes that were not used.
-     */
-    void* nextBlock(size_t* outCount);
-
-    /**
-     * Backs up count bytes. This must only be called after nextBlock()
-     * and can not be larger than sizeof(T) * count of the last nextBlock()
-     * call.
-     */
-    void backUp(size_t count);
-
-    /**
-     * Moves the specified BigBuffer into this one. When this method
-     * returns, buffer is empty.
-     */
-    void appendBuffer(BigBuffer&& buffer);
-
-    /**
-     * Pads the block with 'bytes' bytes of zero values.
-     */
-    void pad(size_t bytes);
-
-    /**
-     * Pads the block so that it aligns on a 4 byte boundary.
-     */
-    void align4();
-
-    size_t getBlockSize() const;
-
-    const_iterator begin() const;
-    const_iterator end() const;
-
-private:
-    /**
-     * Returns a pointer to a buffer of the requested size.
-     * The buffer is zero-initialized.
-     */
-    void* nextBlockImpl(size_t size);
-
     size_t mBlockSize;
-    size_t mSize;
-    std::vector<Block> mBlocks;
+  };
+
+  typedef std::vector<Block>::const_iterator const_iterator;
+
+  /**
+   * Create a BigBuffer with block allocation sizes
+   * of blockSize.
+   */
+  explicit BigBuffer(size_t blockSize);
+
+  BigBuffer(const BigBuffer&) = delete;  // No copying.
+
+  BigBuffer(BigBuffer&& rhs);
+
+  /**
+   * Number of occupied bytes in all the allocated blocks.
+   */
+  size_t size() const;
+
+  /**
+   * Returns a pointer to an array of T, where T is
+   * a POD type. The elements are zero-initialized.
+   */
+  template <typename T>
+  T* nextBlock(size_t count = 1);
+
+  /**
+   * Returns the next block available and puts the size in outCount.
+   * This is useful for grabbing blocks where the size doesn't matter.
+   * Use backUp() to give back any bytes that were not used.
+   */
+  void* nextBlock(size_t* outCount);
+
+  /**
+   * Backs up count bytes. This must only be called after nextBlock()
+   * and can not be larger than sizeof(T) * count of the last nextBlock()
+   * call.
+   */
+  void backUp(size_t count);
+
+  /**
+   * Moves the specified BigBuffer into this one. When this method
+   * returns, buffer is empty.
+   */
+  void appendBuffer(BigBuffer&& buffer);
+
+  /**
+   * Pads the block with 'bytes' bytes of zero values.
+   */
+  void pad(size_t bytes);
+
+  /**
+   * Pads the block so that it aligns on a 4 byte boundary.
+   */
+  void align4();
+
+  size_t getBlockSize() const;
+
+  const_iterator begin() const;
+  const_iterator end() const;
+
+ private:
+  /**
+   * Returns a pointer to a buffer of the requested size.
+   * The buffer is zero-initialized.
+   */
+  void* nextBlockImpl(size_t size);
+
+  size_t mBlockSize;
+  size_t mSize;
+  std::vector<Block> mBlocks;
 };
 
-inline BigBuffer::BigBuffer(size_t blockSize) : mBlockSize(blockSize), mSize(0) {
-}
+inline BigBuffer::BigBuffer(size_t blockSize)
+    : mBlockSize(blockSize), mSize(0) {}
 
-inline BigBuffer::BigBuffer(BigBuffer&& rhs) :
-        mBlockSize(rhs.mBlockSize), mSize(rhs.mSize), mBlocks(std::move(rhs.mBlocks)) {
-}
+inline BigBuffer::BigBuffer(BigBuffer&& rhs)
+    : mBlockSize(rhs.mBlockSize),
+      mSize(rhs.mSize),
+      mBlocks(std::move(rhs.mBlocks)) {}
 
-inline size_t BigBuffer::size() const {
-    return mSize;
-}
+inline size_t BigBuffer::size() const { return mSize; }
 
-inline size_t BigBuffer::getBlockSize() const {
-    return mBlockSize;
-}
+inline size_t BigBuffer::getBlockSize() const { return mBlockSize; }
 
 template <typename T>
 inline T* BigBuffer::nextBlock(size_t count) {
-    static_assert(std::is_standard_layout<T>::value, "T must be standard_layout type");
-    assert(count != 0);
-    return reinterpret_cast<T*>(nextBlockImpl(sizeof(T) * count));
+  static_assert(std::is_standard_layout<T>::value,
+                "T must be standard_layout type");
+  assert(count != 0);
+  return reinterpret_cast<T*>(nextBlockImpl(sizeof(T) * count));
 }
 
 inline void BigBuffer::backUp(size_t count) {
-    Block& block = mBlocks.back();
-    block.size -= count;
-    mSize -= count;
+  Block& block = mBlocks.back();
+  block.size -= count;
+  mSize -= count;
 }
 
 inline void BigBuffer::appendBuffer(BigBuffer&& buffer) {
-    std::move(buffer.mBlocks.begin(), buffer.mBlocks.end(), std::back_inserter(mBlocks));
-    mSize += buffer.mSize;
-    buffer.mBlocks.clear();
-    buffer.mSize = 0;
+  std::move(buffer.mBlocks.begin(), buffer.mBlocks.end(),
+            std::back_inserter(mBlocks));
+  mSize += buffer.mSize;
+  buffer.mBlocks.clear();
+  buffer.mSize = 0;
 }
 
-inline void BigBuffer::pad(size_t bytes) {
-    nextBlock<char>(bytes);
-}
+inline void BigBuffer::pad(size_t bytes) { nextBlock<char>(bytes); }
 
 inline void BigBuffer::align4() {
-    const size_t unaligned = mSize % 4;
-    if (unaligned != 0) {
-        pad(4 - unaligned);
-    }
+  const size_t unaligned = mSize % 4;
+  if (unaligned != 0) {
+    pad(4 - unaligned);
+  }
 }
 
 inline BigBuffer::const_iterator BigBuffer::begin() const {
-    return mBlocks.begin();
+  return mBlocks.begin();
 }
 
 inline BigBuffer::const_iterator BigBuffer::end() const {
-    return mBlocks.end();
+  return mBlocks.end();
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_BIG_BUFFER_H
+#endif  // AAPT_BIG_BUFFER_H
diff --git a/tools/aapt2/util/Files.h b/tools/aapt2/util/Files.h
index 52c2052..d90c6b6 100644
--- a/tools/aapt2/util/Files.h
+++ b/tools/aapt2/util/Files.h
@@ -39,15 +39,15 @@
 #endif
 
 enum class FileType {
-    kUnknown = 0,
-    kNonexistant,
-    kRegular,
-    kDirectory,
-    kCharDev,
-    kBlockDev,
-    kFifo,
-    kSymlink,
-    kSocket,
+  kUnknown = 0,
+  kNonexistant,
+  kRegular,
+  kDirectory,
+  kCharDev,
+  kBlockDev,
+  kFifo,
+  kSymlink,
+  kSocket,
 };
 
 FileType getFileType(const StringPiece& path);
@@ -93,12 +93,14 @@
 /**
  * Creates a FileMap for the file at path.
  */
-Maybe<android::FileMap> mmapPath(const StringPiece& path, std::string* outError);
+Maybe<android::FileMap> mmapPath(const StringPiece& path,
+                                 std::string* outError);
 
 /**
  * Reads the file at path and appends each line to the outArgList vector.
  */
-bool appendArgsFromFile(const StringPiece& path, std::vector<std::string>* outArgList,
+bool appendArgsFromFile(const StringPiece& path,
+                        std::vector<std::string>* outArgList,
                         std::string* outError);
 
 /*
@@ -108,37 +110,36 @@
  * FileFilter::setPattern(const std::string&) method.
  */
 class FileFilter {
-public:
-    explicit FileFilter(IDiagnostics* diag) : mDiag(diag) {
-    }
+ public:
+  explicit FileFilter(IDiagnostics* diag) : mDiag(diag) {}
 
-    /*
-     * Patterns syntax:
-     * - Delimiter is :
-     * - Entry can start with the flag ! to avoid printing a warning
-     *   about the file being ignored.
-     * - Entry can have the flag "<dir>" to match only directories
-     *   or <file> to match only files. Default is to match both.
-     * - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
-     *   where prefix/suffix must have at least 1 character (so that
-     *   we don't match a '*' catch-all pattern.)
-     * - The special filenames "." and ".." are always ignored.
-     * - Otherwise the full string is matched.
-     * - match is not case-sensitive.
-     */
-    bool setPattern(const StringPiece& pattern);
+  /*
+   * Patterns syntax:
+   * - Delimiter is :
+   * - Entry can start with the flag ! to avoid printing a warning
+   *   about the file being ignored.
+   * - Entry can have the flag "<dir>" to match only directories
+   *   or <file> to match only files. Default is to match both.
+   * - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
+   *   where prefix/suffix must have at least 1 character (so that
+   *   we don't match a '*' catch-all pattern.)
+   * - The special filenames "." and ".." are always ignored.
+   * - Otherwise the full string is matched.
+   * - match is not case-sensitive.
+   */
+  bool setPattern(const StringPiece& pattern);
 
-    /**
-     * Applies the filter, returning true for pass, false for fail.
-     */
-    bool operator()(const std::string& filename, FileType type) const;
+  /**
+   * Applies the filter, returning true for pass, false for fail.
+   */
+  bool operator()(const std::string& filename, FileType type) const;
 
-private:
-    IDiagnostics* mDiag;
-    std::vector<std::string> mPatternTokens;
+ private:
+  IDiagnostics* mDiag;
+  std::vector<std::string> mPatternTokens;
 };
 
-} // namespace file
-} // namespace aapt
+}  // namespace file
+}  // namespace aapt
 
-#endif // AAPT_FILES_H
+#endif  // AAPT_FILES_H
diff --git a/tools/aapt2/util/ImmutableMap.h b/tools/aapt2/util/ImmutableMap.h
index b1f9e9d..6f48764 100644
--- a/tools/aapt2/util/ImmutableMap.h
+++ b/tools/aapt2/util/ImmutableMap.h
@@ -26,59 +26,57 @@
 
 template <typename TKey, typename TValue>
 class ImmutableMap {
-    static_assert(is_comparable<TKey, TKey>::value, "key is not comparable");
+  static_assert(is_comparable<TKey, TKey>::value, "key is not comparable");
 
-private:
-    std::vector<std::pair<TKey, TValue>> mData;
+ private:
+  std::vector<std::pair<TKey, TValue>> mData;
 
-    explicit ImmutableMap(std::vector<std::pair<TKey, TValue>> data) : mData(std::move(data)) {
+  explicit ImmutableMap(std::vector<std::pair<TKey, TValue>> data)
+      : mData(std::move(data)) {}
+
+ public:
+  using const_iterator = typename decltype(mData)::const_iterator;
+
+  ImmutableMap(ImmutableMap&&) = default;
+  ImmutableMap& operator=(ImmutableMap&&) = default;
+
+  ImmutableMap(const ImmutableMap&) = delete;
+  ImmutableMap& operator=(const ImmutableMap&) = delete;
+
+  static ImmutableMap<TKey, TValue> createPreSorted(
+      std::initializer_list<std::pair<TKey, TValue>> list) {
+    return ImmutableMap(
+        std::vector<std::pair<TKey, TValue>>(list.begin(), list.end()));
+  }
+
+  static ImmutableMap<TKey, TValue> createAndSort(
+      std::initializer_list<std::pair<TKey, TValue>> list) {
+    std::vector<std::pair<TKey, TValue>> data(list.begin(), list.end());
+    std::sort(data.begin(), data.end());
+    return ImmutableMap(std::move(data));
+  }
+
+  template <typename TKey2, typename = typename std::enable_if<
+                                is_comparable<TKey, TKey2>::value>::type>
+  const_iterator find(const TKey2& key) const {
+    auto cmp = [](const std::pair<TKey, TValue>& candidate,
+                  const TKey2& target) -> bool {
+      return candidate.first < target;
+    };
+
+    const_iterator endIter = end();
+    auto iter = std::lower_bound(mData.begin(), endIter, key, cmp);
+    if (iter == endIter || iter->first == key) {
+      return iter;
     }
+    return endIter;
+  }
 
-public:
-    using const_iterator = typename decltype(mData)::const_iterator;
+  const_iterator begin() const { return mData.begin(); }
 
-    ImmutableMap(ImmutableMap&&) = default;
-    ImmutableMap& operator=(ImmutableMap&&) = default;
-
-    ImmutableMap(const ImmutableMap&) = delete;
-    ImmutableMap& operator=(const ImmutableMap&) = delete;
-
-    static ImmutableMap<TKey, TValue> createPreSorted(
-            std::initializer_list<std::pair<TKey, TValue>> list) {
-        return ImmutableMap(std::vector<std::pair<TKey, TValue>>(list.begin(), list.end()));
-    }
-
-    static ImmutableMap<TKey, TValue> createAndSort(
-            std::initializer_list<std::pair<TKey, TValue>> list) {
-        std::vector<std::pair<TKey, TValue>> data(list.begin(), list.end());
-        std::sort(data.begin(), data.end());
-        return ImmutableMap(std::move(data));
-    }
-
-    template <typename TKey2,
-              typename = typename std::enable_if<is_comparable<TKey, TKey2>::value>::type>
-    const_iterator find(const TKey2& key) const {
-        auto cmp = [](const std::pair<TKey, TValue>& candidate, const TKey2& target) -> bool {
-            return candidate.first < target;
-        };
-
-        const_iterator endIter = end();
-        auto iter = std::lower_bound(mData.begin(), endIter, key, cmp);
-        if (iter == endIter || iter->first == key) {
-            return iter;
-        }
-        return endIter;
-    }
-
-    const_iterator begin() const {
-        return mData.begin();
-    }
-
-    const_iterator end() const {
-        return mData.end();
-    }
+  const_iterator end() const { return mData.end(); }
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_UTIL_IMMUTABLEMAP_H */
diff --git a/tools/aapt2/util/Maybe.h b/tools/aapt2/util/Maybe.h
index 129f6d9..90a0198 100644
--- a/tools/aapt2/util/Maybe.h
+++ b/tools/aapt2/util/Maybe.h
@@ -32,303 +32,292 @@
  */
 template <typename T>
 class Maybe {
-public:
-    /**
-     * Construct Nothing.
-     */
-    Maybe();
+ public:
+  /**
+   * Construct Nothing.
+   */
+  Maybe();
 
-    ~Maybe();
+  ~Maybe();
 
-    Maybe(const Maybe& rhs);
+  Maybe(const Maybe& rhs);
 
-    template <typename U>
-    Maybe(const Maybe<U>& rhs);  // NOLINT(implicit)
+  template <typename U>
+  Maybe(const Maybe<U>& rhs);  // NOLINT(implicit)
 
-    Maybe(Maybe&& rhs);
+  Maybe(Maybe&& rhs);
 
-    template <typename U>
-    Maybe(Maybe<U>&& rhs);  // NOLINT(implicit)
+  template <typename U>
+  Maybe(Maybe<U>&& rhs);  // NOLINT(implicit)
 
-    Maybe& operator=(const Maybe& rhs);
+  Maybe& operator=(const Maybe& rhs);
 
-    template <typename U>
-    Maybe& operator=(const Maybe<U>& rhs);
+  template <typename U>
+  Maybe& operator=(const Maybe<U>& rhs);
 
-    Maybe& operator=(Maybe&& rhs);
+  Maybe& operator=(Maybe&& rhs);
 
-    template <typename U>
-    Maybe& operator=(Maybe<U>&& rhs);
+  template <typename U>
+  Maybe& operator=(Maybe<U>&& rhs);
 
-    /**
-     * Construct a Maybe holding a value.
-     */
-    Maybe(const T& value);  // NOLINT(implicit)
+  /**
+   * Construct a Maybe holding a value.
+   */
+  Maybe(const T& value);  // NOLINT(implicit)
 
-    /**
-     * Construct a Maybe holding a value.
-     */
-    Maybe(T&& value);  // NOLINT(implicit)
+  /**
+   * Construct a Maybe holding a value.
+   */
+  Maybe(T&& value);  // NOLINT(implicit)
 
-    /**
-     * True if this holds a value, false if
-     * it holds Nothing.
-     */
-    explicit operator bool() const;
+  /**
+   * True if this holds a value, false if
+   * it holds Nothing.
+   */
+  explicit operator bool() const;
 
-    /**
-     * Gets the value if one exists, or else
-     * panics.
-     */
-    T& value();
+  /**
+   * Gets the value if one exists, or else
+   * panics.
+   */
+  T& value();
 
-    /**
-     * Gets the value if one exists, or else
-     * panics.
-     */
-    const T& value() const;
+  /**
+   * Gets the value if one exists, or else
+   * panics.
+   */
+  const T& value() const;
 
-    T valueOrDefault(const T& def) const;
+  T valueOrDefault(const T& def) const;
 
-private:
-    template <typename U>
-    friend class Maybe;
+ private:
+  template <typename U>
+  friend class Maybe;
 
-    template <typename U>
-    Maybe& copy(const Maybe<U>& rhs);
+  template <typename U>
+  Maybe& copy(const Maybe<U>& rhs);
 
-    template <typename U>
-    Maybe& move(Maybe<U>&& rhs);
+  template <typename U>
+  Maybe& move(Maybe<U>&& rhs);
 
-    void destroy();
+  void destroy();
 
-    bool mNothing;
+  bool mNothing;
 
-    typename std::aligned_storage<sizeof(T), alignof(T)>::type mStorage;
+  typename std::aligned_storage<sizeof(T), alignof(T)>::type mStorage;
 };
 
 template <typename T>
-Maybe<T>::Maybe()
-: mNothing(true) {
-}
+Maybe<T>::Maybe() : mNothing(true) {}
 
 template <typename T>
 Maybe<T>::~Maybe() {
-    if (!mNothing) {
-        destroy();
-    }
+  if (!mNothing) {
+    destroy();
+  }
 }
 
 template <typename T>
-Maybe<T>::Maybe(const Maybe& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        new (&mStorage) T(reinterpret_cast<const T&>(rhs.mStorage));
-    }
+Maybe<T>::Maybe(const Maybe& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    new (&mStorage) T(reinterpret_cast<const T&>(rhs.mStorage));
+  }
 }
 
 template <typename T>
 template <typename U>
-Maybe<T>::Maybe(const Maybe<U>& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
-    }
+Maybe<T>::Maybe(const Maybe<U>& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
+  }
 }
 
 template <typename T>
-Maybe<T>::Maybe(Maybe&& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        rhs.mNothing = true;
+Maybe<T>::Maybe(Maybe&& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    rhs.mNothing = true;
 
-        // Move the value from rhs.
-        new (&mStorage) T(std::move(reinterpret_cast<T&>(rhs.mStorage)));
-        rhs.destroy();
-    }
+    // Move the value from rhs.
+    new (&mStorage) T(std::move(reinterpret_cast<T&>(rhs.mStorage)));
+    rhs.destroy();
+  }
 }
 
 template <typename T>
 template <typename U>
-Maybe<T>::Maybe(Maybe<U>&& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        rhs.mNothing = true;
+Maybe<T>::Maybe(Maybe<U>&& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    rhs.mNothing = true;
 
-        // Move the value from rhs.
-        new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
-        rhs.destroy();
-    }
+    // Move the value from rhs.
+    new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
+    rhs.destroy();
+  }
 }
 
 template <typename T>
 inline Maybe<T>& Maybe<T>::operator=(const Maybe& rhs) {
-    // Delegate to the actual assignment.
-    return copy(rhs);
+  // Delegate to the actual assignment.
+  return copy(rhs);
 }
 
 template <typename T>
 template <typename U>
 inline Maybe<T>& Maybe<T>::operator=(const Maybe<U>& rhs) {
-    return copy(rhs);
+  return copy(rhs);
 }
 
 template <typename T>
 template <typename U>
 Maybe<T>& Maybe<T>::copy(const Maybe<U>& rhs) {
-    if (mNothing && rhs.mNothing) {
-        // Both are nothing, nothing to do.
-        return *this;
-    } else if  (!mNothing && !rhs.mNothing) {
-        // We both are something, so assign rhs to us.
-        reinterpret_cast<T&>(mStorage) = reinterpret_cast<const U&>(rhs.mStorage);
-    } else if (mNothing) {
-        // We are nothing but rhs is something.
-        mNothing = rhs.mNothing;
-
-        // Copy the value from rhs.
-        new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
-    } else {
-        // We are something but rhs is nothing, so destroy our value.
-        mNothing = rhs.mNothing;
-        destroy();
-    }
+  if (mNothing && rhs.mNothing) {
+    // Both are nothing, nothing to do.
     return *this;
+  } else if (!mNothing && !rhs.mNothing) {
+    // We both are something, so assign rhs to us.
+    reinterpret_cast<T&>(mStorage) = reinterpret_cast<const U&>(rhs.mStorage);
+  } else if (mNothing) {
+    // We are nothing but rhs is something.
+    mNothing = rhs.mNothing;
+
+    // Copy the value from rhs.
+    new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
+  } else {
+    // We are something but rhs is nothing, so destroy our value.
+    mNothing = rhs.mNothing;
+    destroy();
+  }
+  return *this;
 }
 
 template <typename T>
 inline Maybe<T>& Maybe<T>::operator=(Maybe&& rhs) {
-    // Delegate to the actual assignment.
-    return move(std::forward<Maybe<T>>(rhs));
+  // Delegate to the actual assignment.
+  return move(std::forward<Maybe<T>>(rhs));
 }
 
 template <typename T>
 template <typename U>
 inline Maybe<T>& Maybe<T>::operator=(Maybe<U>&& rhs) {
-    return move(std::forward<Maybe<U>>(rhs));
+  return move(std::forward<Maybe<U>>(rhs));
 }
 
 template <typename T>
 template <typename U>
 Maybe<T>& Maybe<T>::move(Maybe<U>&& rhs) {
-    if (mNothing && rhs.mNothing) {
-        // Both are nothing, nothing to do.
-        return *this;
-    } else if  (!mNothing && !rhs.mNothing) {
-        // We both are something, so move assign rhs to us.
-        rhs.mNothing = true;
-        reinterpret_cast<T&>(mStorage) = std::move(reinterpret_cast<U&>(rhs.mStorage));
-        rhs.destroy();
-    } else if (mNothing) {
-        // We are nothing but rhs is something.
-        mNothing = false;
-        rhs.mNothing = true;
-
-        // Move the value from rhs.
-        new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
-        rhs.destroy();
-    } else {
-        // We are something but rhs is nothing, so destroy our value.
-        mNothing = true;
-        destroy();
-    }
+  if (mNothing && rhs.mNothing) {
+    // Both are nothing, nothing to do.
     return *this;
+  } else if (!mNothing && !rhs.mNothing) {
+    // We both are something, so move assign rhs to us.
+    rhs.mNothing = true;
+    reinterpret_cast<T&>(mStorage) =
+        std::move(reinterpret_cast<U&>(rhs.mStorage));
+    rhs.destroy();
+  } else if (mNothing) {
+    // We are nothing but rhs is something.
+    mNothing = false;
+    rhs.mNothing = true;
+
+    // Move the value from rhs.
+    new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
+    rhs.destroy();
+  } else {
+    // We are something but rhs is nothing, so destroy our value.
+    mNothing = true;
+    destroy();
+  }
+  return *this;
 }
 
 template <typename T>
-Maybe<T>::Maybe(const T& value)
-: mNothing(false) {
-    new (&mStorage) T(value);
+Maybe<T>::Maybe(const T& value) : mNothing(false) {
+  new (&mStorage) T(value);
 }
 
 template <typename T>
-Maybe<T>::Maybe(T&& value)
-: mNothing(false) {
-    new (&mStorage) T(std::forward<T>(value));
+Maybe<T>::Maybe(T&& value) : mNothing(false) {
+  new (&mStorage) T(std::forward<T>(value));
 }
 
 template <typename T>
 Maybe<T>::operator bool() const {
-    return !mNothing;
+  return !mNothing;
 }
 
 template <typename T>
 T& Maybe<T>::value() {
-    assert(!mNothing && "Maybe<T>::value() called on Nothing");
-    return reinterpret_cast<T&>(mStorage);
+  assert(!mNothing && "Maybe<T>::value() called on Nothing");
+  return reinterpret_cast<T&>(mStorage);
 }
 
 template <typename T>
 const T& Maybe<T>::value() const {
-    assert(!mNothing && "Maybe<T>::value() called on Nothing");
-    return reinterpret_cast<const T&>(mStorage);
+  assert(!mNothing && "Maybe<T>::value() called on Nothing");
+  return reinterpret_cast<const T&>(mStorage);
 }
 
 template <typename T>
 T Maybe<T>::valueOrDefault(const T& def) const {
-    if (mNothing) {
-        return def;
-    }
-    return reinterpret_cast<const T&>(mStorage);
+  if (mNothing) {
+    return def;
+  }
+  return reinterpret_cast<const T&>(mStorage);
 }
 
 template <typename T>
 void Maybe<T>::destroy() {
-    reinterpret_cast<T&>(mStorage).~T();
+  reinterpret_cast<T&>(mStorage).~T();
 }
 
 template <typename T>
 inline Maybe<typename std::remove_reference<T>::type> make_value(T&& value) {
-    return Maybe<typename std::remove_reference<T>::type>(std::forward<T>(value));
+  return Maybe<typename std::remove_reference<T>::type>(std::forward<T>(value));
 }
 
 template <typename T>
 inline Maybe<T> make_nothing() {
-    return Maybe<T>();
+  return Maybe<T>();
 }
 
 /**
- * Define the == operator between Maybe<T> and Maybe<U> only if the operator T == U is defined.
- * That way the compiler will show an error at the callsite when comparing two Maybe<> objects
+ * Define the == operator between Maybe<T> and Maybe<U> only if the operator T
+ * == U is defined.
+ * That way the compiler will show an error at the callsite when comparing two
+ * Maybe<> objects
  * whose inner types can't be compared.
  */
 template <typename T, typename U>
-typename std::enable_if<
-        has_eq_op<T, U>::value,
-        bool
->::type operator==(const Maybe<T>& a, const Maybe<U>& b) {
-    if (a && b) {
-        return a.value() == b.value();
-    } else if (!a && !b) {
-        return true;
-    }
-    return false;
+typename std::enable_if<has_eq_op<T, U>::value, bool>::type operator==(
+    const Maybe<T>& a, const Maybe<U>& b) {
+  if (a && b) {
+    return a.value() == b.value();
+  } else if (!a && !b) {
+    return true;
+  }
+  return false;
 }
 
 /**
  * Same as operator== but negated.
  */
 template <typename T, typename U>
-typename std::enable_if<
-        has_eq_op<T, U>::value,
-        bool
->::type operator!=(const Maybe<T>& a, const Maybe<U>& b) {
-    return !(a == b);
+typename std::enable_if<has_eq_op<T, U>::value, bool>::type operator!=(
+    const Maybe<T>& a, const Maybe<U>& b) {
+  return !(a == b);
 }
 
 template <typename T, typename U>
-typename std::enable_if<
-        has_lt_op<T, U>::value,
-        bool
->::type operator<(const Maybe<T>& a, const Maybe<U>& b) {
-    if (a && b) {
-        return a.value() < b.value();
-    } else if (!a && !b) {
-        return false;
-    }
-    return !a;
+typename std::enable_if<has_lt_op<T, U>::value, bool>::type operator<(
+    const Maybe<T>& a, const Maybe<U>& b) {
+  if (a && b) {
+    return a.value() < b.value();
+  } else if (!a && !b) {
+    return false;
+  }
+  return !a;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_MAYBE_H
+#endif  // AAPT_MAYBE_H
diff --git a/tools/aapt2/util/StringPiece.h b/tools/aapt2/util/StringPiece.h
index 266c003..de93822 100644
--- a/tools/aapt2/util/StringPiece.h
+++ b/tools/aapt2/util/StringPiece.h
@@ -17,11 +17,11 @@
 #ifndef AAPT_STRING_PIECE_H
 #define AAPT_STRING_PIECE_H
 
-#include <ostream>
-#include <string>
 #include <utils/JenkinsHash.h>
 #include <utils/String8.h>
 #include <utils/Unicode.h>
+#include <ostream>
+#include <string>
 
 namespace aapt {
 
@@ -35,45 +35,46 @@
  */
 template <typename TChar>
 class BasicStringPiece {
-public:
-    using const_iterator = const TChar*;
-    using difference_type = size_t;
+ public:
+  using const_iterator = const TChar*;
+  using difference_type = size_t;
 
-    // End of string marker.
-    constexpr static const size_t npos = static_cast<size_t>(-1);
+  // End of string marker.
+  constexpr static const size_t npos = static_cast<size_t>(-1);
 
-    BasicStringPiece();
-    BasicStringPiece(const BasicStringPiece<TChar>& str);
-    BasicStringPiece(const std::basic_string<TChar>& str);  // NOLINT(implicit)
-    BasicStringPiece(const TChar* str);  // NOLINT(implicit)
-    BasicStringPiece(const TChar* str, size_t len);
+  BasicStringPiece();
+  BasicStringPiece(const BasicStringPiece<TChar>& str);
+  BasicStringPiece(const std::basic_string<TChar>& str);  // NOLINT(implicit)
+  BasicStringPiece(const TChar* str);                     // NOLINT(implicit)
+  BasicStringPiece(const TChar* str, size_t len);
 
-    BasicStringPiece<TChar>& operator=(const BasicStringPiece<TChar>& rhs);
-    BasicStringPiece<TChar>& assign(const TChar* str, size_t len);
+  BasicStringPiece<TChar>& operator=(const BasicStringPiece<TChar>& rhs);
+  BasicStringPiece<TChar>& assign(const TChar* str, size_t len);
 
-    BasicStringPiece<TChar> substr(size_t start, size_t len = npos) const;
-    BasicStringPiece<TChar> substr(BasicStringPiece<TChar>::const_iterator begin,
-                                   BasicStringPiece<TChar>::const_iterator end) const;
+  BasicStringPiece<TChar> substr(size_t start, size_t len = npos) const;
+  BasicStringPiece<TChar> substr(
+      BasicStringPiece<TChar>::const_iterator begin,
+      BasicStringPiece<TChar>::const_iterator end) const;
 
-    const TChar* data() const;
-    size_t length() const;
-    size_t size() const;
-    bool empty() const;
-    std::basic_string<TChar> toString() const;
+  const TChar* data() const;
+  size_t length() const;
+  size_t size() const;
+  bool empty() const;
+  std::basic_string<TChar> toString() const;
 
-    bool contains(const BasicStringPiece<TChar>& rhs) const;
-    int compare(const BasicStringPiece<TChar>& rhs) const;
-    bool operator<(const BasicStringPiece<TChar>& rhs) const;
-    bool operator>(const BasicStringPiece<TChar>& rhs) const;
-    bool operator==(const BasicStringPiece<TChar>& rhs) const;
-    bool operator!=(const BasicStringPiece<TChar>& rhs) const;
+  bool contains(const BasicStringPiece<TChar>& rhs) const;
+  int compare(const BasicStringPiece<TChar>& rhs) const;
+  bool operator<(const BasicStringPiece<TChar>& rhs) const;
+  bool operator>(const BasicStringPiece<TChar>& rhs) const;
+  bool operator==(const BasicStringPiece<TChar>& rhs) const;
+  bool operator!=(const BasicStringPiece<TChar>& rhs) const;
 
-    const_iterator begin() const;
-    const_iterator end() const;
+  const_iterator begin() const;
+  const_iterator end() const;
 
-private:
-    const TChar* mData;
-    size_t mLength;
+ private:
+  const TChar* mData;
+  size_t mLength;
 };
 
 using StringPiece = BasicStringPiece<char>;
@@ -87,198 +88,210 @@
 constexpr const size_t BasicStringPiece<TChar>::npos;
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece() : mData(nullptr) , mLength(0) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece()
+    : mData(nullptr), mLength(0) {}
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece(const BasicStringPiece<TChar>& str) :
-        mData(str.mData), mLength(str.mLength) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece(
+    const BasicStringPiece<TChar>& str)
+    : mData(str.mData), mLength(str.mLength) {}
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece(const std::basic_string<TChar>& str) :
-        mData(str.data()), mLength(str.length()) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece(
+    const std::basic_string<TChar>& str)
+    : mData(str.data()), mLength(str.length()) {}
 
 template <>
-inline BasicStringPiece<char>::BasicStringPiece(const char* str) :
-        mData(str), mLength(str != nullptr ? strlen(str) : 0) {
-}
+inline BasicStringPiece<char>::BasicStringPiece(const char* str)
+    : mData(str), mLength(str != nullptr ? strlen(str) : 0) {}
 
 template <>
-inline BasicStringPiece<char16_t>::BasicStringPiece(const char16_t* str) :
-        mData(str), mLength(str != nullptr ? strlen16(str) : 0) {
-}
+inline BasicStringPiece<char16_t>::BasicStringPiece(const char16_t* str)
+    : mData(str), mLength(str != nullptr ? strlen16(str) : 0) {}
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece(const TChar* str, size_t len) :
-        mData(str), mLength(len) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece(const TChar* str, size_t len)
+    : mData(str), mLength(len) {}
 
 template <typename TChar>
 inline BasicStringPiece<TChar>& BasicStringPiece<TChar>::operator=(
-        const BasicStringPiece<TChar>& rhs) {
-    mData = rhs.mData;
-    mLength = rhs.mLength;
-    return *this;
+    const BasicStringPiece<TChar>& rhs) {
+  mData = rhs.mData;
+  mLength = rhs.mLength;
+  return *this;
 }
 
 template <typename TChar>
-inline BasicStringPiece<TChar>& BasicStringPiece<TChar>::assign(const TChar* str, size_t len) {
-    mData = str;
-    mLength = len;
-    return *this;
-}
-
-
-template <typename TChar>
-inline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(size_t start, size_t len) const {
-    if (len == npos) {
-        len = mLength - start;
-    }
-
-    if (start > mLength || start + len > mLength) {
-        return BasicStringPiece<TChar>();
-    }
-    return BasicStringPiece<TChar>(mData + start, len);
+inline BasicStringPiece<TChar>& BasicStringPiece<TChar>::assign(
+    const TChar* str, size_t len) {
+  mData = str;
+  mLength = len;
+  return *this;
 }
 
 template <typename TChar>
 inline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(
-        BasicStringPiece<TChar>::const_iterator begin,
-        BasicStringPiece<TChar>::const_iterator end) const {
-    return BasicStringPiece<TChar>(begin, end - begin);
+    size_t start, size_t len) const {
+  if (len == npos) {
+    len = mLength - start;
+  }
+
+  if (start > mLength || start + len > mLength) {
+    return BasicStringPiece<TChar>();
+  }
+  return BasicStringPiece<TChar>(mData + start, len);
+}
+
+template <typename TChar>
+inline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(
+    BasicStringPiece<TChar>::const_iterator begin,
+    BasicStringPiece<TChar>::const_iterator end) const {
+  return BasicStringPiece<TChar>(begin, end - begin);
 }
 
 template <typename TChar>
 inline const TChar* BasicStringPiece<TChar>::data() const {
-    return mData;
+  return mData;
 }
 
 template <typename TChar>
 inline size_t BasicStringPiece<TChar>::length() const {
-    return mLength;
+  return mLength;
 }
 
 template <typename TChar>
 inline size_t BasicStringPiece<TChar>::size() const {
-    return mLength;
+  return mLength;
 }
 
 template <typename TChar>
 inline bool BasicStringPiece<TChar>::empty() const {
-    return mLength == 0;
+  return mLength == 0;
 }
 
 template <typename TChar>
 inline std::basic_string<TChar> BasicStringPiece<TChar>::toString() const {
-    return std::basic_string<TChar>(mData, mLength);
+  return std::basic_string<TChar>(mData, mLength);
 }
 
 template <>
-inline bool BasicStringPiece<char>::contains(const BasicStringPiece<char>& rhs) const {
-    if (!mData || !rhs.mData) {
-        return false;
-    }
-    if (rhs.mLength > mLength) {
-        return false;
-    }
-    return strstr(mData, rhs.mData) != nullptr;
+inline bool BasicStringPiece<char>::contains(
+    const BasicStringPiece<char>& rhs) const {
+  if (!mData || !rhs.mData) {
+    return false;
+  }
+  if (rhs.mLength > mLength) {
+    return false;
+  }
+  return strstr(mData, rhs.mData) != nullptr;
 }
 
 template <>
-inline int BasicStringPiece<char>::compare(const BasicStringPiece<char>& rhs) const {
-    const char nullStr = '\0';
-    const char* b1 = mData != nullptr ? mData : &nullStr;
-    const char* e1 = b1 + mLength;
-    const char* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
-    const char* e2 = b2 + rhs.mLength;
+inline int BasicStringPiece<char>::compare(
+    const BasicStringPiece<char>& rhs) const {
+  const char nullStr = '\0';
+  const char* b1 = mData != nullptr ? mData : &nullStr;
+  const char* e1 = b1 + mLength;
+  const char* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
+  const char* e2 = b2 + rhs.mLength;
 
-    while (b1 < e1 && b2 < e2) {
-        const int d = static_cast<int>(*b1++) - static_cast<int>(*b2++);
-        if (d) {
-            return d;
-        }
+  while (b1 < e1 && b2 < e2) {
+    const int d = static_cast<int>(*b1++) - static_cast<int>(*b2++);
+    if (d) {
+      return d;
     }
-    return static_cast<int>(mLength - rhs.mLength);
+  }
+  return static_cast<int>(mLength - rhs.mLength);
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<char16_t>& str) {
-    android::String8 utf8(str.data(), str.size());
-    return out.write(utf8.string(), utf8.size());
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const BasicStringPiece<char16_t>& str) {
+  android::String8 utf8(str.data(), str.size());
+  return out.write(utf8.string(), utf8.size());
 }
 
 template <>
-inline bool BasicStringPiece<char16_t>::contains(const BasicStringPiece<char16_t>& rhs) const {
-    if (!mData || !rhs.mData) {
-        return false;
-    }
-    if (rhs.mLength > mLength) {
-        return false;
-    }
-    return strstr16(mData, rhs.mData) != nullptr;
+inline bool BasicStringPiece<char16_t>::contains(
+    const BasicStringPiece<char16_t>& rhs) const {
+  if (!mData || !rhs.mData) {
+    return false;
+  }
+  if (rhs.mLength > mLength) {
+    return false;
+  }
+  return strstr16(mData, rhs.mData) != nullptr;
 }
 
 template <>
-inline int BasicStringPiece<char16_t>::compare(const BasicStringPiece<char16_t>& rhs) const {
-    const char16_t nullStr = u'\0';
-    const char16_t* b1 = mData != nullptr ? mData : &nullStr;
-    const char16_t* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
-    return strzcmp16(b1, mLength, b2, rhs.mLength);
+inline int BasicStringPiece<char16_t>::compare(
+    const BasicStringPiece<char16_t>& rhs) const {
+  const char16_t nullStr = u'\0';
+  const char16_t* b1 = mData != nullptr ? mData : &nullStr;
+  const char16_t* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
+  return strzcmp16(b1, mLength, b2, rhs.mLength);
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator<(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) < 0;
+inline bool BasicStringPiece<TChar>::operator<(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) < 0;
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator>(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) > 0;
+inline bool BasicStringPiece<TChar>::operator>(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) > 0;
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator==(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) == 0;
+inline bool BasicStringPiece<TChar>::operator==(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) == 0;
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator!=(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) != 0;
+inline bool BasicStringPiece<TChar>::operator!=(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) != 0;
 }
 
 template <typename TChar>
-inline typename BasicStringPiece<TChar>::const_iterator BasicStringPiece<TChar>::begin() const {
-    return mData;
+inline typename BasicStringPiece<TChar>::const_iterator
+BasicStringPiece<TChar>::begin() const {
+  return mData;
 }
 
 template <typename TChar>
-inline typename BasicStringPiece<TChar>::const_iterator BasicStringPiece<TChar>::end() const {
-    return mData + mLength;
+inline typename BasicStringPiece<TChar>::const_iterator
+BasicStringPiece<TChar>::end() const {
+  return mData + mLength;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<char>& str) {
-    return out.write(str.data(), str.size());
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const BasicStringPiece<char>& str) {
+  return out.write(str.data(), str.size());
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-inline ::std::ostream& operator<<(::std::ostream& out, const std::u16string& str) {
-    android::String8 utf8(str.data(), str.size());
-    return out.write(utf8.string(), utf8.size());
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const std::u16string& str) {
+  android::String8 utf8(str.data(), str.size());
+  return out.write(utf8.string(), utf8.size());
 }
 
 namespace std {
 
 template <typename TChar>
 struct hash<aapt::BasicStringPiece<TChar>> {
-    size_t operator()(const aapt::BasicStringPiece<TChar>& str) const {
-        uint32_t hashCode = android::JenkinsHashMixBytes(
-                0, reinterpret_cast<const uint8_t*>(str.data()), sizeof(TChar) * str.size());
-        return static_cast<size_t>(hashCode);
-    }
+  size_t operator()(const aapt::BasicStringPiece<TChar>& str) const {
+    uint32_t hashCode = android::JenkinsHashMixBytes(
+        0, reinterpret_cast<const uint8_t*>(str.data()),
+        sizeof(TChar) * str.size());
+    return static_cast<size_t>(hashCode);
+  }
 };
 
-} // namespace std
+}  // namespace std
 
-#endif // AAPT_STRING_PIECE_H
+#endif  // AAPT_STRING_PIECE_H
diff --git a/tools/aapt2/util/TypeTraits.h b/tools/aapt2/util/TypeTraits.h
index 76c13d6..b6539ed 100644
--- a/tools/aapt2/util/TypeTraits.h
+++ b/tools/aapt2/util/TypeTraits.h
@@ -21,19 +21,20 @@
 
 namespace aapt {
 
-#define DEFINE_HAS_BINARY_OP_TRAIT(name, op) \
-    template <typename T, typename U> \
-    struct name { \
-        template <typename V, typename W> \
-        static constexpr decltype(std::declval<V>() op std::declval<W>(), bool()) test(int) { \
-        return true; \
-    } \
-    template <typename V, typename W> \
-    static constexpr bool test(...) { \
-        return false; \
-    } \
-    static constexpr bool value = test<T, U>(int()); \
-}
+#define DEFINE_HAS_BINARY_OP_TRAIT(name, op)                                  \
+  template <typename T, typename U>                                           \
+  struct name {                                                               \
+    template <typename V, typename W>                                         \
+    static constexpr decltype(std::declval<V>() op std::declval<W>(), bool()) \
+    test(int) {                                                               \
+      return true;                                                            \
+    }                                                                         \
+    template <typename V, typename W>                                         \
+    static constexpr bool test(...) {                                         \
+      return false;                                                           \
+    }                                                                         \
+    static constexpr bool value = test<T, U>(int());                          \
+  }
 
 DEFINE_HAS_BINARY_OP_TRAIT(has_eq_op, ==);
 DEFINE_HAS_BINARY_OP_TRAIT(has_lt_op, <);
@@ -43,9 +44,10 @@
  */
 template <typename T, typename U>
 struct is_comparable {
-    static constexpr bool value = has_eq_op<T, U>::value && has_lt_op<T, U>::value;
+  static constexpr bool value =
+      has_eq_op<T, U>::value && has_lt_op<T, U>::value;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_UTIL_TYPETRAITS_H */
diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h
index 9c88354..077e193 100644
--- a/tools/aapt2/util/Util.h
+++ b/tools/aapt2/util/Util.h
@@ -56,16 +56,14 @@
  * UTF-16 isspace(). It basically checks for lower range characters that are
  * whitespace.
  */
-inline bool isspace16(char16_t c) {
-    return c < 0x0080 && isspace(c);
-}
+inline bool isspace16(char16_t c) { return c < 0x0080 && isspace(c); }
 
 /**
  * Returns an iterator to the first character that is not alpha-numeric and that
  * is not in the allowedChars set.
  */
-StringPiece::const_iterator findNonAlphaNumericAndNotInSet(const StringPiece& str,
-                                                           const StringPiece& allowedChars);
+StringPiece::const_iterator findNonAlphaNumericAndNotInSet(
+    const StringPiece& str, const StringPiece& allowedChars);
 
 /**
  * Tests that the string is a valid Java class name.
@@ -78,7 +76,8 @@
 bool isJavaPackageName(const StringPiece& str);
 
 /**
- * Converts the class name to a fully qualified class name from the given `package`. Ex:
+ * Converts the class name to a fully qualified class name from the given
+ * `package`. Ex:
  *
  * asdf         --> package.asdf
  * .asdf        --> package.asdf
@@ -89,111 +88,114 @@
                                               const StringPiece& className);
 
 /**
- * Makes a std::unique_ptr<> with the template parameter inferred by the compiler.
+ * Makes a std::unique_ptr<> with the template parameter inferred by the
+ * compiler.
  * This will be present in C++14 and can be removed then.
  */
 template <typename T, class... Args>
 std::unique_ptr<T> make_unique(Args&&... args) {
-    return std::unique_ptr<T>(new T{std::forward<Args>(args)...});
+  return std::unique_ptr<T>(new T{std::forward<Args>(args)...});
 }
 
 /**
- * Writes a set of items to the std::ostream, joining the times with the provided
+ * Writes a set of items to the std::ostream, joining the times with the
+ * provided
  * separator.
  */
 template <typename Container>
-::std::function<::std::ostream&(::std::ostream&)> joiner(const Container& container,
-                                                         const char* sep) {
-    using std::begin;
-    using std::end;
-    const auto beginIter = begin(container);
-    const auto endIter = end(container);
-    return [beginIter, endIter, sep](::std::ostream& out) -> ::std::ostream& {
-        for (auto iter = beginIter; iter != endIter; ++iter) {
-            if (iter != beginIter) {
-                out << sep;
-            }
-            out << *iter;
-        }
-        return out;
-    };
+::std::function<::std::ostream&(::std::ostream&)> joiner(
+    const Container& container, const char* sep) {
+  using std::begin;
+  using std::end;
+  const auto beginIter = begin(container);
+  const auto endIter = end(container);
+  return [beginIter, endIter, sep](::std::ostream& out) -> ::std::ostream& {
+    for (auto iter = beginIter; iter != endIter; ++iter) {
+      if (iter != beginIter) {
+        out << sep;
+      }
+      out << *iter;
+    }
+    return out;
+  };
 }
 
-inline ::std::function<::std::ostream&(::std::ostream&)> formatSize(size_t size) {
-    return [size](::std::ostream& out) -> ::std::ostream& {
-        constexpr size_t K = 1024u;
-        constexpr size_t M = K * K;
-        constexpr size_t G = M * K;
-        if (size < K) {
-            out << size << "B";
-        } else if (size < M) {
-            out << (double(size) / K) << " KiB";
-        } else if (size < G) {
-            out << (double(size) / M) << " MiB";
-        } else {
-            out << (double(size) / G) << " GiB";
-        }
-        return out;
-    };
+inline ::std::function<::std::ostream&(::std::ostream&)> formatSize(
+    size_t size) {
+  return [size](::std::ostream& out) -> ::std::ostream& {
+    constexpr size_t K = 1024u;
+    constexpr size_t M = K * K;
+    constexpr size_t G = M * K;
+    if (size < K) {
+      out << size << "B";
+    } else if (size < M) {
+      out << (double(size) / K) << " KiB";
+    } else if (size < G) {
+      out << (double(size) / M) << " MiB";
+    } else {
+      out << (double(size) / G) << " GiB";
+    }
+    return out;
+  };
 }
 
 /**
- * Helper method to extract a UTF-16 string from a StringPool. If the string is stored as UTF-8,
+ * Helper method to extract a UTF-16 string from a StringPool. If the string is
+ * stored as UTF-8,
  * the conversion to UTF-16 happens within ResStringPool.
  */
 StringPiece16 getString16(const android::ResStringPool& pool, size_t idx);
 
 /**
- * Helper method to extract a UTF-8 string from a StringPool. If the string is stored as UTF-16,
- * the conversion from UTF-16 to UTF-8 does not happen in ResStringPool and is done by this method,
- * which maintains no state or cache. This means we must return an std::string copy.
+ * Helper method to extract a UTF-8 string from a StringPool. If the string is
+ * stored as UTF-16,
+ * the conversion from UTF-16 to UTF-8 does not happen in ResStringPool and is
+ * done by this method,
+ * which maintains no state or cache. This means we must return an std::string
+ * copy.
  */
 std::string getString(const android::ResStringPool& pool, size_t idx);
 
 /**
- * Checks that the Java string format contains no non-positional arguments (arguments without
- * explicitly specifying an index) when there are more than one argument. This is an error
- * because translations may rearrange the order of the arguments in the string, which will
+ * Checks that the Java string format contains no non-positional arguments
+ * (arguments without
+ * explicitly specifying an index) when there are more than one argument. This
+ * is an error
+ * because translations may rearrange the order of the arguments in the string,
+ * which will
  * break the string interpolation.
  */
 bool verifyJavaStringFormat(const StringPiece& str);
 
 class StringBuilder {
-public:
-    StringBuilder& append(const StringPiece& str);
-    const std::string& str() const;
-    const std::string& error() const;
+ public:
+  StringBuilder& append(const StringPiece& str);
+  const std::string& str() const;
+  const std::string& error() const;
 
-    // When building StyledStrings, we need UTF-16 indices into the string,
-    // which is what the Java layer expects when dealing with java String.charAt().
-    size_t utf16Len() const;
+  // When building StyledStrings, we need UTF-16 indices into the string,
+  // which is what the Java layer expects when dealing with java
+  // String.charAt().
+  size_t utf16Len() const;
 
-    operator bool() const;
+  operator bool() const;
 
-private:
-    std::string mStr;
-    size_t mUtf16Len = 0;
-    bool mQuote = false;
-    bool mTrailingSpace = false;
-    bool mLastCharWasEscape = false;
-    std::string mError;
+ private:
+  std::string mStr;
+  size_t mUtf16Len = 0;
+  bool mQuote = false;
+  bool mTrailingSpace = false;
+  bool mLastCharWasEscape = false;
+  std::string mError;
 };
 
-inline const std::string& StringBuilder::str() const {
-    return mStr;
-}
+inline const std::string& StringBuilder::str() const { return mStr; }
 
-inline const std::string& StringBuilder::error() const {
-    return mError;
-}
+inline const std::string& StringBuilder::error() const { return mError; }
 
-inline size_t StringBuilder::utf16Len() const {
-    return mUtf16Len;
-}
+inline size_t StringBuilder::utf16Len() const { return mUtf16Len; }
 
-inline StringBuilder::operator bool() const {
-    return mError.empty();
-}
+inline StringBuilder::operator bool() const { return mError.empty(); }
 
 /**
  * Converts a UTF8 string to a UTF16 string.
@@ -216,65 +218,51 @@
  * any memory on the heap nor use standard containers.
  */
 class Tokenizer {
-public:
-    class iterator {
-    public:
-        iterator(const iterator&) = default;
-        iterator& operator=(const iterator&) = default;
+ public:
+  class iterator {
+   public:
+    iterator(const iterator&) = default;
+    iterator& operator=(const iterator&) = default;
 
-        iterator& operator++();
+    iterator& operator++();
 
-        StringPiece operator*() {
-            return mToken;
-        }
-        bool operator==(const iterator& rhs) const;
-        bool operator!=(const iterator& rhs) const;
+    StringPiece operator*() { return mToken; }
+    bool operator==(const iterator& rhs) const;
+    bool operator!=(const iterator& rhs) const;
 
-    private:
-        friend class Tokenizer;
+   private:
+    friend class Tokenizer;
 
-        iterator(StringPiece s, char sep, StringPiece tok, bool end);
+    iterator(StringPiece s, char sep, StringPiece tok, bool end);
 
-        StringPiece mStr;
-        char mSeparator;
-        StringPiece mToken;
-        bool mEnd;
-    };
+    StringPiece mStr;
+    char mSeparator;
+    StringPiece mToken;
+    bool mEnd;
+  };
 
-    Tokenizer(StringPiece str, char sep);
+  Tokenizer(StringPiece str, char sep);
 
-    iterator begin() {
-        return mBegin;
-    }
+  iterator begin() { return mBegin; }
 
-    iterator end() {
-        return mEnd;
-    }
+  iterator end() { return mEnd; }
 
-private:
-    const iterator mBegin;
-    const iterator mEnd;
+ private:
+  const iterator mBegin;
+  const iterator mEnd;
 };
 
 inline Tokenizer tokenize(const StringPiece& str, char sep) {
-    return Tokenizer(str, sep);
+  return Tokenizer(str, sep);
 }
 
-inline uint16_t hostToDevice16(uint16_t value) {
-    return htods(value);
-}
+inline uint16_t hostToDevice16(uint16_t value) { return htods(value); }
 
-inline uint32_t hostToDevice32(uint32_t value) {
-    return htodl(value);
-}
+inline uint32_t hostToDevice32(uint32_t value) { return htodl(value); }
 
-inline uint16_t deviceToHost16(uint16_t value) {
-    return dtohs(value);
-}
+inline uint16_t deviceToHost16(uint16_t value) { return dtohs(value); }
 
-inline uint32_t deviceToHost32(uint32_t value) {
-    return dtohl(value);
-}
+inline uint32_t deviceToHost32(uint32_t value) { return dtohl(value); }
 
 /**
  * Given a path like: res/xml-sw600dp/foo.xml
@@ -288,17 +276,19 @@
 bool extractResFilePathParts(const StringPiece& path, StringPiece* outPrefix,
                              StringPiece* outEntry, StringPiece* outSuffix);
 
-} // namespace util
+}  // namespace util
 
 /**
- * Stream operator for functions. Calls the function with the stream as an argument.
+ * Stream operator for functions. Calls the function with the stream as an
+ * argument.
  * In the aapt namespace for lookup.
  */
-inline ::std::ostream& operator<<(::std::ostream& out,
-                                  const ::std::function<::std::ostream&(::std::ostream&)>& f) {
-    return f(out);
+inline ::std::ostream& operator<<(
+    ::std::ostream& out,
+    const ::std::function<::std::ostream&(::std::ostream&)>& f) {
+  return f(out);
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_UTIL_H
+#endif  // AAPT_UTIL_H
diff --git a/tools/aapt2/xml/XmlActionExecutor.h b/tools/aapt2/xml/XmlActionExecutor.h
index cad508c..ca21b08 100644
--- a/tools/aapt2/xml/XmlActionExecutor.h
+++ b/tools/aapt2/xml/XmlActionExecutor.h
@@ -30,79 +30,84 @@
 namespace xml {
 
 enum class XmlActionExecutorPolicy {
-    /**
-     * Actions on run if elements are matched, errors occur only when actions return false.
-     */
-    None,
+  /**
+   * Actions on run if elements are matched, errors occur only when actions
+   * return false.
+   */
+  None,
 
-    /**
-     * The actions defined must match and run. If an element is found that does not match
-     * an action, an error occurs.
-     */
-    Whitelist,
+  /**
+   * The actions defined must match and run. If an element is found that does
+   * not match
+   * an action, an error occurs.
+   */
+  Whitelist,
 };
 
 /**
- * Contains the actions to perform at this XML node. This is a recursive data structure that
+ * Contains the actions to perform at this XML node. This is a recursive data
+ * structure that
  * holds XmlNodeActions for child XML nodes.
  */
 class XmlNodeAction {
-public:
-    using ActionFuncWithDiag = std::function<bool(Element*, SourcePathDiagnostics*)>;
-    using ActionFunc = std::function<bool(Element*)>;
+ public:
+  using ActionFuncWithDiag =
+      std::function<bool(Element*, SourcePathDiagnostics*)>;
+  using ActionFunc = std::function<bool(Element*)>;
 
-    /**
-     * Find or create a child XmlNodeAction that will be performed for the child element
-     * with the name `name`.
-     */
-    XmlNodeAction& operator[](const std::string& name) {
-        return mMap[name];
-    }
+  /**
+   * Find or create a child XmlNodeAction that will be performed for the child
+   * element
+   * with the name `name`.
+   */
+  XmlNodeAction& operator[](const std::string& name) { return mMap[name]; }
 
-    /**
-     * Add an action to be performed at this XmlNodeAction.
-     */
-    void action(ActionFunc f);
-    void action(ActionFuncWithDiag);
+  /**
+   * Add an action to be performed at this XmlNodeAction.
+   */
+  void action(ActionFunc f);
+  void action(ActionFuncWithDiag);
 
-private:
-    friend class XmlActionExecutor;
+ private:
+  friend class XmlActionExecutor;
 
-    bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag, Element* el) const;
+  bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag,
+               Element* el) const;
 
-    std::map<std::string, XmlNodeAction> mMap;
-    std::vector<ActionFuncWithDiag> mActions;
+  std::map<std::string, XmlNodeAction> mMap;
+  std::vector<ActionFuncWithDiag> mActions;
 };
 
 /**
- * Allows the definition of actions to execute at specific XML elements defined by their
+ * Allows the definition of actions to execute at specific XML elements defined
+ * by their
  * hierarchy.
  */
 class XmlActionExecutor {
-public:
-    XmlActionExecutor() = default;
+ public:
+  XmlActionExecutor() = default;
 
-    /**
-     * Find or create a root XmlNodeAction that will be performed for the root XML element
-     * with the name `name`.
-     */
-    XmlNodeAction& operator[](const std::string& name) {
-        return mMap[name];
-    }
+  /**
+   * Find or create a root XmlNodeAction that will be performed for the root XML
+   * element
+   * with the name `name`.
+   */
+  XmlNodeAction& operator[](const std::string& name) { return mMap[name]; }
 
-    /**
-     * Execute the defined actions for this XmlResource.
-     * Returns true if all actions return true, otherwise returns false.
-     */
-    bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag, XmlResource* doc) const;
+  /**
+   * Execute the defined actions for this XmlResource.
+   * Returns true if all actions return true, otherwise returns false.
+   */
+  bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag,
+               XmlResource* doc) const;
 
-private:
-    std::map<std::string, XmlNodeAction> mMap;
+ private:
+  std::map<std::string, XmlNodeAction> mMap;
 
-    DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
+  DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
 };
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
 #endif /* AAPT_XML_XMLPATTERN_H */
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index e4f41b0..932303e 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -38,18 +38,18 @@
  * Base class for all XML nodes.
  */
 class Node {
-public:
-    Node* parent = nullptr;
-    size_t lineNumber = 0;
-    size_t columnNumber = 0;
-    std::string comment;
-    std::vector<std::unique_ptr<Node>> children;
+ public:
+  Node* parent = nullptr;
+  size_t lineNumber = 0;
+  size_t columnNumber = 0;
+  std::string comment;
+  std::vector<std::unique_ptr<Node>> children;
 
-    virtual ~Node() = default;
+  virtual ~Node() = default;
 
-    void addChild(std::unique_ptr<Node> child);
-    virtual void accept(RawVisitor* visitor) = 0;
-    virtual std::unique_ptr<Node> clone() = 0;
+  void addChild(std::unique_ptr<Node> child);
+  virtual void accept(RawVisitor* visitor) = 0;
+  virtual std::unique_ptr<Node> clone() = 0;
 };
 
 /**
@@ -58,178 +58,173 @@
  */
 template <typename Derived>
 class BaseNode : public Node {
-public:
-    virtual void accept(RawVisitor* visitor) override;
+ public:
+  virtual void accept(RawVisitor* visitor) override;
 };
 
 /**
  * A Namespace XML node. Can only have one child.
  */
 class Namespace : public BaseNode<Namespace> {
-public:
-    std::string namespacePrefix;
-    std::string namespaceUri;
+ public:
+  std::string namespacePrefix;
+  std::string namespaceUri;
 
-    std::unique_ptr<Node> clone() override;
+  std::unique_ptr<Node> clone() override;
 };
 
 struct AaptAttribute {
-    Maybe<ResourceId> id;
-    aapt::Attribute attribute;
+  Maybe<ResourceId> id;
+  aapt::Attribute attribute;
 };
 
 /**
  * An XML attribute.
  */
 struct Attribute {
-    std::string namespaceUri;
-    std::string name;
-    std::string value;
+  std::string namespaceUri;
+  std::string name;
+  std::string value;
 
-    Maybe<AaptAttribute> compiledAttribute;
-    std::unique_ptr<Item> compiledValue;
+  Maybe<AaptAttribute> compiledAttribute;
+  std::unique_ptr<Item> compiledValue;
 };
 
 /**
  * An Element XML node.
  */
 class Element : public BaseNode<Element> {
-public:
-    std::string namespaceUri;
-    std::string name;
-    std::vector<Attribute> attributes;
+ public:
+  std::string namespaceUri;
+  std::string name;
+  std::vector<Attribute> attributes;
 
-    Attribute* findAttribute(const StringPiece& ns, const StringPiece& name);
-    xml::Element* findChild(const StringPiece& ns, const StringPiece& name);
-    xml::Element* findChildWithAttribute(const StringPiece& ns, const StringPiece& name,
-                                         const StringPiece& attrNs,
-                                         const StringPiece& attrName,
-                                         const StringPiece& attrValue);
-    std::vector<xml::Element*> getChildElements();
-    std::unique_ptr<Node> clone() override;
+  Attribute* findAttribute(const StringPiece& ns, const StringPiece& name);
+  xml::Element* findChild(const StringPiece& ns, const StringPiece& name);
+  xml::Element* findChildWithAttribute(const StringPiece& ns,
+                                       const StringPiece& name,
+                                       const StringPiece& attrNs,
+                                       const StringPiece& attrName,
+                                       const StringPiece& attrValue);
+  std::vector<xml::Element*> getChildElements();
+  std::unique_ptr<Node> clone() override;
 };
 
 /**
  * A Text (CDATA) XML node. Can not have any children.
  */
 class Text : public BaseNode<Text> {
-public:
-    std::string text;
+ public:
+  std::string text;
 
-    std::unique_ptr<Node> clone() override;
+  std::unique_ptr<Node> clone() override;
 };
 
 /**
  * An XML resource with a source, name, and XML tree.
  */
 class XmlResource {
-public:
-    ResourceFile file;
-    std::unique_ptr<xml::Node> root;
+ public:
+  ResourceFile file;
+  std::unique_ptr<xml::Node> root;
 };
 
 /**
  * Inflates an XML DOM from a text stream, logging errors to the logger.
  * Returns the root node on success, or nullptr on failure.
  */
-std::unique_ptr<XmlResource> inflate(std::istream* in, IDiagnostics* diag, const Source& source);
+std::unique_ptr<XmlResource> inflate(std::istream* in, IDiagnostics* diag,
+                                     const Source& source);
 
 /**
  * Inflates an XML DOM from a binary ResXMLTree, logging errors to the logger.
  * Returns the root node on success, or nullptr on failure.
  */
-std::unique_ptr<XmlResource> inflate(const void* data, size_t dataLen, IDiagnostics* diag,
-                                     const Source& source);
+std::unique_ptr<XmlResource> inflate(const void* data, size_t dataLen,
+                                     IDiagnostics* diag, const Source& source);
 
 Element* findRootElement(XmlResource* doc);
 Element* findRootElement(Node* node);
 
 /**
- * A visitor interface for the different XML Node subtypes. This will not traverse into
+ * A visitor interface for the different XML Node subtypes. This will not
+ * traverse into
  * children. Use Visitor for that.
  */
 class RawVisitor {
-public:
-    virtual ~RawVisitor() = default;
+ public:
+  virtual ~RawVisitor() = default;
 
-    virtual void visit(Namespace* node) {}
-    virtual void visit(Element* node) {}
-    virtual void visit(Text* text) {}
+  virtual void visit(Namespace* node) {}
+  virtual void visit(Element* node) {}
+  virtual void visit(Text* text) {}
 };
 
 /**
  * Visitor whose default implementation visits the children nodes of any node.
  */
 class Visitor : public RawVisitor {
-public:
-    using RawVisitor::visit;
+ public:
+  using RawVisitor::visit;
 
-    void visit(Namespace* node) override {
-        visitChildren(node);
-    }
+  void visit(Namespace* node) override { visitChildren(node); }
 
-    void visit(Element* node) override {
-        visitChildren(node);
-    }
+  void visit(Element* node) override { visitChildren(node); }
 
-    void visit(Text* text) override {
-        visitChildren(text);
-    }
+  void visit(Text* text) override { visitChildren(text); }
 
-    void visitChildren(Node* node) {
-        for (auto& child : node->children) {
-            child->accept(this);
-        }
+  void visitChildren(Node* node) {
+    for (auto& child : node->children) {
+      child->accept(this);
     }
+  }
 };
 
 /**
  * An XML DOM visitor that will record the package name for a namespace prefix.
  */
 class PackageAwareVisitor : public Visitor, public IPackageDeclStack {
-public:
-    using Visitor::visit;
+ public:
+  using Visitor::visit;
 
-    void visit(Namespace* ns) override;
-    Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const override;
+  void visit(Namespace* ns) override;
+  Maybe<ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias, const StringPiece& localPackage) const override;
 
-private:
-    struct PackageDecl {
-        std::string prefix;
-        ExtractedPackage package;
-    };
+ private:
+  struct PackageDecl {
+    std::string prefix;
+    ExtractedPackage package;
+  };
 
-    std::vector<PackageDecl> mPackageDecls;
+  std::vector<PackageDecl> mPackageDecls;
 };
 
 // Implementations
 
 template <typename Derived>
 void BaseNode<Derived>::accept(RawVisitor* visitor) {
-    visitor->visit(static_cast<Derived*>(this));
+  visitor->visit(static_cast<Derived*>(this));
 }
 
 template <typename T>
 class NodeCastImpl : public RawVisitor {
-public:
-    using RawVisitor::visit;
+ public:
+  using RawVisitor::visit;
 
-    T* value = nullptr;
+  T* value = nullptr;
 
-    void visit(T* v) override {
-        value = v;
-    }
+  void visit(T* v) override { value = v; }
 };
 
 template <typename T>
 T* nodeCast(Node* node) {
-    NodeCastImpl<T> visitor;
-    node->accept(&visitor);
-    return visitor.value;
+  NodeCastImpl<T> visitor;
+  node->accept(&visitor);
+  return visitor.value;
 }
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
-#endif // AAPT_XML_DOM_H
+#endif  // AAPT_XML_DOM_H
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index a24d109..ce69df6 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -23,8 +23,8 @@
 #include "util/StringPiece.h"
 #include "xml/XmlUtil.h"
 
-#include <algorithm>
 #include <expat.h>
+#include <algorithm>
 #include <istream>
 #include <ostream>
 #include <queue>
@@ -36,263 +36,288 @@
 namespace xml {
 
 class XmlPullParser : public IPackageDeclStack {
-public:
-    enum class Event {
-        kBadDocument,
-        kStartDocument,
-        kEndDocument,
+ public:
+  enum class Event {
+    kBadDocument,
+    kStartDocument,
+    kEndDocument,
 
-        kStartNamespace,
-        kEndNamespace,
-        kStartElement,
-        kEndElement,
-        kText,
-        kComment,
-    };
+    kStartNamespace,
+    kEndNamespace,
+    kStartElement,
+    kEndElement,
+    kText,
+    kComment,
+  };
 
-    /**
-     * Skips to the next direct descendant node of the given startDepth,
-     * skipping namespace nodes.
-     *
-     * When nextChildNode returns true, you can expect Comments, Text, and StartElement events.
-     */
-    static bool nextChildNode(XmlPullParser* parser, size_t startDepth);
-    static bool skipCurrentElement(XmlPullParser* parser);
-    static bool isGoodEvent(Event event);
+  /**
+   * Skips to the next direct descendant node of the given startDepth,
+   * skipping namespace nodes.
+   *
+   * When nextChildNode returns true, you can expect Comments, Text, and
+   * StartElement events.
+   */
+  static bool nextChildNode(XmlPullParser* parser, size_t startDepth);
+  static bool skipCurrentElement(XmlPullParser* parser);
+  static bool isGoodEvent(Event event);
 
-    explicit XmlPullParser(std::istream& in);
-    ~XmlPullParser();
+  explicit XmlPullParser(std::istream& in);
+  ~XmlPullParser();
 
-    /**
-     * Returns the current event that is being processed.
-     */
-    Event getEvent() const;
+  /**
+   * Returns the current event that is being processed.
+   */
+  Event getEvent() const;
 
-    const std::string& getLastError() const;
+  const std::string& getLastError() const;
 
-    /**
-     * Note, unlike XmlPullParser, the first call to next() will return
-     * StartElement of the first element.
-     */
-    Event next();
+  /**
+   * Note, unlike XmlPullParser, the first call to next() will return
+   * StartElement of the first element.
+   */
+  Event next();
 
-    //
-    // These are available for all nodes.
-    //
+  //
+  // These are available for all nodes.
+  //
 
-    const std::string& getComment() const;
-    size_t getLineNumber() const;
-    size_t getDepth() const;
+  const std::string& getComment() const;
+  size_t getLineNumber() const;
+  size_t getDepth() const;
 
-    /**
-     * Returns the character data for a Text event.
-     */
-    const std::string& getText() const;
+  /**
+   * Returns the character data for a Text event.
+   */
+  const std::string& getText() const;
 
-    //
-    // Namespace prefix and URI are available for StartNamespace and EndNamespace.
-    //
+  //
+  // Namespace prefix and URI are available for StartNamespace and EndNamespace.
+  //
 
-    const std::string& getNamespacePrefix() const;
-    const std::string& getNamespaceUri() const;
+  const std::string& getNamespacePrefix() const;
+  const std::string& getNamespaceUri() const;
 
-    //
-    // These are available for StartElement and EndElement.
-    //
+  //
+  // These are available for StartElement and EndElement.
+  //
 
-    const std::string& getElementNamespace() const;
-    const std::string& getElementName() const;
+  const std::string& getElementNamespace() const;
+  const std::string& getElementName() const;
 
-    /*
-     * Uses the current stack of namespaces to resolve the package. Eg:
-     * xmlns:app = "http://schemas.android.com/apk/res/com.android.app"
-     * ...
-     * android:text="@app:string/message"
-     *
-     * In this case, 'app' will be converted to 'com.android.app'.
-     *
-     * If xmlns:app="http://schemas.android.com/apk/res-auto", then
-     * 'package' will be set to 'defaultPackage'.
-     */
-    Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const override;
+  /*
+   * Uses the current stack of namespaces to resolve the package. Eg:
+   * xmlns:app = "http://schemas.android.com/apk/res/com.android.app"
+   * ...
+   * android:text="@app:string/message"
+   *
+   * In this case, 'app' will be converted to 'com.android.app'.
+   *
+   * If xmlns:app="http://schemas.android.com/apk/res-auto", then
+   * 'package' will be set to 'defaultPackage'.
+   */
+  Maybe<ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias, const StringPiece& localPackage) const override;
 
-    //
-    // Remaining methods are for retrieving information about attributes
-    // associated with a StartElement.
-    //
-    // Attributes must be in sorted order (according to the less than operator
-    // of struct Attribute).
-    //
+  //
+  // Remaining methods are for retrieving information about attributes
+  // associated with a StartElement.
+  //
+  // Attributes must be in sorted order (according to the less than operator
+  // of struct Attribute).
+  //
 
-    struct Attribute {
-        std::string namespaceUri;
-        std::string name;
-        std::string value;
+  struct Attribute {
+    std::string namespaceUri;
+    std::string name;
+    std::string value;
 
-        int compare(const Attribute& rhs) const;
-        bool operator<(const Attribute& rhs) const;
-        bool operator==(const Attribute& rhs) const;
-        bool operator!=(const Attribute& rhs) const;
-    };
+    int compare(const Attribute& rhs) const;
+    bool operator<(const Attribute& rhs) const;
+    bool operator==(const Attribute& rhs) const;
+    bool operator!=(const Attribute& rhs) const;
+  };
 
-    using const_iterator = std::vector<Attribute>::const_iterator;
+  using const_iterator = std::vector<Attribute>::const_iterator;
 
-    const_iterator beginAttributes() const;
-    const_iterator endAttributes() const;
-    size_t getAttributeCount() const;
-    const_iterator findAttribute(StringPiece namespaceUri, StringPiece name) const;
+  const_iterator beginAttributes() const;
+  const_iterator endAttributes() const;
+  size_t getAttributeCount() const;
+  const_iterator findAttribute(StringPiece namespaceUri,
+                               StringPiece name) const;
 
-private:
-    static void XMLCALL startNamespaceHandler(void* userData, const char* prefix, const char* uri);
-    static void XMLCALL startElementHandler(void* userData, const char* name, const char** attrs);
-    static void XMLCALL characterDataHandler(void* userData, const char* s, int len);
-    static void XMLCALL endElementHandler(void* userData, const char* name);
-    static void XMLCALL endNamespaceHandler(void* userData, const char* prefix);
-    static void XMLCALL commentDataHandler(void* userData, const char* comment);
+ private:
+  static void XMLCALL startNamespaceHandler(void* userData, const char* prefix,
+                                            const char* uri);
+  static void XMLCALL startElementHandler(void* userData, const char* name,
+                                          const char** attrs);
+  static void XMLCALL characterDataHandler(void* userData, const char* s,
+                                           int len);
+  static void XMLCALL endElementHandler(void* userData, const char* name);
+  static void XMLCALL endNamespaceHandler(void* userData, const char* prefix);
+  static void XMLCALL commentDataHandler(void* userData, const char* comment);
 
-    struct EventData {
-        Event event;
-        size_t lineNumber;
-        size_t depth;
-        std::string data1;
-        std::string data2;
-        std::vector<Attribute> attributes;
-    };
+  struct EventData {
+    Event event;
+    size_t lineNumber;
+    size_t depth;
+    std::string data1;
+    std::string data2;
+    std::vector<Attribute> attributes;
+  };
 
-    std::istream& mIn;
-    XML_Parser mParser;
-    char mBuffer[16384];
-    std::queue<EventData> mEventQueue;
-    std::string mLastError;
-    const std::string mEmpty;
-    size_t mDepth;
-    std::stack<std::string> mNamespaceUris;
+  std::istream& mIn;
+  XML_Parser mParser;
+  char mBuffer[16384];
+  std::queue<EventData> mEventQueue;
+  std::string mLastError;
+  const std::string mEmpty;
+  size_t mDepth;
+  std::stack<std::string> mNamespaceUris;
 
-    struct PackageDecl {
-        std::string prefix;
-        ExtractedPackage package;
-    };
-    std::vector<PackageDecl> mPackageAliases;
+  struct PackageDecl {
+    std::string prefix;
+    ExtractedPackage package;
+  };
+  std::vector<PackageDecl> mPackageAliases;
 };
 
 /**
  * Finds the attribute in the current element within the global namespace.
  */
-Maybe<StringPiece> findAttribute(const XmlPullParser* parser, const StringPiece& name);
+Maybe<StringPiece> findAttribute(const XmlPullParser* parser,
+                                 const StringPiece& name);
 
 /**
- * Finds the attribute in the current element within the global namespace. The attribute's value
+ * Finds the attribute in the current element within the global namespace. The
+ * attribute's value
  * must not be the empty string.
  */
-Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece& name);
+Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser,
+                                         const StringPiece& name);
 
 //
 // Implementation
 //
 
-inline ::std::ostream& operator<<(::std::ostream& out, XmlPullParser::Event event) {
-    switch (event) {
-        case XmlPullParser::Event::kBadDocument: return out << "BadDocument";
-        case XmlPullParser::Event::kStartDocument: return out << "StartDocument";
-        case XmlPullParser::Event::kEndDocument: return out << "EndDocument";
-        case XmlPullParser::Event::kStartNamespace: return out << "StartNamespace";
-        case XmlPullParser::Event::kEndNamespace: return out << "EndNamespace";
-        case XmlPullParser::Event::kStartElement: return out << "StartElement";
-        case XmlPullParser::Event::kEndElement: return out << "EndElement";
-        case XmlPullParser::Event::kText: return out << "Text";
-        case XmlPullParser::Event::kComment: return out << "Comment";
-    }
-    return out;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  XmlPullParser::Event event) {
+  switch (event) {
+    case XmlPullParser::Event::kBadDocument:
+      return out << "BadDocument";
+    case XmlPullParser::Event::kStartDocument:
+      return out << "StartDocument";
+    case XmlPullParser::Event::kEndDocument:
+      return out << "EndDocument";
+    case XmlPullParser::Event::kStartNamespace:
+      return out << "StartNamespace";
+    case XmlPullParser::Event::kEndNamespace:
+      return out << "EndNamespace";
+    case XmlPullParser::Event::kStartElement:
+      return out << "StartElement";
+    case XmlPullParser::Event::kEndElement:
+      return out << "EndElement";
+    case XmlPullParser::Event::kText:
+      return out << "Text";
+    case XmlPullParser::Event::kComment:
+      return out << "Comment";
+  }
+  return out;
 }
 
-inline bool XmlPullParser::nextChildNode(XmlPullParser* parser, size_t startDepth) {
-    Event event;
+inline bool XmlPullParser::nextChildNode(XmlPullParser* parser,
+                                         size_t startDepth) {
+  Event event;
 
-    // First get back to the start depth.
-    while (isGoodEvent(event = parser->next()) && parser->getDepth() > startDepth + 1) {}
+  // First get back to the start depth.
+  while (isGoodEvent(event = parser->next()) &&
+         parser->getDepth() > startDepth + 1) {
+  }
 
-    // Now look for the first good node.
-    while ((event != Event::kEndElement || parser->getDepth() > startDepth) && isGoodEvent(event)) {
-        switch (event) {
-        case Event::kText:
-        case Event::kComment:
-        case Event::kStartElement:
-            return true;
-        default:
-            break;
-        }
-        event = parser->next();
+  // Now look for the first good node.
+  while ((event != Event::kEndElement || parser->getDepth() > startDepth) &&
+         isGoodEvent(event)) {
+    switch (event) {
+      case Event::kText:
+      case Event::kComment:
+      case Event::kStartElement:
+        return true;
+      default:
+        break;
     }
-    return false;
+    event = parser->next();
+  }
+  return false;
 }
 
 inline bool XmlPullParser::skipCurrentElement(XmlPullParser* parser) {
-    int depth = 1;
-    while (depth > 0) {
-        switch (parser->next()) {
-            case Event::kEndDocument:
-                return true;
-            case Event::kBadDocument:
-                return false;
-            case Event::kStartElement:
-                depth++;
-                break;
-            case Event::kEndElement:
-                depth--;
-                break;
-            default:
-                break;
-        }
+  int depth = 1;
+  while (depth > 0) {
+    switch (parser->next()) {
+      case Event::kEndDocument:
+        return true;
+      case Event::kBadDocument:
+        return false;
+      case Event::kStartElement:
+        depth++;
+        break;
+      case Event::kEndElement:
+        depth--;
+        break;
+      default:
+        break;
     }
-    return true;
+  }
+  return true;
 }
 
 inline bool XmlPullParser::isGoodEvent(XmlPullParser::Event event) {
-    return event != Event::kBadDocument && event != Event::kEndDocument;
+  return event != Event::kBadDocument && event != Event::kEndDocument;
 }
 
 inline int XmlPullParser::Attribute::compare(const Attribute& rhs) const {
-    int cmp = namespaceUri.compare(rhs.namespaceUri);
-    if (cmp != 0) return cmp;
-    return name.compare(rhs.name);
+  int cmp = namespaceUri.compare(rhs.namespaceUri);
+  if (cmp != 0) return cmp;
+  return name.compare(rhs.name);
 }
 
 inline bool XmlPullParser::Attribute::operator<(const Attribute& rhs) const {
-    return compare(rhs) < 0;
+  return compare(rhs) < 0;
 }
 
 inline bool XmlPullParser::Attribute::operator==(const Attribute& rhs) const {
-    return compare(rhs) == 0;
+  return compare(rhs) == 0;
 }
 
 inline bool XmlPullParser::Attribute::operator!=(const Attribute& rhs) const {
-    return compare(rhs) != 0;
+  return compare(rhs) != 0;
 }
 
-inline XmlPullParser::const_iterator XmlPullParser::findAttribute(StringPiece namespaceUri,
-                                                                  StringPiece name) const {
-    const auto endIter = endAttributes();
-    const auto iter = std::lower_bound(beginAttributes(), endIter,
-            std::pair<StringPiece, StringPiece>(namespaceUri, name),
-            [](const Attribute& attr, const std::pair<StringPiece, StringPiece>& rhs) -> bool {
-                int cmp = attr.namespaceUri.compare(0, attr.namespaceUri.size(),
-                        rhs.first.data(), rhs.first.size());
-                if (cmp < 0) return true;
-                if (cmp > 0) return false;
-                cmp = attr.name.compare(0, attr.name.size(), rhs.second.data(), rhs.second.size());
-                if (cmp < 0) return true;
-                return false;
-            }
-    );
+inline XmlPullParser::const_iterator XmlPullParser::findAttribute(
+    StringPiece namespaceUri, StringPiece name) const {
+  const auto endIter = endAttributes();
+  const auto iter = std::lower_bound(
+      beginAttributes(), endIter,
+      std::pair<StringPiece, StringPiece>(namespaceUri, name),
+      [](const Attribute& attr,
+         const std::pair<StringPiece, StringPiece>& rhs) -> bool {
+        int cmp = attr.namespaceUri.compare(0, attr.namespaceUri.size(),
+                                            rhs.first.data(), rhs.first.size());
+        if (cmp < 0) return true;
+        if (cmp > 0) return false;
+        cmp = attr.name.compare(0, attr.name.size(), rhs.second.data(),
+                                rhs.second.size());
+        if (cmp < 0) return true;
+        return false;
+      });
 
-    if (iter != endIter && namespaceUri == iter->namespaceUri && name == iter->name) {
-        return iter;
-    }
-    return endIter;
+  if (iter != endIter && namespaceUri == iter->namespaceUri &&
+      name == iter->name) {
+    return iter;
+  }
+  return endIter;
 }
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
-#endif // AAPT_XML_PULL_PARSER_H
+#endif  // AAPT_XML_PULL_PARSER_H
diff --git a/tools/aapt2/xml/XmlUtil.h b/tools/aapt2/xml/XmlUtil.h
index a6ad79d..96de654 100644
--- a/tools/aapt2/xml/XmlUtil.h
+++ b/tools/aapt2/xml/XmlUtil.h
@@ -26,9 +26,12 @@
 namespace xml {
 
 constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
-constexpr const char* kSchemaPublicPrefix = "http://schemas.android.com/apk/res/";
-constexpr const char* kSchemaPrivatePrefix = "http://schemas.android.com/apk/prv/res/";
-constexpr const char* kSchemaAndroid = "http://schemas.android.com/apk/res/android";
+constexpr const char* kSchemaPublicPrefix =
+    "http://schemas.android.com/apk/res/";
+constexpr const char* kSchemaPrivatePrefix =
+    "http://schemas.android.com/apk/prv/res/";
+constexpr const char* kSchemaAndroid =
+    "http://schemas.android.com/apk/res/android";
 constexpr const char* kSchemaTools = "http://schemas.android.com/tools";
 constexpr const char* kSchemaAapt = "http://schemas.android.com/aapt";
 
@@ -36,17 +39,19 @@
  * Result of extracting a package name from a namespace URI declaration.
  */
 struct ExtractedPackage {
-    /**
-     * The name of the package. This can be the empty string, which means that the package
-     * should be assumed to be the package being compiled.
-     */
-    std::string package;
+  /**
+   * The name of the package. This can be the empty string, which means that the
+   * package
+   * should be assumed to be the package being compiled.
+   */
+  std::string package;
 
-    /**
-     * True if the package's private namespace was declared. This means that private resources
-     * are made visible.
-     */
-    bool privateNamespace;
+  /**
+   * True if the package's private namespace was declared. This means that
+   * private resources
+   * are made visible.
+   */
+  bool privateNamespace;
 };
 
 /**
@@ -57,7 +62,8 @@
  * Special case: if namespaceUri is http://schemas.android.com/apk/res-auto,
  * returns an empty package name.
  */
-Maybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri);
+Maybe<ExtractedPackage> extractPackageFromNamespace(
+    const std::string& namespaceUri);
 
 /**
  * Returns an XML Android namespace for the given package of the form:
@@ -68,31 +74,37 @@
  *
  * http://schemas.android.com/apk/prv/res/<package>
  */
-std::string buildPackageNamespace(const StringPiece& package, bool privateReference=false);
+std::string buildPackageNamespace(const StringPiece& package,
+                                  bool privateReference = false);
 
 /**
- * Interface representing a stack of XML namespace declarations. When looking up the package
+ * Interface representing a stack of XML namespace declarations. When looking up
+ * the package
  * for a namespace prefix, the stack is checked from top to bottom.
  */
 struct IPackageDeclStack {
-    virtual ~IPackageDeclStack() = default;
+  virtual ~IPackageDeclStack() = default;
 
-    /**
-     * Returns an ExtractedPackage struct if the alias given corresponds with a package declaration.
-     */
-    virtual Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const = 0;
+  /**
+   * Returns an ExtractedPackage struct if the alias given corresponds with a
+   * package declaration.
+   */
+  virtual Maybe<ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias, const StringPiece& localPackage) const = 0;
 };
 
 /**
- * Helper function for transforming the original Reference inRef to a fully qualified reference
- * via the IPackageDeclStack. This will also mark the Reference as private if the namespace of
+ * Helper function for transforming the original Reference inRef to a fully
+ * qualified reference
+ * via the IPackageDeclStack. This will also mark the Reference as private if
+ * the namespace of
  * the package declaration was private.
  */
 void transformReferenceFromNamespace(IPackageDeclStack* declStack,
-                                     const StringPiece& localPackage, Reference* inRef);
+                                     const StringPiece& localPackage,
+                                     Reference* inRef);
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
 #endif /* AAPT_XML_XMLUTIL_H */
