Update keep radius summarization to include all rules
This updates the summaries to include all keep rules from a given build.
This makes it possible to reason about unused rules across all builds.
Bug: b/515648762
Change-Id: I8d124204e0207c317b002680148914f7e9a3dec4
diff --git a/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportGenerator.java b/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportGenerator.java
index 658829d..7f0428b 100644
--- a/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportGenerator.java
+++ b/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportGenerator.java
@@ -5,6 +5,8 @@
import com.android.tools.r8.keepanno.annotations.KeepForApi;
import com.android.tools.r8.keepradius.proto.BuildInfo;
+import com.android.tools.r8.keepradius.proto.GlobalKeepRuleKeepRadius;
+import com.android.tools.r8.keepradius.proto.GlobalKeepRuleKeepRadiusSummary;
import com.android.tools.r8.keepradius.proto.KeepConstraint;
import com.android.tools.r8.keepradius.proto.KeepConstraints;
import com.android.tools.r8.keepradius.proto.KeepInfoCollectionSummary;
@@ -156,9 +158,9 @@
// Info about number of items.
BuildInfo buildInfo = keepRadius.getBuildInfo();
- summaryBuilder.setClassCount(buildInfo.getClassCount());
- summaryBuilder.setFieldCount(buildInfo.getFieldCount());
- summaryBuilder.setMethodCount(buildInfo.getMethodCount());
+ summaryBuilder.setLiveClassCount(buildInfo.getClassCount());
+ summaryBuilder.setLiveFieldCount(buildInfo.getFieldCount());
+ summaryBuilder.setLiveMethodCount(buildInfo.getMethodCount());
// Info about number of keep rules.
summaryBuilder.setKeepRuleCount(keepRadius.getKeepRuleKeepRadiusTableCount());
@@ -212,19 +214,22 @@
return Integer.compare(radiusB, radiusA);
});
- for (int i = 0; i < Math.min(10, rulesWithRadius.size()); i++) {
+ for (int i = 0; i < rulesWithRadius.size(); i++) {
KeepRuleKeepRadius rule = rulesWithRadius.get(i);
int radius =
rule.getKeepRadius().getClassKeepRadiusCount()
+ rule.getKeepRadius().getFieldKeepRadiusCount()
+ rule.getKeepRadius().getMethodKeepRadiusCount();
- if (radius == 0) {
- break;
- }
summaryBuilder.addKeepRuleKeepRadius(
KeepRuleKeepRadiusSummary.newBuilder().setSource(rule.getSource()).setItemCount(radius));
}
+ // Info about problematic global rules.
+ for (GlobalKeepRuleKeepRadius rule : keepRadius.getGlobalKeepRuleKeepRadiusTableList()) {
+ summaryBuilder.addGlobalKeepRuleKeepRadius(
+ GlobalKeepRuleKeepRadiusSummary.newBuilder().setSource(rule.getSource()).build());
+ }
+
return summaryBuilder.build();
}
diff --git a/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportTemplate.java b/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportTemplate.java
index 986064b..0445bb9 100644
--- a/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportTemplate.java
+++ b/src/keepradius/java/com/android/tools/r8/keepradius/KeepRadiusHtmlReportTemplate.java
@@ -266,18 +266,18 @@
"ICNmOGY5ZmE7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6ICM1NTU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQp0aDpsYXN0LWNoaWxkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQp0aDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMWYyOwp9CnRyOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmY2ZjZmM7Cn0KLnJlcG9ydC1saW5rIHsKICAgIGNvbG9yOiAjMWE3M2U4OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoucmVwb3J0LWxpbms6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLnN0YXQtYmFkZ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlOTsKICAgIGNvbG9yOiAjMmU3ZDMyOwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBmb250LXNpemU6IDAuOHJlbTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKfQouc3RhdC1iYWRnZS53YXJuIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYzZTA7CiAgICBjb2xvcjogI2VmNmMwMDsKfQouc3RhdC1iYWRnZS5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlYmVlOwogICAgY29sb3I6ICNjNjI4Mjg7Cn0KLm5hbWUtcm93IHRkIHsKICAgIGJhY2tncm91bmQtY29s",
"b3I6ICNmOGY5ZmE7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6ICMzZjUxYjU7CiAgICBwYWRkaW5nLXRvcDogMXJlbTsKICAgIHBhZGRpbmctYm90dG9tOiAwLjVyZW07CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9Ci5kYXRhLXJvdyB0ZCB7CiAgICBwYWRkaW5nLWJvdHRvbTogMXJlbTsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KPC9zdHlsZT4KICAgIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Um9ib3RvOndnaHRAMzAwOzQwMDs1MDA7NzAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3Byb3RvYnVmanNANy4yLjQvZGlzdC9wcm90b2J1Zi5taW4uanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDE+Qmxhc3QgUmFkaXVzIFJlcG9ydHM8L2gxPgogICAgICAgIDxkaXYgaWQ9InRhYmxlLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLXNvcnQ9InJ1bGVzIj5LZWVwIFJ1bGVzPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtc29ydD0iaXRlbXMiPktlcHQgSXRlbXM8L3RoPgogICAgICAgICAgICAgICAgICAgICAg",
"ICA8dGggZGF0YS1zb3J0PSJjbGFzc2VzIj5LZXB0IENsYXNzZXM8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGggZGF0YS1zb3J0PSJtZXRob2RzIj5LZXB0IE1ldGhvZHM8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGggZGF0YS1zb3J0PSJmaWVsZHMiPktlcHQgRmllbGRzPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2JsZW1hdGljIFJ1bGVzPC90aD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0ic3VtbWFyeS10YWJsZS1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICA8IS0tIEphdmFTY3JpcHQgd2lsbCBwb3B1bGF0ZSB0aGlzIC0tPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgaWQ9ImtlZXByYWRpdXMtcHJvdG8iIHR5cGU9InRleHQvcGxhaW4iPi8vIENvcHlyaWdodCAoYykgMjAyNiwgdGhlIFI4IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCnN5bnRheCA9ICJwcm90bzMiOwoKcGFja2FnZSBj",
- "b20uYW5kcm9pZC50b29scy5yOC5rZWVwcmFkaXVzLnByb3RvOwoKLy8gRG9uJ3QgcHV0IGFsbCBtZXNzYWdlcyB1bmRlciB0aGUgb3V0ZXIgY2xhc3MuCm9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKCi8vIENhbWVsLWNhc2UgdGhlIG91dGVyIGNsYXNzIG5hbWUuCm9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJLZWVwUmFkaXVzU3VtbWFyeVByb3RvcyI7CgovLyBKYXZhIHBhY2thZ2UgY29uc2lzdGVudCB3aXRoIFI4IGNvbnZlbnRpb24uCm9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmFuZHJvaWQudG9vbHMucjgua2VlcHJhZGl1cy5wcm90byI7CgptZXNzYWdlIEtlZXBSYWRpdXNTdW1tYXJ5IHsKICAvLyBOYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuCiAgc3RyaW5nIG5hbWUgPSAxOwoKICAvLyBMaW5rIHRvIHRoZSBmdWxsIHJlcG9ydC4KICBzdHJpbmcgbGluayA9IDI7CgogIC8vIEluZm8gYWJvdXQgbnVtYmVyIG9mIGl0ZW1zLgogIGludDMyIGNsYXNzX2NvdW50ID0gMzsKICBpbnQzMiBmaWVsZF9jb3VudCA9IDQ7CiAgaW50MzIgbWV0aG9kX2NvdW50ID0gNTsKCiAgLy8gSW5mbyBhYm91dCBudW1iZXIgb2Yga2VlcCBydWxlcy4KICBpbnQzMiBrZWVwX3J1bGVfY291bnQgPSA2OwogIGludDMyIGtlZXBfcnVsZV9wYWNrYWdlX3dpZGVfY291bnQgPSA3OwoKICAvLyBJbmZvIGFib3V0IG51bWJlciBvZiBrZXB0IGl0ZW1zLgogIEtlZXBJbmZvQ29sbGVjdGlvblN1bW1hcnkg",
- "a2VwdF9jbGFzc2VzID0gODsKICBLZWVwSW5mb0NvbGxlY3Rpb25TdW1tYXJ5IGtlcHRfZmllbGRzID0gOTsKICBLZWVwSW5mb0NvbGxlY3Rpb25TdW1tYXJ5IGtlcHRfbWV0aG9kcyA9IDEwOwoKICAvLyBJbmZvIGFib3V0IHByb2JsZW1hdGljIHJ1bGVzLgogIHJlcGVhdGVkIEtlZXBSdWxlS2VlcFJhZGl1c1N1bW1hcnkga2VlcF9ydWxlX2tlZXBfcmFkaXVzID0gMTE7Cn0KCm1lc3NhZ2UgS2VlcEluZm9Db2xsZWN0aW9uU3VtbWFyeSB7CiAgaW50MzIgaXRlbV9jb3VudCA9IDE7CiAgaW50MzIgbm9fb2JmdXNjYXRpb25fY291bnQgPSAyOwogIGludDMyIG5vX29wdGltaXphdGlvbl9jb3VudCA9IDM7CiAgaW50MzIgbm9fc2hyaW5raW5nX2NvdW50ID0gNDsKfQoKbWVzc2FnZSBLZWVwUnVsZUtlZXBSYWRpdXNTdW1tYXJ5IHsKICBzdHJpbmcgc291cmNlID0gMTsKICBpbnQzMiBpdGVtX2NvdW50ID0gMjsKfQo8L3NjcmlwdD4KICAgIDxzY3JpcHQgaWQ9ImtlZXByYWRpdXMtZGF0YSIgdHlwZT0iYXBwbGljYXRpb24vanNvbiI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pi8vIENvcHlyaWdodCAoYykgMjAyNiwgdGhlIFI4IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBM",
- "SUNFTlNFIGZpbGUuCgooZnVuY3Rpb24oKSB7CiAgY29uc3QgcHJvdG9TY2hlbWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2VlcHJhZGl1cy1wcm90bycpLnRleHRDb250ZW50OwogIGNvbnN0IHN1bW1hcmllc0RhdGEgPSBKU09OLnBhcnNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZWVwcmFkaXVzLWRhdGEnKS50ZXh0Q29udGVudCk7CiAgY29uc3QgdGFibGVCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktdGFibGUtYm9keScpOwogIGNvbnN0IGhlYWRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aFtkYXRhLXNvcnRdJyk7CgogIGNvbnN0IHJvb3QgPSBwcm90b2J1Zi5wYXJzZShwcm90b1NjaGVtYSkucm9vdDsKICBjb25zdCBLZWVwUmFkaXVzU3VtbWFyeSA9IHJvb3QubG9va3VwVHlwZSgiY29tLmFuZHJvaWQudG9vbHMucjgua2VlcHJhZGl1cy5wcm90by5LZWVwUmFkaXVzU3VtbWFyeSIpOwoKICBsZXQgc3VtbWFyaWVzID0gW107CiAgbGV0IGN1cnJlbnRTb3J0ID0gewogICAga2V5OiBudWxsLAogICAgZGVzYzogdHJ1ZQogIH07CgogIHN1bW1hcmllc0RhdGEuZm9yRWFjaChzdW1tYXJ5QmFzZTY0ID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGJpbmFyeSA9IGF0b2Ioc3VtbWFyeUJhc2U2NCk7CiAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsg",
- "aSsrKSB7CiAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTsKICAgICAgfQogICAgICBjb25zdCBtZXNzYWdlID0gS2VlcFJhZGl1c1N1bW1hcnkuZGVjb2RlKGJ5dGVzKTsKICAgICAgY29uc3Qgc3VtbWFyeSA9IEtlZXBSYWRpdXNTdW1tYXJ5LnRvT2JqZWN0KG1lc3NhZ2UsIHsKICAgICAgICBkZWZhdWx0czogdHJ1ZSwKICAgICAgICBlbnVtczogU3RyaW5nCiAgICAgIH0pOwogICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGRlY29kZSBzdW1tYXJ5OiIsIGUpOwogICAgfQogIH0pOwoKICBmdW5jdGlvbiByZW5kZXJUYWJsZSgpIHsKICAgIHRhYmxlQm9keS5pbm5lckhUTUwgPSAnJzsKICAgIHN1bW1hcmllcy5mb3JFYWNoKHJlbmRlclJvdyk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJSb3coc3VtbWFyeSkgewogICAgLy8gTmFtZSByb3cgKEZ1bGwgd2lkdGgpCiAgICBjb25zdCBuYW1lVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogICAgbmFtZVRyLmNsYXNzTmFtZSA9ICduYW1lLXJvdyc7CiAgICBjb25zdCBuYW1lVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgbmFtZVRkLmNvbFNwYW4gPSA2OwogICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGxpbmsuY2xhc3NOYW1lID0gJ3JlcG9ydC1saW5rJzsKICAgIGxpbmsuaHJl",
- "ZiA9IHN1bW1hcnkubGluayB8fCBzdW1tYXJ5Lm5hbWUucmVwbGFjZSgnLnBiJywgJy5odG1sJyk7CiAgICBsaW5rLnRleHRDb250ZW50ID0gc3VtbWFyeS5uYW1lOwogICAgbmFtZVRkLmFwcGVuZENoaWxkKGxpbmspOwogICAgbmFtZVRyLmFwcGVuZENoaWxkKG5hbWVUZCk7CiAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmFtZVRyKTsKCiAgICAvLyBEYXRhIHJvdwogICAgY29uc3QgZGF0YVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICAgIGRhdGFUci5jbGFzc05hbWUgPSAnZGF0YS1yb3cnOwoKICAgIGNvbnN0IHJ1bGVzVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgcnVsZXNUZC50ZXh0Q29udGVudCA9IHN1bW1hcnkua2VlcFJ1bGVDb3VudCB8fCAiMCI7CiAgICBpZiAoc3VtbWFyeS5rZWVwUnVsZVBhY2thZ2VXaWRlQ291bnQgJiYgc3VtbWFyeS5rZWVwUnVsZVBhY2thZ2VXaWRlQ291bnQgIT09IDApIHsKICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgc3Bhbi5jbGFzc05hbWUgPSAnc3RhdC1iYWRnZSB3YXJuJzsKICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGAke3N1bW1hcnkua2VlcFJ1bGVQYWNrYWdlV2lkZUNvdW50fSBwYWNrYWdlLXdpZGVgOwogICAgICBzcGFuLnRpdGxlID0gIk51bWJlciBvZiBrZWVwIHJ1bGVzIHRoYXQga2VlcCBhbiBlbnRpcmUgcGFja2FnZSI7CiAgICAgIHJ1bGVzVGQuYXBwZW5kQ2hp",
- "bGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7CiAgICAgIHJ1bGVzVGQuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICB9CiAgICBkYXRhVHIuYXBwZW5kQ2hpbGQocnVsZXNUZCk7CgogICAgY29uc3QgaXRlbXNUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICBjb25zdCB0b3RhbEtlcHQgPSAoc3VtbWFyeS5rZXB0Q2xhc3Nlcz8uaXRlbUNvdW50IHx8IDApICsKICAgICAgKHN1bW1hcnkua2VwdE1ldGhvZHM/Lml0ZW1Db3VudCB8fCAwKSArCiAgICAgIChzdW1tYXJ5LmtlcHRGaWVsZHM/Lml0ZW1Db3VudCB8fCAwKTsKICAgIGNvbnN0IHRvdGFsSXRlbXMgPSAoc3VtbWFyeS5jbGFzc0NvdW50IHx8IDApICsgKHN1bW1hcnkubWV0aG9kQ291bnQgfHwgMCkgKyAoc3VtbWFyeS5maWVsZENvdW50IHx8IDApOwogICAgaXRlbXNUZC50ZXh0Q29udGVudCA9IGAke3RvdGFsS2VwdH0gLyAke3RvdGFsSXRlbXN9YDsKICAgIGRhdGFUci5hcHBlbmRDaGlsZChpdGVtc1RkKTsKCiAgICBjb25zdCBjbGFzc2VzVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgY2xhc3Nlc1RkLmlubmVySFRNTCA9IGZvcm1hdEtlZXBJbmZvKHN1bW1hcnkua2VwdENsYXNzZXMsIHN1bW1hcnkuY2xhc3NDb3VudCk7CiAgICBkYXRhVHIuYXBwZW5kQ2hpbGQoY2xhc3Nlc1RkKTsKCiAgICBjb25zdCBtZXRob2RzVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgbWV0aG9kc1RkLmlubmVy",
- "SFRNTCA9IGZvcm1hdEtlZXBJbmZvKHN1bW1hcnkua2VwdE1ldGhvZHMsIHN1bW1hcnkubWV0aG9kQ291bnQpOwogICAgZGF0YVRyLmFwcGVuZENoaWxkKG1ldGhvZHNUZCk7CgogICAgY29uc3QgZmllbGRzVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgZmllbGRzVGQuaW5uZXJIVE1MID0gZm9ybWF0S2VlcEluZm8oc3VtbWFyeS5rZXB0RmllbGRzLCBzdW1tYXJ5LmZpZWxkQ291bnQpOwogICAgZGF0YVRyLmFwcGVuZENoaWxkKGZpZWxkc1RkKTsKCiAgICBjb25zdCBwcm9ibGVtYXRpY1RkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIGlmIChzdW1tYXJ5LmtlZXBSdWxlS2VlcFJhZGl1cyAmJiBzdW1tYXJ5LmtlZXBSdWxlS2VlcFJhZGl1cy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsKICAgICAgdWwuc3R5bGUubWFyZ2luID0gJzAnOwogICAgICB1bC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcwJzsKICAgICAgdWwuc3R5bGUubGlzdFN0eWxlVHlwZSA9ICdub25lJzsKICAgICAgdWwuc3R5bGUuZm9udFNpemUgPSAnMC45cmVtJzsKICAgICAgc3VtbWFyeS5rZWVwUnVsZUtlZXBSYWRpdXMuZm9yRWFjaChydWxlID0+IHsKICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICAgICAgbGkuc3R5bGUubWFyZ2luQm90dG9tID0gJzRweCc7CgogICAgICAgIGNvbnN0IGJhZGdlID0g",
- "ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGJhZGdlLmNsYXNzTmFtZSA9ICdzdGF0LWJhZGdlIHdhcm4nOwogICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gcnVsZS5pdGVtQ291bnQ7CiAgICAgICAgYmFkZ2UudGl0bGUgPSAiTnVtYmVyIG9mIGl0ZW1zIGtlcHQgYnkgdGhlIHJ1bGUuIjsKICAgICAgICBiYWRnZS5zdHlsZS5tYXJnaW5SaWdodCA9ICc4cHgnOwoKICAgICAgICBsaS5hcHBlbmRDaGlsZChiYWRnZSk7CiAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBjb2RlLnN0eWxlLmZvbnRGYW1pbHkgPSAnbW9ub3NwYWNlJzsKICAgICAgICBjb2RlLnN0eWxlLmZvbnRTaXplID0gJzAuODVyZW0nOwogICAgICAgIGNvZGUudGV4dENvbnRlbnQgPSBydWxlLnNvdXJjZTsKICAgICAgICBsaS5hcHBlbmRDaGlsZChjb2RlKTsKICAgICAgICB1bC5hcHBlbmRDaGlsZChsaSk7CiAgICAgIH0pOwogICAgICBwcm9ibGVtYXRpY1RkLmFwcGVuZENoaWxkKHVsKTsKICAgIH0gZWxzZSB7CiAgICAgIHByb2JsZW1hdGljVGQudGV4dENvbnRlbnQgPSAiLSI7CiAgICB9CiAgICBkYXRhVHIuYXBwZW5kQ2hpbGQocHJvYmxlbWF0aWNUZCk7CgogICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKGRhdGFUcik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRLZWVwSW5mbyhrZWVwSW5mbywgdG90YWwpIHsKICAgIGlmICgha2VlcEluZm8pIHJldHVybiAiMCAv",
- "ICIgKyAodG90YWwgfHwgMCk7CiAgICBjb25zdCBrZXB0ID0ga2VlcEluZm8uaXRlbUNvdW50IHx8IDA7CiAgICBsZXQgYmFkZ2VzID0gIiI7CiAgICBpZiAoa2VlcEluZm8ubm9PYmZ1c2NhdGlvbkNvdW50ID4gMCkgewogICAgICBiYWRnZXMgKz0gYDxzcGFuIGNsYXNzPSJzdGF0LWJhZGdlIiB0aXRsZT0iTm8gb2JmdXNjYXRpb24iPiR7a2VlcEluZm8ubm9PYmZ1c2NhdGlvbkNvdW50IHx8IDB9IE9CRjwvc3Bhbj5gOwogICAgfQogICAgaWYgKGtlZXBJbmZvLm5vT3B0aW1pemF0aW9uQ291bnQgPiAwKSB7CiAgICAgIGJhZGdlcyArPSBgPHNwYW4gY2xhc3M9InN0YXQtYmFkZ2Ugd2FybiIgdGl0bGU9Ik5vIG9wdGltaXphdGlvbiI+JHtrZWVwSW5mby5ub09wdGltaXphdGlvbkNvdW50IHx8IDB9IE9QVDwvc3Bhbj5gOwogICAgfQogICAgaWYgKGtlZXBJbmZvLm5vU2hyaW5raW5nQ291bnQgPiAwKSB7CiAgICAgIGJhZGdlcyArPSBgPHNwYW4gY2xhc3M9InN0YXQtYmFkZ2UgZXJyb3IiIHRpdGxlPSJObyBzaHJpbmtpbmciPiR7a2VlcEluZm8ubm9TaHJpbmtpbmdDb3VudCB8fCAwfSBTSFI8L3NwYW4+YDsKICAgIH0KICAgIHJldHVybiBgJHtrZXB0fSAvICR7dG90YWwgfHwgMH08YnI+JHtiYWRnZXN9YDsKICB9CgogIGZ1bmN0aW9uIHNvcnRTdW1tYXJpZXMoa2V5KSB7CiAgICBpZiAoY3VycmVudFNvcnQua2V5ID09PSBrZXkpIHsKICAgICAgY3VycmVudFNvcnQuZGVzYyA9ICFjdXJyZW50U29ydC5kZXNjOwogICAg",
- "fSBlbHNlIHsKICAgICAgY3VycmVudFNvcnQua2V5ID0ga2V5OwogICAgICBjdXJyZW50U29ydC5kZXNjID0gdHJ1ZTsKICAgIH0KCiAgICBzdW1tYXJpZXMuc29ydCgoYSwgYikgPT4gewogICAgICBsZXQgdmFsQSwgdmFsQjsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICdydWxlcyc6CiAgICAgICAgICB2YWxBID0gYS5rZWVwUnVsZUNvdW50IHx8IDA7CiAgICAgICAgICB2YWxCID0gYi5rZWVwUnVsZUNvdW50IHx8IDA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdpdGVtcyc6CiAgICAgICAgICB2YWxBID0gKGEua2VwdENsYXNzZXM/Lml0ZW1Db3VudCB8fCAwKSArIChhLmtlcHRNZXRob2RzPy5pdGVtQ291bnQgfHwgMCkgKyAoYS5rZXB0RmllbGRzPy5pdGVtQ291bnQgfHwgMCk7CiAgICAgICAgICB2YWxCID0gKGIua2VwdENsYXNzZXM/Lml0ZW1Db3VudCB8fCAwKSArIChiLmtlcHRNZXRob2RzPy5pdGVtQ291bnQgfHwgMCkgKyAoYi5rZXB0RmllbGRzPy5pdGVtQ291bnQgfHwgMCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdjbGFzc2VzJzoKICAgICAgICAgIHZhbEEgPSAoYS5rZXB0Q2xhc3NlcyAmJiBhLmtlcHRDbGFzc2VzLml0ZW1Db3VudCkgfHwgMDsKICAgICAgICAgIHZhbEIgPSAoYi5rZXB0Q2xhc3NlcyAmJiBiLmtlcHRDbGFzc2VzLml0ZW1Db3VudCkgfHwgMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ21ldGhvZHMnOgogICAgICAgICAgdmFs",
- "QSA9IChhLmtlcHRNZXRob2RzICYmIGEua2VwdE1ldGhvZHMuaXRlbUNvdW50KSB8fCAwOwogICAgICAgICAgdmFsQiA9IChiLmtlcHRNZXRob2RzICYmIGIua2VwdE1ldGhvZHMuaXRlbUNvdW50KSB8fCAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZmllbGRzJzoKICAgICAgICAgIHZhbEEgPSAoYS5rZXB0RmllbGRzICYmIGEua2VwdEZpZWxkcy5pdGVtQ291bnQpIHx8IDA7CiAgICAgICAgICB2YWxCID0gKGIua2VwdEZpZWxkcyAmJiBiLmtlcHRGaWVsZHMuaXRlbUNvdW50KSB8fCAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHJldHVybiBjdXJyZW50U29ydC5kZXNjID8gdmFsQiAtIHZhbEEgOiB2YWxBIC0gdmFsQjsKICAgIH0pOwoKICAgIHJlbmRlclRhYmxlKCk7CiAgICB1cGRhdGVIZWFkZXJTdHlsZXMoKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlclN0eWxlcygpIHsKICAgIGhlYWRlcnMuZm9yRWFjaCh0aCA9PiB7CiAgICAgIGNvbnN0IGtleSA9IHRoLmdldEF0dHJpYnV0ZSgnZGF0YS1zb3J0Jyk7CiAgICAgIHRoLmlubmVySFRNTCA9IHRoLnRleHRDb250ZW50LnJlcGxhY2UoLyBb4pay4pa8XS8sICcnKTsKICAgICAgaWYgKGtleSA9PT0gY3VycmVudFNvcnQua2V5KSB7CiAgICAgICAgdGguaW5uZXJIVE1MICs9IGN1cnJlbnRTb3J0LmRlc2MgPyAnIOKWvCcgOiAnIOKWsic7CiAgICAgIH0KICAgIH0p",
- "OwogIH0KCiAgaGVhZGVycy5mb3JFYWNoKHRoID0+IHsKICAgIHRoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICBzb3J0U3VtbWFyaWVzKHRoLmdldEF0dHJpYnV0ZSgnZGF0YS1zb3J0JykpOwogICAgfSk7CiAgfSk7CgogIHNvcnRTdW1tYXJpZXMoJ2l0ZW1zJyk7Cn0pKCk7PC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo="));
+ "b20uYW5kcm9pZC50b29scy5yOC5rZWVwcmFkaXVzLnByb3RvOwoKLy8gRG9uJ3QgcHV0IGFsbCBtZXNzYWdlcyB1bmRlciB0aGUgb3V0ZXIgY2xhc3MuCm9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKCi8vIENhbWVsLWNhc2UgdGhlIG91dGVyIGNsYXNzIG5hbWUuCm9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJLZWVwUmFkaXVzU3VtbWFyeVByb3RvcyI7CgovLyBKYXZhIHBhY2thZ2UgY29uc2lzdGVudCB3aXRoIFI4IGNvbnZlbnRpb24uCm9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmFuZHJvaWQudG9vbHMucjgua2VlcHJhZGl1cy5wcm90byI7CgptZXNzYWdlIEtlZXBSYWRpdXNTdW1tYXJ5IHsKICAvLyBOYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuCiAgc3RyaW5nIG5hbWUgPSAxOwoKICAvLyBMaW5rIHRvIHRoZSBmdWxsIHJlcG9ydC4KICBzdHJpbmcgbGluayA9IDI7CgogIC8vIEluZm8gYWJvdXQgbnVtYmVyIG9mIGxpdmUgaXRlbXMuCiAgaW50MzIgbGl2ZV9jbGFzc19jb3VudCA9IDM7CiAgaW50MzIgbGl2ZV9maWVsZF9jb3VudCA9IDQ7CiAgaW50MzIgbGl2ZV9tZXRob2RfY291bnQgPSA1OwoKICAvLyBJbmZvIGFib3V0IG51bWJlciBvZiBrZWVwIHJ1bGVzLgogIGludDMyIGtlZXBfcnVsZV9jb3VudCA9IDY7CiAgaW50MzIga2VlcF9ydWxlX3BhY2thZ2Vfd2lkZV9jb3VudCA9IDc7CgogIC8vIEluZm8gYWJvdXQgbnVtYmVyIG9mIGtlcHQgaXRlbXMuCiAgS2VlcElu",
+ "Zm9Db2xsZWN0aW9uU3VtbWFyeSBrZXB0X2NsYXNzZXMgPSA4OwogIEtlZXBJbmZvQ29sbGVjdGlvblN1bW1hcnkga2VwdF9maWVsZHMgPSA5OwogIEtlZXBJbmZvQ29sbGVjdGlvblN1bW1hcnkga2VwdF9tZXRob2RzID0gMTA7CgogIC8vIEluZm8gYWJvdXQgcHJvYmxlbWF0aWMgcnVsZXMuCiAgcmVwZWF0ZWQgS2VlcFJ1bGVLZWVwUmFkaXVzU3VtbWFyeSBrZWVwX3J1bGVfa2VlcF9yYWRpdXMgPSAxMTsKCiAgLy8gSW5mbyBhYm91dCBwcm9ibGVtYXRpYyBnbG9iYWwgcnVsZXMuCiAgcmVwZWF0ZWQgR2xvYmFsS2VlcFJ1bGVLZWVwUmFkaXVzU3VtbWFyeSBnbG9iYWxfa2VlcF9ydWxlX2tlZXBfcmFkaXVzID0gMTI7Cn0KCm1lc3NhZ2UgS2VlcEluZm9Db2xsZWN0aW9uU3VtbWFyeSB7CiAgaW50MzIgaXRlbV9jb3VudCA9IDE7CiAgaW50MzIgbm9fb2JmdXNjYXRpb25fY291bnQgPSAyOwogIGludDMyIG5vX29wdGltaXphdGlvbl9jb3VudCA9IDM7CiAgaW50MzIgbm9fc2hyaW5raW5nX2NvdW50ID0gNDsKfQoKbWVzc2FnZSBLZWVwUnVsZUtlZXBSYWRpdXNTdW1tYXJ5IHsKICBzdHJpbmcgc291cmNlID0gMTsKICBpbnQzMiBpdGVtX2NvdW50ID0gMjsKfQoKbWVzc2FnZSBHbG9iYWxLZWVwUnVsZUtlZXBSYWRpdXNTdW1tYXJ5IHsKICBzdHJpbmcgc291cmNlID0gMTsKfTwvc2NyaXB0PgogICAgPHNjcmlwdCBpZD0ia2VlcHJhZGl1cy1kYXRhIiB0eXBlPSJhcHBsaWNhdGlvbi9qc29uIj48L3NjcmlwdD4KICAgIDxz",
+ "Y3JpcHQ+Ly8gQ29weXJpZ2h0IChjKSAyMDI2LCB0aGUgUjggcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCihmdW5jdGlvbigpIHsKICBjb25zdCBwcm90b1NjaGVtYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZWVwcmFkaXVzLXByb3RvJykudGV4dENvbnRlbnQ7CiAgY29uc3Qgc3VtbWFyaWVzRGF0YSA9IEpTT04ucGFyc2UoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tlZXByYWRpdXMtZGF0YScpLnRleHRDb250ZW50KTsKICBjb25zdCB0YWJsZUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS10YWJsZS1ib2R5Jyk7CiAgY29uc3QgaGVhZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoW2RhdGEtc29ydF0nKTsKCiAgY29uc3Qgcm9vdCA9IHByb3RvYnVmLnBhcnNlKHByb3RvU2NoZW1hKS5yb290OwogIGNvbnN0IEtlZXBSYWRpdXNTdW1tYXJ5ID0gcm9vdC5sb29rdXBUeXBlKCJjb20uYW5kcm9pZC50b29scy5yOC5rZWVwcmFkaXVzLnByb3RvLktlZXBSYWRpdXNTdW1tYXJ5Iik7CgogIGxldCBzdW1tYXJpZXMgPSBbXTsKICBsZXQgY3VycmVudFNvcnQgPSB7CiAgICBrZXk6IG51bGwsCiAg",
+ "ICBkZXNjOiB0cnVlCiAgfTsKCiAgc3VtbWFyaWVzRGF0YS5mb3JFYWNoKHN1bW1hcnlCYXNlNjQgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgYmluYXJ5ID0gYXRvYihzdW1tYXJ5QmFzZTY0KTsKICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpOwogICAgICB9CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBLZWVwUmFkaXVzU3VtbWFyeS5kZWNvZGUoYnl0ZXMpOwogICAgICBjb25zdCBzdW1tYXJ5ID0gS2VlcFJhZGl1c1N1bW1hcnkudG9PYmplY3QobWVzc2FnZSwgewogICAgICAgIGRlZmF1bHRzOiB0cnVlLAogICAgICAgIGVudW1zOiBTdHJpbmcKICAgICAgfSk7CiAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZGVjb2RlIHN1bW1hcnk6IiwgZSk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIHJlbmRlclRhYmxlKCkgewogICAgdGFibGVCb2R5LmlubmVySFRNTCA9ICcnOwogICAgc3VtbWFyaWVzLmZvckVhY2gocmVuZGVyUm93KTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlclJvdyhzdW1tYXJ5KSB7CiAgICAvLyBOYW1lIHJvdyAoRnVsbCB3aWR0aCkKICAgIGNvbnN0IG5hbWVUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Ry",
+ "Jyk7CiAgICBuYW1lVHIuY2xhc3NOYW1lID0gJ25hbWUtcm93JzsKICAgIGNvbnN0IG5hbWVUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICBuYW1lVGQuY29sU3BhbiA9IDY7CiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgbGluay5jbGFzc05hbWUgPSAncmVwb3J0LWxpbmsnOwogICAgbGluay5ocmVmID0gc3VtbWFyeS5saW5rIHx8IHN1bW1hcnkubmFtZS5yZXBsYWNlKCcucGInLCAnLmh0bWwnKTsKICAgIGxpbmsudGV4dENvbnRlbnQgPSBzdW1tYXJ5Lm5hbWU7CiAgICBuYW1lVGQuYXBwZW5kQ2hpbGQobGluayk7CiAgICBuYW1lVHIuYXBwZW5kQ2hpbGQobmFtZVRkKTsKICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChuYW1lVHIpOwoKICAgIC8vIERhdGEgcm93CiAgICBjb25zdCBkYXRhVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogICAgZGF0YVRyLmNsYXNzTmFtZSA9ICdkYXRhLXJvdyc7CgogICAgY29uc3QgcnVsZXNUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICBydWxlc1RkLnRleHRDb250ZW50ID0gc3VtbWFyeS5rZWVwUnVsZUNvdW50IHx8ICIwIjsKICAgIGlmIChzdW1tYXJ5LmtlZXBSdWxlUGFja2FnZVdpZGVDb3VudCAmJiBzdW1tYXJ5LmtlZXBSdWxlUGFja2FnZVdpZGVDb3VudCAhPT0gMCkgewogICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICBz",
+ "cGFuLmNsYXNzTmFtZSA9ICdzdGF0LWJhZGdlIHdhcm4nOwogICAgICBzcGFuLnRleHRDb250ZW50ID0gYCR7c3VtbWFyeS5rZWVwUnVsZVBhY2thZ2VXaWRlQ291bnR9IHBhY2thZ2Utd2lkZWA7CiAgICAgIHNwYW4udGl0bGUgPSAiTnVtYmVyIG9mIGtlZXAgcnVsZXMgdGhhdCBrZWVwIGFuIGVudGlyZSBwYWNrYWdlIjsKICAgICAgcnVsZXNUZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKICAgICAgcnVsZXNUZC5hcHBlbmRDaGlsZChzcGFuKTsKICAgIH0KICAgIGRhdGFUci5hcHBlbmRDaGlsZChydWxlc1RkKTsKCiAgICBjb25zdCBpdGVtc1RkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIGNvbnN0IHRvdGFsS2VwdCA9IChzdW1tYXJ5LmtlcHRDbGFzc2VzPy5pdGVtQ291bnQgfHwgMCkgKwogICAgICAoc3VtbWFyeS5rZXB0TWV0aG9kcz8uaXRlbUNvdW50IHx8IDApICsKICAgICAgKHN1bW1hcnkua2VwdEZpZWxkcz8uaXRlbUNvdW50IHx8IDApOwogICAgY29uc3QgdG90YWxJdGVtcyA9IChzdW1tYXJ5LmNsYXNzQ291bnQgfHwgMCkgKyAoc3VtbWFyeS5tZXRob2RDb3VudCB8fCAwKSArIChzdW1tYXJ5LmZpZWxkQ291bnQgfHwgMCk7CiAgICBpdGVtc1RkLnRleHRDb250ZW50ID0gYCR7dG90YWxLZXB0fSAvICR7dG90YWxJdGVtc31gOwogICAgZGF0YVRyLmFwcGVuZENoaWxkKGl0ZW1zVGQpOwoKICAgIGNvbnN0IGNsYXNzZXNUZCA9IGRvY3VtZW50LmNyZWF0",
+ "ZUVsZW1lbnQoJ3RkJyk7CiAgICBjbGFzc2VzVGQuaW5uZXJIVE1MID0gZm9ybWF0S2VlcEluZm8oc3VtbWFyeS5rZXB0Q2xhc3Nlcywgc3VtbWFyeS5jbGFzc0NvdW50KTsKICAgIGRhdGFUci5hcHBlbmRDaGlsZChjbGFzc2VzVGQpOwoKICAgIGNvbnN0IG1ldGhvZHNUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICBtZXRob2RzVGQuaW5uZXJIVE1MID0gZm9ybWF0S2VlcEluZm8oc3VtbWFyeS5rZXB0TWV0aG9kcywgc3VtbWFyeS5tZXRob2RDb3VudCk7CiAgICBkYXRhVHIuYXBwZW5kQ2hpbGQobWV0aG9kc1RkKTsKCiAgICBjb25zdCBmaWVsZHNUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICBmaWVsZHNUZC5pbm5lckhUTUwgPSBmb3JtYXRLZWVwSW5mbyhzdW1tYXJ5LmtlcHRGaWVsZHMsIHN1bW1hcnkuZmllbGRDb3VudCk7CiAgICBkYXRhVHIuYXBwZW5kQ2hpbGQoZmllbGRzVGQpOwoKICAgIGNvbnN0IHByb2JsZW1hdGljVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgaWYgKHN1bW1hcnkua2VlcFJ1bGVLZWVwUmFkaXVzICYmIHN1bW1hcnkua2VlcFJ1bGVLZWVwUmFkaXVzLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpOwogICAgICB1bC5zdHlsZS5tYXJnaW4gPSAnMCc7CiAgICAgIHVsLnN0eWxlLnBhZGRpbmdMZWZ0ID0gJzAnOwogICAgICB1bC5zdHlsZS5saXN0U3R5bGVUeXBlID0g",
+ "J25vbmUnOwogICAgICB1bC5zdHlsZS5mb250U2l6ZSA9ICcwLjlyZW0nOwogICAgICBzdW1tYXJ5LmtlZXBSdWxlS2VlcFJhZGl1cy5mb3JFYWNoKHJ1bGUgPT4gewogICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAgICBsaS5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnNHB4JzsKCiAgICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgYmFkZ2UuY2xhc3NOYW1lID0gJ3N0YXQtYmFkZ2Ugd2Fybic7CiAgICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBydWxlLml0ZW1Db3VudDsKICAgICAgICBiYWRnZS50aXRsZSA9ICJOdW1iZXIgb2YgaXRlbXMga2VwdCBieSB0aGUgcnVsZS4iOwogICAgICAgIGJhZGdlLnN0eWxlLm1hcmdpblJpZ2h0ID0gJzhweCc7CgogICAgICAgIGxpLmFwcGVuZENoaWxkKGJhZGdlKTsKICAgICAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGNvZGUuc3R5bGUuZm9udEZhbWlseSA9ICdtb25vc3BhY2UnOwogICAgICAgIGNvZGUuc3R5bGUuZm9udFNpemUgPSAnMC44NXJlbSc7CiAgICAgICAgY29kZS50ZXh0Q29udGVudCA9IHJ1bGUuc291cmNlOwogICAgICAgIGxpLmFwcGVuZENoaWxkKGNvZGUpOwogICAgICAgIHVsLmFwcGVuZENoaWxkKGxpKTsKICAgICAgfSk7CiAgICAgIHByb2JsZW1hdGljVGQuYXBwZW5kQ2hpbGQodWwpOwogICAgfSBl",
+ "bHNlIHsKICAgICAgcHJvYmxlbWF0aWNUZC50ZXh0Q29udGVudCA9ICItIjsKICAgIH0KICAgIGRhdGFUci5hcHBlbmRDaGlsZChwcm9ibGVtYXRpY1RkKTsKCiAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQoZGF0YVRyKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEtlZXBJbmZvKGtlZXBJbmZvLCB0b3RhbCkgewogICAgaWYgKCFrZWVwSW5mbykgcmV0dXJuICIwIC8gIiArICh0b3RhbCB8fCAwKTsKICAgIGNvbnN0IGtlcHQgPSBrZWVwSW5mby5pdGVtQ291bnQgfHwgMDsKICAgIGxldCBiYWRnZXMgPSAiIjsKICAgIGlmIChrZWVwSW5mby5ub09iZnVzY2F0aW9uQ291bnQgPiAwKSB7CiAgICAgIGJhZGdlcyArPSBgPHNwYW4gY2xhc3M9InN0YXQtYmFkZ2UiIHRpdGxlPSJObyBvYmZ1c2NhdGlvbiI+JHtrZWVwSW5mby5ub09iZnVzY2F0aW9uQ291bnQgfHwgMH0gT0JGPC9zcGFuPmA7CiAgICB9CiAgICBpZiAoa2VlcEluZm8ubm9PcHRpbWl6YXRpb25Db3VudCA+IDApIHsKICAgICAgYmFkZ2VzICs9IGA8c3BhbiBjbGFzcz0ic3RhdC1iYWRnZSB3YXJuIiB0aXRsZT0iTm8gb3B0aW1pemF0aW9uIj4ke2tlZXBJbmZvLm5vT3B0aW1pemF0aW9uQ291bnQgfHwgMH0gT1BUPC9zcGFuPmA7CiAgICB9CiAgICBpZiAoa2VlcEluZm8ubm9TaHJpbmtpbmdDb3VudCA+IDApIHsKICAgICAgYmFkZ2VzICs9IGA8c3BhbiBjbGFzcz0ic3RhdC1iYWRnZSBlcnJvciIgdGl0bGU9Ik5vIHNocmlua2luZyI+JHtrZWVwSW5mby5ub1Nocmlu",
+ "a2luZ0NvdW50IHx8IDB9IFNIUjwvc3Bhbj5gOwogICAgfQogICAgcmV0dXJuIGAke2tlcHR9IC8gJHt0b3RhbCB8fCAwfTxicj4ke2JhZGdlc31gOwogIH0KCiAgZnVuY3Rpb24gc29ydFN1bW1hcmllcyhrZXkpIHsKICAgIGlmIChjdXJyZW50U29ydC5rZXkgPT09IGtleSkgewogICAgICBjdXJyZW50U29ydC5kZXNjID0gIWN1cnJlbnRTb3J0LmRlc2M7CiAgICB9IGVsc2UgewogICAgICBjdXJyZW50U29ydC5rZXkgPSBrZXk7CiAgICAgIGN1cnJlbnRTb3J0LmRlc2MgPSB0cnVlOwogICAgfQoKICAgIHN1bW1hcmllcy5zb3J0KChhLCBiKSA9PiB7CiAgICAgIGxldCB2YWxBLCB2YWxCOwogICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgIGNhc2UgJ3J1bGVzJzoKICAgICAgICAgIHZhbEEgPSBhLmtlZXBSdWxlQ291bnQgfHwgMDsKICAgICAgICAgIHZhbEIgPSBiLmtlZXBSdWxlQ291bnQgfHwgMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2l0ZW1zJzoKICAgICAgICAgIHZhbEEgPSAoYS5rZXB0Q2xhc3Nlcz8uaXRlbUNvdW50IHx8IDApICsgKGEua2VwdE1ldGhvZHM/Lml0ZW1Db3VudCB8fCAwKSArIChhLmtlcHRGaWVsZHM/Lml0ZW1Db3VudCB8fCAwKTsKICAgICAgICAgIHZhbEIgPSAoYi5rZXB0Q2xhc3Nlcz8uaXRlbUNvdW50IHx8IDApICsgKGIua2VwdE1ldGhvZHM/Lml0ZW1Db3VudCB8fCAwKSArIChiLmtlcHRGaWVsZHM/Lml0ZW1Db3VudCB8fCAwKTsKICAgICAgICAgIGJyZWFrOwogICAg",
+ "ICAgIGNhc2UgJ2NsYXNzZXMnOgogICAgICAgICAgdmFsQSA9IChhLmtlcHRDbGFzc2VzICYmIGEua2VwdENsYXNzZXMuaXRlbUNvdW50KSB8fCAwOwogICAgICAgICAgdmFsQiA9IChiLmtlcHRDbGFzc2VzICYmIGIua2VwdENsYXNzZXMuaXRlbUNvdW50KSB8fCAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbWV0aG9kcyc6CiAgICAgICAgICB2YWxBID0gKGEua2VwdE1ldGhvZHMgJiYgYS5rZXB0TWV0aG9kcy5pdGVtQ291bnQpIHx8IDA7CiAgICAgICAgICB2YWxCID0gKGIua2VwdE1ldGhvZHMgJiYgYi5rZXB0TWV0aG9kcy5pdGVtQ291bnQpIHx8IDA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdmaWVsZHMnOgogICAgICAgICAgdmFsQSA9IChhLmtlcHRGaWVsZHMgJiYgYS5rZXB0RmllbGRzLml0ZW1Db3VudCkgfHwgMDsKICAgICAgICAgIHZhbEIgPSAoYi5rZXB0RmllbGRzICYmIGIua2VwdEZpZWxkcy5pdGVtQ291bnQpIHx8IDA7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgcmV0dXJuIGN1cnJlbnRTb3J0LmRlc2MgPyB2YWxCIC0gdmFsQSA6IHZhbEEgLSB2YWxCOwogICAgfSk7CgogICAgcmVuZGVyVGFibGUoKTsKICAgIHVwZGF0ZUhlYWRlclN0eWxlcygpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSGVhZGVyU3R5bGVzKCkgewogICAgaGVhZGVycy5mb3JFYWNoKHRoID0+IHsKICAgICAgY29uc3Qga2V5",
+ "ID0gdGguZ2V0QXR0cmlidXRlKCdkYXRhLXNvcnQnKTsKICAgICAgdGguaW5uZXJIVE1MID0gdGgudGV4dENvbnRlbnQucmVwbGFjZSgvIFvilrLilrxdLywgJycpOwogICAgICBpZiAoa2V5ID09PSBjdXJyZW50U29ydC5rZXkpIHsKICAgICAgICB0aC5pbm5lckhUTUwgKz0gY3VycmVudFNvcnQuZGVzYyA/ICcg4pa8JyA6ICcg4payJzsKICAgICAgfQogICAgfSk7CiAgfQoKICBoZWFkZXJzLmZvckVhY2godGggPT4gewogICAgdGguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgIHNvcnRTdW1tYXJpZXModGguZ2V0QXR0cmlidXRlKCdkYXRhLXNvcnQnKSk7CiAgICB9KTsKICB9KTsKCiAgc29ydFN1bW1hcmllcygnaXRlbXMnKTsKfSkoKTs8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg=="));
}
private static String decodeBase64(String string) {
diff --git a/src/keepradius/proto/keepradiussummary.proto b/src/keepradius/proto/keepradiussummary.proto
index bb7f3d0..81b54fd 100644
--- a/src/keepradius/proto/keepradiussummary.proto
+++ b/src/keepradius/proto/keepradiussummary.proto
@@ -21,10 +21,10 @@
// Link to the full report.
string link = 2;
- // Info about number of items.
- int32 class_count = 3;
- int32 field_count = 4;
- int32 method_count = 5;
+ // Info about number of live items.
+ int32 live_class_count = 3;
+ int32 live_field_count = 4;
+ int32 live_method_count = 5;
// Info about number of keep rules.
int32 keep_rule_count = 6;
@@ -37,6 +37,9 @@
// Info about problematic rules.
repeated KeepRuleKeepRadiusSummary keep_rule_keep_radius = 11;
+
+ // Info about problematic global rules.
+ repeated GlobalKeepRuleKeepRadiusSummary global_keep_rule_keep_radius = 12;
}
message KeepInfoCollectionSummary {
@@ -50,3 +53,7 @@
string source = 1;
int32 item_count = 2;
}
+
+message GlobalKeepRuleKeepRadiusSummary {
+ string source = 1;
+}
\ No newline at end of file