ZGlmZiAtLWdpdCBhL0NoYW5nZXMubWQgYi9DaGFuZ2VzLm1kCmluZGV4IGZjMTVlNjAuLjlmMjQ0OWMgMTAwNjQ0Ci0tLSBhL0NoYW5nZXMubWQKKysrIGIvQ2hhbmdlcy5tZApAQCAtNDMsMTQgKzQzLDkgQEAKIFRoZSBwYXRoIHNldCB3aGVuIHJ1bm5pbmcgYnVpbGRzIG5vdyBtYWtlcyB0aGUgYHB5dGhvbmAgZXhlY3V0YWJsZSBwb2ludCB0byBweXRob24gMywKIHdoZXJlYXMgb24gcHJldmlvdXMgdmVyc2lvbnMgaXQgcG9pbnRlZCB0byBweXRob24gMi4gSWYgeW91IHN0aWxsIGhhdmUgcHl0aG9uIDIgc2NyaXB0cywKIHlvdSBjYW4gY2hhbmdlIHRoZSBzaGViYW5nIGxpbmUgdG8gdXNlIGBweXRob24yYCBleHBsaWNpdGx5LiBUaGlzIG9ubHkgYXBwbGllcyBmb3IKLXNjcmlwdHMgcnVuIGRpcmVjdGx5IGZyb20gbWFrZWZpbGVzLCBvciBmcm9tIHNvb25nIGdlbnJ1bGVzLiBUaGlzIGJlaGF2aW9yIGNhbiBiZQotdGVtcG9yYXJpbHkgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHRoZSBgQlVJTERfQlJPS0VOX1BZVEhPTl9JU19QWVRIT04yYCBlbnZpcm9ubWVudAotdmFyaWFibGUgdG8gYHRydWVgLiBJdCdzIG9ubHkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIG5vdCBhIHByb2R1Y3QgY29uZmlnIHZhcmlhYmxlCi1iZWNhdXNlIHByb2R1Y3QgY29uZmlnIHNvbWV0aW1lcyBjYWxscyBweXRob24gY29kZS4KK3NjcmlwdHMgcnVuIGRpcmVjdGx5IGZyb20gbWFrZWZpbGVzLCBvciBmcm9tIHNvb25nIGdlbnJ1bGVzLgogCi1JbiBhZGRpdGlvbiwgYHB5dGhvbl8qYCBzb29uZyBtb2R1bGVzIG5vIGxvbmdlciBhbGxvdyBweXRob24gMi4gVGhpcyBjYW4gYmUgdGVtcG9yYXJpbHkKLW92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUgYEJVSUxEX0JST0tFTl9VU0VTX1NPT05HX1BZVEhPTjJfTU9EVUxFU2AgcHJvZHVjdCBjb25maWd1cmF0aW9uCi12YXJpYWJsZSB0byBgdHJ1ZWAuCitJbiBhZGRpdGlvbiwgYHB5dGhvbl8qYCBzb29uZyBtb2R1bGVzIG5vIGxvbmdlciBhbGxvdyBweXRob24gMi4KIAogUHl0aG9uIDIgaXMgc2xhdGVkIGZvciBjb21wbGV0ZSByZW1vdmFsIGluIFYuCiAKZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvQW5kcm9pZC5icCBiL2JhY2twb3J0ZWRfZml4ZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQzIEBACisvLyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9yZWxpYWJpbGl0eSIsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJhcHBsaWVkX2JhY2twb3J0ZWRfZml4ZXMiLAorICAgIHRvb2xzOiBbImFwcGxpZWRfYmFja3BvcnRlZF9maXhlc19wcm9wZXJ0eV93cml0ZXIiXSwKKyAgICBzcmNzOiBbIjphcHBsaWVkX2JhY2twb3J0ZWRfZml4X2JpbnBicyJdLAorICAgIG91dDogWyJhcHBsaWVkX2JhY2twb3J0ZWRfZml4ZXMucHJvcCJdLAorICAgIGNtZDogIiQobG9jYXRpb24gYXBwbGllZF9iYWNrcG9ydGVkX2ZpeGVzX3Byb3BlcnR5X3dyaXRlcikiICsKKyAgICAgICAgIiAtcCAkKGxvY2F0aW9uIGFwcGxpZWRfYmFja3BvcnRlZF9maXhlcy5wcm9wKSIgKworICAgICAgICAiICQoaW4pIiwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19wcm90b19maWxlIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzLnByb3RvIiwKKyAgICBdLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvIiwKKyAgICBzcmNzOiBbImJhY2twb3J0ZWRfZml4ZXMucHJvdG8iXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19jb21tb24iLAorICAgIHNyY3M6IFsic3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL2NvbW1vbi8qLmphdmEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYmFja3BvcnRlZF9maXhlc19wcm90byIsCisgICAgICAgICJndWF2YSIsCisgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KKworamF2YV90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX2NvbW1vbl90ZXN0IiwKKyAgICBzcmNzOiBbInRlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL2NvbW1vbi8qLmphdmEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYmFja3BvcnRlZF9maXhlc19jb21tb24iLAorICAgICAgICAiYmFja3BvcnRlZF9maXhlc19wcm90byIsCisgICAgICAgICJqdW5pdCIsCisgICAgICAgICJ0cnV0aCIsCisgICAgICAgICJ0cnV0aC1saXRlcHJvdG8tZXh0ZW5zaW9uIiwKKyAgICAgICAgInRydXRoLXByb3RvLWV4dGVuc2lvbiIsCisgICAgXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAorICAgIH0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX21haW5fbGliIiwKKyAgICBzcmNzOiBbInNyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy8qLmphdmEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYmFja3BvcnRlZF9maXhlc19jb21tb24iLAorICAgICAgICAiYmFja3BvcnRlZF9maXhlc19wcm90byIsCisgICAgICAgICJqY29tbWFuZGVyIiwKKyAgICAgICAgImd1YXZhIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQorCitqYXZhX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiYXBwbGllZF9iYWNrcG9ydGVkX2ZpeGVzX3Byb3BlcnR5X3dyaXRlciIsCisgICAgbWFpbl9jbGFzczogImNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYmFja3BvcnRlZF9maXhlc19tYWluX2xpYiIsCisgICAgXSwKK30KKworamF2YV9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImJhY2twb3J0ZWRfZml4ZXNfY29tYmluZXIiLAorICAgIG1haW5fY2xhc3M6ICJjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuQ29tYmluZUJhY2twb3J0ZWRGaXhlcyIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfbWFpbl9saWIiLAorICAgIF0sCit9CisKKy8vIENvbWJpbmVzIEJhY2twb3J0ZWRGaXggYmluYXJ5IHByb3RvIGZpbGVzIGludG8gYSBzaW5nbGUgQmFja3BvcnRlZEZpeGVzIGJpbmFyeSBwcm90byBmaWxlLgorZ2VucnVsZV9kZWZhdWx0cyB7CisgICAgbmFtZTogImRlZmF1bHRfYmFja3BvcnRlZF9maXhlc19jb21iaW5lciIsCisgICAgdG9vbHM6IFsiYmFja3BvcnRlZF9maXhlc19jb21iaW5lciJdLAorICAgIGNtZDogIiQobG9jYXRpb24gYmFja3BvcnRlZF9maXhlc19jb21iaW5lcikiICsKKyAgICAgICAgIiAtbyAkKG91dCkiICsKKyAgICAgICAgIiAkKGluKSIsCit9CisKK2phdmFfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19tYWluX2xpYl90ZXN0IiwKKyAgICBzcmNzOiBbInRlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzLyouamF2YSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX21haW5fbGliIiwKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfcHJvdG8iLAorICAgICAgICAianVuaXQiLAorICAgICAgICAidHJ1dGgiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworLy8gQ29udmVydHMgQmFja3Byb3RlZEZpeCB0ZXh0IHByb3RvcyB0byBiaW5hcnkgcHJvdG9zCitnZW5ydWxlX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiZGVmYXVsdF9iYWNrcG9ydGVkX2ZpeF9iaW5wYnMiLAorICAgIHRvb2xzOiBbImFwcm90b2MiXSwKKyAgICB0b29sX2ZpbGVzOiBbCisgICAgICAgICI6YmFja3BvcnRlZF9maXhlc19wcm90b19maWxlIiwKKyAgICBdLAorICAgIGNtZDogIiQobG9jYXRpb24gYXByb3RvYykgICIgKworICAgICAgICAiIC0tZW5jb2RlPWNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4IiArCisgICAgICAgICIgICQobG9jYXRpb24gOmJhY2twb3J0ZWRfZml4ZXNfcHJvdG9fZmlsZSkiICsKKyAgICAgICAgIiA8ICQoaW4pIiArCisgICAgICAgICIgPiAkKG91dCk7IGVjaG8gJChvdXQpIiwKK30KKworZ2Vuc3JjcyB7CisgICAgbmFtZTogImFwcGxpZWRfYmFja3BvcnRlZF9maXhfYmlucGJzIiwKKyAgICBkZWZhdWx0czogWyJkZWZhdWx0X2JhY2twb3J0ZWRfZml4X2JpbnBicyJdLAorICAgIG91dHB1dF9leHRlbnNpb246ICJiaW5wYiIsCisgICAgc3JjczogWworICAgICAgICAiYXBwbGllZF9maXhlcy8qLnR4dHBiIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy9PV05FUlMgYi9iYWNrcG9ydGVkX2ZpeGVzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3NmJmCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9PV05FUlMKQEAgLTAsMCArMSwzIEBACitlc3NpY2tAZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCitwb3J0bWFubmNAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy9hcHBsaWVkX2ZpeGVzL2tpMzUwMDM3MDIzLnR4dHBiIGIvYmFja3BvcnRlZF9maXhlcy9hcHBsaWVkX2ZpeGVzL2tpMzUwMDM3MDIzLnR4dHBiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmE3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL2FwcGxpZWRfZml4ZXMva2kzNTAwMzcwMjMudHh0cGIKQEAgLTAsMCArMSwxOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBwcm90by1maWxlOiAuLi9iYWNrcG9ydGVkX2ZpeGVzLnByb3RvCisjIHByb3RvLW1lc3NhZ2U6IEJhY2twb3J0ZWRGaXgKKwora25vd25faXNzdWU6IDM1MDAzNzAyMworYWxpYXM6IDEKZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvYmFja3BvcnRlZF9maXhlcy5wcm90byBiL2JhY2twb3J0ZWRfZml4ZXMvYmFja3BvcnRlZF9maXhlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTYxOGVlCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9iYWNrcG9ydGVkX2ZpeGVzLnByb3RvCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlczsKKworb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOworCisvLyBBIGxpc3Qgb2YgYmFja3BvcnRlZCBmaXhlcy4KK21lc3NhZ2UgQmFja3BvcnRlZEZpeGVzIHsKKyAgcmVwZWF0ZWQgQmFja3BvcnRlZEZpeCBmaXhlcyA9IDE7Cit9CisKKy8vIEEga25vd24gaXNzdWUgYXBwcm92ZWQgZm9yIHJlcG9ydGluZyBCdWlsZC5nZXRCYWNrcG9ydGVkRml4U3RhdHVzCittZXNzYWdlIEJhY2twb3J0ZWRGaXggeworCisgIC8vIFRoZSBpc3N1ZSBpZCBmcm9tIHRoZSBwdWJsaWMgYnVnIHRyYWNrZXIKKyAgLy8gaHR0cHM6Ly9pc3N1ZXRyYWNrZXIuZ29vZ2xlLmNvbS9pc3N1ZXMve2tub3duX2lzc3VlfQorICBvcHRpb25hbCBpbnQ2NCBrbm93bl9pc3N1ZSA9IDE7CisgIC8vIFRoZSBhbGlhcyBmb3IgdGhlIGtub3duIGlzc3VlLgorICAvLyAxIC0gMTAyMyBhcmUgdmFsaWQgYWxpYXNlcworICAvLyBNdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIGJhY2twb3J0ZWQgZml4ZXMuCisgIG9wdGlvbmFsIGludDMyIGFsaWFzID0gMjsKK30KKwpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlcy5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTJjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Db21iaW5lQmFja3BvcnRlZEZpeGVzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzOworCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLmNvbW1vbi5QYXJzZXI7CisKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5KQ29tbWFuZGVyOworaW1wb3J0IGNvbS5iZXVzdC5qY29tbWFuZGVyLlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5jb252ZXJ0ZXJzLkZpbGVDb252ZXJ0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqIENyZWF0ZXMgYSBCYWNrcG9ydGVkRml4ZXMgYmluYXJ5IHByb3RvIGZpbGUgZnJvbSBhIGxpc3Qgb2YgQmFja3BvcnRlZEZpeCBwcm90byBiaW5hcnkgZmlsZXMuICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tYmluZUJhY2twb3J0ZWRGaXhlcyB7CisKKyAgICBAUGFyYW1ldGVyKGRlc2NyaXB0aW9uID0gIkJhY2twb3J0ZWRGaXggcHJvdG8gYmluYXJ5IGZpbGVzIiwKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IEZpbGVDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCisgICAgTGlzdDxGaWxlPiBmaXhGaWxlczsKKyAgICBAUGFyYW1ldGVyKGRlc2NyaXB0aW9uID0gIldyaXRlIHRoZSBCYWNrcG9ydGVkRml4ZXMgcHJvdG8gYmluYXJ5IHRvIHRoaXMgZmlsZSIsCisgICAgICAgICAgICBuYW1lcyA9IHsiLS1vdXQiLCItbyJ9LAorICAgICAgICAgICAgY29udmVydGVyID0gRmlsZUNvbnZlcnRlci5jbGFzcywKKyAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBGaWxlIG91dEZpbGU7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcuLi4gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbWJpbmVCYWNrcG9ydGVkRml4ZXMgbWFpbiA9IG5ldyBDb21iaW5lQmFja3BvcnRlZEZpeGVzKCk7CisgICAgICAgIEpDb21tYW5kZXIubmV3QnVpbGRlcigpLmFkZE9iamVjdChtYWluKS5idWlsZCgpLnBhcnNlKGFyZ3YpOworICAgICAgICBtYWluLnJ1bigpOworICAgIH0KKworICAgIENvbWJpbmVCYWNrcG9ydGVkRml4ZXMoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKHZhciBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSkgeworICAgICAgICAgICAgdmFyIGZpeGVzID0gUGFyc2VyLnBhcnNlQmFja3BvcnRlZEZpeEZpbGVzKGZpeEZpbGVzKTsKKyAgICAgICAgICAgIHdyaXRlQmFja3BvcnRlZEZpeGVzKGZpeGVzLCBvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgd3JpdGVCYWNrcG9ydGVkRml4ZXMoQmFja3BvcnRlZEZpeGVzIGZpeGVzLCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZml4ZXMud3JpdGVUbyhvdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZiNGFjCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuY29tbW9uLlBhcnNlcjsKKworaW1wb3J0IGNvbS5iZXVzdC5qY29tbWFuZGVyLkpDb21tYW5kZXI7CitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5iZXVzdC5qY29tbWFuZGVyLmNvbnZlcnRlcnMuRmlsZUNvbnZlcnRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisKKy8qKgorICogQ3JlYXRlcyBiYWNrcG9ydGVkIGZpeCBwcm9wZXJ0aWVzIGZpbGUuCisgKgorICogPHA+V3JpdGVzIEJpdFNldCBvZiBiYWNrcG9ydGVkIGZpeCBhbGlhc2VzIGZyb20gYSBsaXN0IG9mIEJhY2twb3J0ZWRGaXggcHJvdG8gYmluYXJ5IGZpbGVzIGFuZAorICogd3JpdGVzIHRoZSBwcm9wZXJ0eSB7QHZhbHVlIFBST1BFUlRZX05BTUV9IHRvIGEgZmlsZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicm8uYnVpbGQuYmFja3BvcnRlZF9maXhlcy5hbGlhc19iaXRzZXQubG9uZ19saXN0IjsKKyAgICBAUGFyYW1ldGVyKGRlc2NyaXB0aW9uID0gIkJhY2twb3J0ZWRGaXggcHJvdG8gYmluYXJ5IGZpbGVzIiwKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IEZpbGVDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCisgICAgTGlzdDxGaWxlPiBmaXhGaWxlczsKKyAgICBAUGFyYW1ldGVyKGRlc2NyaXB0aW9uID0gIlRoZSBmaWxlIHRvIHdyaXRlIHRoZSBwcm9wZXJ0eSB2YWx1ZSB0by4iLAorICAgICAgICAgICAgbmFtZXMgPSB7Ii0tcHJvcGVydHlfZmlsZSIsICItcCJ9LAorICAgICAgICAgICAgY29udmVydGVyID0gRmlsZUNvbnZlcnRlci5jbGFzcywKKyAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBGaWxlIHByb3BlcnR5RmlsZTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZSBtYWluID0gbmV3IFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUoKTsKKyAgICAgICAgSkNvbW1hbmRlci5uZXdCdWlsZGVyKCkuYWRkT2JqZWN0KG1haW4pLmJ1aWxkKCkucGFyc2UoYXJndik7CisgICAgICAgIG1haW4ucnVuKCk7CisgICAgfQorCisgICAgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZSgpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAodmFyIG91dCA9IEZpbGVzLm5ld1dyaXRlcihwcm9wZXJ0eUZpbGUsIFVURl84KSkgeworICAgICAgICAgICAgdmFyIGZpeGVzID0gUGFyc2VyLnBhcnNlQmFja3BvcnRlZEZpeEZpbGVzKGZpeEZpbGVzKTsKKyAgICAgICAgICAgIHdyaXRlRml4ZXNBc0FsaWFzQml0U2V0KGZpeGVzLCBvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgd3JpdGVGaXhlc0FzQWxpYXNCaXRTZXQoQmFja3BvcnRlZEZpeGVzIGZpeGVzLCBXcml0ZXIgb3V0KSB7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dCk7CisgICAgICAgIHByaW50V3JpdGVyLnByaW50bG4oIiMgVGhlIGZvbGxvd2luZyBiYWNrcG9ydGVkIGZpeGVzIGhhdmUgYmVlbiBhcHBsaWVkIik7CisgICAgICAgIGZvciAodmFyIGYgOiBmaXhlcy5nZXRGaXhlc0xpc3QoKSkgeworICAgICAgICAgICAgcHJpbnRXcml0ZXIucHJpbnRmKCIjIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLyVkIHdpdGggYWxpYXMgJWQiLAorICAgICAgICAgICAgICAgICAgICBmLmdldEtub3duSXNzdWUoKSwgZi5nZXRBbGlhcygpKTsKKyAgICAgICAgICAgIHByaW50V3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgYnNBcnJheSA9IFBhcnNlci5nZXRCaXRTZXRBcnJheSgKKyAgICAgICAgICAgICAgICBmaXhlcy5nZXRGaXhlc0xpc3QoKS5zdHJlYW0oKS5tYXBUb0ludChCYWNrcG9ydGVkRml4OjpnZXRBbGlhcykudG9BcnJheSgpKTsKKyAgICAgICAgU3RyaW5nIGJzU3RyaW5nID0gQXJyYXlzLnN0cmVhbShic0FycmF5KS5tYXBUb09iaihMb25nOjp0b1N0cmluZykuY29sbGVjdCgKKyAgICAgICAgICAgICAgICBDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSk7CisgICAgICAgIHByaW50V3JpdGVyLnByaW50ZigiJXM9JXMiLCBQUk9QRVJUWV9OQU1FLCBic1N0cmluZyk7CisgICAgICAgIHByaW50V3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgaWYgKHByaW50V3JpdGVyLmNoZWNrRXJyb3IoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvICIgKyBvdXQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyLmphdmEgYi9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4MGZkYwotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL2NvbW1vbi9QYXJzZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5jb21tb247CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4ZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworCisvKiogU3RhdGljIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIHtAbGluayBCYWNrcG9ydGVkRml4ZXN9LiAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcnNlciB7CisKKyAgICAvKiogQ3JlYXRlcyBsaXN0IG9mIEZpbGVJbnB1dFN0cmVhbXMgZm9yIGEgbGlzdCBvZiBmaWxlcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEltbXV0YWJsZUxpc3Q8RmlsZUlucHV0U3RyZWFtPiBnZXRGaWxlSW5wdXRTdHJlYW1zKExpc3Q8RmlsZT4gZml4RmlsZXMpIHRocm93cworICAgICAgICAgICAgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdmFyIHN0cmVhbXMgPSBJbW11dGFibGVMaXN0LjxGaWxlSW5wdXRTdHJlYW0+YnVpbGRlcigpOworICAgICAgICBmb3IgKHZhciBmIDogZml4RmlsZXMpIHsKKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJlYW1zLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqIENvbnZlcnRzIGEgbGlzdCBvZiBiYWNrcG9ydGVkIGZpeCBhbGlhc2VzIGludG8gYSBsb25nIGFycmF5IHJlcHJlc2VudGluZyBhIHtAbGluayBCaXRTZXR9ICovCisgICAgcHVibGljIHN0YXRpYyBsb25nW10gZ2V0Qml0U2V0QXJyYXkoaW50W10gYWxpYXNlcykgeworICAgICAgICBCaXRTZXQgYnMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIGZvciAoaW50IGEgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICBicy5zZXQoYSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJzLnRvTG9uZ0FycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBCYWNrcG9ydGVkRml4ZXN9IGZyb20gYSBsaXN0IG9mIHtAbGluayBCYWNrcG9ydGVkRml4fSBiaW5hcnkgcHJvdG8gc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJhY2twb3J0ZWRGaXhlcyBwYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhMaXN0PEZpbGU+IGZpeEZpbGVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmaXhGaWxlcy5zdHJlYW0oKS5tYXAoUGFyc2VyOjp0dW5lbEZpbGVJbnB1dFN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChQYXJzZXI6OnR1bm5lbFBhcnNlKQorICAgICAgICAgICAgICAgICAgICAuc29ydGVkKENvbXBhcmF0b3IuY29tcGFyaW5nKEJhY2twb3J0ZWRGaXg6OmdldEtub3duSXNzdWUpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChmaXhDb2xsZWN0b3IoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVHVubmVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGUucmV0aHJvdyhGaWxlTm90Rm91bmRFeGNlcHRpb24uY2xhc3MsIElPRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdG9yPEJhY2twb3J0ZWRGaXgsID8sIEJhY2twb3J0ZWRGaXhlcz4gZml4Q29sbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdG9ycy5jb2xsZWN0aW5nQW5kVGhlbihDb2xsZWN0b3JzLnRvTGlzdCgpLCBmaXhMaXN0IC0+IHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBCYWNrcG9ydGVkRml4ZXMubmV3QnVpbGRlcigpOworICAgICAgICAgICAgcmVzdWx0LmFkZEFsbEZpeGVzKGZpeExpc3QpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5idWlsZCgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlSW5wdXRTdHJlYW0gdHVuZWxGaWxlSW5wdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgVHVubmVsRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR1bm5lbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJhY2twb3J0ZWRGaXggdHVubmVsUGFyc2UoSW5wdXRTdHJlYW0gcykgdGhyb3dzIFR1bm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZml4ID0gQmFja3BvcnRlZEZpeC5wYXJzZUZyb20ocyk7CisgICAgICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gZml4OworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVHVubmVsRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHVubmVsRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIFR1bm5lbEV4Y2VwdGlvbihFeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKCJJZiB5b3Ugc2VlIHRoaXMgVHVubmVsRXhjZXB0aW9uIHNvbWV0aGluZyB3ZW50IHdyb25nLiAgSXQgc2hvdWxkIGFsd2F5cyBiZSByZXRocm93biBhcyB0aGUgY2F1c2UuIiwgY2F1c2UpOworICAgICAgICB9CisKKyAgICAgICAgPFggZXh0ZW5kcyBFeGNlcHRpb24+IFJ1bnRpbWVFeGNlcHRpb24gcmV0aHJvdyhDbGFzczxYPiBleGNlcHRpb25DbGF6eikgdGhyb3dzIFggeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGV4Y2VwdGlvbkNsYXp6KTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZkluc3RhbmNlT2YoZ2V0Q2F1c2UoKSwgZXhjZXB0aW9uQ2xhenopOworICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBnZXRDYXVzZSgpLAorICAgICAgICAgICAgICAgICAgICAicmV0aHJvdyglcykgZG9lc24ndCBtYXRjaCB1bmRlcmx5aW5nIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbkNsYXp6KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyA8WDEgZXh0ZW5kcyBFeGNlcHRpb24sIFgyIGV4dGVuZHMgRXhjZXB0aW9uPiBSdW50aW1lRXhjZXB0aW9uIHJldGhyb3coCisgICAgICAgICAgICAgICAgQ2xhc3M8WDE+IGV4Y2VwdGlvbkNsYXp6MSwgQ2xhc3M8WDI+IGV4Y2VwdGlvbkNsYXp6MikgdGhyb3dzIFgxLCBYMiB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZXhjZXB0aW9uQ2xhenoxKTsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChleGNlcHRpb25DbGF6ejIpOworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmSW5zdGFuY2VPZihnZXRDYXVzZSgpLCBleGNlcHRpb25DbGF6ejEpOworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmSW5zdGFuY2VPZihnZXRDYXVzZSgpLCBleGNlcHRpb25DbGF6ejIpOworICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBnZXRDYXVzZSgpLAorICAgICAgICAgICAgICAgICAgICAicmV0aHJvdyglcywgJXMpIGRvZXNuJ3QgbWF0Y2ggdW5kZXJseWluZyBleGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25DbGF6ejEsCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXp6Mik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0Nhc3RFeGNlcHRpb24gZXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdC4uLiBmb3JtYXRBcmdzKSB7CisgICAgICAgICAgICBDbGFzc0Nhc3RFeGNlcHRpb24gcmVzdWx0ID0gbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KG1lc3NhZ2UsIGZvcm1hdEFyZ3MpKTsKKyAgICAgICAgICAgIHJlc3VsdC5pbml0Q2F1c2UoY2F1c2UpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJzZXIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Db21iaW5lQmFja3BvcnRlZEZpeGVzVGVzdC5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Db21iaW5lQmFja3BvcnRlZEZpeGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDVmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3Rlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL0NvbWJpbmVCYWNrcG9ydGVkRml4ZXNUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGg7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIENvbWJpbmVCYWNrcG9ydGVkRml4ZXN9LiAqLworcHVibGljIGNsYXNzIENvbWJpbmVCYWNrcG9ydGVkRml4ZXNUZXN0IHsKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJhY2twb3J0ZWRGaXhlc19kZWZhdWx0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTm90IG11Y2ggb2YgYSB0ZXN0LCBidXQgdGhlcmUgaXMgbm90IG11Y2ggdG8gdGVzdC4KKyAgICAgICAgQmFja3BvcnRlZEZpeGVzIGZpeGVzID0gQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRGaXhlcyhCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKS5zZXRLbm93bklzc3VlKDEyMykuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ29tYmluZUJhY2twb3J0ZWRGaXhlcy53cml0ZUJhY2twb3J0ZWRGaXhlcyhmaXhlcywgcmVzdWx0KTsKKyAgICAgICAgVHJ1dGguYXNzZXJ0VGhhdChCYWNrcG9ydGVkRml4ZXMucGFyc2VGcm9tKHJlc3VsdC50b0J5dGVBcnJheSgpKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKGZpeGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL3Rlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGVUZXN0LmphdmEgYi9iYWNrcG9ydGVkX2ZpeGVzL3Rlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwOWMxNQotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZVRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworLyoqIFRlc3RzIGZvciB7QGxpbmsgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZX0uICovCitwdWJsaWMgY2xhc3MgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZVRlc3QgeworCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZXNBc0FsaWFzQml0U2V0X2RlZmF1bHQoKSB7CisgICAgICAgIEJhY2twb3J0ZWRGaXhlcyBmaXhlcyA9IEJhY2twb3J0ZWRGaXhlcy5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICBXcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlLndyaXRlRml4ZXNBc0FsaWFzQml0U2V0KGZpeGVzLCBuZXcgUHJpbnRXcml0ZXIocmVzdWx0KSk7CisKKyAgICAgICAgVHJ1dGguYXNzZXJ0VGhhdChyZXN1bHQudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKCIiIgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGJhY2twb3J0ZWQgZml4ZXMgaGF2ZSBiZWVuIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvLmJ1aWxkLmJhY2twb3J0ZWRfZml4ZXMuYWxpYXNfYml0c2V0LmxvbmdfbGlzdD0KKyAgICAgICAgICAgICAgICAgICAgICAgICIiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVzQXNBbGlhc0JpdFNldF9zb21lKCkgeworICAgICAgICBCYWNrcG9ydGVkRml4ZXMgZml4ZXMgPSBCYWNrcG9ydGVkRml4ZXMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZEZpeGVzKEJhY2twb3J0ZWRGaXgubmV3QnVpbGRlcigpLnNldEtub3duSXNzdWUoMTIzNEwpLnNldEFsaWFzKDEpKQorICAgICAgICAgICAgICAgIC5hZGRGaXhlcyhCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKS5zZXRLbm93bklzc3VlKDNMKS5zZXRBbGlhcyg2NSkpCisgICAgICAgICAgICAgICAgLmFkZEZpeGVzKEJhY2twb3J0ZWRGaXgubmV3QnVpbGRlcigpLnNldEtub3duSXNzdWUoNEwpLnNldEFsaWFzKDY3KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICBXcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlLndyaXRlRml4ZXNBc0FsaWFzQml0U2V0KGZpeGVzLCBuZXcgUHJpbnRXcml0ZXIocmVzdWx0KSk7CisKKyAgICAgICAgVHJ1dGguYXNzZXJ0VGhhdChyZXN1bHQudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKCIiIgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGJhY2twb3J0ZWQgZml4ZXMgaGF2ZSBiZWVuIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9pc3N1ZXRyYWNrZXIuZ29vZ2xlLmNvbS9pc3N1ZXMvMTIzNCB3aXRoIGFsaWFzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9pc3N1ZXRyYWNrZXIuZ29vZ2xlLmNvbS9pc3N1ZXMvMyB3aXRoIGFsaWFzIDY1CisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzQgd2l0aCBhbGlhcyA2NworICAgICAgICAgICAgICAgICAgICAgICAgcm8uYnVpbGQuYmFja3BvcnRlZF9maXhlcy5hbGlhc19iaXRzZXQubG9uZ19saXN0PTIsMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyVGVzdC5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTBhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3Rlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL2NvbW1vbi9QYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuY29tbW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLmV4dGVuc2lvbnMucHJvdG8uUHJvdG9UcnV0aC5hc3NlcnRUaGF0OworCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLkJhY2twb3J0ZWRGaXg7CitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLkJhY2twb3J0ZWRGaXhlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZW1wb3JhcnlGb2xkZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKKworLyoqIFRlc3RzIGZvciB7QGxpbmsgUGFyc2VyfS4qLworcHVibGljIGNsYXNzIFBhcnNlclRlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIG1UZW1wRm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRGaWxlSW5wdXRTdHJlYW1zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdmFyIHJlc3VsdHMgPSBQYXJzZXIuZ2V0RmlsZUlucHV0U3RyZWFtcygKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgbnVsbCkudG9GaWxlKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHRzKS5pc05vdEVtcHR5KCk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldEJpdFNldEFycmF5X2VtcHR5KCkgeworICAgICAgICB2YXIgcmVzdWx0cyA9IFBhcnNlci5nZXRCaXRTZXRBcnJheShuZXcgaW50W117fSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0cykuaXNFbXB0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0Qml0U2V0QXJyYXlfMl8zXzY0KCkgeworICAgICAgICB2YXIgcmVzdWx0cyA9IFBhcnNlci5nZXRCaXRTZXRBcnJheShuZXcgaW50W117MiwzLDY0fSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0cykuYXNMaXN0KCkuY29udGFpbnNFeGFjdGx5KDEyTCwxTCkuaW5PcmRlcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VCYWNrcG9ydGVkRml4RmlsZXNfZW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB2YXIgcmVzdWx0ID0gUGFyc2VyLnBhcnNlQmFja3BvcnRlZEZpeEZpbGVzKEltbXV0YWJsZUxpc3Qub2YoKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0KS5pc0VxdWFsVG8oQmFja3BvcnRlZEZpeGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VCYWNrcG9ydGVkRml4RmlsZXNfb25lQmxhbmsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB2YXIgcmVzdWx0ID0gUGFyc2VyLnBhcnNlQmFja3BvcnRlZEZpeEZpbGVzKEltbXV0YWJsZUxpc3Qub2YobVRlbXBGb2xkZXIubmV3RmlsZSgpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQpLmlzRXF1YWxUbygKKyAgICAgICAgICAgICAgICBCYWNrcG9ydGVkRml4ZXMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRml4ZXMoQmFja3BvcnRlZEZpeC5nZXREZWZhdWx0SW5zdGFuY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQmFja3BvcnRlZEZpeEZpbGVzX3R3bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJhY2twb3J0ZWRGaXgga2kxMjMgPSBCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRLbm93bklzc3VlKDEyMykKKyAgICAgICAgICAgICAgICAuc2V0QWxpYXMoMSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgQmFja3BvcnRlZEZpeCBraTQ1NiA9IEJhY2twb3J0ZWRGaXgubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEtub3duSXNzdWUoNDU2KQorICAgICAgICAgICAgICAgIC5zZXRBbGlhcygyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB2YXIgcmVzdWx0ID0gUGFyc2VyLnBhcnNlQmFja3BvcnRlZEZpeEZpbGVzKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YodGVtcEZpbGUoa2k0NTYpLCB0ZW1wRmlsZShraTEyMykpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQpLmlzRXF1YWxUbygKKyAgICAgICAgICAgICAgICBCYWNrcG9ydGVkRml4ZXMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRml4ZXMoa2kxMjMpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRml4ZXMoa2k0NTYpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIHRlbXBGaWxlKEJhY2twb3J0ZWRGaXggZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBtVGVtcEZvbGRlci5uZXdGaWxlKCk7CisgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkgeworICAgICAgICAgICAgZml4LndyaXRlVG8ob3V0KTsKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2kvQW5kcm9pZC5icCBiL2NpL0FuZHJvaWQuYnAKaW5kZXggMTA0ZjUxNy4uM2YyOGJlNCAxMDA2NDQKLS0tIGEvY2kvQW5kcm9pZC5icAorKysgYi9jaS9BbmRyb2lkLmJwCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgICJidWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5IiwKICAgICBdLAogICAgIGxpYnM6IFsKLSAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzIiwKKyAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzX2xpYiIsCiAgICAgICAgICJweWZha2VmcyIsCiAgICAgICAgICJjaV90ZXN0X2xpYiIsCiAgICAgXSwKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzX2xvY2FsX3Rlc3QucHkiLAogICAgIF0sCiAgICAgbGliczogWwotICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXMiLAorICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfbGliIiwKICAgICAgICAgInB5ZmFrZWZzIiwKICAgICAgICAgImNpX3Rlc3RfbGliIiwKICAgICBdLApAQCAtNzEsMTEgKzcxLDYwIEBACiAgICAgfSwKIH0KIAotcHl0aG9uX2xpYnJhcnlfaG9zdCB7CitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAib3B0aW1pemVkX3RhcmdldHNfdGVzdCIsCisgICAgbWFpbjogIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfbGliIiwKKyAgICAgICAgInB5ZmFrZWZzIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cHkzLWNtZCIsCisgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKICAgICBuYW1lOiAiYnVpbGRfdGVzdF9zdWl0ZXMiLAogICAgIHNyY3M6IFsKICAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzLnB5IiwKICAgICAgICAgIm9wdGltaXplZF90YXJnZXRzLnB5IiwKKyAgICAgICAgInRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5IiwKKyAgICAgICAgImJ1aWxkX2NvbnRleHQucHkiLAorICAgICAgICAidGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkiLAorICAgICAgICAibWV0cmljc19hZ2VudC5weSIsCisgICAgICAgICJidWlsZGJvdC5weSIsCisgICAgXSwKKyAgICBtYWluOiAiYnVpbGRfdGVzdF9zdWl0ZXMucHkiLAorICAgIGxpYnM6IFsKKyAgICAgICAgInNvb25nLW1ldHJpY3MtcHJvdG8tcHkiLAorICAgIF0sCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZF90ZXN0X3N1aXRlc19saWIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzLnB5IiwKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzLnB5IiwKKyAgICAgICAgInRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5IiwKKyAgICAgICAgImJ1aWxkX2NvbnRleHQucHkiLAorICAgICAgICAidGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkiLAorICAgICAgICAibWV0cmljc19hZ2VudC5weSIsCisgICAgICAgICJidWlsZGJvdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJzb29uZy1tZXRyaWNzLXByb3RvLXB5IiwKICAgICBdLAogfQogCmRpZmYgLS1naXQgYS9jaS9idWlsZF9jb250ZXh0LnB5IGIvY2kvYnVpbGRfY29udGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ExZGVmCi0tLSAvZGV2L251bGwKKysrIGIvY2kvYnVpbGRfY29udGV4dC5weQpAQCAtMCwwICsxLDY3IEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkNvbnRhaW5lciBjbGFzcyBmb3IgYnVpbGQgY29udGV4dCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zLiIiIgorCitpbXBvcnQgcmUKKworCitjbGFzcyBCdWlsZENvbnRleHQ6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkX2NvbnRleHRfZGljdDogZGljdFtzdHIsIGFueV0pOgorICAgIHNlbGYuZW5hYmxlZF9idWlsZF9mZWF0dXJlcyA9IHNldCgpCisgICAgZm9yIG9wdCBpbiBidWlsZF9jb250ZXh0X2RpY3QuZ2V0KCdlbmFibGVkQnVpbGRGZWF0dXJlcycsIFtdKToKKyAgICAgIHNlbGYuZW5hYmxlZF9idWlsZF9mZWF0dXJlcy5hZGQob3B0LmdldCgnbmFtZScpKQorICAgIHNlbGYudGVzdF9pbmZvcyA9IHNldCgpCisgICAgZm9yIHRlc3RfaW5mb19kaWN0IGluIGJ1aWxkX2NvbnRleHRfZGljdC5nZXQoJ3Rlc3RDb250ZXh0JywgZGljdCgpKS5nZXQoCisgICAgICAgICd0ZXN0SW5mb3MnLCBbXQorICAgICk6CisgICAgICBzZWxmLnRlc3RfaW5mb3MuYWRkKHNlbGYuVGVzdEluZm8odGVzdF9pbmZvX2RpY3QpKQorCisgIGRlZiBidWlsZF90YXJnZXRfdXNlZChzZWxmLCB0YXJnZXQ6IHN0cikgLT4gYm9vbDoKKyAgICByZXR1cm4gYW55KHRlc3QuYnVpbGRfdGFyZ2V0X3VzZWQodGFyZ2V0KSBmb3IgdGVzdCBpbiBzZWxmLnRlc3RfaW5mb3MpCisKKyAgY2xhc3MgVGVzdEluZm86CisKKyAgICBfRE9XTkxPQURfT1BUUyA9IHsKKyAgICAgICAgJ3Rlc3QtY29uZmlnLW9ubHktemlwJywKKyAgICAgICAgJ3Rlc3QtemlwLWZpbGUtZmlsdGVyJywKKyAgICAgICAgJ2V4dHJhLWhvc3Qtc2hhcmVkLWxpYi16aXAnLAorICAgICAgICAnc2FuZGJveC10ZXN0cy16aXBzJywKKyAgICAgICAgJ2FkZGl0aW9uYWwtZmlsZXMtZmlsdGVyJywKKyAgICAgICAgJ2N0cy1wYWNrYWdlLW5hbWUnLAorICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2luZm9fZGljdDogZGljdFtzdHIsIGFueV0pOgorICAgICAgc2VsZi5pc190ZXN0X21hcHBpbmcgPSBGYWxzZQorICAgICAgc2VsZi50ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMgPSBzZXQoKQorICAgICAgc2VsZi5maWxlX2Rvd25sb2FkX29wdGlvbnMgPSBzZXQoKQorICAgICAgc2VsZi5uYW1lID0gdGVzdF9pbmZvX2RpY3QuZ2V0KCduYW1lJykKKyAgICAgIHNlbGYuY29tbWFuZCA9IHRlc3RfaW5mb19kaWN0LmdldCgnY29tbWFuZCcpCisgICAgICBzZWxmLmV4dHJhX29wdGlvbnMgPSB0ZXN0X2luZm9fZGljdC5nZXQoJ2V4dHJhT3B0aW9ucycpCisgICAgICBmb3Igb3B0IGluIHRlc3RfaW5mb19kaWN0LmdldCgnZXh0cmFPcHRpb25zJywgW10pOgorICAgICAgICBrZXkgPSBvcHQuZ2V0KCdrZXknKQorICAgICAgICBpZiBrZXkgPT0gJ3Rlc3QtbWFwcGluZy10ZXN0LWdyb3VwJzoKKyAgICAgICAgICBzZWxmLmlzX3Rlc3RfbWFwcGluZyA9IFRydWUKKyAgICAgICAgICBzZWxmLnRlc3RfbWFwcGluZ190ZXN0X2dyb3Vwcy51cGRhdGUob3B0LmdldCgndmFsdWVzJywgc2V0KCkpKQorCisgICAgICAgIGlmIGtleSBpbiBzZWxmLl9ET1dOTE9BRF9PUFRTOgorICAgICAgICAgIHNlbGYuZmlsZV9kb3dubG9hZF9vcHRpb25zLnVwZGF0ZShvcHQuZ2V0KCd2YWx1ZXMnLCBzZXQoKSkpCisKKyAgICBkZWYgYnVpbGRfdGFyZ2V0X3VzZWQoc2VsZiwgdGFyZ2V0OiBzdHIpIC0+IGJvb2w6CisgICAgICAjIEZvciBhbGwgb2YgYSB0YXJnZXRzJyBvdXRwdXRzLCBjaGVjayBpZiBhbnkgb2YgdGhlIHJlZ2V4ZXMgdXNlZCBieSB0ZXN0cworICAgICAgIyB0byBkb3dubG9hZCBhcnRpZmFjdHMgd291bGQgbWF0Y2ggaXQuIElmIGFueSBvZiB0aGVtIGRvIHRoZW4gdGhpcyB0YXJnZXQKKyAgICAgICMgaXMgbmVjZXNzYXJ5LgorICAgICAgcmVnZXggPSByJ1xiKCVzKVxiJyAlIHJlLmVzY2FwZSh0YXJnZXQpCisgICAgICByZXR1cm4gYW55KHJlLnNlYXJjaChyZWdleCwgb3B0KSBmb3Igb3B0IGluIHNlbGYuZmlsZV9kb3dubG9hZF9vcHRpb25zKQpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfZGV2aWNlX2FuZF90ZXN0cyBiL2NpL2J1aWxkX2RldmljZV9hbmRfdGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjNkM2NlMwotLS0gL2Rldi9udWxsCisrKyBiL2NpL2J1aWxkX2RldmljZV9hbmRfdGVzdHMKQEAgLTAsMCArMSwxOSBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorc2V0IC1ldW8gcGlwZWZhaWwKKworYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBidWlsZF90ZXN0X3N1aXRlcworJChidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhci1tb2RlIEhPU1RfT1VUKS9iaW4vYnVpbGRfdGVzdF9zdWl0ZXMgLS1kZXZpY2UtYnVpbGQgJEAKZGlmZiAtLWdpdCBhL2NpL2J1aWxkX21ldGFkYXRhIGIvY2kvYnVpbGRfbWV0YWRhdGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2U5MjE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NpL2J1aWxkX21ldGFkYXRhCkBAIC0wLDAgKzEsNDQgQEAKKyMvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLXgKKworc291cmNlIGJ1aWxkL21ha2Uvc2hlbGxfdXRpbHMuc2gKKworZXhwb3J0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQKK2V4cG9ydCBUQVJHRVRfUkVMRUFTRT10cnVua19zdGFnaW5nCitleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9ZW5nCisKK2ltcG9ydF9idWlsZF92YXJzIFwKKyAgICAgICAgT1VUX0RJUiBcCisgICAgICAgIERJU1RfRElSIFwKKyAgICAgICAgSE9TVF9PVVRfRVhFQ1VUQUJMRVMgXAorICAgIHx8IGV4aXQgJD8KKworVEFSR0VUUz0oCisgICAgYWxsX3RlYW1zCisgICAgc291cmNlX3RyZWVfc2l6ZQorICAgIHJlbGVhc2VfY29uZmlnX21ldGFkYXRhCispCisKKyMgQnVpbGQgbW9kdWxlcworYnVpbGQvc29vbmcvYmluL20gZGlzdCAke1RBUkdFVFNbQF19IHx8IGV4aXQgJD8KKworIyBMaXN0IGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIHRyZWUKKyggXAorICAgICRIT1NUX09VVF9FWEVDVVRBQkxFUy9zb3VyY2VfdHJlZV9zaXplIC1vICRESVNUX0RJUi9hbGxfc291cmNlX3RyZWVfZmlsZXMucGIgXAorICAgICAgICAmJiBnemlwIC1mbiAkRElTVF9ESVIvYWxsX3NvdXJjZV90cmVlX2ZpbGVzLnBiIFwKKykgfHwgZXhpdCAkPwpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXMgYi9jaS9idWlsZF90ZXN0X3N1aXRlcwppbmRleCA1YWFmMmY0Li43NDQ3MGE4IDEwMDc1NQotLS0gYS9jaS9idWlsZF90ZXN0X3N1aXRlcworKysgYi9jaS9idWlsZF90ZXN0X3N1aXRlcwpAQCAtMSw0ICsxLDQgQEAKLSMhcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2xpbnV4LXg4Ni9iaW4vcHkzLWNtZCAtQgorIyEvdXNyL2Jpbi9lbnYgYmFzaAogIwogIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwpAQCAtMTMsOCArMTMsNyBAQAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3NldCAtZXVvIHBpcGVmYWlsCiAKLWltcG9ydCBidWlsZF90ZXN0X3N1aXRlcwotaW1wb3J0IHN5cwotCi1idWlsZF90ZXN0X3N1aXRlcy5tYWluKHN5cy5hcmd2WzE6XSkKK2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgYnVpbGRfdGVzdF9zdWl0ZXMKKyQoYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSBIT1NUX09VVCkvYmluL2J1aWxkX3Rlc3Rfc3VpdGVzICRACmRpZmYgLS1naXQgYS9jaS9idWlsZF90ZXN0X3N1aXRlcy5weSBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzLnB5CmluZGV4IDZlMWY4OGMuLmNkY2JhNWEgMTAwNjQ0Ci0tLSBhL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzLnB5CisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzLnB5CkBAIC0yMCwxNCArMjAsMjIgQEAKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBwYXRobGliCitpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiBmcm9tIHR5cGluZyBpbXBvcnQgQ2FsbGFibGUKK2Zyb20gYnVpbGRfY29udGV4dCBpbXBvcnQgQnVpbGRDb250ZXh0CiBpbXBvcnQgb3B0aW1pemVkX3RhcmdldHMKK2ltcG9ydCBtZXRyaWNzX2FnZW50CitpbXBvcnQgdGVzdF9kaXNjb3ZlcnlfYWdlbnQKIAogCi1SRVFVSVJFRF9FTlZfVkFSUyA9IGZyb3plbnNldChbJ1RBUkdFVF9QUk9EVUNUJywgJ1RBUkdFVF9SRUxFQVNFJywgJ1RPUCddKQorUkVRVUlSRURfRU5WX1ZBUlMgPSBmcm96ZW5zZXQoWydUQVJHRVRfUFJPRFVDVCcsICdUQVJHRVRfUkVMRUFTRScsICdUT1AnLCAnRElTVF9ESVInXSkKIFNPT05HX1VJX0VYRV9SRUxfUEFUSCA9ICdidWlsZC9zb29uZy9zb29uZ191aS5iYXNoJworTE9HX1BBVEggPSAnbG9ncy9idWlsZF90ZXN0X3N1aXRlcy5sb2cnCisjIEN1cnJlbnRseSwgdGhpcyBwcmV2ZW50cyB0aGUgcmVtb3ZhbCBvZiB0aG9zZSB0YWdzIHdoZW4gdGhleSBleGlzdC4gSW4gdGhlIGZ1dHVyZSB3ZSBsaWtlbHkKKyMgd2FudCB0aGUgc2NyaXB0IHRvIHN1cHBseSAnZGlzdCBkaXJlY3RseQorUkVRVUlSRURfQlVJTERfVEFSR0VUUyA9IGZyb3plbnNldChbJ2Rpc3QnLCAnZHJvaWQnLCAnY2hlY2tidWlsZCddKQogCiAKIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CkBAIC01Myw3ICs2MSw3IEBACiAKICAgZGVmIF9faW5pdF9fKAogICAgICAgc2VsZiwKLSAgICAgIGJ1aWxkX2NvbnRleHQ6IGRpY3Rbc3RyLCBhbnldLAorICAgICAgYnVpbGRfY29udGV4dDogQnVpbGRDb250ZXh0LAogICAgICAgYXJnczogYXJncGFyc2UuTmFtZXNwYWNlLAogICAgICAgdGFyZ2V0X29wdGltaXphdGlvbnM6IGRpY3Rbc3RyLCBvcHRpbWl6ZWRfdGFyZ2V0cy5PcHRpbWl6ZWRCdWlsZFRhcmdldF0sCiAgICk6CkBAIC02MywxMiArNzEsMzEgQEAKIAogICBkZWYgY3JlYXRlX2J1aWxkX3BsYW4oc2VsZik6CiAKLSAgICBpZiAnb3B0aW1pemVkX2J1aWxkJyBub3QgaW4gc2VsZi5idWlsZF9jb250ZXh0WydlbmFibGVkX2J1aWxkX2ZlYXR1cmVzJ106CisgICAgaWYgJ29wdGltaXplZF9idWlsZCcgbm90IGluIHNlbGYuYnVpbGRfY29udGV4dC5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzOgorICAgICAgcmV0dXJuIEJ1aWxkUGxhbihzZXQoc2VsZi5hcmdzLmV4dHJhX3RhcmdldHMpLCBzZXQoKSkKKworICAgIGlmIG5vdCBzZWxmLmJ1aWxkX2NvbnRleHQudGVzdF9pbmZvczoKKyAgICAgIGxvZ2dpbmcud2FybmluZygnQnVpbGQgY29udGV4dCBoYXMgbm8gdGVzdCBpbmZvcywgc2tpcHBpbmcgb3B0aW1pemF0aW9ucy4nKQorICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLmFyZ3MuZXh0cmFfdGFyZ2V0czoKKyAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgJ0JVSUxEX0NPTlRFWFQgaGFzIG5vIHRlc3QgaW5mb3MuJykKICAgICAgIHJldHVybiBCdWlsZFBsYW4oc2V0KHNlbGYuYXJncy5leHRyYV90YXJnZXRzKSwgc2V0KCkpCiAKICAgICBidWlsZF90YXJnZXRzID0gc2V0KCkKLSAgICBwYWNrYWdpbmdfZnVuY3Rpb25zID0gc2V0KCkKLSAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYXJncy5leHRyYV90YXJnZXRzOgorICAgIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzID0gW10KKyAgICAjIEluIG9yZGVyIHRvIHJvbGwgb3B0aW1pemF0aW9ucyBvdXQgZGlmZmVyZW50bHkgYmV0d2VlbiB0ZXN0IHN1aXRlcyBhbmQKKyAgICAjIGRldmljZSBidWlsZHMsIHdlIGhhdmUgc2VwYXJhdGUgZmxhZ3MuCisgICAgZW5hYmxlX2Rpc2NvdmVyeSA9ICgndGVzdF9zdWl0ZXNfemlwX3Rlc3RfZGlzY292ZXJ5JworICAgICAgICBpbiBzZWxmLmJ1aWxkX2NvbnRleHQuZW5hYmxlZF9idWlsZF9mZWF0dXJlcworICAgICAgICBhbmQgbm90IHNlbGYuYXJncy5kZXZpY2VfYnVpbGQKKyAgICApIG9yICgKKyAgICAgICAgJ2RldmljZV96aXBfdGVzdF9kaXNjb3ZlcnknCisgICAgICAgIGluIHNlbGYuYnVpbGRfY29udGV4dC5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzCisgICAgICAgIGFuZCBzZWxmLmFyZ3MuZGV2aWNlX2J1aWxkCisgICAgKQorICAgIGxvZ2dpbmcuaW5mbyhmJ0Rpc2NvdmVyeSBtb2RlIGlzIGVuYWJsZWQ9IHtlbmFibGVfZGlzY292ZXJ5fScpCisgICAgcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cyA9IHNlbGYuX2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cyhlbmFibGVfZGlzY292ZXJ5KQorCisgICAgZm9yIHRhcmdldCBpbiBwcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzOgogICAgICAgdGFyZ2V0X29wdGltaXplcl9nZXR0ZXIgPSBzZWxmLnRhcmdldF9vcHRpbWl6YXRpb25zLmdldCh0YXJnZXQsIE5vbmUpCiAgICAgICBpZiBub3QgdGFyZ2V0X29wdGltaXplcl9nZXR0ZXI6CiAgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKQEAgLTc4LDE1ICsxMDUsMTA2IEBACiAgICAgICAgICAgdGFyZ2V0LCBzZWxmLmJ1aWxkX2NvbnRleHQsIHNlbGYuYXJncwogICAgICAgKQogICAgICAgYnVpbGRfdGFyZ2V0cy51cGRhdGUodGFyZ2V0X29wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpKQotICAgICAgcGFja2FnaW5nX2Z1bmN0aW9ucy5hZGQodGFyZ2V0X29wdGltaXplci5wYWNrYWdlX291dHB1dHMpCisgICAgICBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVycy5hcHBlbmQoCisgICAgICAgICAgdGFyZ2V0X29wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzCisgICAgICApCiAKLSAgICByZXR1cm4gQnVpbGRQbGFuKGJ1aWxkX3RhcmdldHMsIHBhY2thZ2luZ19mdW5jdGlvbnMpCisgICAgcmV0dXJuIEJ1aWxkUGxhbihidWlsZF90YXJnZXRzLCBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVycykKIAorICBkZWYgX2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cyhzZWxmLCBlbmFibGVfZGlzY292ZXJ5OiBib29sKToKKyAgICBidWlsZF90YXJnZXRzID0gc2V0KCkKKyAgICB0cnk6CisgICAgICB0ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlcyA9IHNlbGYuX2dldF90ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlcygpCisgICAgICBsb2dnaW5nLmluZm8oZidEaXNjb3ZlcmVkIHRlc3QgZGlzY292ZXJ5IHJlZ2V4ZXM6IHt0ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlc30nKQorICAgIGV4Y2VwdCB0ZXN0X2Rpc2NvdmVyeV9hZ2VudC5UZXN0RGlzY292ZXJ5RXJyb3IgYXMgZToKKyAgICAgIG9wdGltaXphdGlvbl9yYXRpb25hbGUgPSBlLm1lc3NhZ2UKKyAgICAgIGxvZ2dpbmcud2FybmluZyhmJ1VuYWJsZSB0byBwZXJmb3JtIHRlc3QgZGlzY292ZXJ5OiB7b3B0aW1pemF0aW9uX3JhdGlvbmFsZX0nKQorCisgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYXJncy5leHRyYV90YXJnZXRzOgorICAgICAgICBnZXRfbWV0cmljc19hZ2VudCgpLnJlcG9ydF91bm9wdGltaXplZF90YXJnZXQodGFyZ2V0LCBvcHRpbWl6YXRpb25fcmF0aW9uYWxlKQorICAgICAgcmV0dXJuIHNlbGYuX2xlZ2FjeV9jb2xsZWN0X3ByZWxpbWluYXJ5X2J1aWxkX3RhcmdldHMoKQorCisgICAgZm9yIHRhcmdldCBpbiBzZWxmLmFyZ3MuZXh0cmFfdGFyZ2V0czoKKyAgICAgIGlmIHRhcmdldCBpbiBSRVFVSVJFRF9CVUlMRF9UQVJHRVRTOgorICAgICAgICBidWlsZF90YXJnZXRzLmFkZCh0YXJnZXQpCisgICAgICAgIGdldF9tZXRyaWNzX2FnZW50KCkucmVwb3J0X3Vub3B0aW1pemVkX3RhcmdldCh0YXJnZXQsICdSZXF1aXJlZCBidWlsZCB0YXJnZXQuJykKKyAgICAgICAgY29udGludWUKKyAgICAgICMgSWYgbm90aGluZyBpcyBkaXNjb3ZlcmVkIHdpdGhvdXQgZXJyb3IsIHRoYXQgbWVhbnMgbm90aGluZyBpcyBuZWVkZWQuCisgICAgICBpZiBub3QgdGVzdF9kaXNjb3ZlcnlfemlwX3JlZ2V4ZXM6CisgICAgICAgIGdldF9tZXRyaWNzX2FnZW50KCkucmVwb3J0X29wdGltaXplZF90YXJnZXQodGFyZ2V0KQorICAgICAgICBjb250aW51ZQorCisgICAgICByZWdleCA9IHInXGIoJXMuKilcYicgJSByZS5lc2NhcGUodGFyZ2V0KQorICAgICAgZm9yIG9wdCBpbiB0ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgIGlmIHJlLnNlYXJjaChyZWdleCwgb3B0KToKKyAgICAgICAgICAgIGdldF9tZXRyaWNzX2FnZW50KCkucmVwb3J0X3Vub3B0aW1pemVkX3RhcmdldCh0YXJnZXQsICdUZXN0IGFydGlmYWN0IHVzZWQuJykKKyAgICAgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKKyAgICAgICAgICAgICMgcHJvY2VlZCB0byBuZXh0IHRhcmdldCBldmFsdWF0aW9uCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGdldF9tZXRyaWNzX2FnZW50KCkucmVwb3J0X29wdGltaXplZF90YXJnZXQodGFyZ2V0KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgIyBJbiBjYXNlIG9mIGV4Y2VwdGlvbiByZXBvcnQgYXMgdW5vcHRpbWl6ZWQKKyAgICAgICAgICBidWlsZF90YXJnZXRzLmFkZCh0YXJnZXQpCisgICAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgZidFcnJvciBpbiBwYXJzaW5nIHRlc3QgZGlzY292ZXJ5IG91dHB1dCBmb3Ige3RhcmdldH06IHtyZXByKGUpfScpCisgICAgICAgICAgbG9nZ2luZy5lcnJvcihmJ3VuYWJsZSB0byBwYXJzZSB0ZXN0IGRpc2NvdmVyeSBvdXRwdXQ6IHtyZXByKGUpfScpCisgICAgICAgICAgYnJlYWsKKyAgICAjIElmIGRpc2NvdmVyeSBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBsaXN0CisgICAgaWYgbm90IGVuYWJsZV9kaXNjb3Zlcnk6CisgICAgICByZXR1cm4gc2VsZi5fbGVnYWN5X2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cygpCisKKyAgICByZXR1cm4gYnVpbGRfdGFyZ2V0cworCisgIGRlZiBfbGVnYWN5X2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cyhzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0gc2V0KCkKKyAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYXJncy5leHRyYV90YXJnZXRzOgorICAgICAgaWYgc2VsZi5fdW51c2VkX3RhcmdldF9leGNsdXNpb25fZW5hYmxlZCgKKyAgICAgICAgICB0YXJnZXQKKyAgICAgICkgYW5kIG5vdCBzZWxmLmJ1aWxkX2NvbnRleHQuYnVpbGRfdGFyZ2V0X3VzZWQodGFyZ2V0KToKKyAgICAgICAgY29udGludWUKKworICAgICAgYnVpbGRfdGFyZ2V0cy5hZGQodGFyZ2V0KQorICAgIHJldHVybiBidWlsZF90YXJnZXRzCisKKyAgZGVmIF91bnVzZWRfdGFyZ2V0X2V4Y2x1c2lvbl9lbmFibGVkKHNlbGYsIHRhcmdldDogc3RyKSAtPiBib29sOgorICAgIHJldHVybiAoCisgICAgICAgIGYne3RhcmdldH1fdW51c2VkX2V4Y2x1c2lvbicKKyAgICAgICAgaW4gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICApCisKKyAgZGVmIF9nZXRfdGVzdF9kaXNjb3ZlcnlfemlwX3JlZ2V4ZXMoc2VsZikgLT4gc2V0W3N0cl06CisgICAgYnVpbGRfdGFyZ2V0X3JlZ2V4ZXMgPSBzZXQoKQorICAgIGZvciB0ZXN0X2luZm8gaW4gc2VsZi5idWlsZF9jb250ZXh0LnRlc3RfaW5mb3M6CisgICAgICB0Zl9jb21tYW5kID0gc2VsZi5fYnVpbGRfdGZfY29tbWFuZCh0ZXN0X2luZm8pCisgICAgICBkaXNjb3ZlcnlfYWdlbnQgPSB0ZXN0X2Rpc2NvdmVyeV9hZ2VudC5UZXN0RGlzY292ZXJ5QWdlbnQodHJhZGVmZWRfYXJncz10Zl9jb21tYW5kKQorICAgICAgZm9yIHJlZ2V4IGluIGRpc2NvdmVyeV9hZ2VudC5kaXNjb3Zlcl90ZXN0X3ppcF9yZWdleGVzKCk6CisgICAgICAgIGJ1aWxkX3RhcmdldF9yZWdleGVzLmFkZChyZWdleCkKKyAgICByZXR1cm4gYnVpbGRfdGFyZ2V0X3JlZ2V4ZXMKKworCisgIGRlZiBfYnVpbGRfdGZfY29tbWFuZChzZWxmLCB0ZXN0X2luZm8pIC0+IGxpc3Rbc3RyXToKKyAgICBjb21tYW5kID0gW3Rlc3RfaW5mby5jb21tYW5kXQorICAgIGZvciBleHRyYV9vcHRpb24gaW4gdGVzdF9pbmZvLmV4dHJhX29wdGlvbnM6CisgICAgICBpZiBub3QgZXh0cmFfb3B0aW9uLmdldCgna2V5Jyk6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBhcmdfa2V5ID0gJy0tJyArIGV4dHJhX29wdGlvbi5nZXQoJ2tleScpCisgICAgICBpZiBhcmdfa2V5ID09ICctLWJ1aWxkLWlkJzoKKyAgICAgICAgY29tbWFuZC5hcHBlbmQoYXJnX2tleSkKKyAgICAgICAgY29tbWFuZC5hcHBlbmQob3MuZW52aXJvbi5nZXQoJ0JVSUxEX05VTUJFUicpKQorICAgICAgICBjb250aW51ZQorICAgICAgaWYgZXh0cmFfb3B0aW9uLmdldCgndmFsdWVzJyk6CisgICAgICAgIGZvciB2YWx1ZSBpbiBleHRyYV9vcHRpb24uZ2V0KCd2YWx1ZXMnKToKKyAgICAgICAgICBjb21tYW5kLmFwcGVuZChhcmdfa2V5KQorICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKHZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgY29tbWFuZC5hcHBlbmQoYXJnX2tleSkKKworICAgIHJldHVybiBjb21tYW5kCiAKIEBkYXRhY2xhc3MoZnJvemVuPVRydWUpCiBjbGFzcyBCdWlsZFBsYW46CiAgIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdCi0gIHBhY2thZ2luZ19mdW5jdGlvbnM6IHNldFtDYWxsYWJsZVsuLi4sIE5vbmVdXQorICBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVyczogbGlzdFtDYWxsYWJsZVtbXSwgbGlzdFtsaXN0W3N0cl1dXV0KIAogCiBkZWYgYnVpbGRfdGVzdF9zdWl0ZXMoYXJndjogbGlzdFtzdHJdKSAtPiBpbnQ6CkBAIC05OCwxOSArMjE2LDI3IEBACiAgIFJldHVybnM6CiAgICAgVGhlIGV4aXQgY29kZSBvZiB0aGUgYnVpbGQuCiAgICIiIgotICBhcmdzID0gcGFyc2VfYXJncyhhcmd2KQotICBjaGVja19yZXF1aXJlZF9lbnYoKQotICBidWlsZF9jb250ZXh0ID0gbG9hZF9idWlsZF9jb250ZXh0KCkKLSAgYnVpbGRfcGxhbm5lciA9IEJ1aWxkUGxhbm5lcigKLSAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG9wdGltaXplZF90YXJnZXRzLk9QVElNSVpFRF9CVUlMRF9UQVJHRVRTCi0gICkKLSAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorICBnZXRfbWV0cmljc19hZ2VudCgpLmFuYWx5c2lzX3N0YXJ0KCkKKyAgdHJ5OgorICAgIGFyZ3MgPSBwYXJzZV9hcmdzKGFyZ3YpCisgICAgY2hlY2tfcmVxdWlyZWRfZW52KCkKKyAgICBidWlsZF9jb250ZXh0ID0gQnVpbGRDb250ZXh0KGxvYWRfYnVpbGRfY29udGV4dCgpKQorICAgIGJ1aWxkX3BsYW5uZXIgPSBCdWlsZFBsYW5uZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG9wdGltaXplZF90YXJnZXRzLk9QVElNSVpFRF9CVUlMRF9UQVJHRVRTCisgICAgKQorICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKyAgZXhjZXB0OgorICAgIHJhaXNlCisgIGZpbmFsbHk6CisgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5hbmFseXNpc19lbmQoKQogCiAgIHRyeToKICAgICBleGVjdXRlX2J1aWxkX3BsYW4oYnVpbGRfcGxhbikKICAgZXhjZXB0IEJ1aWxkRmFpbHVyZUVycm9yIGFzIGU6CiAgICAgbG9nZ2luZy5lcnJvcignQnVpbGQgY29tbWFuZCBmYWlsZWQhIENoZWNrIGJ1aWxkX2xvZyBmb3IgZGV0YWlscy4nKQogICAgIHJldHVybiBlLnJldHVybl9jb2RlCisgIGZpbmFsbHk6CisgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5lbmRfcmVwb3J0aW5nKCkKIAogICByZXR1cm4gMAogCkBAIC0xMjEsNiArMjQ3LDExIEBACiAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAnZXh0cmFfdGFyZ2V0cycsIG5hcmdzPScqJywgaGVscD0nRXh0cmEgdGVzdCBzdWl0ZXMgdG8gYnVpbGQuJwogICApCisgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1kZXZpY2UtYnVpbGQnLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0ZsYWcgdG8gaW5kaWNhdGUgcnVubmluZyBhIGRldmljZSBidWlsZC4nLAorICApCiAKICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCiAKQEAgLTE1NCw3ICsyODUsNyBAQAogCiAKIGRlZiBlbXB0eV9idWlsZF9jb250ZXh0KCk6Ci0gIHJldHVybiB7J2VuYWJsZWRfYnVpbGRfZmVhdHVyZXMnOiBbXX0KKyAgcmV0dXJuIHsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnOiBbXX0KIAogCiBkZWYgZXhlY3V0ZV9idWlsZF9wbGFuKGJ1aWxkX3BsYW46IEJ1aWxkUGxhbik6CkBAIC0xNjgsOCArMjk5LDE1IEBACiAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgogICAgIHJhaXNlIEJ1aWxkRmFpbHVyZUVycm9yKGUucmV0dXJuY29kZSkgZnJvbSBlCiAKLSAgZm9yIHBhY2thZ2luZ19mdW5jdGlvbiBpbiBidWlsZF9wbGFuLnBhY2thZ2luZ19mdW5jdGlvbnM6Ci0gICAgcGFja2FnaW5nX2Z1bmN0aW9uKCkKKyAgZ2V0X21ldHJpY3NfYWdlbnQoKS5wYWNrYWdpbmdfc3RhcnQoKQorICB0cnk6CisgICAgZm9yIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXIgaW4gYnVpbGRfcGxhbi5wYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVyczoKKyAgICAgIGZvciBwYWNrYWdpbmdfY29tbWFuZCBpbiBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVyKCk6CisgICAgICAgIHJ1bl9jb21tYW5kKHBhY2thZ2luZ19jb21tYW5kKQorICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKKyAgICByYWlzZSBCdWlsZEZhaWx1cmVFcnJvcihlLnJldHVybmNvZGUpIGZyb20gZQorICBmaW5hbGx5OgorICAgIGdldF9tZXRyaWNzX2FnZW50KCkucGFja2FnaW5nX2VuZCgpCiAKIAogZGVmIGdldF90b3AoKSAtPiBwYXRobGliLlBhdGg6CkBAIC0xODAsNSArMzE4LDIxIEBACiAgIHN1YnByb2Nlc3MucnVuKGFyZ3M9YXJncywgY2hlY2s9VHJ1ZSwgc3Rkb3V0PXN0ZG91dCkKIAogCitkZWYgZ2V0X21ldHJpY3NfYWdlbnQoKToKKyAgcmV0dXJuIG1ldHJpY3NfYWdlbnQuTWV0cmljc0FnZW50Lmluc3RhbmNlKCkKKworCiBkZWYgbWFpbihhcmd2KToKKyAgZGlzdF9kaXIgPSBvcy5lbnZpcm9uLmdldCgnRElTVF9ESVInKQorICBpZiBkaXN0X2RpcjoKKyAgICBsb2dfZmlsZSA9IHBhdGhsaWIuUGF0aChkaXN0X2RpcikgLyBMT0dfUEFUSAorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoCisgICAgICAgIGxldmVsPWxvZ2dpbmcuREVCVUcsCisgICAgICAgIGZvcm1hdD0nJShhc2N0aW1lKXMgJShsZXZlbG5hbWUpcyAlKG1lc3NhZ2UpcycsCisgICAgICAgIGZpbGVuYW1lPWxvZ19maWxlLAorICAgICkKICAgc3lzLmV4aXQoYnVpbGRfdGVzdF9zdWl0ZXMoYXJndikpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5IGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weQppbmRleCBhOWZmM2ZiLi4xOTA3NDBmIDEwMDY0NAotLS0gYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5CisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX3Rlc3QucHkKQEAgLTE1LDYgKzE1LDcgQEAKICIiIlRlc3RzIGZvciBidWlsZF90ZXN0X3N1aXRlcy5weSIiIgogCiBpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBmdW5jdG9vbHMKIGZyb20gaW1wb3J0bGliIGltcG9ydCByZXNvdXJjZXMKIGltcG9ydCBqc29uCiBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCkBAIC0zMSwxMCArMzIsMTMgQEAKIGZyb20gdHlwaW5nIGltcG9ydCBDYWxsYWJsZQogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitmcm9tIGJ1aWxkX2NvbnRleHQgaW1wb3J0IEJ1aWxkQ29udGV4dAogaW1wb3J0IGJ1aWxkX3Rlc3Rfc3VpdGVzCiBpbXBvcnQgY2lfdGVzdF9saWIKIGltcG9ydCBvcHRpbWl6ZWRfdGFyZ2V0cwogZnJvbSBweWZha2VmcyBpbXBvcnQgZmFrZV9maWxlc3lzdGVtX3VuaXR0ZXN0CitpbXBvcnQgbWV0cmljc19hZ2VudAoraW1wb3J0IHRlc3RfZGlzY292ZXJ5X2FnZW50CiAKIAogY2xhc3MgQnVpbGRUZXN0U3VpdGVzVGVzdChmYWtlX2ZpbGVzeXN0ZW1fdW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTAsNiArNTQsMTAgQEAKICAgICBzZWxmLmFkZENsZWFudXAoc3VicHJvY2Vzc19ydW5fcGF0Y2hlci5zdG9wKQogICAgIHNlbGYubW9ja19zdWJwcm9jZXNzX3J1biA9IHN1YnByb2Nlc3NfcnVuX3BhdGNoZXIuc3RhcnQoKQogCisgICAgbWV0cmljc19hZ2VudF9maW5hbGl6ZV9wYXRjaGVyID0gbW9jay5wYXRjaCgnbWV0cmljc19hZ2VudC5NZXRyaWNzQWdlbnQuZW5kX3JlcG9ydGluZycpCisgICAgc2VsZi5hZGRDbGVhbnVwKG1ldHJpY3NfYWdlbnRfZmluYWxpemVfcGF0Y2hlci5zdG9wKQorICAgIHNlbGYubW9ja19tZXRyaWNzX2FnZW50X2VuZCA9IG1ldHJpY3NfYWdlbnRfZmluYWxpemVfcGF0Y2hlci5zdGFydCgpCisKICAgICBzZWxmLl9zZXR1cF93b3JraW5nX2J1aWxkX2VudigpCiAKICAgZGVmIHRlc3RfbWlzc2luZ190YXJnZXRfcmVsZWFzZV9lbnZfdmFyX3JhaXNlcyhzZWxmKToKQEAgLTcwLDYgKzc4LDEyIEBACiAgICAgd2l0aCBzZWxmLmFzc2VydF9yYWlzZXNfd29yZChidWlsZF90ZXN0X3N1aXRlcy5FcnJvciwgJ1RPUCcpOgogICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKIAorICBkZWYgdGVzdF9taXNzaW5nX2Rpc3RfZGlyX2Vudl92YXJfcmFpc2VzKHNlbGYpOgorICAgIGRlbCBvcy5lbnZpcm9uWydESVNUX0RJUiddCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnRElTVF9ESVInKToKKyAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oW10pCisKICAgZGVmIHRlc3RfaW52YWxpZF9hcmdfcmFpc2VzKHNlbGYpOgogICAgIGludmFsaWRfYXJncyA9IFsnLS1pbnZhbGlkX2FyZyddCiAKQEAgLTEwNiw2ICsxMjAsOSBAQAogICAgIHNlbGYuc29vbmdfdWlfZGlyID0gc2VsZi5mYWtlX3RvcC5qb2lucGF0aCgnYnVpbGQvc29vbmcnKQogICAgIHNlbGYuc29vbmdfdWlfZGlyLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKIAorICAgIHNlbGYubG9nc19kaXIgPSBzZWxmLmZha2VfdG9wLmpvaW5wYXRoKCdkaXN0L2xvZ3MnKQorICAgIHNlbGYubG9nc19kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorCiAgICAgc2VsZi5zb29uZ191aSA9IHNlbGYuc29vbmdfdWlfZGlyLmpvaW5wYXRoKCdzb29uZ191aS5iYXNoJykKICAgICBzZWxmLnNvb25nX3VpLnRvdWNoKCkKIApAQCAtMTEzLDYgKzEzMCw3IEBACiAgICAgICAgICdUQVJHRVRfUkVMRUFTRSc6ICdyZWxlYXNlJywKICAgICAgICAgJ1RBUkdFVF9QUk9EVUNUJzogJ3Byb2R1Y3QnLAogICAgICAgICAnVE9QJzogc3RyKHNlbGYuZmFrZV90b3ApLAorICAgICAgICAnRElTVF9ESVInOiBzdHIoc2VsZi5mYWtlX3RvcC5qb2lucGF0aCgnZGlzdCcpKSwKICAgICB9KQogCiAgICAgc2VsZi5tb2NrX3N1YnByb2Nlc3NfcnVuLnJldHVybl92YWx1ZSA9IDAKQEAgLTIzOCwxNCArMjU2LDI3IEBACiAKICAgY2xhc3MgVGVzdE9wdGltaXplZEJ1aWxkVGFyZ2V0KG9wdGltaXplZF90YXJnZXRzLk9wdGltaXplZEJ1aWxkVGFyZ2V0KToKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRwdXRfdGFyZ2V0cyk6CisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLCB0YXJnZXQsIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG91dHB1dF90YXJnZXRzLCBwYWNrYWdpbmdfY29tbWFuZHMKKyAgICApOgorICAgICAgc3VwZXIoKS5fX2luaXRfXyh0YXJnZXQsIGJ1aWxkX2NvbnRleHQsIGFyZ3MpCiAgICAgICBzZWxmLm91dHB1dF90YXJnZXRzID0gb3V0cHV0X3RhcmdldHMKKyAgICAgIHNlbGYucGFja2FnaW5nX2NvbW1hbmRzID0gcGFja2FnaW5nX2NvbW1hbmRzCiAKLSAgICBkZWYgZ2V0X2J1aWxkX3RhcmdldHMoc2VsZik6CisgICAgZGVmIGdldF9idWlsZF90YXJnZXRzX2ltcGwoc2VsZik6CiAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRfdGFyZ2V0cwogCi0gICAgZGVmIHBhY2thZ2Vfb3V0cHV0cyhzZWxmKToKLSAgICAgIHJldHVybiBmJ3BhY2thZ2luZyB7IiAiLmpvaW4oc2VsZi5vdXRwdXRfdGFyZ2V0cyl9JworICAgIGRlZiBnZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzX2ltcGwoc2VsZik6CisgICAgICByZXR1cm4gc2VsZi5wYWNrYWdpbmdfY29tbWFuZHMKKworICAgIGRlZiBnZXRfZW5hYmxlZF9mbGFnKHNlbGYpOgorICAgICAgcmV0dXJuIGYne3NlbGYudGFyZ2V0fV9lbmFibGVkJworCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICB0ZXN0X2Rpc2NvdmVyeV9hZ2VudF9wYXRjaGVyID0gbW9jay5wYXRjaCgndGVzdF9kaXNjb3ZlcnlfYWdlbnQuVGVzdERpc2NvdmVyeUFnZW50LmRpc2NvdmVyX3Rlc3RfemlwX3JlZ2V4ZXMnKQorICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X2Rpc2NvdmVyeV9hZ2VudF9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX3Rlc3RfZGlzY292ZXJ5X2FnZW50X2VuZCA9IHRlc3RfZGlzY292ZXJ5X2FnZW50X3BhdGNoZXIuc3RhcnQoKQorCiAKICAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9idWlsZHNfZXZlcnl0aGluZyhzZWxmKToKICAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CkBAIC0yNjcsMTQgKzI5OCwxNiBAQAogCiAgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQogCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVpbGRfcGxhbi5wYWNrYWdpbmdfZnVuY3Rpb25zKSwgMCkKKyAgICBmb3IgcGFja2FnaW5nX2NvbW1hbmQgaW4gc2VsZi5ydW5fcGFja2FnaW5nX2NvbW1hbmRzKGJ1aWxkX3BsYW4pOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGFja2FnaW5nX2NvbW1hbmQpLCAwKQogCiAgIGRlZiB0ZXN0X2J1aWxkX29wdGltaXphdGlvbl9vbl9vcHRpbWl6ZXNfdGFyZ2V0KHNlbGYpOgogICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KICAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKICAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAogICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCi0gICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPXtzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX0KKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6IHNlbGYuZ2V0X3RhcmdldF9mbGFnKCd0YXJnZXRfMScpfV0sCisgICAgICAgICAgICB0ZXN0X2NvbnRleHQ9c2VsZi5nZXRfdGVzdF9jb250ZXh0KCd0YXJnZXRfMScpLAogICAgICAgICApLAogICAgICkKIApAQCAtMjg1LDIwICszMTgsMjAgQEAKIAogICBkZWYgdGVzdF9idWlsZF9vcHRpbWl6YXRpb25fb25fcGFja2FnZXNfdGFyZ2V0KHNlbGYpOgogICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBvcHRpbWl6ZWRfdGFyZ2V0X25hbWUgPSBzZWxmLmdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoJ3RhcmdldF8xJykKKyAgICBwYWNrYWdpbmdfY29tbWFuZHMgPSBbW2YncGFja2FnaW5nIHtvcHRpbWl6ZWRfdGFyZ2V0X25hbWV9J11dCiAgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCiAgICAgICAgIGJ1aWxkX3RhcmdldHM9YnVpbGRfdGFyZ2V0cywKICAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAotICAgICAgICAgICAgZW5hYmxlZF9idWlsZF9mZWF0dXJlcz17c2VsZi5nZXRfdGFyZ2V0X2ZsYWcoJ3RhcmdldF8xJyl9CisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiBzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX1dLAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXNlbGYuZ2V0X3Rlc3RfY29udGV4dCgndGFyZ2V0XzEnKSwKICAgICAgICAgKSwKKyAgICAgICAgcGFja2FnaW5nX2NvbW1hbmRzPXBhY2thZ2luZ19jb21tYW5kcywKICAgICApCiAKICAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCiAKLSAgICBvcHRpbWl6ZWRfdGFyZ2V0X25hbWUgPSBzZWxmLmdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoJ3RhcmdldF8xJykKLSAgICBzZWxmLmFzc2VydEluKAotICAgICAgICBmJ3BhY2thZ2luZyB7b3B0aW1pemVkX3RhcmdldF9uYW1lfScsCi0gICAgICAgIHNlbGYucnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoYnVpbGRfcGxhbiksCi0gICAgKQorICAgIHNlbGYuYXNzZXJ0SW4ocGFja2FnaW5nX2NvbW1hbmRzLCBzZWxmLnJ1bl9wYWNrYWdpbmdfY29tbWFuZHMoYnVpbGRfcGxhbikpCiAKICAgZGVmIHRlc3RfaW5kaXZpZHVhbF9idWlsZF9vcHRpbWl6YXRpb25fb2ZmX2RvZXNudF9vcHRpbWl6ZShzZWxmKToKICAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CkBAIC0zMTIsMjYgKzM0NSw5NCBAQAogCiAgIGRlZiB0ZXN0X2luZGl2aWR1YWxfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9kb2VzbnRfcGFja2FnZShzZWxmKToKICAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgcGFja2FnaW5nX2NvbW1hbmRzID0gW1sncGFja2FnaW5nIGNvbW1hbmQnXV0KICAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKICAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICAgICBwYWNrYWdpbmdfY29tbWFuZHM9cGFja2FnaW5nX2NvbW1hbmRzLAogICAgICkKIAogICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKIAotICAgIGV4cGVjdGVkX3BhY2thZ2luZ19mdW5jdGlvbl9vdXRwdXRzID0ge05vbmUsIE5vbmV9Ci0gICAgc2VsZi5hc3NlcnRTZXRFcXVhbCgKLSAgICAgICAgZXhwZWN0ZWRfcGFja2FnaW5nX2Z1bmN0aW9uX291dHB1dHMsCi0gICAgICAgIHNlbGYucnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoYnVpbGRfcGxhbiksCisgICAgZm9yIHBhY2thZ2luZ19jb21tYW5kIGluIHNlbGYucnVuX3BhY2thZ2luZ19jb21tYW5kcyhidWlsZF9wbGFuKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhY2thZ2luZ19jb21tYW5kKSwgMCkKKworICBkZWYgdGVzdF90YXJnZXRfb3V0cHV0X3VzZWRfdGFyZ2V0X2J1aWx0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldCA9ICd0ZXN0X3RhcmdldCcKKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz17YnVpbGRfdGFyZ2V0fSwKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXNlbGYuZ2V0X3Rlc3RfY29udGV4dChidWlsZF90YXJnZXQpLAorICAgICAgICAgICAgZW5hYmxlZF9idWlsZF9mZWF0dXJlcz1beyduYW1lJzogJ3Rlc3RfdGFyZ2V0X3VudXNlZF9leGNsdXNpb24nfV0sCisgICAgICAgICksCiAgICAgKQogCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMsIHtidWlsZF90YXJnZXR9KQorCisgIGRlZiB0ZXN0X3RhcmdldF9yZWdleF91c2VkX3RhcmdldF9idWlsdChzZWxmKToKKyAgICBidWlsZF90YXJnZXQgPSAndGVzdF90YXJnZXQnCisgICAgdGVzdF9jb250ZXh0ID0gc2VsZi5nZXRfdGVzdF9jb250ZXh0KGJ1aWxkX3RhcmdldCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFt7CisgICAgICAgICdrZXknOiAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAndmFsdWVzJzogW2YnLip7YnVpbGRfdGFyZ2V0fS4qXC56aXAnXSwKKyAgICB9XQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPXtidWlsZF90YXJnZXR9LAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICAgICAgICB0ZXN0X2NvbnRleHQ9dGVzdF9jb250ZXh0LAorICAgICAgICAgICAgZW5hYmxlZF9idWlsZF9mZWF0dXJlcz1beyduYW1lJzogJ3Rlc3RfdGFyZ2V0X3VudXNlZF9leGNsdXNpb24nfV0sCisgICAgICAgICksCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMsIHtidWlsZF90YXJnZXR9KQorCisgIGRlZiB0ZXN0X3RhcmdldF9vdXRwdXRfbm90X3VzZWRfdGFyZ2V0X25vdF9idWlsdChzZWxmKToKKyAgICBidWlsZF90YXJnZXQgPSAndGVzdF90YXJnZXQnCisgICAgdGVzdF9jb250ZXh0ID0gc2VsZi5nZXRfdGVzdF9jb250ZXh0KGJ1aWxkX3RhcmdldCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFtdCisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9e2J1aWxkX3RhcmdldH0sCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgICAgICAgIHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQsCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiAndGVzdF90YXJnZXRfdW51c2VkX2V4Y2x1c2lvbid9XSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cywgc2V0KCkpCisKKyAgZGVmIHRlc3RfdGFyZ2V0X3JlZ2V4X21hdGNoaW5nX25vdF90b29fYnJvYWQoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0ID0gJ3Rlc3RfdGFyZ2V0JworICAgIHRlc3RfY29udGV4dCA9IHNlbGYuZ2V0X3Rlc3RfY29udGV4dChidWlsZF90YXJnZXQpCisgICAgdGVzdF9jb250ZXh0Wyd0ZXN0SW5mb3MnXVswXVsnZXh0cmFPcHRpb25zJ10gPSBbeworICAgICAgICAna2V5JzogJ2FkZGl0aW9uYWwtZmlsZXMtZmlsdGVyJywKKyAgICAgICAgJ3ZhbHVlcyc6IFtmJy4qYXtidWlsZF90YXJnZXR9LipcLnppcCddLAorICAgIH1dCisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9e2J1aWxkX3RhcmdldH0sCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgICAgICAgIHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQsCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiAndGVzdF90YXJnZXRfdW51c2VkX2V4Y2x1c2lvbid9XSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cywgc2V0KCkpCisKICAgZGVmIGNyZWF0ZV9idWlsZF9wbGFubmVyKAogICAgICAgc2VsZiwKICAgICAgIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdLAotICAgICAgYnVpbGRfY29udGV4dDogZGljdFtzdHIsIGFueV0gPSBOb25lLAorICAgICAgYnVpbGRfY29udGV4dDogQnVpbGRDb250ZXh0ID0gTm9uZSwKICAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSA9IE5vbmUsCiAgICAgICB0YXJnZXRfb3B0aW1pemF0aW9uczogZGljdFsKICAgICAgICAgICBzdHIsIG9wdGltaXplZF90YXJnZXRzLk9wdGltaXplZEJ1aWxkVGFyZ2V0CiAgICAgICBdID0gTm9uZSwKKyAgICAgIHBhY2thZ2luZ19jb21tYW5kczogbGlzdFtsaXN0W3N0cl1dID0gW10sCiAgICkgLT4gYnVpbGRfdGVzdF9zdWl0ZXMuQnVpbGRQbGFubmVyOgogICAgIGlmIG5vdCBidWlsZF9jb250ZXh0OgogICAgICAgYnVpbGRfY29udGV4dCA9IHNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoKQpAQCAtMzM5LDcgKzQ0MCw5IEBACiAgICAgICBhcmdzID0gc2VsZi5jcmVhdGVfYXJncyhleHRyYV9idWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMpCiAgICAgaWYgbm90IHRhcmdldF9vcHRpbWl6YXRpb25zOgogICAgICAgdGFyZ2V0X29wdGltaXphdGlvbnMgPSBzZWxmLmNyZWF0ZV90YXJnZXRfb3B0aW1pemF0aW9ucygKLSAgICAgICAgICBidWlsZF9jb250ZXh0LCBidWlsZF90YXJnZXRzCisgICAgICAgICAgYnVpbGRfY29udGV4dCwKKyAgICAgICAgICBidWlsZF90YXJnZXRzLAorICAgICAgICAgIHBhY2thZ2luZ19jb21tYW5kcywKICAgICAgICkKICAgICByZXR1cm4gYnVpbGRfdGVzdF9zdWl0ZXMuQnVpbGRQbGFubmVyKAogICAgICAgICBidWlsZF9jb250ZXh0LCBhcmdzLCB0YXJnZXRfb3B0aW1pemF0aW9ucwpAQCAtMzQ4LDE1ICs0NTEsMTcgQEAKICAgZGVmIGNyZWF0ZV9idWlsZF9jb250ZXh0KAogICAgICAgc2VsZiwKICAgICAgIG9wdGltaXplZF9idWlsZF9lbmFibGVkOiBib29sID0gVHJ1ZSwKLSAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM6IHNldFtzdHJdID0gc2V0KCksCisgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzOiBsaXN0W2RpY3Rbc3RyLCBzdHJdXSA9IFtdLAogICAgICAgdGVzdF9jb250ZXh0OiBkaWN0W3N0ciwgYW55XSA9IHt9LAotICApIC0+IGRpY3Rbc3RyLCBhbnldOgotICAgIGJ1aWxkX2NvbnRleHQgPSB7fQotICAgIGJ1aWxkX2NvbnRleHRbJ2VuYWJsZWRfYnVpbGRfZmVhdHVyZXMnXSA9IGVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgKSAtPiBCdWlsZENvbnRleHQ6CisgICAgYnVpbGRfY29udGV4dF9kaWN0ID0ge30KKyAgICBidWlsZF9jb250ZXh0X2RpY3RbJ2VuYWJsZWRCdWlsZEZlYXR1cmVzJ10gPSBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzCiAgICAgaWYgb3B0aW1pemVkX2J1aWxkX2VuYWJsZWQ6Ci0gICAgICBidWlsZF9jb250ZXh0WydlbmFibGVkX2J1aWxkX2ZlYXR1cmVzJ10uYWRkKCdvcHRpbWl6ZWRfYnVpbGQnKQotICAgIGJ1aWxkX2NvbnRleHRbJ3Rlc3RfY29udGV4dCddID0gdGVzdF9jb250ZXh0Ci0gICAgcmV0dXJuIGJ1aWxkX2NvbnRleHQKKyAgICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXS5hcHBlbmQoCisgICAgICAgICAgeyduYW1lJzogJ29wdGltaXplZF9idWlsZCd9CisgICAgICApCisgICAgYnVpbGRfY29udGV4dF9kaWN0Wyd0ZXN0Q29udGV4dCddID0gdGVzdF9jb250ZXh0CisgICAgcmV0dXJuIEJ1aWxkQ29udGV4dChidWlsZF9jb250ZXh0X2RpY3QpCiAKICAgZGVmIGNyZWF0ZV9hcmdzKAogICAgICAgc2VsZiwgZXh0cmFfYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0gPSBzZXQoKQpAQCAtMzY2LDE5ICs0NzEsMTcgQEAKICAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoZXh0cmFfYnVpbGRfdGFyZ2V0cykKIAogICBkZWYgY3JlYXRlX3RhcmdldF9vcHRpbWl6YXRpb25zKAotICAgICAgc2VsZiwgYnVpbGRfY29udGV4dDogZGljdFtzdHIsIGFueV0sIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdCisgICAgICBzZWxmLAorICAgICAgYnVpbGRfY29udGV4dDogQnVpbGRDb250ZXh0LAorICAgICAgYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0sCisgICAgICBwYWNrYWdpbmdfY29tbWFuZHM6IGxpc3RbbGlzdFtzdHJdXSA9IFtdLAogICApOgogICAgIHRhcmdldF9vcHRpbWl6YXRpb25zID0gZGljdCgpCiAgICAgZm9yIHRhcmdldCBpbiBidWlsZF90YXJnZXRzOgotICAgICAgdGFyZ2V0X29wdGltaXphdGlvbnNbdGFyZ2V0XSA9ICgKLSAgICAgICAgICBsYW1iZGEgdGFyZ2V0LCBidWlsZF9jb250ZXh0LCBhcmdzOiBvcHRpbWl6ZWRfdGFyZ2V0cy5nZXRfdGFyZ2V0X29wdGltaXplcigKLSAgICAgICAgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICBzZWxmLmdldF90YXJnZXRfZmxhZyh0YXJnZXQpLAotICAgICAgICAgICAgICBidWlsZF9jb250ZXh0LAotICAgICAgICAgICAgICBzZWxmLlRlc3RPcHRpbWl6ZWRCdWlsZFRhcmdldCgKLSAgICAgICAgICAgICAgICAgIHtzZWxmLmdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUodGFyZ2V0KX0KLSAgICAgICAgICAgICAgKSwKLSAgICAgICAgICApCisgICAgICB0YXJnZXRfb3B0aW1pemF0aW9uc1t0YXJnZXRdID0gZnVuY3Rvb2xzLnBhcnRpYWwoCisgICAgICAgICAgc2VsZi5UZXN0T3B0aW1pemVkQnVpbGRUYXJnZXQsCisgICAgICAgICAgb3V0cHV0X3RhcmdldHM9e3NlbGYuZ2V0X29wdGltaXplZF90YXJnZXRfbmFtZSh0YXJnZXQpfSwKKyAgICAgICAgICBwYWNrYWdpbmdfY29tbWFuZHM9cGFja2FnaW5nX2NvbW1hbmRzLAogICAgICAgKQogCiAgICAgcmV0dXJuIHRhcmdldF9vcHRpbWl6YXRpb25zCkBAIC0zODksMTQgKzQ5MiwzMCBAQAogICBkZWYgZ2V0X29wdGltaXplZF90YXJnZXRfbmFtZShzZWxmLCB0YXJnZXQ6IHN0cik6CiAgICAgcmV0dXJuIGYne3RhcmdldH1fb3B0aW1pemVkJwogCi0gIGRlZiBydW5fcGFja2FnaW5nX2Z1bmN0aW9ucygKLSAgICAgIHNlbGYsIGJ1aWxkX3BsYW46IGJ1aWxkX3Rlc3Rfc3VpdGVzLkJ1aWxkUGxhbgotICApIC0+IHNldFtzdHJdOgotICAgIG91dHB1dCA9IHNldCgpCi0gICAgZm9yIHBhY2thZ2luZ19mdW5jdGlvbiBpbiBidWlsZF9wbGFuLnBhY2thZ2luZ19mdW5jdGlvbnM6Ci0gICAgICBvdXRwdXQuYWRkKHBhY2thZ2luZ19mdW5jdGlvbigpKQorICBkZWYgZ2V0X3Rlc3RfY29udGV4dChzZWxmLCB0YXJnZXQ6IHN0cik6CisgICAgcmV0dXJuIHsKKyAgICAgICAgJ3Rlc3RJbmZvcyc6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6ICdhdHBfdGVzdCcsCisgICAgICAgICAgICAgICAgJ3RhcmdldCc6ICd0ZXN0X3RhcmdldCcsCisgICAgICAgICAgICAgICAgJ2JyYW5jaCc6ICdicmFuY2gnLAorICAgICAgICAgICAgICAgICdleHRyYU9wdGlvbnMnOiBbeworICAgICAgICAgICAgICAgICAgICAna2V5JzogJ2FkZGl0aW9uYWwtZmlsZXMtZmlsdGVyJywKKyAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyc6IFtmJ3t0YXJnZXR9LnppcCddLAorICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICdjb21tYW5kJzogJy90Zi9jb21tYW5kJywKKyAgICAgICAgICAgICAgICAnZXh0cmFCdWlsZFRhcmdldHMnOiBbCisgICAgICAgICAgICAgICAgICAgICdleHRyYV9idWlsZF90YXJnZXQnLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICBdLAorICAgIH0KIAotICAgIHJldHVybiBvdXRwdXQKKyAgZGVmIHJ1bl9wYWNrYWdpbmdfY29tbWFuZHMoc2VsZiwgYnVpbGRfcGxhbjogYnVpbGRfdGVzdF9zdWl0ZXMuQnVpbGRQbGFuKToKKyAgICByZXR1cm4gWworICAgICAgICBwYWNrYWdpbmdfY29tbWFuZF9nZXR0ZXIoKQorICAgICAgICBmb3IgcGFja2FnaW5nX2NvbW1hbmRfZ2V0dGVyIGluIGJ1aWxkX3BsYW4ucGFja2FnaW5nX2NvbW1hbmRzX2dldHRlcnMKKyAgICBdCiAKIAogZGVmIHdhaXRfdW50aWwoCmRpZmYgLS1naXQgYS9jaS9idWlsZGJvdC5weSBiL2NpL2J1aWxkYm90LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDk3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9idWlsZGJvdC5weQpAQCAtMCwwICsxLDQzIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlV0aWxpdGllcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBidWlsZGJvdCwgd2l0aCBhIHNpbXVsYXRpb24gaW4gYSBsb2NhbCBlbnZpcm9ubWVudCIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworIyBDaGVjayB0aGF0IHRoZSBzY3JpcHQgaXMgcnVubmluZyBmcm9tIHRoZSByb290IG9mIHRoZSB0cmVlLiBQcmV2ZW50cyBzdWJ0bGUKKyMgZXJyb3JzIGxhdGVyLCBhbmQgQ0kgYWx3YXlzIHJ1bnMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KK2lmIG5vdCBvcy5wYXRoLmV4aXN0cygiYnVpbGQvbWFrZS9jaS9idWlsZGJvdC5weSIpOgorICAgIHJhaXNlIEV4Y2VwdGlvbigiQ0kgc2NyaXB0IG11c3QgYmUgcnVuIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZjogIgorICAgICAgICAgICAgICAgICAgICArIG9zLmdldGN3ZCgpKQorCisjIENoZWNrIHRoYXQgd2UgYXJlIHVzaW5nIHRoZSBoZXJtZXRpYyBpbnRlcnByZXRlcgoraWYgInByZWJ1aWx0cy9idWlsZC10b29scy8iIG5vdCBpbiBzeXMuZXhlY3V0YWJsZToKKyAgICByYWlzZSBFeGNlcHRpb24oIkNJIHNjcmlwdCBtdXN0IGJlIHJ1biB1c2luZyB0aGUgaGVybWV0aWMgaW50ZXJwcmV0ZXIgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICsgInByZWJ1aWx0cy9idWlsZC10b29scyBpbnN0ZWFkIG9mOiAiICsgc3lzLmV4ZWN1dGFibGUpCisKKworZGVmIE91dERpcigpOgorICAgICJHZXQgdGhlIG91dCBkaXJlY3RvcnkuIFdpbGwgY3JlYXRlIGl0IGlmIG5lZWRlZC4iCisgICAgcmVzdWx0ID0gb3MuZW52aXJvbi5nZXQoIk9VVF9ESVIiLCAib3V0IikKKyAgICBvcy5tYWtlZGlycyhyZXN1bHQsIGV4aXN0X29rPVRydWUpCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgRGlzdERpcigpOgorICAgICJHZXQgdGhlIGRpc3QgZGlyZWN0b3J5LiBXaWxsIGNyZWF0ZSBpdCBpZiBuZWVkZWQuIgorICAgIHJlc3VsdCA9IG9zLmVudmlyb24uZ2V0KCJESVNUX0RJUiIsIG9zLnBhdGguam9pbihPdXREaXIoKSwgImRpc3QiKSkKKyAgICBvcy5tYWtlZGlycyhyZXN1bHQsIGV4aXN0X29rPVRydWUpCisgICAgcmV0dXJuIHJlc3VsdAorCmRpZmYgLS1naXQgYS9jaS9kdW1wX3Byb2R1Y3RfY29uZmlnIGIvY2kvZHVtcF9wcm9kdWN0X2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43N2I1MWRkCi0tLSAvZGV2L251bGwKKysrIGIvY2kvZHVtcF9wcm9kdWN0X2NvbmZpZwpAQCAtMCwwICsxLDM1MyBAQAorIyFwcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9weTMtY21kIC1CCisKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiU2NyaXB0IHRvIGNvbGxlY3QgYWxsIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBmcm9tIGFsbCBwcm9kdWN0IGNvbmZpZyBjb21ib3MuCisKK1RoaXMgc2NyaXB0IG11c3QgYmUgcnVuIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorCitTZWUgR2V0QXJncygpIGJlbG93IG9yIHJ1biBkdW1wX3Byb2R1Y3RfY29uZmlnIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGFzeW5jaW8KK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgY3N2CitpbXBvcnQgZGF0YWNsYXNzZXMKK2ltcG9ydCBqc29uCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIERpY3QsIFR1cGxlLCBPcHRpb25hbAorCitpbXBvcnQgYnVpbGRib3QKKworIyBXZSBoYXZlIHNvbWUgQklHIHZhcmlhYmxlcworY3N2LmZpZWxkX3NpemVfbGltaXQoc3lzLm1heHNpemUpCisKKworY2xhc3MgRGF0YWNsYXNzSlNPTkVuY29kZXIoanNvbi5KU09ORW5jb2Rlcik6CisgICAgIiIiSlNPTkVuY29kZXIgZm9yIG91ciBjdXN0b20gdHlwZXMuIiIiCisgICAgZGVmIGRlZmF1bHQoc2VsZiwgbyk6CisgICAgICAgIGlmIGRhdGFjbGFzc2VzLmlzX2RhdGFjbGFzcyhvKToKKyAgICAgICAgICAgIHJldHVybiBkYXRhY2xhc3Nlcy5hc2RpY3QobykKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuZGVmYXVsdChvKQorCisKK2RlZiBHZXRQcm9kdWN0cygpOgorICAgICIiIkdldCB0aGUgYWxsIG9mIHRoZSBhdmFpbGFibGUgVEFSR0VUX1BST0RVQ1QgdmFsdWVzLiIiIgorICAgIHRyeToKKyAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWyJidWlsZC9zb29uZy9iaW4vbGlzdF9wcm9kdWN0cyJdLCB0ZXh0PVRydWUpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgorICAgICAgICBzeXMuZXhpdCgxKQorICAgIHJldHVybiBbcy5zdHJpcCgpIGZvciBzIGluIHN0ZG91dC5zcGxpdGxpbmVzKCkgaWYgcy5zdHJpcCgpXQorCisKK2RlZiBHZXRSZWxlYXNlcyhwcm9kdWN0KToKKyAgICAiIiJGb3IgYSBnaXZlbiBwcm9kdWN0LCBnZXQgdGhlIHJlbGVhc2UgY29uZmlncyBhdmFpbGFibGUgdG8gaXQuIiIiCisgICAgaWYgVHJ1ZToKKyAgICAgICAgIyBIYXJkIGNvZGUgdGhlIGxpc3QKKyAgICAgICAgbWFpbmxpbmVfcHJvZHVjdHMgPSBbCisgICAgICAgICAgICAibW9kdWxlX2FybSIsCisgICAgICAgICAgICAibW9kdWxlX3g4NiIsCisgICAgICAgICAgICAibW9kdWxlX2FybTY0IiwKKyAgICAgICAgICAgICJtb2R1bGVfcmlzY3Y2NCIsCisgICAgICAgICAgICAibW9kdWxlX3g4Nl82NCIsCisgICAgICAgICAgICAibW9kdWxlX2FybTY0b25seSIsCisgICAgICAgICAgICAibW9kdWxlX3g4Nl82NG9ubHkiLAorICAgICAgICBdCisgICAgICAgIGlmIHByb2R1Y3QgaW4gbWFpbmxpbmVfcHJvZHVjdHM6CisgICAgICAgICAgICByZXR1cm4gWyJ0cnVua19zdGFnaW5nIiwgInRydW5rIiwgIm1haW5saW5lIl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbInRydW5rX3N0YWdpbmciLCAidHJ1bmsiLCAibmV4dCJdCisgICAgZWxzZToKKyAgICAgICAgIyBHZXQgaXQgZnJvbSB0aGUgYnVpbGQgc3lzdGVtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0ZG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsiYnVpbGQvc29vbmcvYmluL2xpc3RfcmVsZWFzZXMiLCBwcm9kdWN0XSwgdGV4dD1UcnVlKQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3I6CisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICByZXR1cm4gW3Muc3RyaXAoKSBmb3IgcyBpbiBzdGRvdXQuc3BsaXRsaW5lcygpIGlmIHMuc3RyaXAoKV0KKworCitkZWYgR2VuZXJhdGVBbGxMdW5jaFRhcmdldHMoKToKKyAgICAiIiJHZW5lcmF0ZSB0aGUgZnVsbCBsaXN0IG9mIGx1bmNoIHRhcmdldHMuIiIiCisgICAgZm9yIHByb2R1Y3QgaW4gR2V0UHJvZHVjdHMoKToKKyAgICAgICAgZm9yIHJlbGVhc2UgaW4gR2V0UmVsZWFzZXMocHJvZHVjdCk6CisgICAgICAgICAgICBmb3IgdmFyaWFudCBpbiBbInVzZXIiLCAidXNlcmRlYnVnIiwgImVuZyJdOgorICAgICAgICAgICAgICAgIHlpZWxkIChwcm9kdWN0LCByZWxlYXNlLCB2YXJpYW50KQorCisKK2FzeW5jIGRlZiBQYXJhbGxlbEV4ZWMocGFyYWxsZWxpc20sIHRhc2tzKToKKyAgICAnJycKKyAgICBQYXJhbGxlbEV4ZWMgdGFrZXMgYSBwYXJhbGxlbGlzbSBudW1iZXIsIGFuZCBhbiBpdGVyYXRvciBvZiB0YXNrcyB0byBydW4uCisgICAgVGhlbiBpdCB3aWxsIHJ1biBhbGwgdGhlIHRhc2tzLCBidXQgYSBtYXhpbXVtIG9mIHBhcmFsbGVsaXNtIHdpbGwgYmUgcnVuIGF0CisgICAgYW55IGdpdmVuIHRpbWUuIFRoZSB0YXNrcyBtdXN0IGJlIGFzeW5jIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBvbmUgYXJndW1lbnQsCisgICAgd2hpY2ggd2lsbCBiZSBhbiBpbnRlZ2VyIGlkIG9mIHRoZSB3b3JrZXIgdGhhdCB0aGV5J3JlIHJ1bm5pbmcgb24uCisgICAgJycnCisgICAgdGFza3MgPSBpdGVyKHRhc2tzKQorCisgICAgb3ZlcmFsbF9zdGFydCA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAjIGxpc3RzIHNvIHRoZXkgY2FuIGJlIG1vZGlmaWVkIGZyb20gdGhlIGlubmVyIGZ1bmN0aW9uCisgICAgdG90YWxfZHVyYXRpb24gPSBbMF0KKyAgICBjb3VudCA9IFswXQorICAgIGFzeW5jIGRlZiBkaXNwYXRjaCh3b3JrZXIpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhc2sgPSBuZXh0KHRhc2tzKQorICAgICAgICAgICAgICAgIGl0ZW1fc3RhcnQgPSB0aW1lLm1vbm90b25pYygpCisgICAgICAgICAgICAgICAgYXdhaXQgdGFzayh3b3JrZXIpCisgICAgICAgICAgICAgICAgbm93ID0gdGltZS5tb25vdG9uaWMoKQorICAgICAgICAgICAgICAgIGl0ZW1fZHVyYXRpb24gPSBub3cgLSBpdGVtX3N0YXJ0CisgICAgICAgICAgICAgICAgY291bnRbMF0gKz0gMQorICAgICAgICAgICAgICAgIHRvdGFsX2R1cmF0aW9uWzBdICs9IGl0ZW1fZHVyYXRpb24KKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiVGltaW5nOiBJdGVtcyBwcm9jZXNzZWQ6IHtjb3VudFswXX0sIFdhbGwgdGltZToge25vdy1vdmVyYWxsX3N0YXJ0OjAuMWZ9IHNlYywgVGhyb3VnaHB1dDogeyhub3ctb3ZlcmFsbF9zdGFydCkvY291bnRbMF06MC4zZn0gc2VjIHBlciBpdGVtLCBBdmVyYWdlIGR1cmF0aW9uOiB7dG90YWxfZHVyYXRpb25bMF0vY291bnRbMF06MC4xZn0gc2VjXG4iKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBhd2FpdCBhc3luY2lvLmdhdGhlcigqW2Rpc3BhdGNoKHdvcmtlcikgZm9yIHdvcmtlciBpbiByYW5nZShwYXJhbGxlbGlzbSldKQorCisKK2FzeW5jIGRlZiBEdW1wUHJvZHVjdENvbmZpZ3Mob3V0LCBnZW5lcmF0b3IsIG91dF9kaXIpOgorICAgICIiIkNvbGxlY3RzIGFsbCBvZiB0aGUgcHJvZHVjdCBjb25maWcgZGF0YSBhbmQgc3RvcmUgaXQgaW4gZmlsZS4iIiIKKyAgICAjIFdyaXRlIHRoZSBvdXRlciBqc29uIGxpc3QgYnkgaGFuZCBzbyB3ZSBjYW4gc3RyZWFtIGl0CisgICAgb3V0LndyaXRlKCJbIikKKyAgICB0cnk6CisgICAgICAgIGZpcnN0X3Jlc3VsdCA9IFtUcnVlXSAjIGEgbGlzdCBzbyBpdCBjYW4gYmUgbW9kaWZpZWQgZnJvbSB0aGUgaW5uZXIgZnVuY3Rpb24KKyAgICAgICAgZGVmIHJ1bihsdW5jaCk6CisgICAgICAgICAgICBhc3luYyBkZWYgY3VycmllZCh3b3JrZXIpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJydW5uaW5nOiB7Jy0nLmpvaW4obHVuY2gpfVxuIikKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBEdW1wT25lUHJvZHVjdENvbmZpZyhsdW5jaCwgb3MucGF0aC5qb2luKG91dF9kaXIsIGYibHVuY2hhYmxlX3t3b3JrZXJ9IikpCisgICAgICAgICAgICAgICAgaWYgZmlyc3RfcmVzdWx0WzBdOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfcmVzdWx0WzBdID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIixcbiIpCisgICAgICAgICAgICAgICAgcmVzdWx0LmR1bXBUb0ZpbGUob3V0KQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJmaW5pc2hlZDogeyctJy5qb2luKGx1bmNoKX1cbiIpCisgICAgICAgICAgICByZXR1cm4gY3VycmllZAorCisgICAgICAgIGF3YWl0IFBhcmFsbGVsRXhlYyhtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCksIChydW4obHVuY2gpIGZvciBsdW5jaCBpbiBnZW5lcmF0b3IpKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgQ2xvc2UgdGhlIGpzb24gcmVnYXJkbGVzcyBvZiBob3cgd2UgZXhpdAorICAgICAgICBvdXQud3JpdGUoIlxuXVxuIikKKworCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgVmFyaWFibGU6CisgICAgIiIiQSB2YXJpYWJsZSBuYW1lLCB2YWx1ZSBhbmQgd2hlcmUgaXQgd2FzIHNldC4iIiIKKyAgICBuYW1lOiBzdHIKKyAgICB2YWx1ZTogc3RyCisgICAgbG9jYXRpb246IHN0cgorCisKK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MoZnJvemVuPVRydWUpCitjbGFzcyBQcm9kdWN0UmVzdWx0OgorICAgIHByb2R1Y3Q6IHN0cgorICAgIHJlbGVhc2U6IHN0cgorICAgIHZhcmlhbnQ6IHN0cgorICAgIGJvYXJkX2luY2x1ZGVzOiBMaXN0W3N0cl0KKyAgICBwcm9kdWN0X2luY2x1ZGVzOiBEaWN0W3N0ciwgTGlzdFtzdHJdXQorICAgIHByb2R1Y3RfZ3JhcGg6IExpc3RbVHVwbGVbc3RyLCBzdHJdXQorICAgIGJvYXJkX3ZhcnM6IExpc3RbVmFyaWFibGVdCisgICAgcHJvZHVjdF92YXJzOiBMaXN0W1ZhcmlhYmxlXQorCisgICAgZGVmIGR1bXBUb0ZpbGUoc2VsZiwgZik6CisgICAgICAgIGpzb24uZHVtcChzZWxmLCBmLCBzb3J0X2tleXM9VHJ1ZSwgaW5kZW50PTIsIGNscz1EYXRhY2xhc3NKU09ORW5jb2RlcikKKworCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgUHJvZHVjdEVycm9yOgorICAgIHByb2R1Y3Q6IHN0cgorICAgIHJlbGVhc2U6IHN0cgorICAgIHZhcmlhbnQ6IHN0cgorICAgIGVycm9yOiBzdHIKKworICAgIGRlZiBkdW1wVG9GaWxlKHNlbGYsIGYpOgorICAgICAgICBqc29uLmR1bXAoc2VsZiwgZiwgc29ydF9rZXlzPVRydWUsIGluZGVudD0yLCBjbHM9RGF0YWNsYXNzSlNPTkVuY29kZXIpCisKKworZGVmIE5vcm1hbGl6ZUluaGVyaXRHcmFwaChsaXN0cyk6CisgICAgIiIiRmxhdHRlbiB0aGUgaW5oZXJpdGFuY2UgZ3JhcGggdG8gYSBzaW1wbGUgbGlzdCBmb3IgZWFzaWVyIHF1ZXJ5aW5nLiIiIgorICAgIHJlc3VsdCA9IHNldCgpCisgICAgZm9yIGl0ZW0gaW4gbGlzdHM6CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtKSk6CisgICAgICAgICAgICByZXN1bHQuYWRkKChpdGVtW2krMV0gaWYgaSA8IGxlbihpdGVtKS0xIGVsc2UgIiIsIGl0ZW1baV0pKQorICAgIHJldHVybiBzb3J0ZWQobGlzdChyZXN1bHQpKQorCisKK2RlZiBQYXJzZUR1bXAobHVuY2gsIGZpbGVuYW1lKSAtPiBQcm9kdWN0UmVzdWx0OgorICAgICIiIlBhcnNlcyB0aGUgY3N2IGFuZCByZXR1cm5zIGEgdHVwbGUgb2YgdGhlIGRhdGEuIiIiCisgICAgZGVmIGRpZmYoaW5pdGlhbCwgZmluYWwpOgorICAgICAgICByZXR1cm4gW2FmdGVyIGZvciBhZnRlciBpbiBmaW5hbC52YWx1ZXMoKSBpZgorICAgICAgICAgICAgICAgIGluaXRpYWwuZ2V0KGFmdGVyLm5hbWUsIFZhcmlhYmxlKGFmdGVyLm5hbWUsICIiLCAiPHVuc2V0PiIpKS52YWx1ZSAhPSBhZnRlci52YWx1ZV0KKyAgICBwcm9kdWN0X2luaXRpYWwgPSB7fQorICAgIHByb2R1Y3RfZmluYWwgPSB7fQorICAgIGJvYXJkX2luaXRpYWwgPSB7fQorICAgIGJvYXJkX2ZpbmFsID0ge30KKyAgICBpbmhlcml0X3Byb2R1Y3QgPSBbXSAjIFRoZSBzdGFjayBvZiBpbmhlcml0LXByb2R1Y3QgY2FsbHMKKyAgICBwcm9kdWN0X2luY2x1ZGVzID0ge30gIyBPdGhlciBmaWxlcyBpbmNsdWRlZCBieSBlYWNoIG9mIHRoZSBwcm9wZXJseSBpbXBvcnRlZCBmaWxlcworICAgIGJvYXJkX2luY2x1ZGVzID0gW10gIyBGaWxlcyBpbmNsdWRlZCBieSBib2FyZGNvbmZpZworICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZjoKKyAgICAgICAgcGhhc2UgPSAiIgorICAgICAgICBmb3IgbGluZSBpbiBjc3YucmVhZGVyKGYpOgorICAgICAgICAgICAgaWYgbGluZVswXSA9PSAicGhhc2UiOgorICAgICAgICAgICAgICAgIHBoYXNlID0gbGluZVsxXQorICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICJ2YWwiOgorICAgICAgICAgICAgICAgICMgVE9PRDogV2Ugc2hvdWxkIHNraXAgdGhlc2Ugc29tZXdoZXJlIGVsc2UuCisgICAgICAgICAgICAgICAgaWYgbGluZVszXS5zdGFydHN3aXRoKCJfQUxMX1JFTEVBU0VfRkxBR1MiKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBsaW5lWzNdLnN0YXJ0c3dpdGgoIlBST0RVQ1RTLiIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHBoYXNlID09ICJQUk9EVUNUUyI6CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVbMl0gPT0gImluaXRpYWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pbml0aWFsW2xpbmVbM11dID0gVmFyaWFibGUobGluZVszXSwgbGluZVs0XSwgbGluZVs1XSkKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSAiUFJPRFVDVC1FWFBBTkQiOgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzJdID09ICJmaW5hbCI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2ZpbmFsW2xpbmVbM11dID0gVmFyaWFibGUobGluZVszXSwgbGluZVs0XSwgbGluZVs1XSkKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSAiQk9BUkQiOgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzJdID09ICJpbml0aWFsIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkX2luaXRpYWxbbGluZVszXV0gPSBWYXJpYWJsZShsaW5lWzNdLCBsaW5lWzRdLCBsaW5lWzVdKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzJdID09ICJmaW5hbCI6CisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZF9maW5hbFtsaW5lWzNdXSA9IFZhcmlhYmxlKGxpbmVbM10sIGxpbmVbNF0sIGxpbmVbNV0pCisgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gImltcG9ydGVkIjoKKyAgICAgICAgICAgICAgICBpbXBvcnRzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBsaW5lWzFdLnNwbGl0KCldCisgICAgICAgICAgICAgICAgaWYgaW1wb3J0czoKKyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdF9wcm9kdWN0LmFwcGVuZChpbXBvcnRzKQorICAgICAgICAgICAgICAgICAgICBpbmMgPSBbcy5zdHJpcCgpIGZvciBzIGluIGxpbmVbMl0uc3BsaXQoKV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gaW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pbmNsdWRlcy5zZXRkZWZhdWx0KGltcG9ydHNbMF0sIFtdKS5hcHBlbmQoZikKKyAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAiYm9hcmRfY29uZmlnX2ZpbGVzIjoKKyAgICAgICAgICAgICAgICBib2FyZF9pbmNsdWRlcyArPSBbcy5zdHJpcCgpIGZvciBzIGluIGxpbmVbMV0uc3BsaXQoKV0KKyAgICByZXR1cm4gUHJvZHVjdFJlc3VsdCgKKyAgICAgICAgcHJvZHVjdCA9IGx1bmNoWzBdLAorICAgICAgICByZWxlYXNlID0gbHVuY2hbMV0sCisgICAgICAgIHZhcmlhbnQgPSBsdW5jaFsyXSwKKyAgICAgICAgcHJvZHVjdF92YXJzID0gZGlmZihwcm9kdWN0X2luaXRpYWwsIHByb2R1Y3RfZmluYWwpLAorICAgICAgICBib2FyZF92YXJzID0gZGlmZihib2FyZF9pbml0aWFsLCBib2FyZF9maW5hbCksCisgICAgICAgIHByb2R1Y3RfZ3JhcGggPSBOb3JtYWxpemVJbmhlcml0R3JhcGgoaW5oZXJpdF9wcm9kdWN0KSwKKyAgICAgICAgcHJvZHVjdF9pbmNsdWRlcyA9IHByb2R1Y3RfaW5jbHVkZXMsCisgICAgICAgIGJvYXJkX2luY2x1ZGVzID0gYm9hcmRfaW5jbHVkZXMKKyAgICApCisKKworYXN5bmMgZGVmIER1bXBPbmVQcm9kdWN0Q29uZmlnKGx1bmNoLCBvdXRfZGlyKSAtPiBQcm9kdWN0UmVzdWx0IHwgUHJvZHVjdEVycm9yOgorICAgICIiIlByaW50IGEgc2luZ2xlIGNvbmZpZydzIGx1bmNoIGluZm8gdG8gc3Rkb3V0LiIiIgorICAgIHByb2R1Y3QsIHJlbGVhc2UsIHZhcmlhbnQgPSBsdW5jaAorCisgICAgZHVtcGNvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKG91dF9kaXIsIGYie3Byb2R1Y3R9LXtyZWxlYXNlfS17dmFyaWFudH0uY3N2IikKKworICAgICMgUnVuIGdldF9idWlsZF92YXIgdG8gYm9vdHN0cmFwIHNvb25nX3VpIGZvciB0aGlzIHRhcmdldAorICAgIGVudiA9IGRpY3Qob3MuZW52aXJvbikKKyAgICBlbnZbIlRBUkdFVF9QUk9EVUNUIl0gPSBwcm9kdWN0CisgICAgZW52WyJUQVJHRVRfUkVMRUFTRSJdID0gcmVsZWFzZQorICAgIGVudlsiVEFSR0VUX0JVSUxEX1ZBUklBTlQiXSA9IHZhcmlhbnQKKyAgICBlbnZbIk9VVF9ESVIiXSA9IG91dF9kaXIKKyAgICBwcm9jZXNzID0gYXdhaXQgYXN5bmNpby5jcmVhdGVfc3VicHJvY2Vzc19leGVjKAorICAgICAgICAiYnVpbGQvc29vbmcvYmluL2dldF9idWlsZF92YXIiLAorICAgICAgICAiVEFSR0VUX1BST0RVQ1QiLAorICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgIGVudj1lbnYKKyAgICApCisgICAgc3Rkb3V0LCBfID0gYXdhaXQgcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgc3Rkb3V0ID0gc3Rkb3V0LmRlY29kZSgpCisKKyAgICBpZiBwcm9jZXNzLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgcmV0dXJuIFByb2R1Y3RFcnJvcigKKyAgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0LAorICAgICAgICAgICAgcmVsZWFzZSA9IHJlbGVhc2UsCisgICAgICAgICAgICB2YXJpYW50ID0gdmFyaWFudCwKKyAgICAgICAgICAgIGVycm9yID0gc3Rkb3V0CisgICAgICAgICkKKyAgICBlbHNlOgorICAgICAgICAjIFJ1biBrYXRpIHRvIGV4dHJhY3QgdGhlIGRhdGEKKyAgICAgICAgcHJvY2VzcyA9IGF3YWl0IGFzeW5jaW8uY3JlYXRlX3N1YnByb2Nlc3NfZXhlYygKKyAgICAgICAgICAgICJwcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9ja2F0aSIsCisgICAgICAgICAgICAiLWYiLAorICAgICAgICAgICAgImJ1aWxkL21ha2UvY29yZS9kdW1wY29uZmlnLm1rIiwKKyAgICAgICAgICAgIGYiVEFSR0VUX1BST0RVQ1Q9e3Byb2R1Y3R9IiwKKyAgICAgICAgICAgIGYiVEFSR0VUX1JFTEVBU0U9e3JlbGVhc2V9IiwKKyAgICAgICAgICAgIGYiVEFSR0VUX0JVSUxEX1ZBUklBTlQ9e3ZhcmlhbnR9IiwKKyAgICAgICAgICAgIGYiRFVNUENPTkZJR19GSUxFPXtkdW1wY29uZmlnX2ZpbGV9IiwKKyAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICBlbnY9ZW52CisgICAgICAgICkKKyAgICAgICAgc3Rkb3V0LCBfID0gYXdhaXQgcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgIGlmIHByb2Nlc3MucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmRlY29kZSgpCisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdEVycm9yKAorICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0LAorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSByZWxlYXNlLAorICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB2YXJpYW50LAorICAgICAgICAgICAgICAgIGVycm9yID0gc3Rkb3V0CisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcnNlIGFuZCByZWNvcmQgdGhlIG91dHB1dAorICAgICAgICAgICAgcmV0dXJuIFBhcnNlRHVtcChsdW5jaCwgZHVtcGNvbmZpZ19maWxlKQorCisKK2RlZiBHZXRBcmdzKCk6CisgICAgIiIiUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4iIiIKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb2xsZWN0IGFsbCBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgZnJvbSBwcm9kdWN0IGNvbmZpZy4iLAorICAgICAgICAgICAgZXBpbG9nPSJOT1RFOiBUaGlzIHNjcmlwdCBtdXN0IGJlIHJ1biBmcm9tIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbHVuY2giLCBuYXJncz0iKiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1kaXN0IiwgYWN0aW9uPSJzdG9yZV90cnVlIikKKworICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCisKKworYXN5bmMgZGVmIG1haW4oKToKKyAgICBhcmdzID0gR2V0QXJncygpCisKKyAgICBvdXRfZGlyID0gYnVpbGRib3QuT3V0RGlyKCkKKworICAgIGlmIGFyZ3MuZGlzdDoKKyAgICAgICAgY20gPSBvcGVuKG9zLnBhdGguam9pbihidWlsZGJvdC5EaXN0RGlyKCksICJhbGxfcHJvZHVjdF9jb25maWcuanNvbiIpLCAidyIpCisgICAgZWxzZToKKyAgICAgICAgY20gPSBjb250ZXh0bGliLm51bGxjb250ZXh0KHN5cy5zdGRvdXQpCisKKworICAgIHdpdGggY20gYXMgb3V0OgorICAgICAgICBpZiBhcmdzLmx1bmNoOgorICAgICAgICAgICAgbHVuY2hlcyA9IFtsdW5jaC5zcGxpdCgiLSIpIGZvciBsdW5jaCBpbiBhcmdzLmx1bmNoXQorICAgICAgICAgICAgZmFpbCA9IEZhbHNlCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obHVuY2hlcykpOgorICAgICAgICAgICAgICAgIGlmIGxlbihsdW5jaGVzW2ldKSAhPSAzOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiTWFsZm9ybWVkIGx1bmNoIHRhcmdldHM6IHthcmdzLmx1bmNoW2ldfVxuIikKKyAgICAgICAgICAgICAgICAgICAgZmFpbCA9IFRydWUKKyAgICAgICAgICAgIGlmIGZhaWw6CisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgICAgIGlmIGxlbihsdW5jaGVzKSA9PSAxOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IER1bXBPbmVQcm9kdWN0Q29uZmlnKGx1bmNoZXNbMF0sIG91dF9kaXIpCisgICAgICAgICAgICAgICAgcmVzdWx0LmR1bXBUb0ZpbGUob3V0KQorICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhd2FpdCBEdW1wUHJvZHVjdENvbmZpZ3Mob3V0LCBsdW5jaGVzLCBvdXRfZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBbGwgY29uZmlncyBtb2RlLiBUaGlzIHdpbGwgZXhlYyBzaW5nbGUgY29uZmlnIG1vZGUgaW4gcGFyYWxsZWwKKyAgICAgICAgICAgICMgZm9yIGVhY2ggbHVuY2ggY29tYm8uIFdyaXRlIG91dHB1dCB0byAkRElTVF9ESVIuCisgICAgICAgICAgICBhd2FpdCBEdW1wUHJvZHVjdENvbmZpZ3Mob3V0LCBHZW5lcmF0ZUFsbEx1bmNoVGFyZ2V0cygpLCBvdXRfZGlyKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgYXN5bmNpby5ydW4obWFpbigpKQorCisKKyMgdmltOiBzZXQgc3ludGF4PXB5dGhvbiB0cz00IHN3PTQgc3RzPTQ6CisKZGlmZiAtLWdpdCBhL2NpL21ldHJpY3NfYWdlbnQucHkgYi9jaS9tZXRyaWNzX2FnZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjQ3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9tZXRyaWNzX2FnZW50LnB5CkBAIC0wLDAgKzEsMTE2IEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIk1ldHJpY3NBZ2VudCBpcyBhIHNpbmdsZXRvbiBjbGFzcyB0aGF0IGNvbGxlY3RzIG1ldHJpY3MgZm9yIG9wdGltaXplZCBidWlsZC4iIiIKKworZnJvbSBlbnVtIGltcG9ydCBFbnVtCitpbXBvcnQgdGltZQoraW1wb3J0IG1ldHJpY3NfcGIyCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCisKKworY2xhc3MgTWV0cmljc0FnZW50OgorICBfU09PTkdfTUVUUklDU19QQVRIID0gJ2xvZ3Mvc29vbmdfbWV0cmljcycKKyAgX0RJU1RfRElSID0gJ0RJU1RfRElSJworICBfaW5zdGFuY2UgPSBOb25lCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgJ01ldHJpY3NBZ2VudCBjYW5ub3QgYmUgaW5zdGFudGlhbGl6ZWQsIHVzZSBpbnN0YW5jZSgpIGluc3RlYWQnCisgICAgKQorCisgIEBjbGFzc21ldGhvZAorICBkZWYgaW5zdGFuY2UoY2xzKToKKyAgICBpZiBub3QgY2xzLl9pbnN0YW5jZToKKyAgICAgIGNscy5faW5zdGFuY2UgPSBjbHMuX19uZXdfXyhjbHMpCisgICAgICBjbHMuX2luc3RhbmNlLl9wcm90byA9IG1ldHJpY3NfcGIyLk9wdGltaXplZEJ1aWxkTWV0cmljcygpCisgICAgICBjbHMuX2luc3RhbmNlLl9pbml0X3Byb3RvKCkKKyAgICAgIGNscy5faW5zdGFuY2UuX3RhcmdldF9yZXN1bHRzID0gZGljdCgpCisKKyAgICByZXR1cm4gY2xzLl9pbnN0YW5jZQorCisgIGRlZiBfaW5pdF9wcm90byhzZWxmKToKKyAgICBzZWxmLl9wcm90by5hbmFseXNpc19wZXJmLm5hbWUgPSAnT3B0aW1pemVkIGJ1aWxkIGFuYWx5c2lzIHRpbWUuJworICAgIHNlbGYuX3Byb3RvLnBhY2thZ2luZ19wZXJmLm5hbWUgPSAnT3B0aW1pemVkIGJ1aWxkIHRvdGFsIHBhY2thZ2luZyB0aW1lLicKKworICBkZWYgYW5hbHlzaXNfc3RhcnQoc2VsZik6CisgICAgc2VsZi5fcHJvdG8uYW5hbHlzaXNfcGVyZi5zdGFydF90aW1lID0gdGltZS50aW1lX25zKCkKKworICBkZWYgYW5hbHlzaXNfZW5kKHNlbGYpOgorICAgIHNlbGYuX3Byb3RvLmFuYWx5c2lzX3BlcmYucmVhbF90aW1lID0gKAorICAgICAgICB0aW1lLnRpbWVfbnMoKSAtIHNlbGYuX3Byb3RvLmFuYWx5c2lzX3BlcmYuc3RhcnRfdGltZQorICAgICkKKworICBkZWYgcGFja2FnaW5nX3N0YXJ0KHNlbGYpOgorICAgIHNlbGYuX3Byb3RvLnBhY2thZ2luZ19wZXJmLnN0YXJ0X3RpbWUgPSB0aW1lLnRpbWVfbnMoKQorCisgIGRlZiBwYWNrYWdpbmdfZW5kKHNlbGYpOgorICAgIHNlbGYuX3Byb3RvLnBhY2thZ2luZ19wZXJmLnJlYWxfdGltZSA9ICgKKyAgICAgICAgdGltZS50aW1lX25zKCkgLSBzZWxmLl9wcm90by5wYWNrYWdpbmdfcGVyZi5zdGFydF90aW1lCisgICAgKQorCisgIGRlZiByZXBvcnRfb3B0aW1pemVkX3RhcmdldChzZWxmLCBuYW1lOiBzdHIpOgorICAgIHRhcmdldF9yZXN1bHQgPSBtZXRyaWNzX3BiMi5PcHRpbWl6ZWRCdWlsZE1ldHJpY3MuVGFyZ2V0T3B0aW1pemF0aW9uUmVzdWx0KCkKKyAgICB0YXJnZXRfcmVzdWx0Lm5hbWUgPSBuYW1lCisgICAgdGFyZ2V0X3Jlc3VsdC5vcHRpbWl6ZWQgPSBUcnVlCisgICAgc2VsZi5fdGFyZ2V0X3Jlc3VsdHNbbmFtZV0gPSB0YXJnZXRfcmVzdWx0CisKKyAgZGVmIHJlcG9ydF91bm9wdGltaXplZF90YXJnZXQoc2VsZiwgbmFtZTogc3RyLCBvcHRpbWl6YXRpb25fcmF0aW9uYWxlOiBzdHIpOgorICAgIHRhcmdldF9yZXN1bHQgPSBtZXRyaWNzX3BiMi5PcHRpbWl6ZWRCdWlsZE1ldHJpY3MuVGFyZ2V0T3B0aW1pemF0aW9uUmVzdWx0KCkKKyAgICB0YXJnZXRfcmVzdWx0Lm5hbWUgPSBuYW1lCisgICAgdGFyZ2V0X3Jlc3VsdC5vcHRpbWl6YXRpb25fcmF0aW9uYWxlID0gb3B0aW1pemF0aW9uX3JhdGlvbmFsZQorICAgIHRhcmdldF9yZXN1bHQub3B0aW1pemVkID0gRmFsc2UKKyAgICBzZWxmLl90YXJnZXRfcmVzdWx0c1tuYW1lXSA9IHRhcmdldF9yZXN1bHQKKworICBkZWYgdGFyZ2V0X3BhY2thZ2luZ19zdGFydChzZWxmLCBuYW1lOiBzdHIpOgorICAgIHRhcmdldF9yZXN1bHQgPSBzZWxmLl90YXJnZXRfcmVzdWx0cy5nZXQobmFtZSkKKyAgICB0YXJnZXRfcmVzdWx0LnBhY2thZ2luZ19wZXJmLnN0YXJ0X3RpbWUgPSB0aW1lLnRpbWVfbnMoKQorICAgIHNlbGYuX3RhcmdldF9yZXN1bHRzW25hbWVdID0gdGFyZ2V0X3Jlc3VsdAorCisgIGRlZiB0YXJnZXRfcGFja2FnaW5nX2VuZChzZWxmLCBuYW1lOiBzdHIpOgorICAgIHRhcmdldF9yZXN1bHQgPSBzZWxmLl90YXJnZXRfcmVzdWx0cy5nZXQobmFtZSkKKyAgICB0YXJnZXRfcmVzdWx0LnBhY2thZ2luZ19wZXJmLnJlYWxfdGltZSA9ICgKKyAgICAgICAgdGltZS50aW1lX25zKCkgLSB0YXJnZXRfcmVzdWx0LnBhY2thZ2luZ19wZXJmLnN0YXJ0X3RpbWUKKyAgICApCisKKyAgZGVmIGFkZF90YXJnZXRfYXJ0aWZhY3QoCisgICAgICBzZWxmLAorICAgICAgdGFyZ2V0X25hbWU6IHN0ciwKKyAgICAgIGFydGlmYWN0X25hbWU6IHN0ciwKKyAgICAgIHNpemU6IGludCwKKyAgICAgIGluY2x1ZGVkX21vZHVsZXM6IHNldFtzdHJdLAorICApOgorICAgIHRhcmdldF9yZXN1bHQgPSBzZWxmLnRhcmdldF9yZXN1bHRzLmdldCh0YXJnZXRfbmFtZSkKKyAgICBhcnRpZmFjdCA9ICgKKyAgICAgICAgbWV0cmljc19wYjIuT3B0aW1pemVkQnVpbGRNZXRyaWNzLlRhcmdldE9wdGltaXphdGlvblJlc3VsdC5PdXRwdXRBcnRpZmFjdCgpCisgICAgKQorICAgIGFydGlmYWN0Lm5hbWUgPSBhcnRpZmFjdF9uYW1lCisgICAgYXJ0aWZhY3Quc2l6ZSA9IHNpemUKKyAgICBmb3IgbW9kdWxlIGluIGluY2x1ZGVkX21vZHVsZXM6CisgICAgICBhcnRpZmFjdC5pbmNsdWRlZF9tb2R1bGVzLmFkZChtb2R1bGUpCisgICAgdGFyZ2V0X3Jlc3VsdC5vdXRwdXRfYXJ0aWZhY3RzLmFkZChhcnRpZmFjdCkKKworICBkZWYgZW5kX3JlcG9ydGluZyhzZWxmKToKKyAgICBmb3IgdGFyZ2V0X3Jlc3VsdCBpbiBzZWxmLl90YXJnZXRfcmVzdWx0cy52YWx1ZXMoKToKKyAgICAgIHNlbGYuX3Byb3RvLnRhcmdldF9yZXN1bHQuYXBwZW5kKHRhcmdldF9yZXN1bHQpCisgICAgc29vbmdfbWV0cmljc19wcm90byA9IG1ldHJpY3NfcGIyLk1ldHJpY3NCYXNlKCkKKyAgICAjIFJlYWQgaW4gZXhpc3RpbmcgbWV0cmljcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBvdXQgYnkgdGhlIHNvb25nCisgICAgIyBidWlsZCBjb21tYW5kIHNvIHRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZW0uCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihvcy5lbnZpcm9uW3NlbGYuX0RJU1RfRElSXSwgc2VsZi5fU09PTkdfTUVUUklDU19QQVRIKSwgJ3JiJykgYXMgZjoKKyAgICAgIHNvb25nX21ldHJpY3NfcHJvdG8uUGFyc2VGcm9tU3RyaW5nKGYucmVhZCgpKQorICAgIHNvb25nX21ldHJpY3NfcHJvdG8ub3B0aW1pemVkX2J1aWxkX21ldHJpY3MuQ29weUZyb20oc2VsZi5fcHJvdG8pCisgICAgbG9nZ2luZy5pbmZvKHNvb25nX21ldHJpY3NfcHJvdG8pCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihvcy5lbnZpcm9uW3NlbGYuX0RJU1RfRElSXSwgc2VsZi5fU09PTkdfTUVUUklDU19QQVRIKSwgJ3diJykgYXMgZjoKKyAgICAgIGYud3JpdGUoc29vbmdfbWV0cmljc19wcm90by5TZXJpYWxpemVUb1N0cmluZygpKQpkaWZmIC0tZ2l0IGEvY2kvb3B0aW1pemVkX3RhcmdldHMucHkgYi9jaS9vcHRpbWl6ZWRfdGFyZ2V0cy5weQppbmRleCAyMjRjOGMwLi42ODhiZGQ4IDEwMDY0NAotLS0gYS9jaS9vcHRpbWl6ZWRfdGFyZ2V0cy5weQorKysgYi9jaS9vcHRpbWl6ZWRfdGFyZ2V0cy5weQpAQCAtMTQsNiArMTQsMTYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGZyb20gYWJjIGltcG9ydCBBQkMKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGZ1bmN0b29scworaW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIGJ1aWxkX2NvbnRleHQgaW1wb3J0IEJ1aWxkQ29udGV4dAoraW1wb3J0IHRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyCiAKIAogY2xhc3MgT3B0aW1pemVkQnVpbGRUYXJnZXQoQUJDKToKQEAgLTI0LDE1ICszNCwxMzIgQEAKICAgYnVpbGQuCiAgICIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZF9jb250ZXh0LCBhcmdzKToKKyAgX1NPT05HX1VJX0JBU0hfUEFUSCA9ICdidWlsZC9zb29uZy9zb29uZ191aS5iYXNoJworICBfUFJFQlVJTFRfU09PTkdfWklQX1BBVEggPSAncHJlYnVpbHRzL2J1aWxkLXRvb2xzL2xpbnV4LXg4Ni9iaW4vc29vbmdfemlwJworCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICB0YXJnZXQ6IHN0ciwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCwKKyAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSwKKyAgKToKKyAgICBzZWxmLnRhcmdldCA9IHRhcmdldAogICAgIHNlbGYuYnVpbGRfY29udGV4dCA9IGJ1aWxkX2NvbnRleHQKICAgICBzZWxmLmFyZ3MgPSBhcmdzCiAKLSAgZGVmIGdldF9idWlsZF90YXJnZXRzKHNlbGYpOgotICAgIHBhc3MKKyAgZGVmIGdldF9idWlsZF90YXJnZXRzKHNlbGYpIC0+IHNldFtzdHJdOgorICAgIGZlYXR1cmVzID0gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICBpZiBzZWxmLmdldF9lbmFibGVkX2ZsYWcoKSBpbiBmZWF0dXJlczoKKyAgICAgIHNlbGYubW9kdWxlc190b19idWlsZCA9IHNlbGYuZ2V0X2J1aWxkX3RhcmdldHNfaW1wbCgpCisgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzX3RvX2J1aWxkCiAKLSAgZGVmIHBhY2thZ2Vfb3V0cHV0cyhzZWxmKToKLSAgICBwYXNzCisgICAgc2VsZi5tb2R1bGVzX3RvX2J1aWxkID0ge3NlbGYudGFyZ2V0fQorICAgIHJldHVybiB7c2VsZi50YXJnZXR9CisKKyAgZGVmIGdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHMoc2VsZikgLT4gbGlzdFtsaXN0W3N0cl1dOgorICAgIGZlYXR1cmVzID0gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICBpZiBzZWxmLmdldF9lbmFibGVkX2ZsYWcoKSBpbiBmZWF0dXJlczoKKyAgICAgIHJldHVybiBzZWxmLmdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHNfaW1wbCgpCisKKyAgICByZXR1cm4gW10KKworICBkZWYgZ2V0X3BhY2thZ2Vfb3V0cHV0c19jb21tYW5kc19pbXBsKHNlbGYpIC0+IGxpc3RbbGlzdFtzdHJdXToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAnZ2V0X3BhY2thZ2Vfb3V0cHV0c19jb21tYW5kc19pbXBsIG5vdCBpbXBsZW1lbnRlZCBpbicKKyAgICAgICAgZicge3R5cGUoc2VsZikuX19uYW1lX199JworICAgICkKKworICBkZWYgZ2V0X2VuYWJsZWRfZmxhZyhzZWxmKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICBmJ2dldF9lbmFibGVkX2ZsYWcgbm90IGltcGxlbWVudGVkIGluIHt0eXBlKHNlbGYpLl9fbmFtZV9ffScKKyAgICApCisKKyAgZGVmIGdldF9idWlsZF90YXJnZXRzX2ltcGwoc2VsZikgLT4gc2V0W3N0cl06CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgZidnZXRfYnVpbGRfdGFyZ2V0c19pbXBsIG5vdCBpbXBsZW1lbnRlZCBpbiB7dHlwZShzZWxmKS5fX25hbWVfX30nCisgICAgKQorCisgIGRlZiBfZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgc2VsZiwKKyAgICAgIHByZWZpeDogc3RyID0gJycsCisgICAgICByZWxhdGl2ZV9yb290OiBzdHIgPSAnJywKKyAgICAgIGxpc3RfZmlsZXM6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLAorICAgICAgZmlsZXM6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLAorICAgICAgZGlyZWN0b3JpZXM6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLAorICApIC0+IGxpc3Rbc3RyXToKKyAgICBpZiBub3QgbGlzdF9maWxlcyBhbmQgbm90IGZpbGVzIGFuZCBub3QgZGlyZWN0b3JpZXM6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgZidObyBpdGVtcyBzcGVjaWZpZWQgdG8gYmUgYWRkZWQgdG8gemlwISBQcmVmaXg6IHtwcmVmaXh9LCBSZWxhdGl2ZScKKyAgICAgICAgICBmJyByb290OiB7cmVsYXRpdmVfcm9vdH0nCisgICAgICApCisgICAgY29tbWFuZF9zZWdtZW50ID0gW10KKyAgICAjIFRoZXNlIGFyZSBhbGwgc29vbmdfemlwIG9wdGlvbnMgc28gY29uc3VsdCBzb29uZ196aXAgLS1oZWxwIGZvciBzcGVjaWZpY3MuCisgICAgaWYgcHJlZml4OgorICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZCgnLVAnKQorICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZChwcmVmaXgpCisgICAgaWYgcmVsYXRpdmVfcm9vdDoKKyAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoJy1DJykKKyAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQocmVsYXRpdmVfcm9vdCkKKyAgICBpZiBsaXN0X2ZpbGVzOgorICAgICAgZm9yIGxpc3RfZmlsZSBpbiBsaXN0X2ZpbGVzOgorICAgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKCctbCcpCisgICAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQobGlzdF9maWxlKQorICAgIGlmIGZpbGVzOgorICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoJy1mJykKKyAgICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZChmaWxlKQorICAgIGlmIGRpcmVjdG9yaWVzOgorICAgICAgZm9yIGRpcmVjdG9yeSBpbiBkaXJlY3RvcmllczoKKyAgICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZCgnLUQnKQorICAgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKGRpcmVjdG9yeSkKKworICAgIHJldHVybiBjb21tYW5kX3NlZ21lbnQKKworICBkZWYgX3F1ZXJ5X3Nvb25nX3ZhcnMoCisgICAgICBzZWxmLCBzcmNfdG9wOiBwYXRobGliLlBhdGgsIHNvb25nX3ZhcnM6IGxpc3Rbc3RyXQorICApIC0+IGRpY3Rbc3RyLCBzdHJdOgorICAgIHByb2Nlc3NfcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCisgICAgICAgIGFyZ3M9WworICAgICAgICAgICAgZid7c3JjX3RvcCAvIHNlbGYuX1NPT05HX1VJX0JBU0hfUEFUSH0nLAorICAgICAgICAgICAgJy0tZHVtcHZhcnMtbW9kZScsCisgICAgICAgICAgICBmJy0tYWJzLXZhcnM9eyIgIi5qb2luKHNvb25nX3ZhcnMpfScsCisgICAgICAgIF0sCisgICAgICAgIGVudj1vcy5lbnZpcm9uLAorICAgICAgICBjaGVjaz1GYWxzZSwKKyAgICAgICAgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwKKyAgICAgICAgdGV4dD1UcnVlLAorICAgICkKKyAgICBpZiBub3QgcHJvY2Vzc19yZXN1bHQucmV0dXJuY29kZSA9PSAwOgorICAgICAgbG9nZ2luZy5lcnJvcignc29vbmcgZHVtcHZhcnMgY29tbWFuZCBmYWlsZWQhIHN0ZGVycjonKQorICAgICAgbG9nZ2luZy5lcnJvcihwcm9jZXNzX3Jlc3VsdC5zdGRlcnIpCisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1Nvb25nIGR1bXB2YXJzIGZhaWxlZCEgU2VlIGxvZyBmb3Igc3RkZXJyLicpCisKKyAgICBpZiBub3QgcHJvY2Vzc19yZXN1bHQuc3Rkb3V0OgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICdOZWNlc3Nhcnkgc29vbmcgdmFyaWFibGVzICcgKyBzb29uZ192YXJzICsgJyBub3QgZm91bmQuJworICAgICAgKQorCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBsaW5lLnNwbGl0KCc9JylbMF06IGxpbmUuc3BsaXQoJz0nKVsxXS5zdHJpcCgiJyIpCisgICAgICAgICAgZm9yIGxpbmUgaW4gcHJvY2Vzc19yZXN1bHQuc3Rkb3V0LnN0cmlwKCkuc3BsaXQoJ1xuJykKKyAgICAgIH0KKyAgICBleGNlcHQgSW5kZXhFcnJvciBhcyBlOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICdFcnJvciBwYXJzaW5nIHNvb25nIGR1bXB2YXJzIG91dHB1dCEgU2VlIG91dHB1dCBoZXJlOicKKyAgICAgICAgICBmJyB7cHJvY2Vzc19yZXN1bHQuc3Rkb3V0fScsCisgICAgICAgICAgZSwKKyAgICAgICkKKworICBkZWYgX2Jhc2VfemlwX2NvbW1hbmQoCisgICAgICBzZWxmLCBzcmNfdG9wOiBwYXRobGliLlBhdGgsIGRpc3RfZGlyOiBwYXRobGliLlBhdGgsIG5hbWU6IHN0cgorICApIC0+IGxpc3Rbc3RyXToKKyAgICByZXR1cm4gWworICAgICAgICBmJ3tzcmNfdG9wIC8gc2VsZi5fUFJFQlVJTFRfU09PTkdfWklQX1BBVEggfScsCisgICAgICAgICctZCcsCisgICAgICAgICctbycsCisgICAgICAgIGYne2Rpc3RfZGlyIC8gbmFtZX0nLAorICAgIF0KIAogCiBjbGFzcyBOdWxsT3B0aW1pemVyKE9wdGltaXplZEJ1aWxkVGFyZ2V0KToKQEAgLTQ4LDIyICsxNzUsMzA4IEBACiAgIGRlZiBnZXRfYnVpbGRfdGFyZ2V0cyhzZWxmKToKICAgICByZXR1cm4ge3NlbGYudGFyZ2V0fQogCi0gIGRlZiBwYWNrYWdlX291dHB1dHMoc2VsZik6Ci0gICAgcGFzcworICBkZWYgZ2V0X3BhY2thZ2Vfb3V0cHV0c19jb21tYW5kcyhzZWxmKToKKyAgICByZXR1cm4gW10KIAogCi1kZWYgZ2V0X3RhcmdldF9vcHRpbWl6ZXIodGFyZ2V0LCBlbmFibGVkX2ZsYWcsIGJ1aWxkX2NvbnRleHQsIG9wdGltaXplcik6Ci0gIGlmIGVuYWJsZWRfZmxhZyBpbiBidWlsZF9jb250ZXh0WydlbmFibGVkX2J1aWxkX2ZlYXR1cmVzJ106Ci0gICAgcmV0dXJuIG9wdGltaXplcgorY2xhc3MgQ2hhbmdlSW5mbzoKIAotICByZXR1cm4gTnVsbE9wdGltaXplcih0YXJnZXQpCisgIGRlZiBfX2luaXRfXyhzZWxmLCBjaGFuZ2VfaW5mb19maWxlX3BhdGgpOgorICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihjaGFuZ2VfaW5mb19maWxlX3BhdGgpIGFzIGNoYW5nZV9pbmZvX2ZpbGU6CisgICAgICAgIGNoYW5nZV9pbmZvX2NvbnRlbnRzID0ganNvbi5sb2FkKGNoYW5nZV9pbmZvX2ZpbGUpCisgICAgZXhjZXB0IGpzb24uZGVjb2Rlci5KU09ORGVjb2RlRXJyb3I6CisgICAgICBsb2dnaW5nLmVycm9yKGYnRmFpbGVkIHRvIGxvYWQgQ0hBTkdFX0lORk86IHtjaGFuZ2VfaW5mb19maWxlX3BhdGh9JykKKyAgICAgIHJhaXNlCisKKyAgICBzZWxmLl9jaGFuZ2VfaW5mb19jb250ZW50cyA9IGNoYW5nZV9pbmZvX2NvbnRlbnRzCisKKyAgZGVmIGZpbmRfY2hhbmdlZF9maWxlcyhzZWxmKSAtPiBzZXRbc3RyXToKKyAgICBjaGFuZ2VkX2ZpbGVzID0gc2V0KCkKKworICAgIGZvciBjaGFuZ2UgaW4gc2VsZi5fY2hhbmdlX2luZm9fY29udGVudHNbJ2NoYW5nZXMnXToKKyAgICAgIHByb2plY3RfcGF0aCA9IGNoYW5nZS5nZXQoJ3Byb2plY3RQYXRoJykgKyAnLycKKworICAgICAgZm9yIHJldmlzaW9uIGluIGNoYW5nZS5nZXQoJ3JldmlzaW9ucycpOgorICAgICAgICBmb3IgZmlsZV9pbmZvIGluIHJldmlzaW9uLmdldCgnZmlsZUluZm9zJyk6CisgICAgICAgICAgY2hhbmdlZF9maWxlcy5hZGQocHJvamVjdF9wYXRoICsgZmlsZV9pbmZvLmdldCgncGF0aCcpKQorCisgICAgcmV0dXJuIGNoYW5nZWRfZmlsZXMKIAogCi0jIFRvIGJlIHdyaXR0ZW4gYXM6Ci0jICAgICd0YXJnZXQnOiBsYW1iZGEgdGFyZ2V0LCBidWlsZF9jb250ZXh0LCBhcmdzOiBnZXRfdGFyZ2V0X29wdGltaXplcigKLSMgICAgICAgIHRhcmdldCwKLSMgICAgICAgICd0YXJnZXRfZW5hYmxlZF9mbGFnJywKLSMgICAgICAgIGJ1aWxkX2NvbnRleHQsCi0jICAgICAgICBUYXJnZXRPcHRpbWl6ZXIoYnVpbGRfY29udGV4dCwgYXJncyksCi0jICAgICkKLU9QVElNSVpFRF9CVUlMRF9UQVJHRVRTID0gZGljdCgpCitjbGFzcyBHZW5lcmFsVGVzdHNPcHRpbWl6ZXIoT3B0aW1pemVkQnVpbGRUYXJnZXQpOgorICAiIiJnZW5lcmFsLXRlc3RzIG9wdGltaXplcgorCisgIFRoaXMgb3B0aW1pemVyIHJlYWRzIGluIHRoZSBsaXN0IG9mIGNoYW5nZWQgZmlsZXMgZnJvbSB0aGUgZmlsZSBsb2NhdGVkIGluCisgIGVudltDSEFOR0VfSU5GT10gYW5kIHVzZXMgdGhpcyBsaXN0IGFsb25nc2lkZSB0aGUgbm9ybWFsIFRFU1QgTUFQUElORyBsb2dpYyB0bworICBkZXRlcm1pbmUgd2hhdCB0ZXN0IG1hcHBpbmcgbW9kdWxlcyB3aWxsIHJ1biBmb3IgdGhlIGdpdmVuIGNoYW5nZXMuIEl0IHRoZW4KKyAgYnVpbGRzIHRob3NlIG1vZHVsZXMgYW5kIHBhY2thZ2VzIHRoZW0gaW4gdGhlIHNhbWUgd2F5IGdlbmVyYWwtdGVzdHMuemlwIGlzCisgIG5vcm1hbGx5IGJ1aWx0LgorICAiIiIKKworICAjIExpc3Qgb2YgbW9kdWxlcyB0aGF0IGFyZSBidWlsdCBhbG9uZ3NpZGUgZ2VuZXJhbC10ZXN0cyBhcyBkZXBlbmRlbmNpZXMuCisgIF9SRVFVSVJFRF9NT0RVTEVTID0gZnJvemVuc2V0KFsKKyAgICAgICdjdHMtdHJhZGVmZWQnLAorICAgICAgJ3Z0cy10cmFkZWZlZCcsCisgICAgICAnY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwnLAorICAgICAgJ2dlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMnLAorICBdKQorCisgIGRlZiBnZXRfYnVpbGRfdGFyZ2V0c19pbXBsKHNlbGYpIC0+IHNldFtzdHJdOgorICAgIGNoYW5nZV9pbmZvX2ZpbGVfcGF0aCA9IG9zLmVudmlyb24uZ2V0KCdDSEFOR0VfSU5GTycpCisgICAgaWYgbm90IGNoYW5nZV9pbmZvX2ZpbGVfcGF0aDoKKyAgICAgIGxvZ2dpbmcuaW5mbygKKyAgICAgICAgICAnTm8gQ0hBTkdFX0lORk8gZW52IHZhciBmb3VuZCwgZ2VuZXJhbC10ZXN0cyBvcHRpbWl6YXRpb24gZGlzYWJsZWQuJworICAgICAgKQorICAgICAgcmV0dXJuIHsnZ2VuZXJhbC10ZXN0cyd9CisKKyAgICB0ZXN0X2luZm9zID0gc2VsZi5idWlsZF9jb250ZXh0LnRlc3RfaW5mb3MKKyAgICB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMgPSBzZXQoKQorICAgIGZvciB0ZXN0X2luZm8gaW4gdGVzdF9pbmZvczoKKyAgICAgIGlzX3Rlc3RfbWFwcGluZyA9IHRlc3RfaW5mby5pc190ZXN0X21hcHBpbmcKKyAgICAgIGN1cnJlbnRfdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzID0gdGVzdF9pbmZvLnRlc3RfbWFwcGluZ190ZXN0X2dyb3VwcworICAgICAgdXNlc19nZW5lcmFsX3Rlc3RzID0gdGVzdF9pbmZvLmJ1aWxkX3RhcmdldF91c2VkKCdnZW5lcmFsLXRlc3RzJykKKworICAgICAgaWYgdXNlc19nZW5lcmFsX3Rlc3RzIGFuZCBub3QgaXNfdGVzdF9tYXBwaW5nOgorICAgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgICAnVGVzdCB1c2VzIGdlbmVyYWwtdGVzdHMuemlwIGJ1dCBpcyBub3QgdGVzdC1tYXBwaW5nLCBnZW5lcmFsLXRlc3RzJworICAgICAgICAgICAgJyBvcHRpbWl6YXRpb24gZGlzYWJsZWQuJworICAgICAgICApCisgICAgICAgIHJldHVybiB7J2dlbmVyYWwtdGVzdHMnfQorCisgICAgICBpZiBpc190ZXN0X21hcHBpbmc6CisgICAgICAgIHRlc3RfbWFwcGluZ190ZXN0X2dyb3Vwcy51cGRhdGUoY3VycmVudF90ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMpCisKKyAgICBjaGFuZ2VfaW5mbyA9IENoYW5nZUluZm8oY2hhbmdlX2luZm9fZmlsZV9wYXRoKQorICAgIGNoYW5nZWRfZmlsZXMgPSBjaGFuZ2VfaW5mby5maW5kX2NoYW5nZWRfZmlsZXMoKQorCisgICAgdGVzdF9tYXBwaW5ncyA9IHRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLkdldFRlc3RNYXBwaW5ncygKKyAgICAgICAgY2hhbmdlZF9maWxlcywgc2V0KCkKKyAgICApCisKKyAgICBtb2R1bGVzX3RvX2J1aWxkID0gc2V0KHNlbGYuX1JFUVVJUkVEX01PRFVMRVMpCisKKyAgICBtb2R1bGVzX3RvX2J1aWxkLnVwZGF0ZSgKKyAgICAgICAgdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIuRmluZEFmZmVjdGVkTW9kdWxlcygKKyAgICAgICAgICAgIHRlc3RfbWFwcGluZ3MsIGNoYW5nZWRfZmlsZXMsIHRlc3RfbWFwcGluZ190ZXN0X2dyb3VwcworICAgICAgICApCisgICAgKQorCisgICAgcmV0dXJuIG1vZHVsZXNfdG9fYnVpbGQKKworICBkZWYgZ2V0X3BhY2thZ2Vfb3V0cHV0c19jb21tYW5kc19pbXBsKHNlbGYpOgorICAgIHNyY190b3AgPSBwYXRobGliLlBhdGgob3MuZW52aXJvbi5nZXQoJ1RPUCcsIG9zLmdldGN3ZCgpKSkKKyAgICBkaXN0X2RpciA9IHBhdGhsaWIuUGF0aChvcy5lbnZpcm9uLmdldCgnRElTVF9ESVInKSkKKworICAgIHNvb25nX3ZhcnMgPSBzZWxmLl9xdWVyeV9zb29uZ192YXJzKAorICAgICAgICBzcmNfdG9wLAorICAgICAgICBbCisgICAgICAgICAgICAnSE9TVF9PVVRfVEVTVENBU0VTJywKKyAgICAgICAgICAgICdUQVJHRVRfT1VUX1RFU1RDQVNFUycsCisgICAgICAgICAgICAnUFJPRFVDVF9PVVQnLAorICAgICAgICAgICAgJ1NPT05HX0hPU1RfT1VUJywKKyAgICAgICAgICAgICdIT1NUX09VVCcsCisgICAgICAgIF0sCisgICAgKQorICAgIGhvc3Rfb3V0X3Rlc3RjYXNlcyA9IHBhdGhsaWIuUGF0aChzb29uZ192YXJzLmdldCgnSE9TVF9PVVRfVEVTVENBU0VTJykpCisgICAgdGFyZ2V0X291dF90ZXN0Y2FzZXMgPSBwYXRobGliLlBhdGgoc29vbmdfdmFycy5nZXQoJ1RBUkdFVF9PVVRfVEVTVENBU0VTJykpCisgICAgcHJvZHVjdF9vdXQgPSBwYXRobGliLlBhdGgoc29vbmdfdmFycy5nZXQoJ1BST0RVQ1RfT1VUJykpCisgICAgc29vbmdfaG9zdF9vdXQgPSBwYXRobGliLlBhdGgoc29vbmdfdmFycy5nZXQoJ1NPT05HX0hPU1RfT1VUJykpCisgICAgaG9zdF9vdXQgPSBwYXRobGliLlBhdGgoc29vbmdfdmFycy5nZXQoJ0hPU1RfT1VUJykpCisKKyAgICBob3N0X3BhdGhzID0gW10KKyAgICB0YXJnZXRfcGF0aHMgPSBbXQorICAgIGhvc3RfY29uZmlnX2ZpbGVzID0gW10KKyAgICB0YXJnZXRfY29uZmlnX2ZpbGVzID0gW10KKyAgICBmb3IgbW9kdWxlIGluIHNlbGYubW9kdWxlc190b19idWlsZDoKKyAgICAgICMgVGhlIHJlcXVpcmVkIG1vZHVsZXMgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSwgbm8gbmVlZCB0byBwYWNrYWdlLgorICAgICAgaWYgbW9kdWxlIGluIHNlbGYuX1JFUVVJUkVEX01PRFVMRVM6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgIGhvc3RfcGF0aCA9IGhvc3Rfb3V0X3Rlc3RjYXNlcyAvIG1vZHVsZQorICAgICAgaWYgb3MucGF0aC5leGlzdHMoaG9zdF9wYXRoKToKKyAgICAgICAgaG9zdF9wYXRocy5hcHBlbmQoaG9zdF9wYXRoKQorICAgICAgICBzZWxmLl9jb2xsZWN0X2NvbmZpZ19maWxlcyhzcmNfdG9wLCBob3N0X3BhdGgsIGhvc3RfY29uZmlnX2ZpbGVzKQorCisgICAgICB0YXJnZXRfcGF0aCA9IHRhcmdldF9vdXRfdGVzdGNhc2VzIC8gbW9kdWxlCisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXRfcGF0aCk6CisgICAgICAgIHRhcmdldF9wYXRocy5hcHBlbmQodGFyZ2V0X3BhdGgpCisgICAgICAgIHNlbGYuX2NvbGxlY3RfY29uZmlnX2ZpbGVzKHNyY190b3AsIHRhcmdldF9wYXRoLCB0YXJnZXRfY29uZmlnX2ZpbGVzKQorCisgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaG9zdF9wYXRoKSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHRhcmdldF9wYXRoKToKKyAgICAgICAgbG9nZ2luZy5pbmZvKGYnTm8gaG9zdCBvciB0YXJnZXQgYnVpbGQgb3V0cHV0cyBmb3VuZCBmb3Ige21vZHVsZX0uJykKKworICAgIHppcF9jb21tYW5kcyA9IFtdCisKKyAgICB6aXBfY29tbWFuZHMuZXh0ZW5kKAorICAgICAgICBzZWxmLl9nZXRfemlwX3Rlc3RfY29uZmlnc196aXBzX2NvbW1hbmRzKAorICAgICAgICAgICAgc3JjX3RvcCwKKyAgICAgICAgICAgIGRpc3RfZGlyLAorICAgICAgICAgICAgaG9zdF9vdXQsCisgICAgICAgICAgICBwcm9kdWN0X291dCwKKyAgICAgICAgICAgIGhvc3RfY29uZmlnX2ZpbGVzLAorICAgICAgICAgICAgdGFyZ2V0X2NvbmZpZ19maWxlcywKKyAgICAgICAgKQorICAgICkKKworICAgIHppcF9jb21tYW5kID0gc2VsZi5fYmFzZV96aXBfY29tbWFuZChzcmNfdG9wLCBkaXN0X2RpciwgJ2dlbmVyYWwtdGVzdHMuemlwJykKKworICAgICMgQWRkIGhvc3QgdGVzdGNhc2VzLgorICAgIGlmIGhvc3RfcGF0aHM6CisgICAgICB6aXBfY29tbWFuZC5leHRlbmQoCisgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgICAgICAgICBwcmVmaXg9J2hvc3QnLAorICAgICAgICAgICAgICByZWxhdGl2ZV9yb290PWYne3NyY190b3AgLyBzb29uZ19ob3N0X291dH0nLAorICAgICAgICAgICAgICBkaXJlY3Rvcmllcz1ob3N0X3BhdGhzLAorICAgICAgICAgICkKKyAgICAgICkKKworICAgICMgQWRkIHRhcmdldCB0ZXN0Y2FzZXMuCisgICAgaWYgdGFyZ2V0X3BhdGhzOgorICAgICAgemlwX2NvbW1hbmQuZXh0ZW5kKAorICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgICAgICAgICAgcHJlZml4PSd0YXJnZXQnLAorICAgICAgICAgICAgICByZWxhdGl2ZV9yb290PWYne3NyY190b3AgLyBwcm9kdWN0X291dH0nLAorICAgICAgICAgICAgICBkaXJlY3Rvcmllcz10YXJnZXRfcGF0aHMsCisgICAgICAgICAgKQorICAgICAgKQorCisgICAgIyBUT0RPKGx1Y2FmYXJzaSk6IFB1c2ggdGhpcyBsb2dpYyBpbnRvIGEgZ2VuZXJhbC10ZXN0cy1taW5pbWFsIGJ1aWxkIGNvbW1hbmQKKyAgICAjIEFkZCBuZWNlc3NhcnkgdG9vbHMuIFRoZXNlIGFyZSBhbHNvIGhhcmRjb2RlZCBpbiBnZW5lcmFsLXRlc3RzLm1rLgorICAgIGZyYW1ld29ya19wYXRoID0gc29vbmdfaG9zdF9vdXQgLyAnZnJhbWV3b3JrJworCisgICAgemlwX2NvbW1hbmQuZXh0ZW5kKAorICAgICAgICBzZWxmLl9nZW5lcmF0ZV96aXBfb3B0aW9uc19mb3JfaXRlbXMoCisgICAgICAgICAgICBwcmVmaXg9J2hvc3QvdG9vbHMnLAorICAgICAgICAgICAgcmVsYXRpdmVfcm9vdD1zdHIoZnJhbWV3b3JrX3BhdGgpLAorICAgICAgICAgICAgZmlsZXM9WworICAgICAgICAgICAgICAgIGYie2ZyYW1ld29ya19wYXRoIC8gJ2N0cy10cmFkZWZlZC5qYXInfSIsCisgICAgICAgICAgICAgICAgZiJ7ZnJhbWV3b3JrX3BhdGggLyAnY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwuamFyJ30iLAorICAgICAgICAgICAgICAgIGYie2ZyYW1ld29ya19wYXRoIC8gJ3Z0cy10cmFkZWZlZC5qYXInfSIsCisgICAgICAgICAgICBdLAorICAgICAgICApCisgICAgKQorCisgICAgemlwX2NvbW1hbmRzLmFwcGVuZCh6aXBfY29tbWFuZCkKKyAgICByZXR1cm4gemlwX2NvbW1hbmRzCisKKyAgZGVmIF9jb2xsZWN0X2NvbmZpZ19maWxlcygKKyAgICAgIHNlbGYsCisgICAgICBzcmNfdG9wOiBwYXRobGliLlBhdGgsCisgICAgICByb290X2RpcjogcGF0aGxpYi5QYXRoLAorICAgICAgY29uZmlnX2ZpbGVzOiBsaXN0W3N0cl0sCisgICk6CisgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc3JjX3RvcCAvIHJvb3RfZGlyKToKKyAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcuY29uZmlnJyk6CisgICAgICAgICAgY29uZmlnX2ZpbGVzLmFwcGVuZChyb290X2RpciAvIGZpbGUpCisKKyAgZGVmIF9nZXRfemlwX3Rlc3RfY29uZmlnc196aXBzX2NvbW1hbmRzKAorICAgICAgc2VsZiwKKyAgICAgIHNyY190b3A6IHBhdGhsaWIuUGF0aCwKKyAgICAgIGRpc3RfZGlyOiBwYXRobGliLlBhdGgsCisgICAgICBob3N0X291dDogcGF0aGxpYi5QYXRoLAorICAgICAgcHJvZHVjdF9vdXQ6IHBhdGhsaWIuUGF0aCwKKyAgICAgIGhvc3RfY29uZmlnX2ZpbGVzOiBsaXN0W3N0cl0sCisgICAgICB0YXJnZXRfY29uZmlnX2ZpbGVzOiBsaXN0W3N0cl0sCisgICkgLT4gdHVwbGVbbGlzdFtzdHJdLCBsaXN0W3N0cl1dOgorICAgICIiIkdlbmVyYXRlIGdlbmVyYWwtdGVzdHNfY29uZmlncy56aXAgYW5kIGdlbmVyYWwtdGVzdHNfbGlzdC56aXAuCisKKyAgICBnZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwIGNvbnRhaW5zIGFsbCBvZiB0aGUgLmNvbmZpZyBmaWxlcyB0aGF0IHdlcmUKKyAgICBidWlsdCBhbmQgZ2VuZXJhbC10ZXN0c19saXN0LnppcCBjb250YWlucyBhIHRleHQgZmlsZSB3aGljaCBsaXN0cworICAgIGFsbCBvZiB0aGUgLmNvbmZpZyBmaWxlcyB0aGF0IGFyZSBpbiBnZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwLgorCisgICAgZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcCBpcyBvcmdhbml6ZWQgYXMgZm9sbG93czoKKyAgICAvCisgICAgICBob3N0LworICAgICAgICB0ZXN0Y2FzZXMvCisgICAgICAgICAgdGVzdF8xLmNvbmZpZworICAgICAgICAgIHRlc3RfMi5jb25maWcKKyAgICAgICAgICAuLi4KKyAgICAgIHRhcmdldC8KKyAgICAgICAgdGVzdGNhc2VzLworICAgICAgICAgIHRlc3RfMS5jb25maWcKKyAgICAgICAgICB0ZXN0XzIuY29uZmlnCisgICAgICAgICAgLi4uCisKKyAgICBTbyB0aGUgcHJvY2VzcyBpcyB3ZSB3cml0ZSBvdXQgdGhlIHBhdGhzIHRvIGFsbCB0aGUgaG9zdCBjb25maWcgZmlsZXMgaW50bworICAgIG9uZQorICAgIGZpbGUgYW5kIGFsbCB0aGUgcGF0aHMgdG8gdGhlIHRhcmdldCBjb25maWcgZmlsZXMgaW4gYW5vdGhlci4gV2UgYWxzbyB3cml0ZQorICAgIHRoZSBwYXRocyB0byBhbGwgdGhlIGNvbmZpZyBmaWxlcyBpbnRvIGEgdGhpcmQgZmlsZSB0byB1c2UgZm9yCisgICAgZ2VuZXJhbC10ZXN0c19saXN0LnppcC4KKworICAgIEFyZ3M6CisgICAgICBkaXN0X2RpcjogZGlzdCBkaXJlY3RvcnkuCisgICAgICBob3N0X291dDogaG9zdCBvdXQgZGlyZWN0b3J5LgorICAgICAgcHJvZHVjdF9vdXQ6IHByb2R1Y3Qgb3V0IGRpcmVjdG9yeS4KKyAgICAgIGhvc3RfY29uZmlnX2ZpbGVzOiBsaXN0IG9mIGFsbCBob3N0IGNvbmZpZyBmaWxlcy4KKyAgICAgIHRhcmdldF9jb25maWdfZmlsZXM6IGxpc3Qgb2YgYWxsIHRhcmdldCBjb25maWcgZmlsZXMuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGNvbW1hbmRzIHRvIGdlbmVyYXRlIGdlbmVyYWwtdGVzdHNfY29uZmlncy56aXAgYW5kCisgICAgICBnZW5lcmFsLXRlc3RzX2xpc3QuemlwCisgICAgIiIiCisgICAgd2l0aCBvcGVuKAorICAgICAgICBmIntob3N0X291dCAvICdob3N0X2dlbmVyYWwtdGVzdHNfbGlzdCd9IiwgJ3cnCisgICAgKSBhcyBob3N0X2xpc3RfZmlsZSwgb3BlbigKKyAgICAgICAgZiJ7cHJvZHVjdF9vdXQgLyAndGFyZ2V0X2dlbmVyYWwtdGVzdHNfbGlzdCd9IiwgJ3cnCisgICAgKSBhcyB0YXJnZXRfbGlzdF9maWxlLCBvcGVuKAorICAgICAgICBmIntob3N0X291dCAvICdnZW5lcmFsLXRlc3RzX2xpc3QnfSIsICd3JworICAgICkgYXMgbGlzdF9maWxlOgorCisgICAgICBmb3IgY29uZmlnX2ZpbGUgaW4gaG9zdF9jb25maWdfZmlsZXM6CisgICAgICAgIGhvc3RfbGlzdF9maWxlLndyaXRlKGYne2NvbmZpZ19maWxlfScgKyAnXG4nKQorICAgICAgICBsaXN0X2ZpbGUud3JpdGUoJ2hvc3QvJyArIG9zLnBhdGgucmVscGF0aChjb25maWdfZmlsZSwgaG9zdF9vdXQpICsgJ1xuJykKKworICAgICAgZm9yIGNvbmZpZ19maWxlIGluIHRhcmdldF9jb25maWdfZmlsZXM6CisgICAgICAgIHRhcmdldF9saXN0X2ZpbGUud3JpdGUoZid7Y29uZmlnX2ZpbGV9JyArICdcbicpCisgICAgICAgIGxpc3RfZmlsZS53cml0ZSgKKyAgICAgICAgICAgICd0YXJnZXQvJyArIG9zLnBhdGgucmVscGF0aChjb25maWdfZmlsZSwgcHJvZHVjdF9vdXQpICsgJ1xuJworICAgICAgICApCisKKyAgICB6aXBfY29tbWFuZHMgPSBbXQorCisgICAgdGVzdHNfY29uZmlnX3ppcF9jb21tYW5kID0gc2VsZi5fYmFzZV96aXBfY29tbWFuZCgKKyAgICAgICAgc3JjX3RvcCwgZGlzdF9kaXIsICdnZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwJworICAgICkKKyAgICB0ZXN0c19jb25maWdfemlwX2NvbW1hbmQuZXh0ZW5kKAorICAgICAgICBzZWxmLl9nZW5lcmF0ZV96aXBfb3B0aW9uc19mb3JfaXRlbXMoCisgICAgICAgICAgICBwcmVmaXg9J2hvc3QnLAorICAgICAgICAgICAgcmVsYXRpdmVfcm9vdD1zdHIoaG9zdF9vdXQpLAorICAgICAgICAgICAgbGlzdF9maWxlcz1bZiJ7aG9zdF9vdXQgLyAnaG9zdF9nZW5lcmFsLXRlc3RzX2xpc3QnfSJdLAorICAgICAgICApCisgICAgKQorCisgICAgdGVzdHNfY29uZmlnX3ppcF9jb21tYW5kLmV4dGVuZCgKKyAgICAgICAgc2VsZi5fZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgICAgICAgcHJlZml4PSd0YXJnZXQnLAorICAgICAgICAgICAgcmVsYXRpdmVfcm9vdD1zdHIocHJvZHVjdF9vdXQpLAorICAgICAgICAgICAgbGlzdF9maWxlcz1bZiJ7cHJvZHVjdF9vdXQgLyAndGFyZ2V0X2dlbmVyYWwtdGVzdHNfbGlzdCd9Il0sCisgICAgICAgICksCisgICAgKQorCisgICAgemlwX2NvbW1hbmRzLmFwcGVuZCh0ZXN0c19jb25maWdfemlwX2NvbW1hbmQpCisKKyAgICB0ZXN0c19saXN0X3ppcF9jb21tYW5kID0gc2VsZi5fYmFzZV96aXBfY29tbWFuZCgKKyAgICAgICAgc3JjX3RvcCwgZGlzdF9kaXIsICdnZW5lcmFsLXRlc3RzX2xpc3QuemlwJworICAgICkKKyAgICB0ZXN0c19saXN0X3ppcF9jb21tYW5kLmV4dGVuZCgKKyAgICAgICAgc2VsZi5fZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgICAgICAgcmVsYXRpdmVfcm9vdD1zdHIoaG9zdF9vdXQpLAorICAgICAgICAgICAgZmlsZXM9W2Yie2hvc3Rfb3V0IC8gJ2dlbmVyYWwtdGVzdHNfbGlzdCd9Il0sCisgICAgICAgICkKKyAgICApCisgICAgemlwX2NvbW1hbmRzLmFwcGVuZCh0ZXN0c19saXN0X3ppcF9jb21tYW5kKQorCisgICAgcmV0dXJuIHppcF9jb21tYW5kcworCisgIGRlZiBnZXRfZW5hYmxlZF9mbGFnKHNlbGYpOgorICAgIHJldHVybiAnZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZWQnCisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBnZXRfb3B0aW1pemVkX3RhcmdldHMoY2xzKSAtPiBkaWN0W3N0ciwgT3B0aW1pemVkQnVpbGRUYXJnZXRdOgorICAgIHJldHVybiB7J2dlbmVyYWwtdGVzdHMnOiBmdW5jdG9vbHMucGFydGlhbChjbHMpfQorCisKK09QVElNSVpFRF9CVUlMRF9UQVJHRVRTID0ge30KK09QVElNSVpFRF9CVUlMRF9UQVJHRVRTLnVwZGF0ZShHZW5lcmFsVGVzdHNPcHRpbWl6ZXIuZ2V0X29wdGltaXplZF90YXJnZXRzKCkpCmRpZmYgLS1naXQgYS9jaS9vcHRpbWl6ZWRfdGFyZ2V0c190ZXN0LnB5IGIvY2kvb3B0aW1pemVkX3RhcmdldHNfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjBjMGVjCi0tLSAvZGV2L251bGwKKysrIGIvY2kvb3B0aW1pemVkX3RhcmdldHNfdGVzdC5weQpAQCAtMCwwICsxLDM1MCBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJUZXN0cyBmb3Igb3B0aW1pemVkX3RhcmdldHMucHkiIiIKKworaW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jaworZnJvbSBidWlsZF9jb250ZXh0IGltcG9ydCBCdWlsZENvbnRleHQKK2ltcG9ydCBvcHRpbWl6ZWRfdGFyZ2V0cworZnJvbSBweWZha2VmcyBpbXBvcnQgZmFrZV9maWxlc3lzdGVtX3VuaXR0ZXN0CisKKworY2xhc3MgR2VuZXJhbFRlc3RzT3B0aW1pemVyVGVzdChmYWtlX2ZpbGVzeXN0ZW1fdW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLnNldFVwUHlmYWtlZnMoKQorCisgICAgb3NfZW52aXJvbl9wYXRjaGVyID0gbW9jay5wYXRjaC5kaWN0KCdvcy5lbnZpcm9uJywge30pCisgICAgc2VsZi5hZGRDbGVhbnVwKG9zX2Vudmlyb25fcGF0Y2hlci5zdG9wKQorICAgIHNlbGYubW9ja19vc19lbnZpcm9uID0gb3NfZW52aXJvbl9wYXRjaGVyLnN0YXJ0KCkKKworICAgIHNlbGYuX3NldHVwX3dvcmtpbmdfYnVpbGRfZW52KCkKKyAgICBzZWxmLl93cml0ZV9jaGFuZ2VfaW5mb19maWxlKCkKKyAgICB0ZXN0X21hcHBpbmdfZGlyID0gcGF0aGxpYi5QYXRoKCcvcHJvamVjdC9wYXRoL2ZpbGUvcGF0aCcpCisgICAgdGVzdF9tYXBwaW5nX2Rpci5ta2RpcihwYXJlbnRzPVRydWUpCisgICAgc2VsZi5fd3JpdGVfdGVzdF9tYXBwaW5nX2ZpbGUoKQorCisgIGRlZiBfc2V0dXBfd29ya2luZ19idWlsZF9lbnYoc2VsZik6CisgICAgc2VsZi5jaGFuZ2VfaW5mb19maWxlID0gcGF0aGxpYi5QYXRoKCcvdG1wL2NoYW5nZV9pbmZvJykKKyAgICBzZWxmLl93cml0ZV9zb29uZ191aV9maWxlKCkKKyAgICBzZWxmLl9ob3N0X291dF90ZXN0Y2FzZXMgPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL2hvc3Rfb3V0X3Rlc3RjYXNlcycpCisgICAgc2VsZi5faG9zdF9vdXRfdGVzdGNhc2VzLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl90YXJnZXRfb3V0X3Rlc3RjYXNlcyA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3AvdGFyZ2V0X291dF90ZXN0Y2FzZXMnKQorICAgIHNlbGYuX3RhcmdldF9vdXRfdGVzdGNhc2VzLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl9wcm9kdWN0X291dCA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3AvcHJvZHVjdF9vdXQnKQorICAgIHNlbGYuX3Byb2R1Y3Rfb3V0Lm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl9zb29uZ19ob3N0X291dCA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3Avc29vbmdfaG9zdF9vdXQnKQorICAgIHNlbGYuX3Nvb25nX2hvc3Rfb3V0Lm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl9ob3N0X291dCA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3AvaG9zdF9vdXQnKQorICAgIHNlbGYuX2hvc3Rfb3V0Lm1rZGlyKHBhcmVudHM9VHJ1ZSkKKworICAgIHNlbGYuX2Rpc3RfZGlyID0gcGF0aGxpYi5QYXRoKCcvdG1wL3RvcC9vdXQvZGlzdCcpCisgICAgc2VsZi5fZGlzdF9kaXIubWtkaXIocGFyZW50cz1UcnVlKQorCisgICAgc2VsZi5tb2NrX29zX2Vudmlyb24udXBkYXRlKHsKKyAgICAgICAgJ0NIQU5HRV9JTkZPJzogc3RyKHNlbGYuY2hhbmdlX2luZm9fZmlsZSksCisgICAgICAgICdUT1AnOiAnL3RtcC90b3AnLAorICAgICAgICAnRElTVF9ESVInOiAnL3RtcC90b3Avb3V0L2Rpc3QnLAorICAgIH0pCisKKyAgZGVmIF93cml0ZV9zb29uZ191aV9maWxlKHNlbGYpOgorICAgIHNvb25nX3BhdGggPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL2J1aWxkL3Nvb25nJykKKyAgICBzb29uZ19wYXRoLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHNvb25nX3BhdGgsICdzb29uZ191aS5iYXNoJyksICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoIiIiCisgICAgICAgICAgICAgICMvYmluL2Jhc2gKKyAgICAgICAgICAgICAgZWNobyBIT1NUX09VVF9URVNUQ0FTRVM9Jy90bXAvdG9wL2hvc3Rfb3V0X3Rlc3RjYXNlcycKKyAgICAgICAgICAgICAgZWNobyBUQVJHRVRfT1VUX1RFU1RDQVNFUz0nL3RtcC90b3AvdGFyZ2V0X291dF90ZXN0Y2FzZXMnCisgICAgICAgICAgICAgIGVjaG8gUFJPRFVDVF9PVVQ9Jy90bXAvdG9wL3Byb2R1Y3Rfb3V0JworICAgICAgICAgICAgICBlY2hvIFNPT05HX0hPU1RfT1VUPScvdG1wL3RvcC9zb29uZ19ob3N0X291dCcKKyAgICAgICAgICAgICAgZWNobyBIT1NUX09VVD0nL3RtcC90b3AvaG9zdF9vdXQnCisgICAgICAgICAgICAgICIiIikKKyAgICBvcy5jaG1vZChvcy5wYXRoLmpvaW4oc29vbmdfcGF0aCwgJ3Nvb25nX3VpLmJhc2gnKSwgMG82NjYpCisKKyAgZGVmIF93cml0ZV9jaGFuZ2VfaW5mb19maWxlKHNlbGYpOgorICAgIGNoYW5nZV9pbmZvX2NvbnRlbnRzID0geworICAgICAgICAnY2hhbmdlcyc6IFt7CisgICAgICAgICAgICAncHJvamVjdFBhdGgnOiAnL3Byb2plY3QvcGF0aCcsCisgICAgICAgICAgICAncmV2aXNpb25zJzogW3sKKyAgICAgICAgICAgICAgICAnZmlsZUluZm9zJzogW3sKKyAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAnZmlsZS9wYXRoL2ZpbGVfbmFtZScsCisgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICB9XSwKKyAgICAgICAgfV0KKyAgICB9CisKKyAgICB3aXRoIG9wZW4oc2VsZi5jaGFuZ2VfaW5mb19maWxlLCAndycpIGFzIGY6CisgICAgICBqc29uLmR1bXAoY2hhbmdlX2luZm9fY29udGVudHMsIGYpCisKKyAgZGVmIF93cml0ZV90ZXN0X21hcHBpbmdfZmlsZShzZWxmKToKKyAgICB0ZXN0X21hcHBpbmdfY29udGVudHMgPSB7CisgICAgICAgICd0ZXN0LW1hcHBpbmctZ3JvdXAnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAndGVzdF9tYXBwaW5nX21vZHVsZScsCisgICAgICAgICAgICB9LAorICAgICAgICBdLAorICAgIH0KKworICAgIHdpdGggb3BlbignL3Byb2plY3QvcGF0aC9maWxlL3BhdGgvVEVTVF9NQVBQSU5HJywgJ3cnKSBhcyBmOgorICAgICAganNvbi5kdW1wKHRlc3RfbWFwcGluZ19jb250ZW50cywgZikKKworICBkZWYgdGVzdF9nZW5lcmFsX3Rlc3RzX29wdGltaXplZChzZWxmKToKKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoKQorCisgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBleHBlY3RlZF9idWlsZF90YXJnZXRzID0gc2V0KAorICAgICAgICBvcHRpbWl6ZWRfdGFyZ2V0cy5HZW5lcmFsVGVzdHNPcHRpbWl6ZXIuX1JFUVVJUkVEX01PRFVMRVMKKyAgICApCisgICAgZXhwZWN0ZWRfYnVpbGRfdGFyZ2V0cy5hZGQoJ3Rlc3RfbWFwcGluZ19tb2R1bGUnKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBleHBlY3RlZF9idWlsZF90YXJnZXRzKQorCisgIGRlZiB0ZXN0X25vX2NoYW5nZV9pbmZvX25vX29wdGltaXphdGlvbihzZWxmKToKKyAgICBkZWwgb3MuZW52aXJvblsnQ0hBTkdFX0lORk8nXQorCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIGJ1aWxkX3RhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCB7J2dlbmVyYWwtdGVzdHMnfSkKKworICBkZWYgdGVzdF9tYXBwaW5nX2dyb3Vwc191bnVzZWRfbW9kdWxlX25vdF9idWlsdChzZWxmKToKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLl9jcmVhdGVfdGVzdF9jb250ZXh0KCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFsKKyAgICAgICAgeworICAgICAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICAgICAndmFsdWVzJzogWydnZW5lcmFsLXRlc3RzLnppcCddLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAna2V5JzogJ3Rlc3QtbWFwcGluZy10ZXN0LWdyb3VwJywKKyAgICAgICAgICAgICd2YWx1ZXMnOiBbJ3VudXNlZC10ZXN0LW1hcHBpbmctZ3JvdXAnXSwKKyAgICAgICAgfSwKKyAgICBdCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuX2NyZWF0ZV9idWlsZF9jb250ZXh0KHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQpCisgICAgKQorCisgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBleHBlY3RlZF9idWlsZF90YXJnZXRzID0gc2V0KAorICAgICAgICBvcHRpbWl6ZWRfdGFyZ2V0cy5HZW5lcmFsVGVzdHNPcHRpbWl6ZXIuX1JFUVVJUkVEX01PRFVMRVMKKyAgICApCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBleHBlY3RlZF9idWlsZF90YXJnZXRzKQorCisgIGRlZiB0ZXN0X2dlbmVyYWxfdGVzdHNfdXNlZF9ieV9ub25fdGVzdF9tYXBwaW5nX3Rlc3Rfbm9fb3B0aW1pemF0aW9uKHNlbGYpOgorICAgIHRlc3RfY29udGV4dCA9IHNlbGYuX2NyZWF0ZV90ZXN0X2NvbnRleHQoKQorICAgIHRlc3RfY29udGV4dFsndGVzdEluZm9zJ11bMF1bJ2V4dHJhT3B0aW9ucyddID0gW3sKKyAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICd2YWx1ZXMnOiBbJ2dlbmVyYWwtdGVzdHMuemlwJ10sCisgICAgfV0KKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5fY3JlYXRlX2J1aWxkX2NvbnRleHQodGVzdF9jb250ZXh0PXRlc3RfY29udGV4dCkKKyAgICApCisKKyAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgeydnZW5lcmFsLXRlc3RzJ30pCisKKyAgZGVmIHRlc3RfbWFsZm9ybWVkX2NoYW5nZV9pbmZvX3JhaXNlcyhzZWxmKToKKyAgICB3aXRoIG9wZW4oc2VsZi5jaGFuZ2VfaW5mb19maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCdub3QgY2hhbmdlIGluZm8nKQorCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoanNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvcik6CisgICAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICBkZWYgdGVzdF9tYWxmb3JtZWRfdGVzdF9tYXBwaW5nX3JhaXNlcyhzZWxmKToKKyAgICB3aXRoIG9wZW4oJy9wcm9qZWN0L3BhdGgvZmlsZS9wYXRoL1RFU1RfTUFQUElORycsICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoJ25vdCB0ZXN0IG1hcHBpbmcnKQorCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoanNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvcik6CisgICAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICBAbW9jay5wYXRjaCgnc3VicHJvY2Vzcy5ydW4nKQorICBkZWYgdGVzdF9wYWNrYWdpbmdfb3V0cHV0c19zdWNjZXNzKHNlbGYsIHN1YnByb2Nlc3NfcnVuKToKKyAgICBzdWJwcm9jZXNzX3J1bi5yZXR1cm5fdmFsdWUgPSBzZWxmLl9nZXRfc29vbmdfdmFyc19vdXRwdXQoKQorICAgIG9wdGltaXplciA9IHNlbGYuX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigpCisgICAgc2VsZi5fc2V0X3VwX2J1aWxkX291dHB1dHMoWyd0ZXN0X21hcHBpbmdfbW9kdWxlJ10pCisKKyAgICB0YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKyAgICBwYWNrYWdlX2NvbW1hbmRzID0gb3B0aW1pemVyLmdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHMoKQorCisgICAgc2VsZi5fdmVyaWZ5X3Nvb25nX3ppcF9jb21tYW5kcyhwYWNrYWdlX2NvbW1hbmRzLCBbJ3Rlc3RfbWFwcGluZ19tb2R1bGUnXSkKKworICBAbW9jay5wYXRjaCgnc3VicHJvY2Vzcy5ydW4nKQorICBkZWYgdGVzdF9nZXRfc29vbmdfZHVtcHZhcnNfZmFpbHNfcmFpc2VzKHNlbGYsIHN1YnByb2Nlc3NfcnVuKToKKyAgICBzdWJwcm9jZXNzX3J1bi5yZXR1cm5fdmFsdWUgPSBzZWxmLl9nZXRfc29vbmdfdmFyc19vdXRwdXQocmV0dXJuX2NvZGU9LTEpCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKyAgICBzZWxmLl9zZXRfdXBfYnVpbGRfb3V0cHV0cyhbJ3Rlc3RfbWFwcGluZ19tb2R1bGUnXSkKKworICAgIHRhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFJ1bnRpbWVFcnJvciwgJ1Nvb25nIGR1bXB2YXJzIGZhaWxlZCEnKToKKyAgICAgIHBhY2thZ2VfY29tbWFuZHMgPSBvcHRpbWl6ZXIuZ2V0X3BhY2thZ2Vfb3V0cHV0c19jb21tYW5kcygpCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MucnVuJykKKyAgZGVmIHRlc3RfZ2V0X3Nvb25nX2R1bXB2YXJzX2JhZF9vdXRwdXRfcmFpc2VzKHNlbGYsIHN1YnByb2Nlc3NfcnVuKToKKyAgICBzdWJwcm9jZXNzX3J1bi5yZXR1cm5fdmFsdWUgPSBzZWxmLl9nZXRfc29vbmdfdmFyc19vdXRwdXQoCisgICAgICAgIHN0ZG91dD0nVGhpcyBvdXRwdXQgaXMgYmFkJworICAgICkKKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoKQorICAgIHNlbGYuX3NldF91cF9idWlsZF9vdXRwdXRzKFsndGVzdF9tYXBwaW5nX21vZHVsZSddKQorCisgICAgdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgIFJ1bnRpbWVFcnJvciwgJ0Vycm9yIHBhcnNpbmcgc29vbmcgZHVtcHZhcnMgb3V0cHV0JworICAgICk6CisgICAgICBwYWNrYWdlX2NvbW1hbmRzID0gb3B0aW1pemVyLmdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHMoKQorCisgIGRlZiBfY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKHNlbGYsIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCA9IE5vbmUpOgorICAgIGlmIG5vdCBidWlsZF9jb250ZXh0OgorICAgICAgYnVpbGRfY29udGV4dCA9IHNlbGYuX2NyZWF0ZV9idWlsZF9jb250ZXh0KCkKKyAgICByZXR1cm4gb3B0aW1pemVkX3RhcmdldHMuR2VuZXJhbFRlc3RzT3B0aW1pemVyKAorICAgICAgICAnZ2VuZXJhbC10ZXN0cycsIGJ1aWxkX2NvbnRleHQsIE5vbmUKKyAgICApCisKKyAgZGVmIF9jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgIHNlbGYsCisgICAgICBnZW5lcmFsX3Rlc3RzX29wdGltaXplZDogYm9vbCA9IFRydWUsCisgICAgICB0ZXN0X2NvbnRleHQ6IGRpY3Rbc3RyLCBhbnldID0gTm9uZSwKKyAgKSAtPiBCdWlsZENvbnRleHQ6CisgICAgaWYgbm90IHRlc3RfY29udGV4dDoKKyAgICAgIHRlc3RfY29udGV4dCA9IHNlbGYuX2NyZWF0ZV90ZXN0X2NvbnRleHQoKQorICAgIGJ1aWxkX2NvbnRleHRfZGljdCA9IHt9CisgICAgYnVpbGRfY29udGV4dF9kaWN0WydlbmFibGVkQnVpbGRGZWF0dXJlcyddID0gW3snbmFtZSc6ICdvcHRpbWl6ZWRfYnVpbGQnfV0KKyAgICBpZiBnZW5lcmFsX3Rlc3RzX29wdGltaXplZDoKKyAgICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXS5hcHBlbmQoCisgICAgICAgICAgeyduYW1lJzogJ2dlbmVyYWxfdGVzdHNfb3B0aW1pemVkJ30KKyAgICAgICkKKyAgICBidWlsZF9jb250ZXh0X2RpY3RbJ3Rlc3RDb250ZXh0J10gPSB0ZXN0X2NvbnRleHQKKyAgICByZXR1cm4gQnVpbGRDb250ZXh0KGJ1aWxkX2NvbnRleHRfZGljdCkKKworICBkZWYgX2NyZWF0ZV90ZXN0X2NvbnRleHQoc2VsZik6CisgICAgcmV0dXJuIHsKKyAgICAgICAgJ3Rlc3RJbmZvcyc6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6ICdhdHBfdGVzdCcsCisgICAgICAgICAgICAgICAgJ3RhcmdldCc6ICd0ZXN0X3RhcmdldCcsCisgICAgICAgICAgICAgICAgJ2JyYW5jaCc6ICdicmFuY2gnLAorICAgICAgICAgICAgICAgICdleHRyYU9wdGlvbnMnOiBbCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdrZXknOiAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyc6IFsnZ2VuZXJhbC10ZXN0cy56aXAnXSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJ2tleSc6ICd0ZXN0LW1hcHBpbmctdGVzdC1ncm91cCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVzJzogWyd0ZXN0LW1hcHBpbmctZ3JvdXAnXSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICdjb21tYW5kJzogJy90Zi9jb21tYW5kJywKKyAgICAgICAgICAgICAgICAnZXh0cmFCdWlsZFRhcmdldHMnOiBbCisgICAgICAgICAgICAgICAgICAgICdleHRyYV9idWlsZF90YXJnZXQnLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICBdLAorICAgIH0KKworICBkZWYgX2dldF9zb29uZ192YXJzX291dHB1dCgKKyAgICAgIHNlbGYsIHJldHVybl9jb2RlOiBpbnQgPSAwLCBzdGRvdXQ6IHN0ciA9ICcnCisgICkgLT4gc3VicHJvY2Vzcy5Db21wbGV0ZWRQcm9jZXNzOgorICAgIHJldHVybl92YWx1ZSA9IHN1YnByb2Nlc3MuQ29tcGxldGVkUHJvY2VzcyhhcmdzPVtdLCByZXR1cm5jb2RlPXJldHVybl9jb2RlKQorICAgIGlmIG5vdCBzdGRvdXQ6CisgICAgICBzdGRvdXQgPSB0ZXh0d3JhcC5kZWRlbnQoZiIiIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1NUX09VVF9URVNUQ0FTRVM9J3tzZWxmLl9ob3N0X291dF90ZXN0Y2FzZXN9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9PVVRfVEVTVENBU0VTPSd7c2VsZi5fdGFyZ2V0X291dF90ZXN0Y2FzZXN9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVQ1RfT1VUPSd7c2VsZi5fcHJvZHVjdF9vdXR9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPT05HX0hPU1RfT1VUPSd7c2VsZi5fc29vbmdfaG9zdF9vdXR9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfT1VUPSd7c2VsZi5faG9zdF9vdXR9JyIiIikKKworICAgIHJldHVybl92YWx1ZS5zdGRvdXQgPSBzdGRvdXQKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlCisKKyAgZGVmIF9zZXRfdXBfYnVpbGRfb3V0cHV0cyhzZWxmLCB0YXJnZXRzOiBsaXN0W3N0cl0pOgorICAgIGZvciB0YXJnZXQgaW4gdGFyZ2V0czoKKyAgICAgIGhvc3RfZGlyID0gc2VsZi5faG9zdF9vdXRfdGVzdGNhc2VzIC8gdGFyZ2V0CisgICAgICBob3N0X2Rpci5ta2RpcigpCisgICAgICAoaG9zdF9kaXIgLyBmJ3t0YXJnZXR9LmNvbmZpZycpLnRvdWNoKCkKKyAgICAgIChob3N0X2RpciAvIGYndGVzdF9maWxlJykudG91Y2goKQorCisgICAgICB0YXJnZXRfZGlyID0gc2VsZi5fdGFyZ2V0X291dF90ZXN0Y2FzZXMgLyB0YXJnZXQKKyAgICAgIHRhcmdldF9kaXIubWtkaXIoKQorICAgICAgKHRhcmdldF9kaXIgLyBmJ3t0YXJnZXR9LmNvbmZpZycpLnRvdWNoKCkKKyAgICAgICh0YXJnZXRfZGlyIC8gZid0ZXN0X2ZpbGUnKS50b3VjaCgpCisKKyAgZGVmIF92ZXJpZnlfc29vbmdfemlwX2NvbW1hbmRzKHNlbGYsIGNvbW1hbmRzOiBsaXN0W3N0cl0sIHRhcmdldHM6IGxpc3Rbc3RyXSk6CisgICAgIiIiVmVyaWZ5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHppcCBjb21tYW5kcy4KKworICAgIFppcCBjb21tYW5kcyBoYXZlIHRvIHN0YXJ0IHdpdGggdGhlIHNvb25nX3ppcCBiaW5hcnkgcGF0aCwgdGhlbiBhcmUgZm9sbG93ZWQKKyAgICBieSBhIGNvdXBsZSBvZiBvcHRpb25zIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWluZyB6aXBwZWQuIERlcGVuZGluZyBvbgorICAgIHdoaWNoIHppcCB3ZSBhcmUgY3JlYXRpbmcgbG9vayBmb3IgYSBmZXcgZXNzZW50aWFsIGl0ZW1zIGJlaW5nIGFkZGVkIGluCisgICAgdGhvc2Ugemlwcy4KKworICAgIEFyZ3M6CisgICAgICBjb21tYW5kczogbGlzdCBvZiBjb21tYW5kIGxpc3RzCisgICAgICB0YXJnZXRzOiBsaXN0IG9mIHRhcmdldHMgZXhwZWN0ZWQgdG8gYmUgaW4gZ2VuZXJhbC10ZXN0cy56aXAKKyAgICAiIiIKKyAgICBmb3IgY29tbWFuZCBpbiBjb21tYW5kczoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgJy90bXAvdG9wL3ByZWJ1aWx0cy9idWlsZC10b29scy9saW51eC14ODYvYmluL3Nvb25nX3ppcCcsCisgICAgICAgICAgY29tbWFuZFswXSwKKyAgICAgICkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy1kJywgY29tbWFuZFsxXSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy1vJywgY29tbWFuZFsyXSkKKyAgICAgIG1hdGNoIChjb21tYW5kWzNdKToKKyAgICAgICAgY2FzZSAnL3RtcC90b3Avb3V0L2Rpc3QvZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcCc6CisgICAgICAgICAgc2VsZi5hc3NlcnRJbihmJ3tzZWxmLl9ob3N0X291dH0vaG9zdF9nZW5lcmFsLXRlc3RzX2xpc3QnLCBjb21tYW5kKQorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgIGYne3NlbGYuX3Byb2R1Y3Rfb3V0fS90YXJnZXRfZ2VuZXJhbC10ZXN0c19saXN0JywgY29tbWFuZAorICAgICAgICAgICkKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2FzZSAnL3RtcC90b3Avb3V0L2Rpc3QvZ2VuZXJhbC10ZXN0c19saXN0LnppcCc6CisgICAgICAgICAgc2VsZi5hc3NlcnRJbignLWYnLCBjb21tYW5kKQorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZid7c2VsZi5faG9zdF9vdXR9L2dlbmVyYWwtdGVzdHNfbGlzdCcsIGNvbW1hbmQpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNhc2UgJy90bXAvdG9wL291dC9kaXN0L2dlbmVyYWwtdGVzdHMuemlwJzoKKyAgICAgICAgICBmb3IgdGFyZ2V0IGluIHRhcmdldHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGYne3NlbGYuX2hvc3Rfb3V0X3Rlc3RjYXNlc30ve3RhcmdldH0nLCBjb21tYW5kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmJ3tzZWxmLl90YXJnZXRfb3V0X3Rlc3RjYXNlc30ve3RhcmdldH0nLCBjb21tYW5kKQorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgIGYne3NlbGYuX3Nvb25nX2hvc3Rfb3V0fS9mcmFtZXdvcmsvY3RzLXRyYWRlZmVkLmphcicsIGNvbW1hbmQKKyAgICAgICAgICApCisgICAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgZid7c2VsZi5fc29vbmdfaG9zdF9vdXR9L2ZyYW1ld29yay9jb21wYXRpYmlsaXR5LWhvc3QtdXRpbC5qYXInLAorICAgICAgICAgICAgICBjb21tYW5kLAorICAgICAgICAgICkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgICBmJ3tzZWxmLl9zb29uZ19ob3N0X291dH0vZnJhbWV3b3JrL3Z0cy10cmFkZWZlZC5qYXInLCBjb21tYW5kCisgICAgICAgICAgKQorICAgICAgICAgIHJldHVybgorICAgICAgICBjYXNlIF86CisgICAgICAgICAgc2VsZi5mYWlsKGYnbWFsZm9ybWVkIGNvbW1hbmQ6IHtjb21tYW5kfScpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgIyBTZXR1cCBsb2dnaW5nIHRvIGJlIHNpbGVudCBzbyB1bml0IHRlc3RzIGNhbiBwYXNzIHRocm91Z2ggVEYuCisgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLkVSUk9SKQorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2NpL3Rlc3RfZGlzY292ZXJ5X2FnZW50LnB5IGIvY2kvdGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4ZWU0NwotLS0gL2Rldi9udWxsCisrKyBiL2NpL3Rlc3RfZGlzY292ZXJ5X2FnZW50LnB5CkBAIC0wLDAgKzEsMTIwIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiJUZXN0IGRpc2NvdmVyeSBhZ2VudCB0aGF0IHVzZXMgVHJhZGVGZWQgdG8gZGlzY292ZXIgdGVzdCBhcnRpZmFjdHMuIiIiCitpbXBvcnQgZ2xvYgoraW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKKworY2xhc3MgVGVzdERpc2NvdmVyeUFnZW50OgorICAiIiJUZXN0IGRpc2NvdmVyeSBhZ2VudC4iIiIKKworICBfVFJBREVGRURfUFJFQlVJTFRfSkFSX1JFTEFUSVZFX1BBVEggPSAoCisgICAgICAidmVuZG9yL2dvb2dsZV90cmFkZWZlZGVyYXRpb24vcHJlYnVpbHRzL2ZpbGVncm91cHMvZ29vZ2xlLXRyYWRlZmVkLyIKKyAgKQorCisgIF9UUkFERUZFRF9OT19QT1NTSUJMRV9URVNUX0RJU0NPVkVSWV9LRVkgPSAiTm9Qb3NzaWJsZVRlc3REaXNjb3ZlcnkiCisKKyAgX1RSQURFRkVEX1RFU1RfWklQX1JFR0VYRVNfTElTVF9LRVkgPSAiVGVzdFppcFJlZ2V4ZXMiCisKKyAgX1RSQURFRkVEX0RJU0NPVkVSWV9PVVRQVVRfRklMRV9OQU1FID0gInRlc3RfZGlzY292ZXJ5X2FnZW50LnR4dCIKKworICBkZWYgX19pbml0X18oCisgICAgICBzZWxmLAorICAgICAgdHJhZGVmZWRfYXJnczogbGlzdFtzdHJdLAorICAgICAgdGVzdF9tYXBwaW5nX3ppcF9wYXRoOiBzdHIgPSAiIiwKKyAgICAgIHRyYWRlZmVkX2phcl9yZXZlbGFudF9maWxlc19wYXRoOiBzdHIgPSBfVFJBREVGRURfUFJFQlVJTFRfSkFSX1JFTEFUSVZFX1BBVEgsCisgICk6CisgICAgc2VsZi50cmFkZWZlZF9hcmdzID0gdHJhZGVmZWRfYXJncworICAgIHNlbGYudGVzdF9tYXBwaW5nX3ppcF9wYXRoID0gdGVzdF9tYXBwaW5nX3ppcF9wYXRoCisgICAgc2VsZi50cmFkZWZlZF9qYXJfcmVsZXZhbnRfZmlsZXNfcGF0aCA9IHRyYWRlZmVkX2phcl9yZXZlbGFudF9maWxlc19wYXRoCisKKyAgZGVmIGRpc2NvdmVyX3Rlc3RfemlwX3JlZ2V4ZXMoc2VsZikgLT4gbGlzdFtzdHJdOgorICAgICIiIkRpc2NvdmVyIHRlc3QgemlwIHJlZ2V4ZXMgZnJvbSBUcmFkZUZlZC4KKworICAgIFJldHVybnM6CisgICAgICBBIGxpc3Qgb2YgdGVzdCB6aXAgcmVnZXhlcyB0aGF0IFRGIGlzIGdvaW5nIHRvIHRyeSB0byBwdWxsIGZpbGVzIGZyb20uCisgICAgIiIiCisgICAgdGVzdF9kaXNjb3Zlcnlfb3V0cHV0X2ZpbGVfbmFtZSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1RPUCcpLCAnb3V0Jywgc2VsZi5fVFJBREVGRURfRElTQ09WRVJZX09VVFBVVF9GSUxFX05BTUUKKyAgICApCisgICAgd2l0aCBvcGVuKAorICAgICAgICB0ZXN0X2Rpc2NvdmVyeV9vdXRwdXRfZmlsZV9uYW1lLCBtb2RlPSJ3K3QiCisgICAgKSBhcyB0ZXN0X2Rpc2NvdmVyeV9vdXRwdXRfZmlsZToKKyAgICAgIGphdmFfYXJncyA9IFtdCisgICAgICBqYXZhX2FyZ3MuYXBwZW5kKCJwcmVidWlsdHMvamRrL2pkazIxL2xpbnV4LXg4Ni9iaW4vamF2YSIpCisgICAgICBqYXZhX2FyZ3MuYXBwZW5kKCItY3AiKQorICAgICAgamF2YV9hcmdzLmFwcGVuZCgKKyAgICAgICAgICBzZWxmLmNyZWF0ZV9jbGFzc3BhdGgoc2VsZi50cmFkZWZlZF9qYXJfcmVsZXZhbnRfZmlsZXNfcGF0aCkKKyAgICAgICkKKyAgICAgIGphdmFfYXJncy5hcHBlbmQoCisgICAgICAgICAgImNvbS5hbmRyb2lkLnRyYWRlZmVkLm9ic2VydmF0b3J5LlRlc3RaaXBEaXNjb3ZlcnlFeGVjdXRvciIKKyAgICAgICkKKyAgICAgIGphdmFfYXJncy5leHRlbmQoc2VsZi50cmFkZWZlZF9hcmdzKQorICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgIGVudi51cGRhdGUoeyJESVNDT1ZFUllfT1VUUFVUX0ZJTEUiOiB0ZXN0X2Rpc2NvdmVyeV9vdXRwdXRfZmlsZS5uYW1lfSkKKyAgICAgIGxvZ2dpbmcuaW5mbyhmIkNhbGxpbmcgdGVzdCBkaXNjb3Zlcnkgd2l0aCBhcmdzOiB7amF2YV9hcmdzfSIpCisgICAgICB0cnk6CisgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGFyZ3M9amF2YV9hcmdzLCBlbnY9ZW52LCB0ZXh0PVRydWUsIGNoZWNrPVRydWUpCisgICAgICAgIGxvZ2dpbmcuaW5mbyhmIlRlc3QgemlwIGRpc2NvdmVyeSBvdXRwdXQ6IHtyZXN1bHQuc3Rkb3V0fSIpCisgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKKyAgICAgICAgcmFpc2UgVGVzdERpc2NvdmVyeUVycm9yKAorICAgICAgICAgICAgZiJGYWlsZWQgdG8gcnVuIHRlc3QgZGlzY292ZXJ5LCBzdHJvdXQ6IHtlLnN0ZG91dH0sIHN0cmVycjoiCisgICAgICAgICAgICBmIiB7ZS5zdGRlcnJ9LCByZXR1cm5jb2RlOiB7ZS5yZXR1cm5jb2RlfSIKKyAgICAgICAgKQorICAgICAgZGF0YSA9IGpzb24ubG9hZHModGVzdF9kaXNjb3Zlcnlfb3V0cHV0X2ZpbGUucmVhZCgpKQorICAgICAgbG9nZ2luZy5pbmZvKGYiVGVzdCBkaXNjb3ZlcnkgcmVzdWx0IGZpbGUgY29udGVudDoge2RhdGF9IikKKyAgICAgIGlmICgKKyAgICAgICAgICBzZWxmLl9UUkFERUZFRF9OT19QT1NTSUJMRV9URVNUX0RJU0NPVkVSWV9LRVkgaW4gZGF0YQorICAgICAgICAgIGFuZCBkYXRhW3NlbGYuX1RSQURFRkVEX05PX1BPU1NJQkxFX1RFU1RfRElTQ09WRVJZX0tFWV0KKyAgICAgICk6CisgICAgICAgIHJhaXNlIFRlc3REaXNjb3ZlcnlFcnJvcigiTm8gcG9zc2libGUgdGVzdCBkaXNjb3ZlcnkiKQorICAgICAgaWYgKAorICAgICAgICAgIGRhdGFbc2VsZi5fVFJBREVGRURfVEVTVF9aSVBfUkVHRVhFU19MSVNUX0tFWV0gaXMgTm9uZQorICAgICAgICAgIG9yIGRhdGFbc2VsZi5fVFJBREVGRURfVEVTVF9aSVBfUkVHRVhFU19MSVNUX0tFWV0gaXMgW10KKyAgICAgICk6CisgICAgICAgIHJhaXNlIFRlc3REaXNjb3ZlcnlFcnJvcigiTm8gdGVzdCB6aXAgcmVnZXhlcyByZXR1cm5lZCIpCisgICAgICByZXR1cm4gZGF0YVtzZWxmLl9UUkFERUZFRF9URVNUX1pJUF9SRUdFWEVTX0xJU1RfS0VZXQorCisgIGRlZiBkaXNjb3Zlcl90ZXN0X21vZHVsZXMoc2VsZikgLT4gbGlzdFtzdHJdOgorICAgICIiIkRpc2NvdmVyIHRlc3QgbW9kdWxlcyBmcm9tIFRyYWRlRmVkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgbGlzdCBvZiB0ZXN0IG1vZHVsZXMgdGhhdCBUcmFkZUZlZCBpcyBnb2luZyB0byBleGVjdXRlIGJhc2VkIG9uIHRoZQorICAgICAgVHJhZGVGZWQgdGVzdCBhcmdzLgorICAgICIiIgorICAgIHJldHVybiBbXQorCisgIGRlZiBjcmVhdGVfY2xhc3NwYXRoKHNlbGYsIGRpcmVjdG9yeSk6CisgICAgIiIiQ3JlYXRlcyBhIGNsYXNzcGF0aCBzdHJpbmcgZnJvbSBhbGwgLmphciBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorCisgICAgQXJnczoKKyAgICAgIGRpcmVjdG9yeTogVGhlIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIC5qYXIgZmlsZXMuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGFzc3BhdGgsIHdpdGggamFyIGZpbGVzIHNlcGFyYXRlZCBieSB0aGUKKyAgICAgIE9TLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yIChlLmcuLCAnOicgb24gTGludXgvbWFjT1MsICc7JyBvbiBXaW5kb3dzKS4KKyAgICAiIiIKKyAgICBqYXJfZmlsZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpcmVjdG9yeSwgIiouamFyIikpCisgICAgcmV0dXJuIG9zLnBhdGhzZXAuam9pbihqYXJfZmlsZXMpCisKKworY2xhc3MgVGVzdERpc2NvdmVyeUVycm9yKEV4Y2VwdGlvbik6CisgICIiIkEgVGVzdERpc2NvdmVyeUVycm9yY2xhc3MuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpOgorICAgIHN1cGVyKCkuX19pbml0X18obWVzc2FnZSkKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCmRpZmYgLS1naXQgYS9jaS90ZXN0X21hcHBpbmdfbW9kdWxlX3JldHJpZXZlci5weSBiL2NpL3Rlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5CmluZGV4IGQyYzEzYzAuLmM5M2NkZDUgMTAwNjQ0Ci0tLSBhL2NpL3Rlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5CisrKyBiL2NpL3Rlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5CkBAIC0xNywxMSArMTcsMTMgQEAKIG1vZHVsZXMgYXJlIG5lZWRlZCB0byBidWlsZCBmb3IgdGhlIGdpdmVuIGxpc3Qgb2YgY2hhbmdlZCBmaWxlcy4KIFRPRE8obHVjYWZhcnNpKTogRGVkdXBsaWNhdGUgZnJvbSBhcnRpZmFjdF9oZWxwZXIucHkKICIiIgorIyBUT0RPKGx1Y2FmYXJzaSk6IFNoYXJlIHRoaXMgbG9naWMgd2l0aCB0aGUgb3JpZ2luYWwgbG9naWMgaW4KKyMgdGVzdF9tYXBwaW5nX3Rlc3RfcmV0cmlldmVyLnB5CiAKLWZyb20gdHlwaW5nIGltcG9ydCBBbnksIERpY3QsIFNldCwgVGV4dAogaW1wb3J0IGpzb24KIGltcG9ydCBvcwogaW1wb3J0IHJlCitmcm9tIHR5cGluZyBpbXBvcnQgQW55CiAKICMgUmVnZXggdG8gZXh0cmEgdGVzdCBuYW1lIGZyb20gdGhlIHBhdGggb2YgdGVzdCBjb25maWcgZmlsZS4KIFRFU1RfTkFNRV9SRUdFWCA9IHInKD86XnwuKi8pKFteL10rKVwuY29uZmlnJwpAQCAtMzksNyArNDEsNyBAQAogX0NPTU1FTlRTX1JFID0gcmUuY29tcGlsZShyJyhcIig/OlteXCJcXF18XFwuKSpcInwoPz0vLykpKD86Ly8uKik/JykKIAogCi1kZWYgRmlsdGVyQ29tbWVudHModGVzdF9tYXBwaW5nX2ZpbGU6IFRleHQpIC0+IFRleHQ6CitkZWYgRmlsdGVyQ29tbWVudHModGVzdF9tYXBwaW5nX2ZpbGU6IHN0cikgLT4gc3RyOgogICAiIiJSZW1vdmUgY29tbWVudHMgaW4gVEVTVF9NQVBQSU5HIGZpbGUgdG8gdmFsaWQgZm9ybWF0LgogCiAgIE9ubHkgJy8vJyBpcyByZWdhcmRlZCBhcyBjb21tZW50cy4KQEAgLTUyLDggKzU0LDggQEAKICAgIiIiCiAgIHJldHVybiByZS5zdWIoX0NPTU1FTlRTX1JFLCByJ1wxJywgdGVzdF9tYXBwaW5nX2ZpbGUpCiAKLWRlZiBHZXRUZXN0TWFwcGluZ3MocGF0aHM6IFNldFtUZXh0XSwKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlZF9wYXRoczogU2V0W1RleHRdKSAtPiBEaWN0W1RleHQsIERpY3RbVGV4dCwgQW55XV06CitkZWYgR2V0VGVzdE1hcHBpbmdzKHBhdGhzOiBzZXRbc3RyXSwKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tlZF9wYXRoczogc2V0W3N0cl0pIC0+IGRpY3Rbc3RyLCBkaWN0W3N0ciwgQW55XV06CiAgICIiIkdldCB0aGUgYWZmZWN0ZWQgVEVTVF9NQVBQSU5HIGZpbGVzLgogCiAgIFRFU1RfTUFQUElORyBmaWxlcyBpbiBzb3VyY2UgY29kZSBhcmUgcGFja2FnZWQgaW50byBhIGJ1aWxkIGFydGlmYWN0CkBAIC0xMjMsMyArMTI1LDY4IEBACiAgICAgICBwYXNzCiAKICAgcmV0dXJuIHRlc3RfbWFwcGluZ3MKKworCitkZWYgRmluZEFmZmVjdGVkTW9kdWxlcygKKyAgICB0ZXN0X21hcHBpbmdzOiBkaWN0W3N0ciwgQW55XSwKKyAgICBjaGFuZ2VkX2ZpbGVzOiBzZXRbc3RyXSwKKyAgICB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHM6IHNldFtzdHJdLAorKSAtPiBzZXRbc3RyXToKKyAgIiIiRmluZCBhZmZlY3RlZCB0ZXN0IG1vZHVsZXMuCisKKyAgRmluZCB0aGUgYWZmZWN0ZWQgc2V0IG9mIHRlc3QgbW9kdWxlcyB0aGF0IHdvdWxkIHJ1biBpbiBhIHRlc3QgbWFwcGluZyBydW4gYmFzZWQgb24gdGhlIGdpdmVuIHRlc3QgbWFwcGluZ3MsIGNoYW5nZWQgZmlsZXMsIGFuZCB0ZXN0IG1hcHBpbmcgdGVzdCBncm91cC4KKworICBBcmdzOgorICAgIHRlc3RfbWFwcGluZ3M6IEEgc2V0IG9mIHRlc3QgbWFwcGluZ3MgcmV0dXJuZWQgYnkgR2V0VGVzdE1hcHBpbmdzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAgeworICAgICAgICAndGVzdF9tYXBwaW5nX2ZpbGVfcGF0aCc6IHsKKyAgICAgICAgICAnZ3JvdXBfbmFtZScgOiBbCisgICAgICAgICAgICAnbmFtZSc6ICdtb2R1bGVfbmFtZScsCisgICAgICAgICAgXSwKKyAgICAgICAgfQorICAgICAgfQorICAgIGNoYW5nZWRfZmlsZXM6IEEgc2V0IG9mIGZpbGVzIGNoYW5nZWQgZm9yIHRoZSBnaXZlbiBydW4uCisgICAgdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzOiBBIHNldCBvZiB0ZXN0IG1hcHBpbmcgdGVzdCBncm91cHMgdGhhdCBhcmUgYmVpbmcgY29uc2lkZXJlZCBmb3IgdGhlIGdpdmVuIHJ1bi4KKworICBSZXR1cm5zOgorICAgIEEgc2V0IG9mIHRlc3QgbW9kdWxlIG5hbWVzIHdoaWNoIHdvdWxkIHJ1biBmb3IgYSB0ZXN0IG1hcHBpbmcgdGVzdCBydW4gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgIiIiCisKKyAgbW9kdWxlcyA9IHNldCgpCisKKyAgZm9yIHRlc3RfbWFwcGluZyBpbiB0ZXN0X21hcHBpbmdzLnZhbHVlcygpOgorICAgIGZvciBncm91cF9uYW1lLCBncm91cCBpbiB0ZXN0X21hcHBpbmcuaXRlbXMoKToKKyAgICAgICMgSWYgYSBtb2R1bGUgaXMgbm90IGluIGFueSBvZiB0aGUgdGVzdCBtYXBwaW5nIGdyb3VwcyBiZWluZyB0ZXN0ZWQgc2tpcAorICAgICAgIyBpdC4KKyAgICAgIGlmIGdyb3VwX25hbWUgbm90IGluIHRlc3RfbWFwcGluZ190ZXN0X2dyb3VwczoKKyAgICAgICAgY29udGludWUKKworICAgICAgZm9yIGVudHJ5IGluIGdyb3VwOgorICAgICAgICBtb2R1bGVfbmFtZSA9IGVudHJ5LmdldCgnbmFtZScpCisKKyAgICAgICAgaWYgbm90IG1vZHVsZV9uYW1lOgorICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZmlsZV9wYXR0ZXJucyA9IGVudHJ5LmdldCgnZmlsZV9wYXR0ZXJucycpCisgICAgICAgIGlmIG5vdCBmaWxlX3BhdHRlcm5zOgorICAgICAgICAgIG1vZHVsZXMuYWRkKG1vZHVsZV9uYW1lKQorICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgbWF0Y2hlc19maWxlX3BhdHRlcm5zKGZpbGVfcGF0dGVybnMsIGNoYW5nZWRfZmlsZXMpOgorICAgICAgICAgIG1vZHVsZXMuYWRkKG1vZHVsZV9uYW1lKQorCisgIHJldHVybiBtb2R1bGVzCisKK2RlZiBNYXRjaGVzRmlsZVBhdHRlcm5zKAorICAgIGZpbGVfcGF0dGVybnM6IGxpc3Rbc2V0XSwgY2hhbmdlZF9maWxlczogc2V0W3N0cl0KKykgLT4gYm9vbDoKKyAgIiIiQ2hlY2tzIGlmIGFueSBvZiB0aGUgY2hhbmdlZCBmaWxlcyBtYXRjaCBhbnkgb2YgdGhlIGZpbGUgcGF0dGVybnMuCisKKyAgQXJnczoKKyAgICBmaWxlX3BhdHRlcm5zOiBBIGxpc3Qgb2YgZmlsZSBwYXR0ZXJucyB0byBtYXRjaCBhZ2FpbnN0LgorICAgIGNoYW5nZWRfZmlsZXM6IEEgc2V0IG9mIGZpbGVzIHRvIGNoZWNrIGFnYWluc3QgdGhlIGZpbGUgcGF0dGVybnMuCisKKyAgUmV0dXJuczoKKyAgICBUcnVlIGlmIGFueSBvZiB0aGUgY2hhbmdlZCBmaWxlcyBtYXRjaCBhbnkgb2YgdGhlIGZpbGUgcGF0dGVybnMuCisgICIiIgorICByZXR1cm4gYW55KHJlLnNlYXJjaChwYXR0ZXJuLCAifCIuam9pbihjaGFuZ2VkX2ZpbGVzKSkgZm9yIHBhdHRlcm4gaW4gZmlsZV9wYXR0ZXJucykKZGlmZiAtLWdpdCBhL2NvZ3NldHVwLnNoIGIvY29nc2V0dXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTQ4NWQuLjAwMDAwMDAKLS0tIGEvY29nc2V0dXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgZmlsZSBpcyBleGVjdXRlZCBieSBidWlsZC9lbnZzZXR1cC5zaCwgYW5kIGNhbiB1c2UgYW55dGhpbmcKLSMgZGVmaW5lZCBpbiBlbnZzZXR1cC5zaC4KLWZ1bmN0aW9uIF9jcmVhdGVfb3V0X3N5bWxpbmtfZm9yX2NvZygpIHsKLSAgaWYgW1sgIiR7T1VUX0RJUn0iID09ICIiIF1dOyB0aGVuCi0gICAgT1VUX0RJUj0ib3V0IgotICBmaQotCi0gICMgZ2V0b3V0ZGlyIGVuc3VyZXMgcGF0aHMgYXJlIGFic29sdXRlLiBlbnZzZXR1cCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhCi0gICMgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCi0gIGxvY2FsIG91dGRpcj0kKGdldG91dGRpcikKLSAgaWYgW1sgLUwgIiR7b3V0ZGlyfSIgXV07IHRoZW4KLSAgICByZXR1cm4KLSAgZmkKLSAgaWYgWyAtZCAiJHtvdXRkaXJ9IiBdOyB0aGVuCi0gICAgZWNobyAtZSAiXHRPdXRwdXQgZGlyZWN0b3J5ICR7b3V0ZGlyfSBjYW5ub3QgYmUgcHJlc2VudCBpbiBhIENvZyB3b3Jrc3BhY2UuIgotICAgIGVjaG8gLWUgIlx0RGVsZXRlIFwiJHtvdXRkaXJ9XCIgb3IgY3JlYXRlIGEgc3ltbGluayBmcm9tIFwiJHtvdXRkaXJ9XCIgdG8gYSBkaXJlY3Rvcnkgb3V0c2lkZSB5b3VyIHdvcmtzcGFjZS4iCi0gICAgcmV0dXJuIDEKLSAgZmkKLQotICBERUZBVUxUX09VVFBVVF9ESVI9IiR7SE9NRX0vLmNvZy9hbmRyb2lkLWJ1aWxkLW91dCIKLSAgbWtkaXIgLXAgJHtERUZBVUxUX09VVFBVVF9ESVJ9Ci0gIGxuIC1zICR7REVGQVVMVF9PVVRQVVRfRElSfSAke291dGRpcn0KLX0KLQotIyBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50IHRvIGJlIGFwcHJvcHJpYXRlIGZvciBDb2cuCi1mdW5jdGlvbiBfc2V0dXBfY29nX2VudigpIHsKLSAgX2NyZWF0ZV9vdXRfc3ltbGlua19mb3JfY29nCi0gIGlmIFsgIiQ/IiAtZXEgIjEiIF07IHRoZW4KLSAgICBlY2hvIC1lICJcZVswOzMzbVdBUk5JTkc6XGVbMDBtIENvZyBlbnZpcm9ubWVudCBzZXR1cCBmYWlsZWQhIgotICAgIHJldHVybiAxCi0gIGZpCi0KLSAgZXhwb3J0IEFORFJPSURfQlVJTERfRU5WSVJPTk1FTlRfQ09ORklHPSJnb29nbGVyLWNvZyIKLQotICAjIFJ1bm5pbmcgcmVwbyBjb21tYW5kIHdpdGhpbiBDb2cgd29ya3NwYWNlcyBpcyBub3Qgc3VwcG9ydGVkLCBzbyBvdmVycmlkZQotICAjIGl0IHdpdGggdGhpcyBmdW5jdGlvbi4gSWYgdGhlIHVzZXIgaXMgcnVubmluZyByZXBvIHdpdGhpbiBhIENvZyB3b3Jrc3BhY2UsCi0gICMgd2UnbGwgZmFpbCB3aXRoIGFuIGVycm9yLCBvdGhlcndpc2UsIHdlIHJ1biB0aGUgb3JpZ2luYWwgcmVwbyBjb21tYW5kIHdpdGgKLSAgIyB0aGUgZ2l2ZW4gYXJncy4KLSAgaWYgISBPUklHX1JFUE9fUEFUSD1gd2hpY2ggcmVwb2A7IHRoZW4KLSAgICByZXR1cm4gMAotICBmaQotICBmdW5jdGlvbiByZXBvIHsKLSAgICBpZiBbWyAiJHtQV0R9IiA9PSAvZ29vZ2xlL2NvZy8qIF1dOyB0aGVuCi0gICAgICBlY2hvICJcZVswMTszMW1FUlJPUjpcZVswbXJlcG8gY29tbWFuZCBpcyBkaXNhbGxvd2VkIHdpdGhpbiBDb2cgd29ya3NwYWNlcy4iCi0gICAgICByZXR1cm4gMQotICAgIGZpCi0gICAgJHtPUklHX1JFUE9fUEFUSH0gIiRAIgotICB9Ci19Ci0KLWlmIFtbICIke1BXRH0iICE9IC9nb29nbGUvY29nLyogXV07IHRoZW4KLSAgZWNobyAtZSAiXGVbMDE7MzFtRVJST1I6XGVbMG0gVGhpcyBzY3JpcHQgbXVzdCBiZSBydW4gZnJvbSBhIENvZyB3b3Jrc3BhY2UuIgotZmkKLQotX3NldHVwX2NvZ19lbnYKZGlmZiAtLWdpdCBhL2NvcmUvQlVJTEQuYmF6ZWwgYi9jb3JlL0JVSUxELmJhemVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg2OWQ0Li4wMDAwMDAwCi0tLSBhL2NvcmUvQlVJTEQuYmF6ZWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLQotIyBFeHBvcnQgdHJhZGVmZWQgdGVtcGxhdGVzIGZvciB0ZXN0cy4KLWV4cG9ydHNfZmlsZXMoCi0gICAgZ2xvYihbIioueG1sIl0pLAotKQotCi0jIEV4cG9ydCBwcm9ndWFyZCBmbGFnIGZpbGVzIGZvciByOC4KLWZpbGVncm91cCgKLSAgICBuYW1lID0gImdsb2JhbF9wcm9ndWFyZF9mbGFncyIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgInByb2d1YXJkLmZsYWdzIiwKLSAgICAgICAgInByb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzIiwKLSAgICBdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKZGlmZiAtLWdpdCBhL2NvcmUvTWFrZWZpbGUgYi9jb3JlL01ha2VmaWxlCmluZGV4IDdkN2I5ZTcuLmE5NTE3MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvTWFrZWZpbGUKKysrIGIvY29yZS9NYWtlZmlsZQpAQCAtMTkyLDYgKzE5MiwzNCBAQAogdW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19wYWlycyA6PQogdW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19kZXN0aW5hdGlvbnMgOj0KIAorCisjIFJldHVybnMgYSBsaXN0IG9mIEVYVFJBX0lOU1RBTExfWklQUyB0cmlvcyB3aG9zZSBwcmltYXJ5IGZpbGUgaXMgY29udGFpbmVkIHdpdGhpbiAkKDEpCisjIFRoZSB0cmlvcyB3aWxsIGNvbnRhaW4gdGhlIHByaW1hcnkgaW5zdGFsbGVkIGZpbGUgOiB0aGUgZGlyZWN0b3J5IHRvIHVuemlwIHRoZSB6aXAgdG8gOiB0aGUgemlwCitkZWZpbmUgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzCiskKHN0cmlwICQoZm9yZWFjaCBwLCQoRVhUUkFfSU5TVEFMTF9aSVBTKSwgXAorICAkKGlmICQoZmlsdGVyICQoY2FsbCB3b3JkLWNvbG9uLDEsJChwKSksJCgxKSksIFwKKyAgICAkKHApKSkpCitlbmRlZgorCisjIFdyaXRlcyBhIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZmlsZXMgdGhhdCB3aWxsIGJlIGluc2lkZSBhIHBhcnRpdGlvbi4KKyMgQWxsIHRoZSBmaWxlIHBhdGhzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbidzIHN0YWdpbmcgZGlyZWN0b3J5LgorIyBJdCB3aWxsIGFsc28gdGFrZSBpbnRvIGFjY291bnQgZmlsZXMgaW5zaWRlIHppcHMgbGlzdGVkIGluIEVYVFJBX0lOU1RBTExfWklQUy4KKyMKKyMgQXJndW1lbnRzOgorIyAgICQoMSk6IE91dHB1dCBmaWxlCisjICAgJCgyKTogVGhlIHBhcnRpdGlvbidzIHN0YWdpbmcgZGlyZWN0b3J5CisjICAgJCgzKTogRmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcGFydGl0aW9uCitkZWZpbmUgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdAorJCgxKTogUFJJVkFURV9GSUxFUyA6PSAkKHN1YnN0ICQoMikvLCwkKGZpbHRlciAkKDIpLyUsJCgzKSkpCiskKDEpOiBQUklWQVRFX0VYVFJBX0lOU1RBTExfWklQUyA6PSAkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSkKKyQoMSk6ICQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9leHRyYV9pbnN0YWxsX3ppcHNfZmlsZV9saXN0ICQoZm9yZWFjaCBwLCQoY2FsbCByZWxldmFudC1leHRyYS1pbnN0YWxsLXppcHMsJChmaWx0ZXIgJCgyKS8lLCQoMykpKSwkKGNhbGwgd29yZC1jb2xvbiwzLCQocCkpKQorCUBlY2hvIFdyaXRpbmcgJCRACisJcm0gLWYgJCRACisJZWNobyAtbiA+ICQkQAorCSQkKGZvcmVhY2ggZiwkJChQUklWQVRFX0ZJTEVTKSxlY2hvICIkJChmKSIgPj4gJCRAJCQobmV3bGluZSkpCisJJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2V4dHJhX2luc3RhbGxfemlwc19maWxlX2xpc3QgJCgyKSAkJChQUklWQVRFX0VYVFJBX0lOU1RBTExfWklQUykgPj4gJCRACitlbmRlZgorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFJldHVybnMgdGhlIG1heCBhbGxvd2VkIHNpemUgZm9yIGFuIGltYWdlIHN1aXRhYmxlIGZvciBoYXNoIHZlcmlmaWNhdGlvbgogIyAoZS5nLiwgYm9vdC5pbWcsIHJlY292ZXJ5LmltZywgZXRjKS4KQEAgLTY5Miw3ICs3MjAsNyBAQAogCiBCT0FSRF9LRVJORUxfTU9EVUxFX0RJUlMgKz0gdG9wCiAKLSMgRGVmYXVsdCB0byBub3QgZ2VuZXJhdGluZyBtb2R1bGVzLmRlcCBmb3Iga2VybmVsIG1vZHVsZXMgb24gc3lzdGVtCisjIERlZmF1bHQgdG8gbm90IGdlbmVyYXRpbmcgbW9kdWxlcy5sb2FkIGZvciBrZXJuZWwgbW9kdWxlcyBvbiBzeXN0ZW0KICMgc2lkZS4gV2Ugc2hvdWxkIG9ubHkgbG9hZCB0aGVzZSBtb2R1bGVzIGlmIHRoZXkgYXJlIGRlcGVuZGVkIGJ5IHZlbmRvcgogIyBzaWRlIG1vZHVsZXMuCiBpZmVxICgkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFU19MT0FEKSwpCkBAIC03MTcsNyArNzQ1LDcgQEAKICAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBidWlsZC12ZW5kb3ItcmFtZGlzay1jaGFyZ2VyLWxvYWQsJChrbWQpKSkgXAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXZlbmRvci1rZXJuZWwtcmFtZGlzay1jaGFyZ2VyLWxvYWQsJChrbWQpKSkgXAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixPRE0sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19PRE1fRExLTUlNQUdFKSksJChUQVJHRVRfT1VUX09ETV9ETEtNKSwkKFRBUkdFVF9PVVRfT0RNKSksb2RtLG1vZHVsZXMubG9hZCwsJChrbWQpKSkgXAotICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixTWVNURU0sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19TWVNURU1fRExLTUlNQUdFKSksJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKSwkKFRBUkdFVF9PVVRfU1lTVEVNKSksc3lzdGVtLG1vZHVsZXMubG9hZCwsJChrbWQpKSkgXAorICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixTWVNURU0sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19TWVNURU1fRExLTUlNQUdFKSksJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKSwkKFRBUkdFVF9PVVQpKSxzeXN0ZW0sbW9kdWxlcy5sb2FkLCwkKGttZCkpKSBcCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpLFwKICAgICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXJlY292ZXJ5LWFzLWJvb3QtbG9hZCwkKGttZCkpKSxcCiAgICAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcy1kaXIsR0VORVJJQ19SQU1ESVNLLCQoVEFSR0VUX1JBTURJU0tfT1VUKSwsbW9kdWxlcy5sb2FkLCQoR0VORVJJQ19SQU1ESVNLX1NUUklQUEVEX01PRFVMRV9TVEFHSU5HX0RJUiksJChrbWQpKSkpKQpAQCAtODQ0LDYgKzg3Miw3IEBACiBTT09OR19DT05WX0RBVEEgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsc29vbmdfY29udmVyc2lvbikvc29vbmdfY29udl9kYXRhCiAkKFNPT05HX0NPTlZfREFUQSk6CiAJQHJtIC1mICRACisJQHRvdWNoICRAICMgVGhpcyBmaWxlIG11c3QgYmUgcHJlc2VudCBldmVuIGlmIFNPT05HX0NPTlYgaXMgZW1wdHkuCiAJQCQoZm9yZWFjaCBzLCQoU09PTkdfQ09OViksZWNobyAiJChzKSwkKFNPT05HX0NPTlYuJChzKS5UWVBFKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuUFJPQkxFTVMpKSwkKHNvcnQgJChmaWx0ZXItb3V0ICQoU09PTkdfQUxSRUFEWV9DT05WKSwkKFNPT05HX0NPTlYuJChzKS5ERVBTKSkpLCQoc29ydCAkKFNPT05HX0NPTlYuJChzKS5NQUtFRklMRVMpKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuSU5TVEFMTEVEKSkiID4+JEA7KQogCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChTT09OR19DT05WX0RBVEEpLGJ1aWxkKQpAQCAtODU2LDExICs4ODUsNiBAQAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoU09PTkdfVE9fQ09OVkVSVCksYnVpbGQpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWRjb3JlLXVuYnVuZGxlZCwkKFNPT05HX1RPX0NPTlZFUlQpKQogCi0kKFBST0RVQ1RfT1VUKS9wcm9kdWN0X3BhY2thZ2VzLnR4dDoKLQlAcm0gLWYgJEAKLQllY2hvICIiID4gJEAKLQkkKGZvcmVhY2ggeCwkKFBST0RVQ1RfUEFDS0FHRVMpLGVjaG8gJCh4KSA+PiAkQCQobmV3bGluZSkpCi0KIE1LMkJQX0NBVEFMT0dfU0NSSVBUIDo9IGJ1aWxkL21ha2UvdG9vbHMvbWsyYnBfY2F0YWxvZy5weQogUFJPRFVDVF9QQUNLQUdFU19UWFQgOj0gJChQUk9EVUNUX09VVCkvcHJvZHVjdF9wYWNrYWdlcy50eHQKIE1LMkJQX1JFTUFJTklOR19IVE1MIDo9ICQoUFJPRFVDVF9PVVQpL21rMmJwX3JlbWFpbmluZy5odG1sCkBAIC05NDEsMjcgKzk2NSwxMiBAQAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS5QSE9OWTogZXZlbnQtbG9nLXRhZ3MKLQotIyBQcm9kdWNlIGFuIGV2ZW50IGxvZ3MgdGFnIGZpbGUgZm9yIGV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCwgaW4gb3JkZXIKLSMgdG8gcHJvcGVybHkgYWxsb2NhdGUgbnVtYmVycy4gIFRoZW4gcHJvZHVjZSBhIGZpbGUgdGhhdCdzIGZpbHRlcmVkCi0jIGZvciB3aGF0J3MgZ29pbmcgdG8gYmUgaW5zdGFsbGVkLgotCi1hbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FsbC1ldmVudC1sb2ctdGFncy50eHQKLQogZXZlbnRfbG9nX3RhZ3NfZmlsZSA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9ldmVudC1sb2ctdGFncwogCiAjIEluY2x1ZGUgdGFncyBmcm9tIGFsbCBwYWNrYWdlcyB0aGF0IHdlIGtub3cgYWJvdXQKIGFsbF9ldmVudF9sb2dfdGFnc19zcmMgOj0gXAogICAgICQoc29ydCAkKGZvcmVhY2ggbSwgJChBTExfTU9EVUxFUyksICQoQUxMX01PRFVMRVMuJChtKS5FVkVOVF9MT0dfVEFHUykpKQogCi0kKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKTogUFJJVkFURV9TUkNfRklMRVMgOj0gJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKQotJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSk6ICQoYWxsX2V2ZW50X2xvZ190YWdzX3NyYykgJChNRVJHRVRBR1MpIGJ1aWxkL21ha2UvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKLQkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgJChNRVJHRVRBR1MpIC1vICRAICQoUFJJVkFURV9TUkNfRklMRVMpCi0KLSQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKSkKLQogIyBJbmNsdWRlIHRhZ3MgZnJvbSBhbGwgcGFja2FnZXMgaW5jbHVkZWQgaW4gdGhpcyBwcm9kdWN0LCBwbHVzIGFsbAogIyB0YWdzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHN5c3RlbSAoaWUsIG5vdCBpbiBhIHZlbmRvci8gb3IgZGV2aWNlLwogIyBkaXJlY3RvcnkpLgpAQCAtOTczLDEzICs5ODIsMTMgQEAKICAgICAgICQoZmlsdGVyLW91dCB2ZW5kb3IvJSBkZXZpY2UvJSBvdXQvJSwkKGFsbF9ldmVudF9sb2dfdGFnc19zcmMpKSkKIAogJChldmVudF9sb2dfdGFnc19maWxlKTogUFJJVkFURV9TUkNfRklMRVMgOj0gJChldmVudF9sb2dfdGFnc19zcmMpCi0kKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX01FUkdFRF9GSUxFIDo9ICQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpCi0kKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiAkKGV2ZW50X2xvZ190YWdzX3NyYykgJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSkgJChNRVJHRVRBR1MpIGJ1aWxkL21ha2UvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKKyQoZXZlbnRfbG9nX3RhZ3NfZmlsZSk6ICQoZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKE1FUkdFVEFHUykKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgJChNRVJHRVRBR1MpIC1vICRAIC1tICQoUFJJVkFURV9NRVJHRURfRklMRSkgJChQUklWQVRFX1NSQ19GSUxFUykKKwkkKGhpZGUpICQoTUVSR0VUQUdTKSAtbyAkQCAkKFBSSVZBVEVfU1JDX0ZJTEVTKQogCiAkKGV2YWwgJChjYWxsIGRlY2xhcmUtMHAtdGFyZ2V0LCQoZXZlbnRfbG9nX3RhZ3NfZmlsZSkpKQogCisuUEhPTlk6IGV2ZW50LWxvZy10YWdzCiBldmVudC1sb2ctdGFnczogJChldmVudF9sb2dfdGFnc19maWxlKQogCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpCkBAIC0xMjY4LDggKzEyNzcsMTEgQEAKIGVuZGlmCiAKIAorcmFtZGlza19pbnRlcm1lZGlhdGVzIDo9JD0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscmFtZGlzaykKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHJhbWRpc2tfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9SQU1ESVNLX09VVCksJChJTlRFUk5BTF9SQU1ESVNLX0ZJTEVTKSkpCisKKyMgVGhlIHZhbHVlIG9mIFJBTURJU0tfTk9ERV9MSVNUIGlzIGRlZmluZWQgaW4gc3lzdGVtL2NvcmUvcm9vdGRpci9BbmRyb2lkLmJwLgogIyBUaGlzIGZpbGUgY29udGFpbnMgL2RldiBub2RlcyBkZXNjcmlwdGlvbiBhZGRlZCB0byB0aGUgZ2VuZXJpYyByYW1kaXNrCi1SQU1ESVNLX05PREVfTElTVCA6PSAkKFBST0RVQ1RfT1VUKS9yYW1kaXNrX25vZGVfbGlzdAogCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9SQU1ESVNLX1RBUkdFVCA6PSAkKEJVSUxUX1JBTURJU0tfVEFSR0VUKQpAQCAtMTU2NSw2ICsxNTc3LDcgQEAKIAkkKEFWQlRPT0wpIGFkZF9oYXNoX2Zvb3RlciBcCiAgICAgICAgICAgIC0taW1hZ2UgJEAgXAogCSAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9JTklUX0JPT1RfSU1BR0VfUEFSVElUSU9OX1NJWkUpKSBcCisJICAgLS1zYWx0ICQkKHNoYTI1NnN1bSAkKEJVSUxEX05VTUJFUl9GSUxFKSAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpIHwgY3V0IC1kICIgIiAtZiAxIHwgdHIgLWQgJ1xuJykgXAogCSAgIC0tcGFydGl0aW9uX25hbWUgaW5pdF9ib290ICQoSU5URVJOQUxfQVZCX0lOSVRfQk9PVF9TSUdOSU5HX0FSR1MpIFwKIAkgICAkKEJPQVJEX0FWQl9JTklUX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpCiAKQEAgLTE2MjMsNiArMTYzNiw4IEBACiAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUykpCiAKIElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX1RBUkdFVCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2ZW5kb3JfYm9vdCkvdmVuZG9yX3JhbWRpc2suY3BpbyQoUkFNRElTS19FWFQpCit2ZW5kb3JfcmFtZGlza19pbnRlcm1lZGlhdGVzIDo9JD0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdmVuZG9yX3JhbWRpc2spCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJCh2ZW5kb3JfcmFtZGlza19pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX1ZFTkRPUl9SQU1ESVNLX09VVCksJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GSUxFUykpKQogCiAjIEV4Y2x1ZGUgcmVjb3ZlcnkgZmlsZXMgaW4gdGhlIGRlZmF1bHQgdmVuZG9yIHJhbWRpc2sgaWYgaW5jbHVkaW5nIGEgc3RhbmRhbG9uZQogIyByZWNvdmVyeSByYW1kaXNrIGluIHZlbmRvcl9ib290LgpAQCAtMTY3NywxMiArMTY5MiwxMyBAQAogICBJTlRFUk5BTF9WRU5ET1JfQk9PVElNQUdFX0FSR1MgKz0gLS12ZW5kb3JfY21kbGluZSAiJChJTlRFUk5BTF9LRVJORUxfQ01ETElORSkiCiBlbmRpZgogCi1pZmRlZiBJTlRFUk5BTF9CT09UQ09ORklHCitpZm5lcSAoLCAkKElOVEVSTkFMX0JPT1RDT05GSUcpJChJTlRFUk5BTF9CT09UQ09ORklHX0ZJTEUpKQogICBJTlRFUk5BTF9WRU5ET1JfQk9PVENPTkZJR19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvdmVuZG9yLWJvb3Rjb25maWcuaW1nCiAgICQoSU5URVJOQUxfVkVORE9SX0JPT1RDT05GSUdfVEFSR0VUKToKIAlybSAtZiAkQAogCSQoZm9yZWFjaCBwYXJhbSwkKElOVEVSTkFMX0JPT1RDT05GSUcpLCBcCiAJIHByaW50ZiAiJXNcbiIgJChwYXJhbSkgPj4gJEA7KQorCWNhdCAkKElOVEVSTkFMX0JPT1RDT05GSUdfRklMRSkgPj4gJEAKICAgSU5URVJOQUxfVkVORE9SX0JPT1RJTUFHRV9BUkdTICs9IC0tdmVuZG9yX2Jvb3Rjb25maWcgJChJTlRFUk5BTF9WRU5ET1JfQk9PVENPTkZJR19UQVJHRVQpCiBlbmRpZgogCkBAIC0xNzM3LDYgKzE3NTMsNyBAQAogCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKICAgICAgICAgICAgLS1pbWFnZSAkQCBcCiAJICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX1ZFTkRPUl9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSBcCisJICAgLS1zYWx0ICQkKHNoYTI1NnN1bSAkKEJVSUxEX05VTUJFUl9GSUxFKSAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpIHwgY3V0IC1kICIgIiAtZiAxIHwgdHIgLWQgJ1xuJykgXAogCSAgIC0tcGFydGl0aW9uX25hbWUgdmVuZG9yX2Jvb3QgJChJTlRFUk5BTF9BVkJfVkVORE9SX0JPT1RfU0lHTklOR19BUkdTKSBcCiAJICAgJChCT0FSRF9BVkJfVkVORE9SX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpCiBlbHNlCkBAIC0xOTY1LDcgKzE5ODIsNyBAQAogaW5zdGFsbGVkX3N5c3RlbV9kbGttX25vdGljZV94bWxfZ3ogOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMvTk9USUNFLnhtbC5negogCiBBTExfSU5TVEFMTEVEX05PVElDRV9GSUxFUyA6PSBcCi0gICQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neikgXAorICAkKGlmICQoVVNFX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSwsJChpbnN0YWxsZWRfbm90aWNlX2h0bWxfb3JfeG1sX2d6KSkgXAogICAkKGluc3RhbGxlZF92ZW5kb3Jfbm90aWNlX3htbF9neikgXAogICAkKGluc3RhbGxlZF9wcm9kdWN0X25vdGljZV94bWxfZ3opIFwKICAgJChpbnN0YWxsZWRfc3lzdGVtX2V4dF9ub3RpY2VfeG1sX2d6KSBcCkBAIC0yMDUyLDcgKzIwNjksOSBAQAogCiBlbmRpZiAjIFBST0RVQ1RfTk9USUNFX1NQTElUCiAKK2lmbmVxICgkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksdHJ1ZSkKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neikKK2VuZGlmCiAKIG5lZWRfdmVuZG9yX25vdGljZTo9ZmFsc2UKIGlmZXEgKCQoQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UpLHRydWUpCkBAIC0yNjI1LDcgKzI2NDQsNyBAQAogVEFSR0VUX1BSSVZBVEVfUkVTX0RJUlMgOj0gJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9yZWNvdmVyeS9yZXMpCiBlbmRpZgogcmVjb3ZlcnlfcmVzb3VyY2VfZGVwcyA6PSAkKHNoZWxsIGZpbmQgJChyZWNvdmVyeV9yZXNvdXJjZXNfY29tbW9uKSBcCi0gICQoVEFSR0VUX1BSSVZBVEVfUkVTX0RJUlMpIC10eXBlIGYpCisgICQoVEFSR0VUX1BSSVZBVEVfUkVTX0RJUlMpIC10eXBlIGYgLW5vdCAtbmFtZSAiKi5icCIpCiByZWNvdmVyeV9yZXNvdXJjZV9kZXBzICs9ICQoZ2VuZXJhdGVkX3JlY292ZXJ5X3RleHRfZmlsZXMpCiAKIApAQCAtMjg5OCw2ICsyOTE3LDkgQEAKICQoZXJyb3IgTVREIGRldmljZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCB0aHVzIEJPQVJEX05BTkRfU1BBUkVfU0laRSBpcyBkZXByZWNhdGVkLikKIGVuZGlmCiAKK3JlY292ZXJ5X2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscmVjb3ZlcnkpCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChyZWNvdmVyeV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX1JFQ09WRVJZX09VVCksJChJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0ZJTEVTKSkpCisKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBCdWlsZCBkZWJ1ZyByYW1kaXNrIGFuZCBkZWJ1ZyBib290IGltYWdlLgpAQCAtMzQxNyw4ICszNDM5LDEwIEBACiAjIHN5c3RlbSBpbWFnZQogCiBJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMgOj0gJChmaWx0ZXItb3V0ICQoVEFSR0VUX09VVCkvJSwgJChJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMpKQoraWZkZWYgQlVJTERJTkdfU1lTVEVNX0lNQUdFCiBJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUyA6PSAkKHNvcnQgJChmaWx0ZXIgJChUQVJHRVRfT1VUKS8lLCBcCiAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUykpKQorZW5kaWYKIAogIyBDcmVhdGUgc3ltbGluayAvc3lzdGVtL3ZlbmRvciB0byAvdmVuZG9yIGlmIG5lY2Vzc2FyeS4KIGlmZGVmIEJPQVJEX1VTRVNfVkVORE9SSU1BR0UKQEAgLTM0NjgsMzEgKzM0OTIsNiBAQAogCiBGVUxMX1NZU1RFTUlNQUdFX0RFUFMgKz0gJChJTlRFUk5BTF9ST09UX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1JPT1QpCiAKLSMgUmV0dXJucyBhIGxpc3Qgb2YgRVhUUkFfSU5TVEFMTF9aSVBTIHRyaW9zIHdob3NlIHByaW1hcnkgZmlsZSBpcyBjb250YWluZWQgd2l0aGluICQoMSkKLSMgVGhlIHRyaW9zIHdpbGwgY29udGFpbiB0aGUgcHJpbWFyeSBpbnN0YWxsZWQgZmlsZSA6IHRoZSBkaXJlY3RvcnkgdG8gdW56aXAgdGhlIHppcCB0byA6IHRoZSB6aXAKLWRlZmluZSByZWxldmFudC1leHRyYS1pbnN0YWxsLXppcHMKLSQoc3RyaXAgJChmb3JlYWNoIHAsJChFWFRSQV9JTlNUQUxMX1pJUFMpLCBcCi0gICQoaWYgJChmaWx0ZXIgJChjYWxsIHdvcmQtY29sb24sMSwkKHApKSwkKDEpKSwgXAotICAgICQocCkpKSkKLWVuZGVmCi0KLSMgV3JpdGVzIGEgdGV4dCBmaWxlIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBmaWxlcyB0aGF0IHdpbGwgYmUgaW5zaWRlIGEgcGFydGl0aW9uLgotIyBBbGwgdGhlIGZpbGUgcGF0aHMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uJ3Mgc3RhZ2luZyBkaXJlY3RvcnkuCi0jIEl0IHdpbGwgYWxzbyB0YWtlIGludG8gYWNjb3VudCBmaWxlcyBpbnNpZGUgemlwcyBsaXN0ZWQgaW4gRVhUUkFfSU5TVEFMTF9aSVBTLgotIwotIyBBcmd1bWVudHM6Ci0jICAgJCgxKTogT3V0cHV0IGZpbGUKLSMgICAkKDIpOiBUaGUgcGFydGl0aW9uJ3Mgc3RhZ2luZyBkaXJlY3RvcnkKLSMgICAkKDMpOiBGaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwYXJ0aXRpb24KLWRlZmluZSB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0Ci0kKDEpOiAkJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZXh0cmFfaW5zdGFsbF96aXBzX2ZpbGVfbGlzdCAkKGZvcmVhY2ggcCwkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSksJChjYWxsIHdvcmQtY29sb24sMywkKHApKSkKLQlAZWNobyBXcml0aW5nICQkQAotCXJtIC1mICQkQAotCWVjaG8gLW4gPiAkJEAKLQkkJChmb3JlYWNoIGYsJChzdWJzdCAkKDIpLywsJChmaWx0ZXIgJCgyKS8lLCQoMykpKSxlY2hvICIkJChmKSIgPj4gJCRAJCQobmV3bGluZSkpCi0JJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2V4dHJhX2luc3RhbGxfemlwc19maWxlX2xpc3QgJCgyKSAkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSkgPj4gJCRACi1lbmRlZgotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKIApAQCAtMzUwMCwxNiArMzQ5OSwyMCBAQAogIyBDb2xsZWN0IGFsbCBhdmFpbGFibGUgc3R1YiBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIHN5c3RlbSBhbmQgaW5zdGFsbCB3aXRoIHByZWRlZmluZWQgbGlua2VyIGNvbmZpZ3VyYXRpb24KICMgQWxzbyBhcHBlbmQgTExOREsgbGlicmFyaWVzIGluIHRoZSBBUEVYIGFzIHJlcXVpcmVkIGxpYnMKIFNZU1RFTV9MSU5LRVJfQ09ORklHIDo9ICQoVEFSR0VUX09VVCkvZXRjL2xpbmtlci5jb25maWcucGIKLVNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxzeXN0ZW1fbGlua2VyX2NvbmZpZykvc3lzdGVtX2xpbmtlcl9jb25maWcKK1NZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSA6PSBzeXN0ZW0vY29yZS9yb290ZGlyL2V0Yy9saW5rZXIuY29uZmlnLmpzb24KICQoU1lTVEVNX0xJTktFUl9DT05GSUcpOiBQUklWQVRFX1NZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSA6PSAkKFNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkKICQoU1lTVEVNX0xJTktFUl9DT05GSUcpOiAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSAkKFNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkgfCBjb252X2xpbmtlcl9jb25maWcKIAlAZWNobyBDcmVhdGluZyBsaW5rZXIgY29uZmlnOiAkQAogCUBta2RpciAtcCAkKGRpciAkQCkKLQlAcm0gLWYgJEAKLQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgc3lzdGVtcHJvdmlkZSAtLXNvdXJjZSAkKFBSSVZBVEVfU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFKSBcCisJQHJtIC1mICRAICRALnN0ZXAxCisJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY29udl9saW5rZXJfY29uZmlnIHByb3RvIC0tZm9yY2UgLXMgJChQUklWQVRFX1NZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkgLW8gJEAuc3RlcDEKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgc3lzdGVtcHJvdmlkZSAtLXNvdXJjZSAkQC5zdGVwMSBcCiAJCS0tb3V0cHV0ICRAIC0tdmFsdWUgIiQoU1RVQl9MSUJSQVJJRVMpIiAtLXN5c3RlbSAiJChUQVJHRVRfT1VUKSIKIAkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgYXBwZW5kIC0tc291cmNlICRAIC0tb3V0cHV0ICRAIC0ta2V5IHJlcXVpcmVMaWJzIFwKIAkJLS12YWx1ZSAiJChmb3JlYWNoIGxpYiwkKExMTkRLX01PVkVEX1RPX0FQRVhfTElCUkFSSUVTKSwgJChsaWIpLnNvKSIKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgYXBwZW5kIC0tc291cmNlICRAIC0tb3V0cHV0ICRAIC0ta2V5IHByb3ZpZGVMaWJzIFwKKwkJLS12YWx1ZSAiJChmb3JlYWNoIGxpYiwkKFBST0RVQ1RfRVhUUkFfU1RVQl9MSUJSQVJJRVMpLCAkKGxpYikuc28pIgorCXJtIC1mICRALnN0ZXAxCiAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKFNZU1RFTV9MSU5LRVJfQ09ORklHKSwpCiAkKGNhbGwgZGVjbGFyZS1saWNlbnNlLWRlcHMsJChTWVNURU1fTElOS0VSX0NPTkZJRyksJChJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUykgJChTWVNURU1fTElOS0VSX0NPTkZJR19TT1VSQ0UpKQpAQCAtMzU1MCw3ICszNTUzLDcgQEAKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAogICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKLSAgICAgICAgICAkKFRBUkdFVF9PVVQpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2ltYWdlX2luZm8udHh0ICQoMSkgJChUQVJHRVRfT1VUKSBcCisgICAgICAgICAgJChUQVJHRVRfT1VUKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9pbWFnZV9pbmZvLnR4dCAkKDEpICQoVEFSR0VUX09VVCkgLS1idWlsZF9kYXRldGltZV9maWxlICQoQlVJTERfREFURVRJTUVfRklMRSkgXAogICAgICAgICAgIHx8ICggbWtkaXIgLXAgJCR7RElTVF9ESVJ9OyBcCiAgICAgICAgICAgICAgICBjcCAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkJHtESVNUX0RJUn0vaW5zdGFsbGVkLWZpbGVzLXJlc2N1ZWQudHh0OyBcCiAgICAgICAgICAgICAgICBleGl0IDEgKQpAQCAtMzU2MiwxNCArMzU2NSwyNCBAQAogZmlsZV9saXN0X2RpZmYgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZmlsZV9saXN0X2RpZmYkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCA6PSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfZGlmZi50aW1lc3RhbXAKIAorIyBUaGUgYnVpbGQgY29uZmlndXJhdGlvbiB0byBidWlsZCB0aGUgUkVMIHZlcnNpb24gbWF5IGhhdmUgbW9yZSBmaWxlcyB0byBhbGxvdy4KKyMgVXNlIGFsbG93bGlzdF9uZXh0IGluIGFkZGl0aW9uIHRvIHRoZSBhbGxvd2xpc3QgaW4gdGhpcyBjYXNlLgorc3lzdGVtX2ZpbGVfZGlmZl9hbGxvd2xpc3RfbmV4dCA6PQoraWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitzeXN0ZW1fZmlsZV9kaWZmX2FsbG93bGlzdF9uZXh0IDo9ICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0X25leHQuSU5TVEFMTEVEKQorJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCk6IFBSSVZBVEVfQUxMT1dMSVNUX05FWFQgOj0gJChzeXN0ZW1fZmlsZV9kaWZmX2FsbG93bGlzdF9uZXh0KQorZW5kaWYKICQoc3lzdGVtX2ZpbGVfZGlmZl90aW1lc3RhbXApOiBcCiAJICAgICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCBcCiAJICAgICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSBcCiAJICAgICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0LklOU1RBTExFRCkgXAorCSAgICAkKHN5c3RlbV9maWxlX2RpZmZfYWxsb3dsaXN0X25leHQpIFwKIAkgICAgJChmaWxlX2xpc3RfZGlmZikKIAkkKGZpbGVfbGlzdF9kaWZmKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgXAogCSAgJChBTExfTU9EVUxFUy4kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLkZJTEVTWVNURU1fRklMRUxJU1QpIFwKLQkgICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0LklOU1RBTExFRCkgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKQorCSAgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSBcCisJICAtLWFsbG93bGlzdHMgJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QuSU5TVEFMTEVEKSBcCisJICAkKFBSSVZBVEVfQUxMT1dMSVNUX05FWFQpCiAJdG91Y2ggJEAKIAogJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoc3lzdGVtX2ZpbGVfZGlmZl90aW1lc3RhbXApCkBAIC0zNTg3LDEwICszNjAwLDEwIEBACiBpZmVxICgkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLCkKICQoZXJyb3IgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBtdXN0IGJlIHNldCBpZiBVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgaXMgdHJ1ZSkKIGVuZGlmCi1zb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQywkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpKS8kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpCi0kKEJVSUxUX1NZU1RFTUlNQUdFKTogJChJTlNUQUxMRURfRklMRVNfRklMRSkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0ICQoc29vbmdfZGVmaW5lZF9zeXN0ZW1faW1hZ2UpCi0kKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsICQoc29vbmdfZGVmaW5lZF9zeXN0ZW1faW1hZ2UpLCAkKEJVSUxUX1NZU1RFTUlNQUdFKSkpCi1zb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSA6PQorU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQywkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpKS8kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpCitTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9CQVNFIDo9ICQoZGlyICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSkKKyQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgJChTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9QQVRIKQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKFNPT05HX0RFRklORURfU1lTVEVNX0lNQUdFX1BBVEgpLCAkKEJVSUxUX1NZU1RFTUlNQUdFKSkpCiBlbHNlCiAkKEJVSUxUX1NZU1RFTUlNQUdFKTogJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoY2FsbCBidWlsZC1zeXN0ZW1pbWFnZS10YXJnZXQsJEApCkBAIC0zNjc1LDEwICszNjg4LDEwIEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGRhdGEgcGFydGl0aW9uIGltYWdlCiBJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMgOj0gJChmaWx0ZXItb3V0ICQoVEFSR0VUX09VVF9EQVRBKS8lLCAkKElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUykpCitpZmRlZiBCVUlMRElOR19VU0VSREFUQV9JTUFHRQogSU5URVJOQUxfVVNFUkRBVEFJTUFHRV9GSUxFUyA6PSBcCiAgICAgJChmaWx0ZXIgJChUQVJHRVRfT1VUX0RBVEEpLyUsJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUykpCiAKLWlmZGVmIEJVSUxESU5HX1VTRVJEQVRBX0lNQUdFCiB1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMgOj0gXAogICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHVzZXJkYXRhKQogQlVJTFRfVVNFUkRBVEFJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvdXNlcmRhdGEuaW1nCkBAIC0zNjkxLDcgKzM3MDQsNyBAQAogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCiAgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCi0gICAgICAgICAgJChUQVJHRVRfT1VUX0RBVEEpICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS91c2VyZGF0YV9pbWFnZV9pbmZvLnR4dCBcCisgICAgICAgICAgJChUQVJHRVRfT1VUX0RBVEEpICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS91c2VyZGF0YV9pbWFnZV9pbmZvLnR4dCAtLWJ1aWxkX2RhdGV0aW1lX2ZpbGUgJChCVUlMRF9EQVRFVElNRV9GSUxFKSBcCiAgICAgICAgICAgJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCksJChCT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCkBAIC0zNzUzLDcgKzM3NjYsNyBAQAogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCiAgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCi0gICAgICAgICAgJChUQVJHRVRfT1VUX0NBQ0hFKSAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvY2FjaGVfaW1hZ2VfaW5mby50eHQgXAorICAgICAgICAgICQoVEFSR0VUX09VVF9DQUNIRSkgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2NhY2hlX2ltYWdlX2luZm8udHh0IC0tYnVpbGRfZGF0ZXRpbWVfZmlsZSAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpIFwKICAgICAgICAgICAkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSwkKEJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKQEAgLTM4NDAsNyArMzg1Myw3IEBACiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKICAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKLSAgICAgICAgICAkKFRBUkdFVF9PVVRfU1lTVEVNX09USEVSKSAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX290aGVyX2ltYWdlX2luZm8udHh0IFwKKyAgICAgICAgICAkKFRBUkdFVF9PVVRfU1lTVEVNX09USEVSKSAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX290aGVyX2ltYWdlX2luZm8udHh0IC0tYnVpbGRfZGF0ZXRpbWVfZmlsZSAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpIFwKICAgICAgICAgICAkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCkBAIC0zOTQ2LDcgKzM5NTksNyBAQAogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCiAgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAotICAgICAgICAgICQoVEFSR0VUX09VVF9WRU5ET1IpICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvdmVuZG9yX2ltYWdlX2luZm8udHh0IFwKKyAgICAgICAgICAkKFRBUkdFVF9PVVRfVkVORE9SKSAkKHZlbmRvcmltYWdlX2ludGVybWVkaWF0ZXMpL3ZlbmRvcl9pbWFnZV9pbmZvLnR4dCAtLWJ1aWxkX2RhdGV0aW1lX2ZpbGUgJChCVUlMRF9EQVRFVElNRV9GSUxFKSBcCiAgICAgICAgICAgJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKFJFQ09WRVJZX0ZST01fQk9PVF9QQVRDSCksJChCT0FSRF9WRU5ET1JJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgpAQCAtMzk5NSw2ICs0MDA4LDIxIEBACiAgICAgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1BST0RVQ1QpLyUsXAogICAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUykpCiAKKyMgSW5zdGFsbCBwcm9kdWN0L2V0Yy9saW5rZXIuY29uZmlnLnBiIHdpdGggUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTCitwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvZXRjL2xpbmtlci5jb25maWcucGIKKyQocHJvZHVjdF9saW5rZXJfY29uZmlnX2ZpbGUpOiBwcml2YXRlX2xpbmtlcl9jb25maWdfZnJhZ21lbnRzIDo9ICQoUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKQorJChwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSk6ICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSB8ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZworCUBlY2hvIENyZWF0aW5nIGxpbmtlciBjb25maWc6ICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBybSAtZiAkQAorCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBwcm90byBcCisJCS0tc291cmNlICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQocHJpdmF0ZV9saW5rZXJfY29uZmlnX2ZyYWdtZW50cykpIFwKKwkJLS1vdXRwdXQgJEAKKyQoY2FsbCBkZWZpbmUgZGVjbGFyZS0xcC10YXJnZXQsJChwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSksKQorSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTICs9ICQocHJvZHVjdF9saW5rZXJfY29uZmlnX2ZpbGUpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKHByb2R1Y3RfbGlua2VyX2NvbmZpZ19maWxlKQorCisKIElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QgOj0gJChQUk9EVUNUX09VVCkvaW5zdGFsbGVkLWZpbGVzLXByb2R1Y3QudHh0CiBJTlNUQUxMRURfRklMRVNfSlNPTl9QUk9EVUNUIDo9ICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVDoudHh0PS5qc29uKQogJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKElOU1RBTExFRF9GSUxFU19KU09OX1BST0RVQ1QpCkBAIC00MDE5LDcgKzQwNDcsNyBAQAogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCiAgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKLSAgICAgICAgICAkKFRBUkdFVF9PVVRfUFJPRFVDVCkgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvcHJvZHVjdF9pbWFnZV9pbmZvLnR4dCBcCisgICAgICAgICAgJChUQVJHRVRfT1VUX1BST0RVQ1QpICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL3Byb2R1Y3RfaW1hZ2VfaW5mby50eHQgLS1idWlsZF9kYXRldGltZV9maWxlICQoQlVJTERfREFURVRJTUVfRklMRSkgXAogICAgICAgICAgICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1BST0RVQ1RJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgpAQCAtNDA4OCw3ICs0MTE2LDcgQEAKICAgICAgICQoQlVJTERfSU1BR0UpIFwKICAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSBcCi0gICAgICAgICAgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2V4dF9pbWFnZV9pbmZvLnR4dCBcCisgICAgICAgICAgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2V4dF9pbWFnZV9pbmZvLnR4dCAtLWJ1aWxkX2RhdGV0aW1lX2ZpbGUgJChCVUlMRF9EQVRFVElNRV9GSUxFKSBcCiAgICAgICAgICAgJChJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9QUk9EVUNUX1NFUlZJQ0VTSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1BST0RVQ1RfU0VSVklDRVNJTUFHRV9QQVJUSVRJT05fU0laRSkpCkBAIC00MTc4LDcgKzQyMDYsNyBAQAogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCiAgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQob2RtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAotICAgICAgICAgICQoVEFSR0VUX09VVF9PRE0pICQob2RtaW1hZ2VfaW50ZXJtZWRpYXRlcykvb2RtX2ltYWdlX2luZm8udHh0IFwKKyAgICAgICAgICAkKFRBUkdFVF9PVVRfT0RNKSAkKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL29kbV9pbWFnZV9pbmZvLnR4dCAtLWJ1aWxkX2RhdGV0aW1lX2ZpbGUgJChCVUlMRF9EQVRFVElNRV9GSUxFKSBcCiAgICAgICAgICAgJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSwkKEJPQVJEX09ETUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCkBAIC00MjQ3LDcgKzQyNzUsNyBAQAogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCiAgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQodmVuZG9yX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCi0gICAgICAgICAgJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKSAkKHZlbmRvcl9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvdmVuZG9yX2Rsa21faW1hZ2VfaW5mby50eHQgXAorICAgICAgICAgICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkgJCh2ZW5kb3JfZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL3ZlbmRvcl9kbGttX2ltYWdlX2luZm8udHh0IC0tYnVpbGRfZGF0ZXRpbWVfZmlsZSAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpIFwKICAgICAgICAgICAkKElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1ZFTkRPUl9ETEtNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKQEAgLTQzMTYsNyArNDM0NCw3IEBACiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKICAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChvZG1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKLSAgICAgICAgICAkKFRBUkdFVF9PVVRfT0RNX0RMS00pICQob2RtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9vZG1fZGxrbV9pbWFnZV9pbmZvLnR4dCBcCisgICAgICAgICAgJChUQVJHRVRfT1VUX09ETV9ETEtNKSAkKG9kbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvb2RtX2Rsa21faW1hZ2VfaW5mby50eHQgLS1idWlsZF9kYXRldGltZV9maWxlICQoQlVJTERfREFURVRJTUVfRklMRSkgXAogICAgICAgICAgICQoSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfT0RNX0RMS01JTUFHRV9UQVJHRVQpLCQoQk9BUkRfT0RNX0RMS01JTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgpAQCAtNDM4Nyw3ICs0NDE1LDcgQEAKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAogICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHN5c3RlbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAotICAgICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fRExLTSkgJChzeXN0ZW1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9kbGttX2ltYWdlX2luZm8udHh0IFwKKyAgICAgICAgICAkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pICQoc3lzdGVtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1fZGxrbV9pbWFnZV9pbmZvLnR4dCAtLWJ1aWxkX2RhdGV0aW1lX2ZpbGUgJChCVUlMRF9EQVRFVElNRV9GSUxFKSBcCiAgICAgICAgICAgJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCksJChCT0FSRF9TWVNURU1fRExLTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCkBAIC01MTMxLDExICs1MTU5LDE0IEBACiAjIFJ1biBhcGV4X3NlcG9saWN5X3Rlc3RzIGZvciBhbGwgaW5zdGFsbGVkIEFQRVhlcwogCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKKyMgVE9ETyhiLzM1Mzg5NjgxNykgYXBleF9zZXBvbGljeV90ZXN0cyBzdXBwb3J0cyBvbmx5IGV4dDQKK2lmZXEgKGV4dDQsJChQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUpKQogaW50ZXJtZWRpYXRlIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGFwZXhfc2Vwb2xpY3lfdGVzdHMpCiBhcGV4X2RpcnMgOj0gXAogICAkKFRBUkdFVF9PVVQpL2FwZXgvJSBcCiAgICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9hcGV4LyUgXAogICAkKFRBUkdFVF9PVVRfVkVORE9SKS9hcGV4LyUgXAorICAkKFRBUkdFVF9PVVRfT0RNKS9hcGV4LyUgXAogICAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvYXBleC8lIFwKIAogYXBleF9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJChhcGV4X2RpcnMpLCAkKElOVEVSTkFMX0FMTElNQUdFU19GSUxFUykpKQpAQCAtNTE2OSw2ICs1MjAwLDcgQEAKIAogYXBleF9maWxlcyA6PQogaW50ZXJtZWRpYXRlIDo9CitlbmRpZiAjIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRQogZW5kaWYgIyBUQVJHRVRfQlVJTERfVU5CVU5ETEVECiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUxODgsNiArNTIyMCw3IEBACiAgICQoVEFSR0VUX09VVF9QUk9EVUNUKS9hcGV4LyUgXAogICAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvYXBleC8lIFwKICAgJChUQVJHRVRfT1VUX1ZFTkRPUikvYXBleC8lIFwKKyAgJChUQVJHRVRfT1VUX09ETSkvYXBleC8lIFwKIAogYXBleF9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJChhcGV4X2RpcnMpLCAkKElOVEVSTkFMX0FMTElNQUdFU19GSUxFUykpKQogCkBAIC01MjA2LDYgKzUyMzksNyBAQAogCSAgIC0tc3lzdGVtX2V4dF9wYXRoICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSBcCiAJICAgLS1wcm9kdWN0X3BhdGggJChUQVJHRVRfT1VUX1BST0RVQ1QpIFwKIAkgICAtLXZlbmRvcl9wYXRoICQoVEFSR0VUX09VVF9WRU5ET1IpIFwKKwkgICAtLW9kbV9wYXRoICQoVEFSR0VUX09VVF9PRE0pIFwKIAkgICAtLWFwZXhfcGF0aCAkKEFQRVhfT1VUKQogCiBhcGV4X2ZpbGVzIDo9CkBAIC01MjYyLDcgKzUyOTYsNyBAQAogCSAgLS1kaXJtYXAgL3N5c3RlbV9leHQ6JChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpIFwKIAkgIC0tZGlybWFwIC9wcm9kdWN0OiQoVEFSR0VUX09VVF9QUk9EVUNUKSBcCiAJICAtLWRpcm1hcCAvYXBleDokKEFQRVhfT1VUKSBcCi0JICAkKFZJTlRGX0ZSQU1FV09SS19NQU5JRkVTVF9GUk9aRU5fRElSKSA+ICRAIDI+JjEgKSB8fCAoIGNhdCAkQCAmJiBleGl0IDEgKQorCSAgc3lzdGVtL2xpYmhpZGwvdmludGZkYXRhL2Zyb3plbiA+ICRAIDI+JjEgKSB8fCAoIGNhdCAkQCAmJiBleGl0IDEgKQogCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCh2aW50ZmZtX2xvZykpCiAKQEAgLTU2MzUsNiArNTY2OSw3IEBACiAgIGJyb3RsaSBcCiAgIGJzZGlmZiBcCiAgIGJ1aWxkX2ltYWdlIFwKKyAgYnVpbGRfbWl4ZWRfa2VybmVsc19yYW1kaXNrX2hvc3QgXAogICBidWlsZF9zdXBlcl9pbWFnZSBcCiAgIGJ1aWxkX3Zlcml0eV9tZXRhZGF0YSBcCiAgIGJ1aWxkX3Zlcml0eV90cmVlIFwKQEAgLTYxMzAsNiArNjE2NSw5IEBACiAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiB6aXBfcm9vdCA6PSAkKGludGVybWVkaWF0ZXMpLyQobmFtZSkKICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IGludGVybWVkaWF0ZXMgOj0gJChpbnRlcm1lZGlhdGVzKQogCitpZm5lcSAoJChTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9QQVRIKSwpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCkKK2VuZGlmCiAKICMgJCgxKTogRGlyZWN0b3J5IHRvIGNvcHkKICMgJCgyKTogTG9jYXRpb24gdG8gY29weSBpdCB0bwpAQCAtNjM0NCw2ICs2MzgyLDEwIEBACiAgIGVuZGlmCiBlbmRpZgogCitpZmRlZiBCVUlMRElOR19WRU5ET1JfS0VSTkVMX0JPT1RfSU1BR0UKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfRklMRVMpCitlbmRpZgorCiBpZmRlZiBCVUlMRElOR19SRUNPVkVSWV9JTUFHRQogICAjIFRPRE8oYi8zMDQxNDQyOCk6IENhbid0IGRlcGVuZCBvbiBJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0ZJTEVTIGFsb25lIGxpa2Ugb3RoZXIKICAgIyBCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSBkZXBlbmRlbmNpZXMgYmVjYXVzZSBjdXJyZW50bHkgdGhlcmUncmUgY3AvcnN5bmMvcm0KQEAgLTY0NTgsOCArNjUwMCwxMSBAQAogCSAgICAkKElOU1RBTExFRF9SQU1ESVNLX1RBUkdFVCkgXAogCSAgICAkKElOU1RBTExFRF9EVEJJTUFHRV9UQVJHRVQpIFwKIAkgICAgJChJTlNUQUxMRURfMk5EQk9PVExPQURFUl9UQVJHRVQpIFwKKwkgICAgJChJTlNUQUxMRURfVkVORE9SX0tFUk5FTF9SQU1ESVNLX1RBUkdFVCkgXAogCSAgICAkKEJVSUxUX1JBTURJU0tfMTZLX1RBUkdFVCkgXAogCSAgICAkKEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUKSBcCisJICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpIFwKKwkgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSBcCiAJICAgICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKSBcCiAJICAgICQoQk9BUkRfUFJFQlVJTFRfUkVDT1ZFUllfRFRCT0lNQUdFKSBcCiAJICAgICQoQk9BUkRfUkVDT1ZFUllfQUNQSU8pIFwKQEAgLTY2MTMsOCArNjY1OCwxMyBAQAogZW5kaWYgIyBJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9JTUFHRQogCUAjIENvbnRlbnRzIG9mIHRoZSBzeXN0ZW0gaW1hZ2UKK2lmbmVxICgkKFNPT05HX0RFRklORURfU1lTVEVNX0lNQUdFX1BBVEgpLCkKKwkkKGhpZGUpICQoY2FsbCBwYWNrYWdlX2ZpbGVzLWNvcHktcm9vdCwgXAorCSAgICAkKFNPT05HX0RFRklORURfU1lTVEVNX0lNQUdFX0JBU0UpL3N5c3RlbS9zeXN0ZW0sJCh6aXBfcm9vdCkvU1lTVEVNKQorZWxzZQogCSQoaGlkZSkgJChjYWxsIHBhY2thZ2VfZmlsZXMtY29weS1yb290LCBcCiAJICAgICQoU1lTVEVNSU1BR0VfU09VUkNFX0RJUiksJCh6aXBfcm9vdCkvU1lTVEVNKQorZW5kaWYKIGVsc2UgaWZkZWYgSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUCiAJQCMgQ29weSB0aGUgc3lzdGVtIGJ1aWxkLnByb3AgZXZlbiBpZiBub3QgYnVpbGRpbmcgYSBzeXN0ZW0gaW1hZ2UKIAlAIyBiZWNhdXNlIGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzIG1heSBuZWVkIGl0IHRvIGJ1aWxkIG90aGVyIHBhcnRpdGlvbgpAQCAtNjgwOCwxNCArNjg1OCwyMiBAQAogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTCiAJJChoaWRlKSBjcCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCiBlbmRpZiAjIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQotaWZkZWYgQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQKK2lmZGVmIEJPQVJEX0tFUk5FTF9QQVRIXzE2SwogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTCiAJJChoaWRlKSBjcCAkKEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCi1lbmRpZiAjIEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUCi1pZmRlZiBCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQKK2VuZGlmICMgQk9BUkRfS0VSTkVMX1BBVEhfMTZLCitpZmRlZiBCT0FSRF9LRVJORUxfTU9EVUxFU18xNksKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgY3AgJChCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KLWVuZGlmICMgQlVJTFRfUkFNRElTS18xNktfVEFSR0VUCitlbmRpZiAjIEJPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SworaWZkZWYgQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL0lNQUdFUworCSQoaGlkZSkgY3AgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkgJCh6aXBfcm9vdCkvSU1BR0VTLworZW5kaWYgIyBCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVAoraWZkZWYgSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVAorCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvSU1BR0VTCisJJChoaWRlKSBjcCAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KK2VuZGlmICMgSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVAogaWZlcSAoJChCT0FSRF9VU0VTX1BWTUZXSU1BR0UpLHRydWUpCiAJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMKIAkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX1BWTUZXSU1BR0VfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCkBAIC02ODgzLDYgKzY5NDEsMzMgQEAKIAkkKGhpZGUpIGVjaG8gIiQoQk9BUkRfS0VSTkVMX1BBR0VTSVpFKSIgPiAkKHppcF9yb290KS9JTklUX0JPT1QvcGFnZXNpemUKIGVuZGlmICMgQk9BUkRfS0VSTkVMX1BBR0VTSVpFCiBlbmRpZiAjIEJVSUxESU5HX0lOSVRfQk9PVF9JTUFHRQoraWZkZWYgQk9BUkRfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvZXJvZnNfZGVmYXVsdF9jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9TWVNURU1JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9TWVNURU1JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfU1lTVEVNX0VYVElNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX1NZU1RFTV9FWFRJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fZXh0X2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1BST0RVQ1RJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9QUk9EVUNUSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvcHJvZHVjdF9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9WRU5ET1JJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9WRU5ET1JJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfT0RNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfT0RNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvb2RtX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1ZFTkRPUl9ETEtNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfVkVORE9SX0RMS01JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfZGxrbV9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9PRE1fRExLTUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX09ETV9ETEtNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvb2RtX2Rsa21fZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9TWVNURU1fRExLTUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSAkKHppcF9yb290KS9NRVRBL3N5c3RlbV9kbGttX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKIGlmbmVxICgkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCksKQogCSQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvVkVORE9SX0JPT1QvUkFNRElTSywpID4gJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfYm9vdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCkBAIC03ODU5LDEzICs3OTQ0LDExIEBACiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsaGFpa3UtcHJlc3VibWl0LCQoU09PTkdfUFJFU1VCTUlUX0ZVWlpfUEFDS0FHSU5HX0FSQ0hfTU9EVUxFUykpCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXh0cmFjdCBwbGF0Zm9ybSBmb250cyB1c2VkIGluIExheW91dGxpYgorIyBFeHRyYWN0IGFkZGl0aW9uYWwgZGF0YSBmaWxlcyB1c2VkIGluIExheW91dGxpYgogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbGF5b3V0bGliX2RhdGEubWsKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZXNrdG9wIHBhY2sgaW1hZ2UgaG9vay4KLWlmbmVxICgsJChzdHJpcCAkKFBBQ0tfREVTS1RPUF9GSUxFU1lTVEVNX0lNQUdFUykpKQotUEFDS19JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYW5kcm9pZC1kZXNrdG9wX2ltYWdlLmJpbgorIyBEZXNrdG9wIHBhY2sgY29tbW9uIHZhcmlhYmxlcy4KIFBBQ0tfSU1BR0VfU0NSSVBUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhY2tfaW1hZ2UKIElNQUdFUyA6PSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCiAJJChJTlNUQUxMRURfU1VQRVJJTUFHRV9UQVJHRVQpIFwKQEAgLTc4NzQsNiArNzk1NywxMSBAQAogCSQoSU5TVEFMTEVEX1ZCTUVUQUlNQUdFX1RBUkdFVCkgXAogCSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKQogCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayBpbWFnZSBob29rLgoraWZuZXEgKCwkKHN0cmlwICQoUEFDS19ERVNLVE9QX0ZJTEVTWVNURU1fSU1BR0VTKSkpCitQQUNLX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfaW1hZ2UuYmluCisKICQoUEFDS19JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKIAkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUKIApAQCAtNzg4MiwxMSArNzk3MCw4NiBAQAogJChQQUNLRURfSU1BR0VfQVJDSElWRV9UQVJHRVQpOiAkKFBBQ0tfSU1BR0VfVEFSR0VUKSB8ICQoR1pJUCkKIAkkKEdaSVApIC1mayAkKFBBQ0tfSU1BR0VfVEFSR0VUKQogCi1kcm9pZGNvcmUtdW5idW5kbGVkOiAkKFBBQ0tFRF9JTUFHRV9BUkNISVZFX1RBUkdFVCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoUEFDS0VEX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKSkKKworLlBIT05ZOiBwYWNrLWltYWdlCitwYWNrLWltYWdlOiAkKFBBQ0tfSU1BR0VfVEFSR0VUKQogCiBlbmRpZiAjIFBBQ0tfREVTS1RPUF9GSUxFU1lTVEVNX0lNQUdFUwogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayByZWNvdmVyeSBpbWFnZSBob29rLgoraWZlcSAoJChCT0FSRF9VU0VTX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UpLHRydWUpCitQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfcmVjb3ZlcnlfaW1hZ2UuYmluCitQQUNLX1JFQ09WRVJZX0lNQUdFX0FSR1MgOj0gLS1ub2FyY2hpdmUgLS1yZWNvdmVyeQorCitpZm5lcSAoLCQoc3RyaXAgJChQQUNLX1JFQ09WRVJZX0lNQUdFX0VYUEVSSU1FTlRBTCkpKQorUEFDS19SRUNPVkVSWV9JTUFHRV9BUkdTICs9IC0tZXhwZXJpbWVudGFsCitlbmRpZiAjIFBBQ0tfUkVDT1ZFUllfSU1BR0VfRVhQRVJJTUVOVEFMCisKKyQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKKwkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgJChQQUNLX1JFQ09WRVJZX0lNQUdFX0FSR1MpCisKK1BBQ0tFRF9SRUNPVkVSWV9JTUFHRV9BUkNISVZFX1RBUkdFVCA6PSAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfVEFSR0VUKS5negorCiskKFBBQ0tFRF9SRUNPVkVSWV9JTUFHRV9BUkNISVZFX1RBUkdFVCk6ICQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpIHwgJChHWklQKQorCSQoR1pJUCkgLWZrICQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoUEFDS0VEX1JFQ09WRVJZX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKSkKKworLlBIT05ZOiBwYWNrLXJlY292ZXJ5LWltYWdlCitwYWNrLXJlY292ZXJ5LWltYWdlOiAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfVEFSR0VUKQorCitlbmRpZiAjIEJPQVJEX1VTRVNfREVTS1RPUF9SRUNPVkVSWV9JTUFHRQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayB1cGRhdGUgaW1hZ2UgaG9vay4KK2lmZXEgKCQoQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRSksdHJ1ZSkKK1BBQ0tfVVBEQVRFX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfdXBkYXRlX2ltYWdlLmJpbgorUEFDS19VUERBVEVfSU1BR0VfQVJHUyA6PSAtLW5vYXJjaGl2ZSAtLXVwZGF0ZQorCitpZm5lcSAoLCQoc3RyaXAgJChQQUNLX1VQREFURV9JTUFHRV9FWFBFUklNRU5UQUwpKSkKK1BBQ0tfVVBEQVRFX0lNQUdFX0FSR1MgKz0gLS1leHBlcmltZW50YWwKK2VuZGlmICMgUEFDS19VUERBVEVfSU1BR0VfRVhQRVJJTUVOVEFMCisKKyQoUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUKTogJChJTUFHRVMpICQoUEFDS19JTUFHRV9TQ1JJUFQpCisJJChQQUNLX0lNQUdFX1NDUklQVCkgLS1vdXRfZGlyICQoUFJPRFVDVF9PVVQpICQoUEFDS19VUERBVEVfSU1BR0VfQVJHUykKKworUEFDS0VEX1VQREFURV9JTUFHRV9BUkNISVZFX1RBUkdFVCA6PSAkKFBBQ0tfVVBEQVRFX0lNQUdFX1RBUkdFVCkuZ3oKKworJChQQUNLRURfVVBEQVRFX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKTogJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpIHwgJChHWklQKQorCSQoR1pJUCkgLWZrICQoUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZGlzdF9maWxlcywkKFBBQ0tFRF9VUERBVEVfSU1BR0VfQVJDSElWRV9UQVJHRVQpKQorCisuUEhPTlk6IHBhY2stdXBkYXRlLWltYWdlCitwYWNrLXVwZGF0ZS1pbWFnZTogJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpCisKK2VuZGlmICMgQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRQorCitQQUNLX01JR1JBVElPTl9JTUFHRV9TQ1JJUFQgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvcGFja19taWdyYXRpb25faW1hZ2UKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXNrdG9wIHBhY2sgbWlncmF0aW9uIGltYWdlIGhvb2suCitpZmVxICgkKEFORFJPSURfREVTS1RPUF9NSUdSQVRJT05fSU1BR0UpLHRydWUpCitQQUNLX01JR1JBVElPTl9JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYW5kcm9pZC1kZXNrdG9wX21pZ3JhdGlvbl9pbWFnZS5iaW4KKworJChQQUNLX01JR1JBVElPTl9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX01JR1JBVElPTl9JTUFHRV9TQ1JJUFQpCisJJChQQUNLX01JR1JBVElPTl9JTUFHRV9TQ1JJUFQpIC0tb3V0X2RpciAkKFBST0RVQ1RfT1VUKSAtLW5vYXJjaGl2ZQorCitQQUNLRURfTUlHUkFUSU9OX0lNQUdFX0FSQ0hJVkVfVEFSR0VUIDo9ICQoUEFDS19NSUdSQVRJT05fSU1BR0VfVEFSR0VUKS5negorCiskKFBBQ0tFRF9NSUdSQVRJT05fSU1BR0VfQVJDSElWRV9UQVJHRVQpOiAkKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1RBUkdFVCkgfCAkKEdaSVApCisJJChHWklQKSAtZmsgJChQQUNLX01JR1JBVElPTl9JTUFHRV9UQVJHRVQpCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoUEFDS0VEX01JR1JBVElPTl9JTUFHRV9BUkNISVZFX1RBUkdFVCkpCisKKy5QSE9OWTogcGFjay1taWdyYXRpb24taW1hZ2UKK3BhY2stbWlncmF0aW9uLWltYWdlOiAkKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1RBUkdFVCkKKworZW5kaWYgIyBBTkRST0lEX0RFU0tUT1BfTUlHUkFUSU9OX0lNQUdFCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgT1MgTGljZW5zaW5nCiAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL29zX2xpY2Vuc2luZy5tawpkaWZmIC0tZ2l0IGEvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rIGIvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rCmluZGV4IGYyZmYyODYuLjk1YzA3MzYgMTAwNjQ0Ci0tLSBhL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5taworKysgYi9jb3JlL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKQEAgLTI4LDIwICsyOCw2MSBAQAogCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxCT0FSRF9VU0VTX09ETUlNQUdFKQogJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsQk9BUkRfTU9WRV9HU0lfQVZCX0tFWVNfVE9fVkVORE9SX0JPT1QsJChCT0FSRF9NT1ZFX0dTSV9BVkJfS0VZU19UT19WRU5ET1JfQk9PVCkpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxDSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEhBU19CT0FSRF9TWVNURU1fRVhUX1BSRUJVSUxUX0RJUiwkKGlmICQoQk9BUkRfU1lTVEVNX0VYVF9QUkVCVUlMVF9ESVIpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEhBU19CT0FSRF9QUk9EVUNUX1BSRUJVSUxUX0RJUiwkKGlmICQoQk9BUkRfUFJPRFVDVF9QUkVCVUlMVF9ESVIpLHRydWUsZmFsc2UpKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTikKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFBMQVRGT1JNX1NFUE9MSUNZX0NPTVBBVF9WRVJTSU9OUykKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFBST0RVQ1RfSU5TVEFMTF9ERUJVR19QT0xJQ1lfVE9fU1lTVEVNX0VYVCkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4sJChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4pKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0RZTkFNSUNfNjRfMzJfRFJNU0VSVkVSKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0VOQUJMRV9NRURJQURSTV82NCkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFRBUkdFVF9EWU5BTUlDXzY0XzMyX01FRElBU0VSVkVSKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04pCisKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELEFERElUSU9OQUxfTTRERUZTLCQoaWYgJChCT0FSRF9TRVBPTElDWV9NNERFRlMpLCQoYWRkcHJlZml4IC1ELCQoQk9BUkRfU0VQT0xJQ1lfTTRERUZTKSkpKQorCisjIEZvciBib290YWJsZS9yZWNvdmVyeQorUkVDT1ZFUllfQVBJX1ZFUlNJT04gOj0gMworUkVDT1ZFUllfRlNUQUJfVkVSU0lPTiA6PSAyCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgcmVjb3ZlcnksIHJlY292ZXJ5X2FwaV92ZXJzaW9uLCAkKFJFQ09WRVJZX0FQSV9WRVJTSU9OKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCByZWNvdmVyeSwgcmVjb3ZlcnlfZnN0YWJfdmVyc2lvbiwgJChSRUNPVkVSWV9GU1RBQl9WRVJTSU9OKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsIHJlY292ZXJ5ICx0YXJnZXRfdXNlcmltYWdlc191c2VfZjJmcyAsJChpZiAkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9GMkZTKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsIHJlY292ZXJ5ICxoYXNfYm9hcmRfY2FjaGVpbWFnZV9wYXJ0aXRpb25fc2l6ZSAsJChpZiAkKEJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUpLHRydWUsZmFsc2UpKQoraWZkZWYgVEFSR0VUX1JFQ09WRVJZX1VJX0xJQgorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdCwgcmVjb3ZlcnksIHRhcmdldF9yZWNvdmVyeV91aV9saWIsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0xJQikpCitlbmRpZgorCisjIEZvciBTYW5pdGl6ZXJzCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsQVNBTl9FTkFCTEVELCQoaWYgJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEhXQVNBTl9FTkFCTEVELCQoaWYgJChmaWx0ZXIgaHdhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsU0FOSVRJWkVfVEFSR0VUX1NZU1RFTV9FTkFCTEVELCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFNBTklUSVpFX1RBUkdFVF9TWVNURU0pKSx0cnVlLGZhbHNlKSkKKworIyBGb3IgaW5pdC5lbnZpcm9uLnJjCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsR0NPVl9DT1ZFUkFHRSwkKE5BVElWRV9DT1ZFUkFHRSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsQ0xBTkdfQ09WRVJBR0UsJChDTEFOR19DT1ZFUkFHRSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELFNDVURPX0FMTE9DQVRJT05fUklOR19CVUZGRVJfU0laRSwkKFBST0RVQ1RfU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFKSkKKworJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEVNTUFfSU5TVFJVTUVOVCwkKGlmICQoZmlsdGVyIHRydWUsJChFTU1BX0lOU1RSVU1FTlQpKSx0cnVlLGZhbHNlKSkKIAogIyBQUk9EVUNUX1BSRUNPTVBJTEVEX1NFUE9MSUNZIGRlZmF1bHRzIHRvIHRydWUuIEV4cGxpY2l0bHkgY2hlY2sgaWYgaXQncyAiZmFsc2UiIG9yIG5vdC4KICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxQUk9EVUNUX1BSRUNPTVBJTEVEX1NFUE9MSUNZLCQoaWYgJChmaWx0ZXIgZmFsc2UsJChQUk9EVUNUX1BSRUNPTVBJTEVEX1NFUE9MSUNZKSksZmFsc2UsdHJ1ZSkpCiAKKyMgRm9yIGFydCBtb2R1bGVzCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFydF9tb2R1bGUsaG9zdF9wcmVmZXJfMzJfYml0LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEhPU1RfUFJFRkVSXzMyX0JJVCkpLHRydWUsZmFsc2UpKQogaWZkZWYgQVJUX0RFQlVHX09QVF9GTEFHCiAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxhcnRfbW9kdWxlLGFydF9kZWJ1Z19vcHRfZmxhZywkKEFSVF9ERUJVR19PUFRfRkxBRykpCiBlbmRpZgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBBUlRfQlVJTERfSE9TVF9ERUJVRyBpcyB0cnVlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFydF9tb2R1bGUsYXJ0X2J1aWxkX2hvc3RfZGVidWcsJChpZiAkKGZpbHRlciBmYWxzZSwkKEFSVF9CVUlMRF9IT1NUX0RFQlVHKSksZmFsc2UsdHJ1ZSkpCisKKyMgRm9yIGNocmUKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsY2hyZSxjaHJlX2RhZW1vbl9scG1hX2VuYWJsZWQsJChpZiAkKGZpbHRlciB0cnVlLCQoQ0hSRV9EQUVNT05fTFBNQV9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsY2hyZV9kZWRpY2F0ZWRfdHJhbnNwb3J0X2NoYW5uZWxfZW5hYmxlZCwkKGlmICQoZmlsdGVyIHRydWUsJChDSFJFX0RFRElDQVRFRF9UUkFOU1BPUlRfQ0hBTk5FTF9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsY2hyZV9sb2dfYXRvbV9leHRlbnNpb25fZW5hYmxlZCwkKGlmICQoZmlsdGVyIHRydWUsJChDSFJFX0xPR19BVE9NX0VYVEVOU0lPTl9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsYnVpbGRpbmdfdmVuZG9yX2ltYWdlLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxESU5HX1ZFTkRPUl9JTUFHRSkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxjaHJlLGNocmVfdXNmX2RhZW1vbl9lbmFibGVkLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKENIUkVfVVNGX0RBRU1PTl9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiAKIGlmZGVmIFRBUkdFVF9CT0FSRF9BVVRPCiAgICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSwgQU5EUk9JRCwgdGFyZ2V0X2JvYXJkX2F1dG8sICQoVEFSR0VUX0JPQVJEX0FVVE8pKQpAQCAtNTYsMTUgKzk3LDEzIEBACiBlbmRpZgogZW5kaWYKIAotIyBUT0RPKGIvMzA4MTg3ODAwKTogc29tZSBpbnRlcm5hbCBtb2R1bGVzIHNldCBgcHJlZmVyYCB0byB0cnVlIG9uIHRoZSBwcmVidWlsdCBhcGV4IG1vZHVsZSwKLSMgYW5kIHNldCB0aGF0IHRvIGZhbHNlIHdoZW4gYEFORFJPSUQubW9kdWxlX2J1aWxkX2Zyb21fc291cmNlYCBpcyB0cnVlLgotIyBTZXQgdGhpcyBzb29uZyBjb25maWcgdmFyaWFibGUgdG8gdHJ1ZSBmb3Igbm93LCBhbmQgY2xlYW51cCBgcHJlZmVyYCBhcyBwYXJ0IG9mIGIvMzA4MTg3ODAwCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxtb2R1bGVfYnVpbGRfZnJvbV9zb3VyY2UsdHJ1ZSkKLQogIyBFbmFibGUgU3lzdGVtVUkgb3B0aW1pemF0aW9ucyBieSBkZWZhdWx0IHVubGVzcyBleHBsaWNpdGx5IHNldC4KIFNZU1RFTVVJX09QVElNSVpFX0pBVkEgPz0gdHJ1ZQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsU1lTVEVNVUlfT1BUSU1JWkVfSkFWQSkKIAorIyBGbGFnIGZvciBlbmFibGluZyBjb21wb3NlIGZvciBMYXVuY2hlci4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9lbmFibGVfY29tcG9zZV9pbl9sYXVuY2hlciwkKFJFTEVBU0VfRU5BQkxFX0NPTVBPU0VfSU5fTEFVTkNIRVIpKQorCiBpZmRlZiBQUk9EVUNUX0FWRl9FTkFCTEVECiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxhdmZfZW5hYmxlZCwkKFBST0RVQ1RfQVZGX0VOQUJMRUQpKQogZW5kaWYKQEAgLTc5LDYgKzExOCwxMCBAQAogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsYXZmX21pY3JvZHJvaWRfZ3Vlc3RfZ2tpX3ZlcnNpb24sJChQUk9EVUNUX0FWRl9NSUNST0RST0lEX0dVRVNUX0dLSV9WRVJTSU9OKSkKIGVuZGlmCiAKK2lmZGVmIFRBUkdFVF9CT09UU18xNksKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCx0YXJnZXRfYm9vdHNfMTZrLCQoZmlsdGVyIHRydWUsJChUQVJHRVRfQk9PVFNfMTZLKSkpCitlbmRpZgorCiBpZmRlZiBQUk9EVUNUX01FTUNHX1YyX0ZPUkNFX0VOQUJMRUQKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELG1lbWNnX3YyX2ZvcmNlX2VuYWJsZWQsJChQUk9EVUNUX01FTUNHX1YyX0ZPUkNFX0VOQUJMRUQpKQogZW5kaWYKQEAgLTkwLDYgKzEzMyw3IEBACiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9hbGxvd19wcmVpbnN0YWxsZWRfYXBwcywkKFJFTEVBU0VfQVZGX0FMTE9XX1BSRUlOU1RBTExFRF9BUFBTKSkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX2VuYWJsZV9kZXZpY2VfYXNzaWdubWVudCwkKFJFTEVBU0VfQVZGX0VOQUJMRV9ERVZJQ0VfQVNTSUdOTUVOVCkpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZGljZV9jaGFuZ2VzLCQoUkVMRUFTRV9BVkZfRU5BQkxFX0RJQ0VfQ0hBTkdFUykpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZWFybHlfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfRUFSTFlfVk0pKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX2xscHZtX2NoYW5nZXMsJChSRUxFQVNFX0FWRl9FTkFCTEVfTExQVk1fQ0hBTkdFUykpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfbXVsdGlfdGVuYW50X21pY3JvZHJvaWRfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfTVVMVElfVEVOQU5UX01JQ1JPRFJPSURfVk0pKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX25ldHdvcmssJChSRUxFQVNFX0FWRl9FTkFCTEVfTkVUV09SSykpCkBAIC0xNTksNiArMjAzLDEwMSBAQAogIyBSZXF1aXJlZCBhcyBwbGF0Zm9ybV9ib290Y2xhc3NwYXRoIGlzIHVzaW5nIHRoaXMgbmFtZXNwYWNlCiAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfY3Jhc2hyZWNvdmVyeV9tb2R1bGUsJChSRUxFQVNFX0NSQVNIUkVDT1ZFUllfTU9EVUxFKSkKIAorIyBBZGQgdXByb2Jlc3RhdHMgYnVpbGQgZmxhZyB0byBzb29uZworJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX3Vwcm9iZXN0YXRzX21vZHVsZSwkKFJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFKSkKKyMgQWRkIHVwcm9iZXN0YXRzIGZpbGUgbW92ZSBmbGFncyB0byBzb29uZywgZm9yIGJvdGggcGxhdGZvcm0gYW5kIG1vZHVsZQoraWZlcSAodHJ1ZSwkKFJFTEVBU0VfVVBST0JFU1RBVFNfRklMRV9NT1ZFKSkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCx1cHJvYmVzdGF0c19maWxlc19pbl9tb2R1bGUsdHJ1ZSkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCx1cHJvYmVzdGF0c19maWxlc19pbl9wbGF0Zm9ybSxmYWxzZSkKK2Vsc2UKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCx1cHJvYmVzdGF0c19maWxlc19pbl9tb2R1bGUsZmFsc2UpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fcGxhdGZvcm0sdHJ1ZSkKK2VuZGlmCisKICMgRW5hYmxlIFByb2ZpbGluZyBtb2R1bGUuIEFsc28gdXNlZCBieSBwbGF0Zm9ybV9ib290Y2xhc3NwYXRoLgogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX3BhY2thZ2VfcHJvZmlsaW5nX21vZHVsZSwkKFJFTEVBU0VfUEFDS0FHRV9QUk9GSUxJTkdfTU9EVUxFKSkKICQoY2FsbCBzb29uZ19jb25maWdfc2V0LGJvb3RjbGFzc3BhdGgscmVsZWFzZV9wYWNrYWdlX3Byb2ZpbGluZ19tb2R1bGUsJChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkpCisKKyMgTW92ZSBWQ04gZnJvbSBwbGF0Zm9ybSB0byB0aGUgVGV0aGVyaW5nIG1vZHVsZTsgdXNlZCBieSBib3RoIHBsYXRmb3JtIGFuZCBtb2R1bGUKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsaXNfdmNuX2luX21haW5saW5lLCQoUkVMRUFTRV9NT1ZFX1ZDTl9UT19NQUlOTElORSkpCisKKyMgQWRkIHBlcmYtc2V0dXAgYnVpbGQgZmxhZyB0byBzb29uZworIyBOb3RlOiBCT0FSRF9QRVJGU0VUVVBfU0NSSVBUIGxvY2F0aW9uIG11c3QgYmUgdW5kZXIgcGxhdGZvcm1fdGVzdGluZy9zY3JpcHRzL3BlcmYtc2V0dXAvLgoraWZkZWYgQk9BUkRfUEVSRlNFVFVQX1NDUklQVAorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxwZXJmLGJvYXJkX3BlcmZzZXR1cF9zY3JpcHQsJChub3RkaXIgJChCT0FSRF9QRVJGU0VUVVBfU0NSSVBUKSkpCitlbmRpZgorCisjIEFkZCB0YXJnZXRfdXNlX3Bhbl9kaXNwbGF5IGZsYWcgZm9yIGhhcmR3YXJlL2xpYmhhcmR3YXJlOmdyYWxsb2MuZGVmYXVsdAorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxncmFsbG9jLHRhcmdldF91c2VfcGFuX2Rpc3BsYXksJChpZiAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRV9QQU5fRElTUExBWSkpLHRydWUsZmFsc2UpKQorCisjIEFkZCB1c2VfY2FtZXJhX3Y0bDJfaGFsIGZsYWcgZm9yIGhhcmR3YXJlL2xpYmhhcmR3YXJlL21vZHVsZXMvY2FtZXJhLzNfNDpjYW1lcmEudjRsMgorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxjYW1lcmEsdXNlX2NhbWVyYV92NGwyX2hhbCwkKGlmICQoZmlsdGVyIHRydWUsJChVU0VfQ0FNRVJBX1Y0TDJfSEFMKSksdHJ1ZSxmYWxzZSkpCisKKyMgQWRkIGF1ZGlvc2VydmVyX211bHRpbGliIGZsYWcgZm9yIGhhcmR3YXJlL2ludGVyZmFjZXMvc291bmR0cmlnZ2VyLzIuMC9kZWZhdWx0OmFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMC1pbXBsCitpZm5lcSAoJChzdHJpcCAkKEFVRElPU0VSVkVSX01VTFRJTElCKSksKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxzb3VuZHRyaWdnZXIsYXVkaW9zZXJ2ZXJfbXVsdGlsaWIsJChBVURJT1NFUlZFUl9NVUxUSUxJQikpCitlbmRpZgorCisjIEFkZCBzaW1fY291bnQsIGRpc2FibGVfcmlsZF9vZW1faG9vaywgYW5kIHVzZV9hb3NwX3JpbGQgZmxhZyBmb3IgcmlsIHJlbGF0ZWQgbW9kdWxlcworJChjYWxsIHNvb25nX2NvbmZpZ19zZXQscmlsLHNpbV9jb3VudCwkKFNJTV9DT1VOVCkpCitpZm5lcSAoJChESVNBQkxFX1JJTERfT0VNX0hPT0spLCBmYWxzZSkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxyaWwsZGlzYWJsZV9yaWxkX29lbV9ob29rLHRydWUpCitlbmRpZgoraWZuZXEgKCQoRU5BQkxFX1ZFTkRPUl9SSUxfU0VSVklDRSksIHRydWUpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wscmlsLHVzZV9hb3NwX3JpbGQsdHJ1ZSkKK2VuZGlmCisKKyMgRXhwb3J0IHRhcmdldF9ib2FyZF9wbGF0Zm9ybSB0byBzb29uZyBmb3IgaGFyZHdhcmUvZ29vZ2xlL2dyYXBoaWNzL2NvbW1vbi9saWJtZW10cmFjazptZW10cmFjay4kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdGFyZ2V0X2JvYXJkX3BsYXRmb3JtLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKKworIyBFeHBvcnQgYm9hcmRfdXNlc19zY2FsZXJfbTJtMXNob3QgYW5kIGJvYXJkX3VzZXNfYWxpZ25fcmVzdHJpY3Rpb24gdG8gc29vbmcgZm9yIGhhcmR3YXJlL2dvb2dsZS9ncmFwaGljcy9jb21tb24vbGlic2NhbGVyOmxpYmV4eW5vc3NjYWxlcgorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc19zY2FsZXJfbTJtMXNob3QsJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19TQ0FMRVJfTTJNMVNIT1QpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX3VzZXNfYWxpZ25fcmVzdHJpY3Rpb24sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19BTElHTl9SRVNUUklDVElPTikpLHRydWUsZmFsc2UpKQorCisjIEV4cG9ydCByZWxhdGVkIHZhcmlhYmxlcyB0byBzb29uZyBmb3IgaGFyZHdhcmUvZ29vZ2xlL2dyYXBoaWNzL2NvbW1vbi9saWJhY3J5bDpsaWJhY3J5bAoraWZkZWYgQk9BUkRfTElCQUNSWUxfREVGQVVMVF9DT01QT1NJVE9SCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LGFjcnlsLGxpYmFjcnlsX2RlZmF1bHRfY29tcG9zaXRvciwkKEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQ09NUE9TSVRPUikpCitlbmRpZgoraWZkZWYgQk9BUkRfTElCQUNSWUxfREVGQVVMVF9TQ0FMRVIKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYWNyeWwsbGliYWNyeWxfZGVmYXVsdF9zY2FsZXIsJChCT0FSRF9MSUJBQ1JZTF9ERUZBVUxUX1NDQUxFUikpCitlbmRpZgoraWZkZWYgQk9BUkRfTElCQUNSWUxfREVGQVVMVF9CTFRFUgorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxhY3J5bCxsaWJhY3J5bF9kZWZhdWx0X2JsdGVyLCQoQk9BUkRfTElCQUNSWUxfREVGQVVMVF9CTFRFUikpCitlbmRpZgoraWZkZWYgQk9BUkRfTElCQUNSWUxfRzJEX0hEUl9QTFVHSU4KKyAgI0JPQVJEX0xJQkFDUllMX0cyRF9IRFJfUExVR0lOIGlzIHNldCBpbiBlYWNoIGJvYXJkIGNvbmZpZworICAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFjcnlsLGxpYmFjcnlsX3VzZV9nMmRfaGRyX3BsdWdpbix0cnVlKQorZW5kaWYKKworIyBFeHBvcnQgcmVsYXRlZCB2YXJpYWJsZXMgdG8gc29vbmcgZm9yIGhhcmR3YXJlL2dvb2dsZS9ncmFwaGljcy9jb21tb24vQm9hcmRDb25maWdDRmxhZ3MubWsKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGh3Y19ub19zdXBwb3J0X3NraXBfdmFsaWRhdGUsJChpZiAkKGZpbHRlciB0cnVlLCQoSFdDX05PX1NVUFBPUlRfU0tJUF9WQUxJREFURSkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsaHdjX3N1cHBvcnRfY29sb3JfdHJhbnNmb3JtLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEhXQ19TVVBQT1JUX0NPTE9SX1RSQU5TRk9STSkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsaHdjX3N1cHBvcnRfcmVuZGVyX2ludGVudCwkKGlmICQoZmlsdGVyIHRydWUsJChIV0NfU1VQUE9SVF9SRU5ERVJfSU5URU5UKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX3ZpcnR1YWxfZGlzcGxheSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1ZJUlRVQUxfRElTUExBWSkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc19kdCwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX0RUKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX2RlY29uXzY0Yml0X2FkZHJlc3MsJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19ERUNPTl82NEJJVF9BRERSRVNTKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX2hkcnVpX2dsZXNfY29udmVyc2lvbiwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX0hEUlVJX0dMRVNfQ09OVkVSU0lPTikpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsdXNlc19pZGlzcGxheV9pbnRmX3NlYywkKGlmICQoZmlsdGVyIHRydWUsJChVU0VTX0lESVNQTEFZX0lOVEZfU0VDKSksdHJ1ZSxmYWxzZSkpCisKKyMgVmFyaWFibGVzIGZvciBmc19jb25maWcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZnNfY29uZmlnLHZlbmRvciwkKGlmICQoQk9BUkRfVVNFU19WRU5ET1JJTUFHRSkkKEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxmc19jb25maWcsb2VtLCQoaWYgJChCT0FSRF9VU0VTX09FTUlNQUdFKSQoQk9BUkRfT0VNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGZzX2NvbmZpZyxvZG0sJChpZiAkKEJPQVJEX1VTRVNfT0RNSU1BR0UpJChCT0FSRF9PRE1JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZnNfY29uZmlnLHZlbmRvcl9kbGttLCQoaWYgJChCT0FSRF9VU0VTX1ZFTkRPUl9ETEtNSU1BR0UpJChCT0FSRF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxmc19jb25maWcsb2RtX2Rsa20sJChpZiAkKEJPQVJEX1VTRVNfT0RNX0RMS01JTUFHRSkkKEJPQVJEX09ETV9ETEtNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGZzX2NvbmZpZyxzeXN0ZW1fZGxrbSwkKGlmICQoQk9BUkRfVVNFU19TWVNURU1fRExLTUlNQUdFKSQoQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx0cnVlLGZhbHNlKSkKKworIyBWYXJpYWJsZXMgZm9yIHRlbGVwaG9ueQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx0ZWxlcGhvbnksc2VjX2NwX3NlY3VyZV9ib290LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFNFQ19DUF9TRUNVUkVfQk9PVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx0ZWxlcGhvbnksY2JkX3Byb3RvY29sX3NpdCwkKGlmICQoZmlsdGVyIHRydWUsJChDQkRfUFJPVE9DT0xfU0lUKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHRlbGVwaG9ueSx1c2VfcmFkaW9leHRlcm5hbF9oYWxfYWlkbCwkKGlmICQoZmlsdGVyIHRydWUsJChVU0VfUkFESU9FWFRFUk5BTF9IQUxfQUlETCkpLHRydWUsZmFsc2UpKQorCisjIFZhcmlhYmxlcyBmb3IgaHdjb21wb3Nlci4kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX3VzZXNfaHdjX3NlcnZpY2VzLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfSFdDX1NFUlZJQ0VTKSksdHJ1ZSxmYWxzZSkpCisKKyMgVmFyaWFibGVzIGZvciBjb250cm9sbGluZyBhbmRyb2lkLmhhcmR3YXJlLmNvbXBvc2VyLmh3YzMtc2VydmljZS5waXhlbAorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX2h3Y192ZXJzaW9uLCQoQk9BUkRfSFdDX1ZFUlNJT04pKQorCisjIFZhcmlhYmxlcyBmb3IgZXh0cmEgYnJhbmNoZXMKKyMgVE9ETyhiLzM4MzIzODM5Nyk6IFVzZSBib290c3RyYXBfZ29fcGFja2FnZSB0byBlbmFibGUgZXh0cmEgZmxhZ3MuCistaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlL2J1aWxkL2V4dHJhX3Nvb25nX2NvbmZpZ192YXJzLm1rCmRpZmYgLS1naXQgYS9jb3JlL2Jhc2VfcnVsZXMubWsgYi9jb3JlL2Jhc2VfcnVsZXMubWsKaW5kZXggY2E1NTNmNi4uNTM2M2UwZiAxMDA2NDQKLS0tIGEvY29yZS9iYXNlX3J1bGVzLm1rCisrKyBiL2NvcmUvYmFzZV9ydWxlcy5tawpAQCAtMzQwLDcgKzM0MCw3IEBACiAKIGlmbmVxICgsJChMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFKSkKICAgaWZuZXEgKCQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKSwkKFNPT05HX0FORFJPSURfTUspKQotICAgICQoY2FsbCBwcmV0dHktZXJyb3IsIExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUgY2FuIG9ubHkgYmUgdXNlZCBmcm9tICQoU09PTkdfQU5EUk9JRF9NSykpCisgICAgJChjYWxsIHByZXR0eS1lcnJvciwgTE9DQUxfTU9EVUxFX01BS0VGSUxFIGNhbiBvbmx5IGJlIHVzZWQgZnJvbSAkKFNPT05HX0FORFJPSURfTUspKQogICBlbmRpZgogICAjIFVzZSB0aGUgaW5zdGFsbCBwYXRoIHJlcXVlc3RlZCBieSBTb29uZy4KICAgTE9DQUxfSU5TVEFMTEVEX01PRFVMRSA6PSAkKExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUpCkBAIC03NzYsNiArNzc2LDggQEAKICAgJChldmFsIG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpIDo9ICQocGF0c3Vic3QgJTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpLCQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6JChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSxcCiAgICAgJChmb3JlYWNoIGRpciwgJChjYWxsIGNvbXBhdGliaWxpdHlfc3VpdGVfZGlycywkKHN1aXRlKSwkKGFyY2hfZGlyKSksIFwKICAgICAgICQoTE9DQUxfQlVJTFRfTU9EVUxFKTokKGRpcikvJChteV9pbnN0YWxsZWRfbW9kdWxlX3N0ZW0pKSkpIFwKKyAgJChldmFsIG15X2NvbXBhdF9tb2R1bGVfYXJjaF9kaXJfJChzdWl0ZSkuJChteV9yZWdpc3Rlcl9uYW1lKSA6PSkgXAorICAkKGZvcmVhY2ggZGlyLCQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSksJChhcmNoX2RpcikpLCQoZXZhbCBteV9jb21wYXRfbW9kdWxlX2FyY2hfZGlyXyQoc3VpdGUpLiQobXlfcmVnaXN0ZXJfbmFtZSkgKz0gJChkaXIpKSkgXAogICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpIDo9ICkpCiAKIGlmbmVxICgsJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUikpCmRpZmYgLS1naXQgYS9jb3JlL2JpbmFyeS5tayBiL2NvcmUvYmluYXJ5Lm1rCmluZGV4IDBiYzk0NjkuLmVhODYyYmUgMTAwNjQ0Ci0tLSBhL2NvcmUvYmluYXJ5Lm1rCisrKyBiL2NvcmUvYmluYXJ5Lm1rCkBAIC0xNzQsNyArMTc0LDcgQEAKIGVuZGlmCiBlbmRpZgogCi1teV9uZGtfc3lzcm9vdF9pbmNsdWRlIDo9CitteV9uZGtfc3lzcm9vdCA6PQogbXlfbmRrX3N5c3Jvb3RfbGliIDo9CiBteV9hcGlfbGV2ZWwgOj0gMTAwMDAKIApAQCAtMjA1LDE1ICsyMDUsMTEgQEAKICAgICBteV9hcGlfbGV2ZWwgOj0gJChteV9uZGtfYXBpKQogICBlbmRpZgogCi0gIG15X25ka19zb3VyY2Vfcm9vdCA6PSBcCi0gICAgICAkKEhJU1RPUklDQUxfTkRLX1ZFUlNJT05TX1JPT1QpLyQoTE9DQUxfTkRLX1ZFUlNJT04pL3NvdXJjZXMKICAgbXlfYnVpbHRfbmRrIDo9ICQoU09PTkdfT1VUX0RJUikvbmRrCiAgIG15X25ka190cmlwbGUgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX05ES19UUklQTEUpCi0gIG15X25ka19zeXNyb290X2luY2x1ZGUgOj0gXAotICAgICAgJChteV9idWlsdF9uZGspL3N5c3Jvb3QvdXNyL2luY2x1ZGUgXAotICAgICAgJChteV9idWlsdF9uZGspL3N5c3Jvb3QvdXNyL2luY2x1ZGUvJChteV9uZGtfdHJpcGxlKSBcCisgIG15X25ka19zeXNyb290IDo9ICQobXlfYnVpbHRfbmRrKS9zeXNyb290CiAKLSAgbXlfbmRrX3N5c3Jvb3RfbGliIDo9ICQobXlfYnVpbHRfbmRrKS9zeXNyb290L3Vzci9saWIvJChteV9uZGtfdHJpcGxlKS8kKG15X25ka19hcGkpCisgIG15X25ka19zeXNyb290X2xpYiA6PSAkKG15X25ka19zeXNyb290KS91c3IvbGliLyQobXlfbmRrX3RyaXBsZSkvJChteV9uZGtfYXBpKQogCiAgICMgVGhlIGJpb25pYyBsaW5rZXIgbm93IGhhcyBzdXBwb3J0IGZvciBwYWNrZWQgcmVsb2NhdGlvbnMgYW5kIGdudSBzdHlsZQogICAjIGhhc2hlcyAod2hpY2ggYXJlIG11Y2ggZmFzdGVyISksIGJ1dCBzaGlwcGluZyB0byBvbGRlciBkZXZpY2VzIHJlcXVpcmVzCkBAIC0yMzksMTYgKzIzNSwxOCBAQAogICBlbmRpZgogCiAgIGlmZXEgKHN5c3RlbSwkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCisgICAgbXlfbmRrX3NvdXJjZV9yb290IDo9IFwKKyAgICAgICAgJChISVNUT1JJQ0FMX05ES19WRVJTSU9OU19ST09UKS8kKExPQ0FMX05ES19WRVJTSU9OKS9zb3VyY2VzCiAgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvc3lzdGVtL2luY2x1ZGUKICAgICBteV9zeXN0ZW1fc2hhcmVkX2xpYnJhcmllcyArPSBsaWJzdGRjKysKICAgZWxzZSBpZm5lcSAoLCQoZmlsdGVyIGMrK18lLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKQotICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9IFwKLSAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2luY2x1ZGUKLSAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCArPSBcCi0gICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrK2FiaS9pbmNsdWRlCisgICAgbXlfbGx2bV9kaXIgOj0gJChMTFZNX1BSRUJVSUxUU19CQVNFKS8kKEJVSUxEX09TKS14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKQorICAgIG15X2xpYmN4eF9hcmNoX2RpciA6PSAkKG15X2xsdm1fZGlyKS9hbmRyb2lkX2xpYmMrKy9uZGsvJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSKQogCi0gICAgbXlfbGliY3h4X2xpYmRpciA6PSBcCi0gICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrKy9saWJzLyQobXlfY3B1X3ZhcmlhbnQpCisgICAgIyBJbmNsdWRlIHRoZSB0YXJnZXQtc3BlY2lmaWMgX19jb25maWdfc2l0ZSBmaWxlIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmljIGxpYmMrKyBoZWFkZXJzLgorICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9ICQobXlfbGliY3h4X2FyY2hfZGlyKS9pbmNsdWRlL2MrKy92MQorICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9ICQobXlfbGx2bV9kaXIpL2luY2x1ZGUvYysrL3YxCisgICAgbXlfbGliY3h4X2xpYmRpciA6PSAkKG15X2xpYmN4eF9hcmNoX2RpcikvbGliCiAKICAgICBpZmVxIChjKytfc3RhdGljLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKICAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSBcCkBAIC0yNTgsNyArMjU2LDcgQEAKICAgICAgIG15X25ka19zdGxfc2hhcmVkX2xpYl9mdWxscGF0aCA6PSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK19zaGFyZWQuc28KICAgICBlbmRpZgogCi0gICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGlidW53aW5kLmEKKyAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgKz0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX0xJQlVOV0lORCkKICAgICBteV9sZGxpYnMgKz0gLWxkbAogICBlbHNlICMgTE9DQUxfTkRLX1NUTF9WQVJJQU5UIG11c3QgYmUgbm9uZQogICAgICMgRG8gbm90aGluZy4KQEAgLTMzMCwxOCArMzI4LDIwIEBACiAgIGlmbmVxICgkKExPQ0FMX0lOX1ZFTkRPUiksKQogICAgICMgVmVuZG9yIG1vZHVsZXMgaGF2ZSBMT0NBTF9JTl9WRU5ET1IKICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX18KLQotICAgIGlmZXEgKCQoQk9BUkRfQVBJX0xFVkVMKSwpCi0gICAgICAjIFRPRE8oYi8zMTQwMzY4NDcpOiBUaGlzIGlzIGEgZmFsbGJhY2sgZm9yIFVEQyB0YXJnZXRzLgotICAgICAgIyBUaGlzIG11c3QgYmUgYSBidWlsZCBmYWlsdXJlIHdoZW4gVURDIGlzIG5vIGxvbmdlciBidWlsdCBmcm9tIHRoaXMgc291cmNlIHRyZWUuCi0gICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX0FQSV9fPSQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCi0gICAgZWxzZQotICAgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKEJPQVJEX0FQSV9MRVZFTCkKLSAgICBlbmRpZgogICBlbHNlIGlmbmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLCkKICAgICAjIFByb2R1Y3QgbW9kdWxlcyBoYXZlIExPQ0FMX0lOX1BST0RVQ1QKICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfUFJPRFVDVF9fCiAgIGVuZGlmCisKKyAgIyBEZWZpbmUgX19BTkRST0lEX1ZFTkRPUl9BUElfXyBmb3IgYm90aCBwcm9kdWN0IGFuZCB2ZW5kb3IgdmFyaWFudHMgYmVjYXVzZQorICAjIHRoZXkgYm90aCB1c2UgdGhlIHNhbWUgTExOREsgbGlicmFyaWVzLgorICBpZmVxICgkKEJPQVJEX0FQSV9MRVZFTCksKQorICAgICMgVE9ETyhiLzMxNDAzNjg0Nyk6IFRoaXMgaXMgYSBmYWxsYmFjayBmb3IgVURDIHRhcmdldHMuCisgICAgIyBUaGlzIG11c3QgYmUgYSBidWlsZCBmYWlsdXJlIHdoZW4gVURDIGlzIG5vIGxvbmdlciBidWlsdCBmcm9tIHRoaXMgc291cmNlIHRyZWUuCisgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKFBMQVRGT1JNX1NES19WRVJTSU9OKQorICBlbHNlCisgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKEJPQVJEX0FQSV9MRVZFTCkKKyAgZW5kaWYKIGVuZGlmCiAKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQpAQCAtMTYyNiwxOSArMTYyNiw2IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLWlmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCi0gIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PQotICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoVEFSR0VUX09VVF9IRUFERVJTKQotZWxzZSBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotICBteV90YXJnZXRfZ2xvYmFsX2NfaW5jbHVkZXMgOj0KLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKG15X25ka19zdGxfaW5jbHVkZV9wYXRoKSAkKG15X25ka19zeXNyb290X2luY2x1ZGUpCi1lbHNlCi0gIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PSAkKFNSQ19IRUFERVJTKSBcCi0gICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19JTkNMVURFUykKLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFNSQ19TWVNURU1fSEVBREVSUykgXAotICAgICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSQobXlfcHJlZml4KUNfU1lTVEVNX0lOQ0xVREVTKQotZW5kaWYKLQogbXlfdGFyZ2V0X2dsb2JhbF9jZmxhZ3MgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpR0xPQkFMX0NGTEFHUykKIG15X3RhcmdldF9nbG9iYWxfY29ubHlmbGFncyA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClDTEFOR18kKG15X3ByZWZpeClHTE9CQUxfQ09OTFlGTEFHUykgJChteV9jX3N0ZF9jb25seWZsYWdzKQogbXlfdGFyZ2V0X2dsb2JhbF9jcHBmbGFncyA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClDTEFOR18kKG15X3ByZWZpeClHTE9CQUxfQ1BQRkxBR1MpICQobXlfY3BwX3N0ZF9jcHBmbGFncykKQEAgLTE2NTQsNiArMTY0MSwyMiBAQAogICBteV90YXJnZXRfZ2xvYmFsX2xkZmxhZ3MgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpR0xPQkFMX0xERkxBR1MpCiBlbmRpZiAjIG15X3VzZV9jbGFuZ19sbGQKIAoraWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9CisgIG15X3RhcmdldF9nbG9iYWxfY19zeXN0ZW1faW5jbHVkZXMgOj0gJChUQVJHRVRfT1VUX0hFQURFUlMpCisgIG15X3RhcmdldF9nbG9iYWxfY2ZsYWdzICs9IC1ub3N0ZGxpYmluYworZWxzZSBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgorICBteV90YXJnZXRfZ2xvYmFsX2NfaW5jbHVkZXMgOj0KKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKG15X25ka19zdGxfaW5jbHVkZV9wYXRoKQorICBteV90YXJnZXRfZ2xvYmFsX2NmbGFncyArPSAtLXN5c3Jvb3QgJChteV9uZGtfc3lzcm9vdCkKK2Vsc2UKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9ICQoU1JDX0hFQURFUlMpIFwKKyAgICAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClDX0lOQ0xVREVTKQorICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoU1JDX1NZU1RFTV9IRUFERVJTKSBcCisgICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19TWVNURU1fSU5DTFVERVMpCisgIG15X3RhcmdldF9nbG9iYWxfY2ZsYWdzICs9IC1ub3N0ZGxpYmluYworZW5kaWYKKwogbXlfdGFyZ2V0X3RyaXBsZSA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClDTEFOR18kKG15X3ByZWZpeClUUklQTEUpCiBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKICAgbXlfdGFyZ2V0X3RyaXBsZV9mbGFnIDo9IC10YXJnZXQgJChteV90YXJnZXRfdHJpcGxlKSQobXlfYXBpX2xldmVsKQpkaWZmIC0tZ2l0IGEvY29yZS9ib2FyZF9jb25maWcubWsgYi9jb3JlL2JvYXJkX2NvbmZpZy5tawppbmRleCBkM2YwNDkzLi5hZDg5YzAzIDEwMDY0NAotLS0gYS9jb3JlL2JvYXJkX2NvbmZpZy5taworKysgYi9jb3JlL2JvYXJkX2NvbmZpZy5tawpAQCAtMjcsNiArMjcsNyBAQAogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfS0VSTkVMX0NNRExJTkUKIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04KIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RDT05GSUcKK19ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RDT05GSUdfRklMRQogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfS0VSTkVMX0JBU0UKIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX1VTRVNfR0VORVJJQ19BVURJTwogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UCkBAIC0yMzcsNiArMjM4LDcgQEAKICAgLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX0RFVklDRV9ESVIKIGVuZGlmCiAKKyQoY2FsbCBkdW1wLXBoYXNlLXN0YXJ0LEJPQVJELCwsLCBidWlsZC9tYWtlL2NvcmUvYm9hcmRfY29uZmlnLm1rKQogaWZuZGVmIFJCQ19QUk9EVUNUX0NPTkZJRwogaW5jbHVkZSAkKGJvYXJkX2NvbmZpZ19taykKIGVsc2UKQEAgLTI2MSw2ICsyNjMsNyBAQAogCiAgIGluY2x1ZGUgJChPVVRfRElSKS9yYmMvcmJjX2JvYXJkX2NvbmZpZ19yZXN1bHRzLm1rCiBlbmRpZgorJChjYWxsIGR1bXAtcGhhc2UtZW5kLCBidWlsZC9tYWtlL2NvcmUvYm9hcmRfY29uZmlnLm1rKQogCiBpZm5lcSAoLCQoYW5kICQoVEFSR0VUX0FSQ0gpLCQoVEFSR0VUX0FSQ0hfU1VJVEUpKSkKICAgJChlcnJvciAkKGJvYXJkX2NvbmZpZ19taykgZXJyb25lb3VzbHkgc2V0cyBib3RoIFRBUkdFVF9BUkNIIGFuZCBUQVJHRVRfQVJDSF9TVUlURSkKQEAgLTI4OCw2ICsyOTEsNyBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYm9hcmRfY29uZmlnX3dpZmkubWsKIAogIyBTZXQgdXAgc29vbmcgY29uZmlnIGZvciAic29vbmdfY29uZmlnX3ZhbHVlX3ZhcmlhYmxlIi4KKy1pbmNsdWRlIGhhcmR3YXJlL2ludGVyZmFjZXMvY29uZmlnc3RvcmUvMS4xL2RlZmF1bHQvc3VyZmFjZWZsaW5nZXIubWsKIC1pbmNsdWRlIHZlbmRvci9nb29nbGUvYnVpbGQvc29vbmcvc29vbmdfY29uZmlnX25hbWVzcGFjZS9jYW1lcmEubWsKIAogIyBEZWZhdWx0ICpfQ1BVX1ZBUklBTlRfUlVOVElNRSB0byBDUFVfVkFSSUFOVCBpZiB1bnNwZWNpZmllZC4KQEAgLTMwOSw5ICszMTMsMTAgQEAKIC5LQVRJX1JFQURPTkxZIDo9ICQoX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QpCiAKIElOVEVSTkFMX0tFUk5FTF9DTURMSU5FIDo9ICQoQk9BUkRfS0VSTkVMX0NNRExJTkUpCi1pZm5lcSAoLCQoQk9BUkRfQk9PVENPTkZJRykpCitpZm5lcSAoLCQoQk9BUkRfQk9PVENPTkZJRykkKEJPQVJEX0JPT1RDT05GSUdfRklMRSkpCiAgIElOVEVSTkFMX0tFUk5FTF9DTURMSU5FICs9IGJvb3Rjb25maWcKICAgSU5URVJOQUxfQk9PVENPTkZJRyA6PSAkKEJPQVJEX0JPT1RDT05GSUcpCisgIElOVEVSTkFMX0JPT1RDT05GSUdfRklMRSA6PSAkKEJPQVJEX0JPT1RDT05GSUdfRklMRSkKIGVuZGlmCiAKIGlmbmVxICgkKGZpbHRlciAlNjQsJChUQVJHRVRfQVJDSCkpLCkKQEAgLTkyMCw2ICs5MjUsMTggQEAKIGVuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBCT0FSRF9VU0VTX1BWTUZXSU1BR0UKIAorQk9BUkRfVVNFU19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFIDo9CitpZmVxICgkKFBST0RVQ1RfQlVJTERfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSksdHJ1ZSkKKyAgQk9BUkRfVVNFU19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFIDo9IHRydWUKK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBCT0FSRF9VU0VTX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UKKworQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRSA6PQoraWZlcSAoJChQUk9EVUNUX0JVSUxEX0RFU0tUT1BfVVBEQVRFX0lNQUdFKSx0cnVlKQorICBCT0FSRF9VU0VTX0RFU0tUT1BfVVBEQVRFX0lNQUdFIDo9IHRydWUKK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBCT0FSRF9VU0VTX0RFU0tUT1BfVVBEQVRFX0lNQUdFCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgRW5zdXJlIGNvbnNpc3RlbmN5IGFtb25nIFRBUkdFVF9SRUNPVkVSWV9VUERBVEVSX0xJQlMsIEFCX09UQV9VUERBVEVSLCBhbmQgUFJPRFVDVF9PVEFfRk9SQ0VfTk9OX0FCX1BBQ0tBR0UuCiBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTID89CmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF9hcm0ubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF9hcm0ubWsKaW5kZXggZjE4NzQ3YS4uMTI2NDgyZiAxMDA2NDQKLS0tIGEvY29yZS9jbGFuZy9UQVJHRVRfYXJtLm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybS5tawpAQCAtNCw3ICs0LDEwIEBACiAKICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLWFybS1hbmRyb2lkLmEKICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVRBUkdFVF9MSUJDUlRfQlVJTFRJTlMgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LmJ1aWx0aW5zLWFybS1hbmRyb2lkLmEKKyQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVRBUkdFVF9MSUJVTldJTkQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2FybS9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClBRERSRVNTX1NBTklUSVpFUl9MSU5LRVJfRklMRSA6PSAvc3lzdGVtL2Jpbi9ib290c3RyYXAvbGlua2VyX2FzYW4KKworJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IGFybQpkaWZmIC0tZ2l0IGEvY29yZS9jbGFuZy9UQVJHRVRfYXJtNjQubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF9hcm02NC5tawppbmRleCA0MmJlZDBhLi5lN2FiNmNiIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL1RBUkdFVF9hcm02NC5taworKysgYi9jb3JlL2NsYW5nL1RBUkdFVF9hcm02NC5tawpAQCAtNCw3ICs0LDEwIEBACiAKIFRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLWFhcmNoNjQtYW5kcm9pZC5hCiBUQVJHRVRfTElCQ1JUX0JVSUxUSU5TIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5idWlsdGlucy1hYXJjaDY0LWFuZHJvaWQuYQorVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvYWFyY2g2NC9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuNjQKIEFERFJFU1NfU0FOSVRJWkVSX0xJTktFUl9GSUxFIDo9IC9zeXN0ZW0vYmluL2Jvb3RzdHJhcC9saW5rZXJfYXNhbjY0CisKK1BSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUiA6PSBhYXJjaDY0CmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF9yaXNjdjY0Lm1rIGIvY29yZS9jbGFuZy9UQVJHRVRfcmlzY3Y2NC5tawppbmRleCBjZmI1YzdkLi41OGM5YzdiIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL1RBUkdFVF9yaXNjdjY0Lm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX3Jpc2N2NjQubWsKQEAgLTQsNyArNCwxMCBAQAogCiBUQVJHRVRfTElCUFJPRklMRV9SVCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQucHJvZmlsZS1yaXNjdjY0LWFuZHJvaWQuYQogVEFSR0VUX0xJQkNSVF9CVUlMVElOUyA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQuYnVpbHRpbnMtcmlzY3Y2NC1hbmRyb2lkLmEKK1RBUkdFVF9MSUJVTldJTkQgOj0gJChMTFZNX1JUTElCX1BBVEgpL3Jpc2N2NjQvbGlidW53aW5kLmEKIAogIyBBZGRyZXNzIHNhbml0aXplciBjbGFuZyBjb25maWcKIEFERFJFU1NfU0FOSVRJWkVSX0xJTktFUiA6PSAvc3lzdGVtL2Jpbi9saW5rZXJfYXNhbjY0CiBBRERSRVNTX1NBTklUSVpFUl9MSU5LRVJfRklMRSA6PSAvc3lzdGVtL2Jpbi9ib290c3RyYXAvbGlua2VyX2FzYW42NAorCitQUkVCVUlMVF9MSUJDWFhfQVJDSF9ESVIgOj0gcmlzY3Y2NApkaWZmIC0tZ2l0IGEvY29yZS9jbGFuZy9UQVJHRVRfeDg2Lm1rIGIvY29yZS9jbGFuZy9UQVJHRVRfeDg2Lm1rCmluZGV4IDU0OTFhMDUuLjFhMDhjNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xhbmcvVEFSR0VUX3g4Ni5taworKysgYi9jb3JlL2NsYW5nL1RBUkdFVF94ODYubWsKQEAgLTQsNyArNCwxMCBAQAogCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClUQVJHRVRfTElCUFJPRklMRV9SVCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQucHJvZmlsZS1pNjg2LWFuZHJvaWQuYQogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQkNSVF9CVUlMVElOUyA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQuYnVpbHRpbnMtaTY4Ni1hbmRyb2lkLmEKKyQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVRBUkdFVF9MSUJVTldJTkQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2kzODYvbGlidW53aW5kLmEKIAogIyBBZGRyZXNzIHNhbml0aXplciBjbGFuZyBjb25maWcKICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUFERFJFU1NfU0FOSVRJWkVSX0xJTktFUiA6PSAvc3lzdGVtL2Jpbi9saW5rZXJfYXNhbgogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpQUREUkVTU19TQU5JVElaRVJfTElOS0VSX0ZJTEUgOj0gL3N5c3RlbS9iaW4vYm9vdHN0cmFwL2xpbmtlcl9hc2FuCisKKyQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVBSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUiA6PSBpMzg2CmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF94ODZfNjQubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF94ODZfNjQubWsKaW5kZXggMTY3ZGI3Mi4uZjM5YjQxZSAxMDA2NDQKLS0tIGEvY29yZS9jbGFuZy9UQVJHRVRfeDg2XzY0Lm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX3g4Nl82NC5tawpAQCAtNCw3ICs0LDEwIEBACiAKIFRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLXg4Nl82NC1hbmRyb2lkLmEKIFRBUkdFVF9MSUJDUlRfQlVJTFRJTlMgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LmJ1aWx0aW5zLXg4Nl82NC1hbmRyb2lkLmEKK1RBUkdFVF9MSUJVTldJTkQgOj0gJChMTFZNX1JUTElCX1BBVEgpL3g4Nl82NC9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuNjQKIEFERFJFU1NfU0FOSVRJWkVSX0xJTktFUl9GSUxFIDo9IC9zeXN0ZW0vYmluL2Jvb3RzdHJhcC9saW5rZXJfYXNhbjY0CisKK1BSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUiA6PSB4ODZfNjQKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tayBiL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZmZGUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb21iby9hcmNoL2FybTY0L2FybXY5LTJhLm1rCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgLm1rIGZpbGUgcmVxdWlyZWQgdG8gc3VwcG9ydCBidWlsZCBmb3IgdGhlIEFSTXY5LjItQSBhcmNoIHZhcmlhbnQuCisjIFRoZSBmaWxlIGp1c3QgbmVlZHMgdG8gYmUgcHJlc2VudCwgaXQgZG9lcyBub3QgbmVlZCB0byBjb250YWluIGFueXRoaW5nLgpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL3g4Ni9hbGRlcmxha2UubWsgYi9jb3JlL2NvbWJvL2FyY2gveDg2L2FsZGVybGFrZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2FlNmVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb21iby9hcmNoL3g4Ni9hbGRlcmxha2UubWsKQEAgLTAsMCArMSw2IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIExpbnV4IG9uIHg4Ni4KKyMgR2VuZXJhdGluZyBiaW5hcmllcyBmb3IgcHJvY2Vzc29ycworIyB0aGF0IGhhdmUgQVZYMiBmZWF0dXJlIGZsYWcKKyMKKworQVJDSF9YODZfSEFWRV9TU0U0XzEgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL3g4Nl82NC9hbGRlcmxha2UubWsgYi9jb3JlL2NvbWJvL2FyY2gveDg2XzY0L2FsZGVybGFrZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2FlNmVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9jb21iby9hcmNoL3g4Nl82NC9hbGRlcmxha2UubWsKQEAgLTAsMCArMSw2IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIExpbnV4IG9uIHg4Ni4KKyMgR2VuZXJhdGluZyBiaW5hcmllcyBmb3IgcHJvY2Vzc29ycworIyB0aGF0IGhhdmUgQVZYMiBmZWF0dXJlIGZsYWcKKyMKKworQVJDSF9YODZfSEFWRV9TU0U0XzEgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb25maWcubWsgYi9jb3JlL2NvbmZpZy5tawppbmRleCA4MmI2M2NmLi40NTRjMGU1IDEwMDY0NAotLS0gYS9jb3JlL2NvbmZpZy5taworKysgYi9jb3JlL2NvbmZpZy5tawpAQCAtMTczLDYgKzE3Myw3IEBACiAkKEtBVElfb2Jzb2xldGVfdmFyIEJVSUxESU5HX1BWTUZXX0lNQUdFLEJVSUxESU5HX1BWTUZXX0lNQUdFIGlzIG5vIGxvbmdlciB1c2VkKQogJChLQVRJX29ic29sZXRlX3ZhciBCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSkKICQoS0FUSV9vYnNvbGV0ZV92YXIgRlNfR0VUX1NUQVRTKQorJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRF9CUk9LRU5fVVNFU19TT09OR19QWVRIT04yX01PRFVMRVMpCiAKICMgVXNlZCB0byBmb3JjZSBnb2FscyB0byBidWlsZC4gIE9ubHkgdXNlIGZvciBjb25kaXRpb25hbGx5IGRlZmluZWQgZ29hbHMuCiAuUEhPTlk6IEZPUkNFCkBAIC0zMjksNiArMzMwLDE4IEBACiAkKGV2YWwgU09PTkdfQ09ORklHX1RZUEVfJChzdHJpcCAkMSlfJChzdHJpcCAkMik6PWJvb2wpCiBlbmRlZgogCisjIHNvb25nX2NvbmZpZ19zZXRfc3RyaW5nX2xpc3QgaXMgdGhlIHNhbWUgYXMgc29vbmdfY29uZmlnX3NldCwgYnV0IGl0IHdpbGwKKyMgYWxzbyB0eXBlIHRoZSB2YXJpYWJsZSBhcyBhIGxpc3Qgb2Ygc3RyaW5ncywgc28gdGhhdCB3aGVuIHVzaW5nIHNlbGVjdCgpIGV4cHJlc3Npb25zCisjIGluIGJsdWVwcmludCBmaWxlcyB0aGV5IGNhbiB1c2UgbGlzdCB2YWx1ZXMgaW5zdGVhZCBvZiBzdHJpbmdzLgorIyBUaGUgdmFsdWVzIG9mIHRoZSBsaXN0IG11c3QgYmUgc3BhY2Utc2VwYXJhdGVkLgorIyAkMSBpcyB0aGUgbmFtZXNwYWNlLiAkMiBpcyB0aGUgdmFyaWFibGUgbmFtZS4gJDMgaXMgdGhlIHZhcmlhYmxlIHZhbHVlLgorIyBFeDogJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfc3RyaW5nX2xpc3QsYWNtZSxDT09MX0xJQlMsYSBiKQorZGVmaW5lIHNvb25nX2NvbmZpZ19zZXRfc3RyaW5nX2xpc3QKKyQoY2FsbCBzb29uZ19jb25maWdfZGVmaW5lX2ludGVybmFsLCQxLCQyKSBcCiskKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kKHN0cmlwICQzKSkKKyQoZXZhbCBTT09OR19DT05GSUdfVFlQRV8kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9c3RyaW5nX2xpc3QpCitlbmRlZgorCiAjIHNvb25nX2NvbmZpZ19hcHBlbmQgYXBwZW5kcyB0byB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBnaXZlbiBTb29uZwogIyBjb25maWcgbmFtZXNwYWNlLiBJZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgZGVmaW5lZC4gSWYgdGhlCiAjIG5hbWVzcGFjZSBkb2VzIG5vdCAgZXhpc3QsIGl0IHdpbGwgYmUgZGVmaW5lZC4KQEAgLTM2Myw4ICszNzYsNyBAQAogIyBjb25maWdzLCBnZW5lcmFsbHkgZm9yIGNyb3NzLWN1dHRpbmcgZmVhdHVyZXMuCiAKICMgQnVpbGQgYnJva2VuIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGJvb2xlYW5zCi1fYnVpbGRfYnJva2VuX2Jvb2xfdmFycyA6PSBcCi0gIEJVSUxEX0JST0tFTl9VU0VTX1NPT05HX1BZVEhPTjJfTU9EVUxFUyBcCitfYnVpbGRfYnJva2VuX2Jvb2xfdmFycyA6PQogCiAjIEJ1aWxkIGJyb2tlbiB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBsaXN0cwogX2J1aWxkX2Jyb2tlbl9saXN0X3ZhcnMgOj0gXApAQCAtNDMyLDEzICs0NDQsNiBAQAogZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAogCi1pZmRlZiBQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKLSAgVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gJChQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUpCi1lbHNlCi0gIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCi1lbmRpZgotLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKLQogIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIEFPU1AgcmVsaWVzIG9uIGJpb25pYydzIFBBR0VfU0laRSBtYWNyby4KIGlmZGVmIFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTwogICBUQVJHRVRfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSAkKFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTykKQEAgLTcyNSw4ICs3MzAsOCBAQAogUFJPR1VBUkRfSE9NRSA6PSBleHRlcm5hbC9wcm9ndWFyZAogUFJPR1VBUkQgOj0gJChQUk9HVUFSRF9IT01FKS9iaW4vcHJvZ3VhcmQuc2gKIFBST0dVQVJEX0RFUFMgOj0gJChQUk9HVUFSRCkgJChQUk9HVUFSRF9IT01FKS9saWIvcHJvZ3VhcmQuamFyCi1KQVZBVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKLU1FUkdFVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL21lcmdlLWV2ZW50LWxvZy10YWdzLnB5CitKQVZBVEFHUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9qYXZhLWV2ZW50LWxvZy10YWdzCitNRVJHRVRBR1MgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MKIEFQUEVORDJTSU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwcGVuZDJzaW1nCiBWRVJJVFlfU0lHTkVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIKIEJVSUxEX1ZFUklUWV9NRVRBREFUQSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfbWV0YWRhdGEKQEAgLTgxMSw2ICs4MTYsMjQgQEAKICAgQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgPz0gdHJ1ZQogZW5kaWYKIAoraWZuZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDM2KSwpCisgIGlmbmVxICgkKE5FRURfQUlETF9OREtfUExBVEZPUk1fQkFDS0VORCksKQorICAgICQoZXJyb3IgTXVzdCBub3Qgc2V0IE5FRURfQUlETF9OREtfUExBVEZPUk1fQkFDS0VORCwgYnV0IGl0IGlzIHNldCB0bzogJChORUVEX0FJRExfTkRLX1BMQVRGT1JNX0JBQ0tFTkQpLiBTdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZC4pCisgIGVuZGlmCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKKyAgVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gJChQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUpCitlbHNlIGlmZXEgKHRydWUsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKKyAgIyB1bmJ1bmRsZWQgYnVpbGRzIG1heSBub3QgaGF2ZSB1cGRhdGVkIGJ1aWxkIHNvdXJjZXMKKyAgVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gZmFsc2UKK2Vsc2UgaWZuZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDM2KSwpCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IHRydWUKK2Vsc2UKKyAgVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gZmFsc2UKK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfQ0hFQ0tfUFJFQlVJTFRfTUFYX1BBR0VfU0laRQorCiAjIFNldCBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgdG8gdGhlIGxhdGVzdCBTeXN0ZW1TREsgdmVyc2lvbiBzdGFydGluZyBmcm9tIFAtbGF1bmNoaW5nCiAjIGRldmljZXMgaWYgdW5zZXQuCiBpZm5kZWYgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TCkBAIC04MzMsMTIgKzg1Niw2IEBACiAuS0FUSV9SRUFET05MWSA6PSBCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMKIAogaWZkZWYgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKLSAgYm9hcmRfYXBpX2xldmVsIDo9ICQoZmlyc3R3b3JkICQoQk9BUkRfQVBJX0xFVkVMKSAkKEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCkpCi0gIGlmbmVxICgsJChib2FyZF9hcGlfbGV2ZWwpKQotICAgIG1pbl9zeXN0ZW1zZGtfdmVyc2lvbiA6PSAkKGNhbGwgbWF0aF9taW4sJChib2FyZF9hcGlfbGV2ZWwpLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQotICBlbHNlCi0gICAgbWluX3N5c3RlbXNka192ZXJzaW9uIDo9ICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpCi0gIGVuZGlmCiAgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOSksKQogICAgIGlmbmVxICgkKEJPQVJEX09UQV9GUkFNRVdPUktfVkJNRVRBX1ZFUlNJT05fT1ZFUlJJREUpLCkKICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOSwgQk9BUkRfT1RBX0ZSQU1FV09SS19WQk1FVEFfVkVSU0lPTl9PVkVSUklERSBjYW5ub3QgYmUgc2V0KQpAQCAtODg5LDYgKzkwNiwxMSBAQAogICAgIFBMQVRGT1JNX1NFUE9MSUNZX0NPTVBBVF9WRVJTSU9OUyBcCiAgICAgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiBcCiAKK0JPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OID89ICQoQk9BUkRfQVBJX0xFVkVMKQoraWZlcSAoJChjYWxsIG1hdGhfZ3QsJChCT0FSRF9BUElfTEVWRUwpLCQoQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04pKSx0cnVlKQorICAkKGVycm9yIEJPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OICgkKEJPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OKSkgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQk9BUkRfQVBJX0xFVkVMICgkKEJPQVJEX0FQSV9MRVZFTCkpKQorZW5kaWYKKwogaWZlcSAoJChQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUyksdHJ1ZSkKICAgaWZuZXEgKCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSx0cnVlKQogICAgICQoZXJyb3IgUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TIG11c3QgYmUgdHJ1ZSB3aGVuIFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TIFwKQEAgLTEyNTEsMTQgKzEyNzMsNDMgQEAKICMgaW4gdGhlIHNvdXJjZSB0cmVlLgogZG9udF9ib3RoZXJfZ29hbHMgOj0gb3V0IHByb2R1Y3QtZ3JhcGgKIAoraWZlcSAoJChUQVJHRVRfU1lTVEVNX1BST1ApLCkKK1RBUkdFVF9TWVNURU1fUFJPUCA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3N5c3RlbS5wcm9wKQorZW5kaWYKKworaWZlcSAoJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSwpCitUQVJHRVRfU1lTVEVNX0VYVF9QUk9QIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvc3lzdGVtX2V4dC5wcm9wKQorZW5kaWYKKworaWZlcSAoJChUQVJHRVRfUFJPRFVDVF9QUk9QKSwpCitUQVJHRVRfUFJPRFVDVF9QUk9QIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvcHJvZHVjdC5wcm9wKQorZW5kaWYKKworaWZlcSAoJChUQVJHRVRfT0RNX1BST1ApLCkKK1RBUkdFVF9PRE1fUFJPUCA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL29kbS5wcm9wKQorZW5kaWYKKworLktBVElfUkVBRE9OTFkgOj0gXAorICAgIFRBUkdFVF9TWVNURU1fUFJPUCBcCisgICAgVEFSR0VUX1NZU1RFTV9FWFRfUFJPUCBcCisgICAgVEFSR0VUX1BST0RVQ1RfUFJPUCBcCisgICAgVEFSR0VUX09ETV9QUk9QIFwKKwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc3lzcHJvcF9jb25maWcubWsKIAogIyBNYWtlIEFORFJPSUQgU29vbmcgY29uZmlnIHZhcmlhYmxlcyB2aXNpYmxlIHRvIEFuZHJvaWQubWsgZmlsZXMsIGZvcgogIyBjb25zaXN0ZW5jeSB3aXRoIHRob3NlIGRlZmluZWQgaW4gQm9hcmRDb25maWcubWsgZmlsZXMuCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rCiAKLVNPT05HX1ZBUklBQkxFUyA6PSAkKFNPT05HX09VVF9ESVIpL3Nvb25nLiQoVEFSR0VUX1BST0RVQ1QpLnZhcmlhYmxlcwotU09PTkdfRVhUUkFfVkFSSUFCTEVTIDo9ICQoU09PTkdfT1VUX0RJUikvc29vbmcuJChUQVJHRVRfUFJPRFVDVCkuZXh0cmEudmFyaWFibGVzCisjIEVNTUFfSU5TVFJVTUVOVCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIGNvdmVyYWdlIGlzIGVuYWJsZWQuIENyZWF0ZXMgYSBzdWZmaXggdG8KKyMgZGlmZmVyZWNpYXRlIHRoZSBjb3ZlcmFnZSB2ZXJzaW9uIG9mIG5pbmphIGZpbGVzLiBUaGlzIHdpbGwgc2F2ZSA1IG1pbnV0ZXMgb2YKKyMgYnVpbGQgdGltZSB1c2VkIHRvIHJlZ2VuZXJhdGUgbmluamEuCitpZmVxICh0cnVlLCQoRU1NQV9JTlNUUlVNRU5UKSkKK0NPVkVSQUdFX1NVRkZJWCA6PSAuY292ZXJhZ2UKK2VuZGlmCisKK1NPT05HX1ZBUklBQkxFUyA6PSAkKFNPT05HX09VVF9ESVIpL3Nvb25nLiQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLnZhcmlhYmxlcworU09PTkdfRVhUUkFfVkFSSUFCTEVTIDo9ICQoU09PTkdfT1VUX0RJUikvc29vbmcuJChUQVJHRVRfUFJPRFVDVCkkKENPVkVSQUdFX1NVRkZJWCkuZXh0cmEudmFyaWFibGVzCiAKIGlmZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9uaW5qYV9jb25maWcubWsKQEAgLTEyNjgsMTAgKzEzMTksNiBAQAogU09PTkdfVkFSSUFCTEVTIDo9CiBTT09OR19FWFRSQV9WQVJJQUJMRVMgOj0KIAotLWluY2x1ZGUgZXh0ZXJuYWwvbHRwL2FuZHJvaWQvbHRwX3BhY2thZ2VfbGlzdC5tawotREVGQVVMVF9EQVRBX09VVF9NT0RVTEVTIDo9IGx0cCAkKGx0cF9wYWNrYWdlcykKLS5LQVRJX1JFQURPTkxZIDo9IERFRkFVTFRfREFUQV9PVVRfTU9EVUxFUwotCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kdW1wdmFyLm1rCiAKIGlmZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgpAQCAtMTI4NiwzICsxMzMzLDU4IEBACiAkKGVycm9yIFNZU1RFTV9PUFRJTUlaRV9KQVZBIG11c3QgYmUgZW5hYmxlZCB3aGVuIEZVTExfU1lTVEVNX09QVElNSVpFX0pBVkEgaXMgZW5hYmxlZCkKIGVuZGlmCiBlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBmaW5nZXJwcmludCwgdGh1bWJwcmludCwgYW5kIHZlcnNpb24gdGFncyBmb3IgdGhlIGN1cnJlbnQgYnVpbGQKKyMKKyMgQlVJTERfVkVSU0lPTl9UQUdTIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyBjaG9zZW4gYnkgdGhlIGRldmljZQorIyBpbXBsZW1lbnRlciB0aGF0IGZ1cnRoZXIgZGlzdGluZ3Vpc2hlcyB0aGUgYnVpbGQuIEl0J3MgYmFzaWNhbGx5IGRlZmluZWQKKyMgYnkgdGhlIGRldmljZSBpbXBsZW1lbnRlci4gSGVyZSwgd2UgYXJlIGFkZGluZyBhIG1hbmRhdG9yeSB0YWcgdGhhdAorIyBpZGVudGlmaWVzIHRoZSBzaWduaW5nIGNvbmZpZyBvZiB0aGUgYnVpbGQuCitCVUlMRF9WRVJTSU9OX1RBR1MgOj0gJChCVUlMRF9WRVJTSU9OX1RBR1MpCitpZmVxICgkKFRBUkdFVF9CVUlMRF9UWVBFKSxkZWJ1ZykKKyAgQlVJTERfVkVSU0lPTl9UQUdTICs9IGRlYnVnCitlbmRpZgorIyBUaGUgInRlc3Qta2V5cyIgdGFnIG1hcmtzIGJ1aWxkcyBzaWduZWQgd2l0aCB0aGUgb2xkIHRlc3Qga2V5cywKKyMgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgU0RLLiAgImRldi1rZXlzIiBtYXJrcyBidWlsZHMgc2lnbmVkIHdpdGgKKyMgbm9uLWRlZmF1bHQgZGV2IGtleXMgKHVzdWFsbHkgcHJpdmF0ZSBrZXlzIGZyb20gYSB2ZW5kb3IgZGlyZWN0b3J5KS4KKyMgQm90aCBvZiB0aGVzZSB0YWdzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCAicmVsZWFzZS1rZXlzIgorIyB3aGVuIHRoZSB0YXJnZXQtZmlsZXMgaXMgc2lnbmVkIGluIGEgcG9zdC1idWlsZCBzdGVwLgoraWZlcSAoJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvdGVzdGtleSkKK0JVSUxEX0tFWVMgOj0gdGVzdC1rZXlzCitlbHNlCitCVUlMRF9LRVlTIDo9IGRldi1rZXlzCitlbmRpZgorQlVJTERfVkVSU0lPTl9UQUdTICs9ICQoQlVJTERfS0VZUykKK0JVSUxEX1ZFUlNJT05fVEFHUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc29ydCAkKEJVSUxEX1ZFUlNJT05fVEFHUykpKQorCisjIEJVSUxEX0ZJTkdFUlBSSU5UIGlzIHVzZWQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29tYmluZWQgYnVpbGQgYW5kCisjIHByb2R1Y3Q7IHVzZWQgYnkgdGhlIE9UQSBzZXJ2ZXIuCitpZmVxICgsJChzdHJpcCAkKEJVSUxEX0ZJTkdFUlBSSU5UKSkpCisgIEJVSUxEX0ZJTkdFUlBSSU5UIDo9ICQoUFJPRFVDVF9CUkFORCkvJChUQVJHRVRfUFJPRFVDVCkvJChUQVJHRVRfREVWSUNFKTokKFBMQVRGT1JNX1ZFUlNJT04pLyQoQlVJTERfSUQpLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSk6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCitlbmRpZgorCitCVUlMRF9GSU5HRVJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX2ZpbmdlcnByaW50LnR4dAoraWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9GSU5HRVJQUklOVCkgPiQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkudG1wICYmIChpZiAhIGNtcCAtcyAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpLnRtcCAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpOyB0aGVuIG12ICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkudG1wICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSk7IGVsc2Ugcm0gJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKS50bXA7IGZpKSAmJiBncmVwICIgIiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSkKKyAgJChlcnJvciBCVUlMRF9GSU5HRVJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKGZpbGUgPCQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpIikKK2VuZGlmCitCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpCisjIHVuc2V0IGl0IGZvciBzYWZldHkuCitCVUlMRF9GSU5HRVJQUklOVCA6PQorCisjIEJVSUxEX1RIVU1CUFJJTlQgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgc3lzdGVtIGJ1aWxkOyB1c2VkIGJ5IHRoZQorIyBPVEEgc2VydmVyLiBUaGlzIHB1cnBvc2VmdWxseSBleGNsdWRlcyBhbnkgcHJvZHVjdC1zcGVjaWZpYyB2YXJpYWJsZXMuCitpZmVxICgsJChzdHJpcCAkKEJVSUxEX1RIVU1CUFJJTlQpKSkKKyAgQlVJTERfVEhVTUJQUklOVCA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLyQoQlVJTERfSUQpLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSk6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCitlbmRpZgorCitCVUlMRF9USFVNQlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfdGh1bWJwcmludC50eHQKK2lmZXEgKCQoc3RyaXAgJChIQVNfQlVJTERfTlVNQkVSKSksdHJ1ZSkKKyQoQlVJTERfVEhVTUJQUklOVF9GSUxFKTogJChCVUlMRF9OVU1CRVJfRklMRSkKK2VuZGlmCitpZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKKyAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCitlbmRpZgorIyB1bnNldCBpdCBmb3Igc2FmZXR5LgorQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9CitCVUlMRF9USFVNQlBSSU5UIDo9CmRpZmYgLS1naXQgYS9jb3JlL2RlZmluaXRpb25zLm1rIGIvY29yZS9kZWZpbml0aW9ucy5tawppbmRleCBiMzBiMTU5Li4xYWI2Mzg4IDEwMDY0NAotLS0gYS9jb3JlL2RlZmluaXRpb25zLm1rCisrKyBiL2NvcmUvZGVmaW5pdGlvbnMubWsKQEAgLTE1NTUsNyArMTU1NSw3IEBACiBkZWZpbmUgdHJhbnNmb3JtLWxvZ3RhZ3MtdG8tamF2YQogQG1rZGlyIC1wICQoZGlyICRAKQogQGVjaG8gImxvZ3RhZ3M6ICRAIDw9ICQ8IgotJChoaWRlKSAkKEpBVkFUQUdTKSAtbyAkQCAkPCAkKFBSSVZBVEVfTUVSR0VEX1RBRykKKyQoaGlkZSkgJChKQVZBVEFHUykgLW8gJEAgJDwKIGVuZGVmCiAKIApAQCAtMjYwNSw3ICsyNjA1LDg3IEBACiAgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA4NTAxLDEwOTAwMCwkKDEpKSwkKDIpKQogICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwOTAwMSwxMDk1MDAsJCgxKSksJCgyKSkKICAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDk1MDEsMTEwMDAwLCQoMSkpLCQoMikpCi0gICAgICAgIEAkKGlmICQod29yZGxpc3QgMTEwMDAxLDExMDAwMiwkKDEpKSwkKGVycm9yIGR1bXAtd29yZHMtdG8tZmlsZTogVG9vIG1hbnkgd29yZHMgKCQod29yZHMgJCgxKSkpKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTAwMDEsMTEwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEwNTAxLDExMTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMTAwMSwxMTE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTE1MDEsMTEyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEyMDAxLDExMjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMjUwMSwxMTMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTMwMDEsMTEzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEzNTAxLDExNDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNDAwMSwxMTQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTQ1MDEsMTE1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE1MDAxLDExNTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNTUwMSwxMTYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTYwMDEsMTE2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE2NTAxLDExNzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNzAwMSwxMTc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTc1MDEsMTE4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE4MDAxLDExODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExODUwMSwxMTkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTkwMDEsMTE5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE5NTAxLDEyMDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMDAwMSwxMjA1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjA1MDEsMTIxMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIxMDAxLDEyMTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMTUwMSwxMjIwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjIwMDEsMTIyNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIyNTAxLDEyMzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMzAwMSwxMjM1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjM1MDEsMTI0MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI0MDAxLDEyNDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNDUwMSwxMjUwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjUwMDEsMTI1NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI1NTAxLDEyNjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNjAwMSwxMjY1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjY1MDEsMTI3MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI3MDAxLDEyNzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNzUwMSwxMjgwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjgwMDEsMTI4NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI4NTAxLDEyOTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyOTAwMSwxMjk1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjk1MDEsMTMwMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMwMDAxLDEzMDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMDUwMSwxMzEwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzEwMDEsMTMxNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMxNTAxLDEzMjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMjAwMSwxMzI1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzI1MDEsMTMzMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMzMDAxLDEzMzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMzUwMSwxMzQwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzQwMDEsMTM0NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM0NTAxLDEzNTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNTAwMSwxMzU1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzU1MDEsMTM2MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM2MDAxLDEzNjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNjUwMSwxMzcwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzcwMDEsMTM3NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM3NTAxLDEzODAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzODAwMSwxMzg1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzg1MDEsMTM5MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM5MDAxLDEzOTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzOTUwMSwxNDAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDAwMDEsMTQwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQwNTAxLDE0MTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MTAwMSwxNDE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDE1MDEsMTQyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQyMDAxLDE0MjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MjUwMSwxNDMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDMwMDEsMTQzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQzNTAxLDE0NDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NDAwMSwxNDQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDQ1MDEsMTQ1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ1MDAxLDE0NTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NTUwMSwxNDYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDYwMDEsMTQ2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ2NTAxLDE0NzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NzAwMSwxNDc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDc1MDEsMTQ4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ4MDAxLDE0ODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0ODUwMSwxNDkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDkwMDEsMTQ5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ5NTAxLDE1MDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChpZiAkKHdvcmRsaXN0IDE1MDAwMSwxNTAwMDIsJCgxKSksJChlcnJvciBkdW1wLXdvcmRzLXRvLWZpbGU6IFRvbyBtYW55IHdvcmRzICgkKHdvcmRzICQoMSkpKSkpCiBlbmRlZgogIyBSZXR1cm4gamFyIGFyZ3VtZW50cyB0byBjb21wcmVzcyBmaWxlcyBpbiBhIGdpdmVuIGRpcmVjdG9yeQogIyAkKDEpOiBkaXJlY3RvcnkKQEAgLTM2MTIsNiArMzY5Miw3IEBACiAgICAgJCQoZm9yZWFjaCBmLCQkKG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpKSwkJChjYWxsIHdvcmQtY29sb24sMiwkJChmKSkpIFwKICAgICAkJChmb3JlYWNoIGYsJCQobXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpKSwkJChjYWxsIHdvcmQtY29sb24sMiwkJChmKSkpIFwKICAgICAkJChteV9jb21wYXRfZGlzdF90ZXN0X2RhdGFfJChzdWl0ZSkpKSBcCisgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkFSQ0hfRElSUy4kKG15X3JlZ2lzdGVyX25hbWUpIDo9ICQobXlfY29tcGF0X21vZHVsZV9hcmNoX2Rpcl8kKHN1aXRlKS4kKG15X3JlZ2lzdGVyX25hbWUpKSkgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUElfTUFQX0ZJTEVTICs9ICQkKG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpKSkgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TT09OR19JTlNUQUxMRURfQ09NUEFUSUJJTElUWV9TVVBQT1JUX0ZJTEVTICs9ICQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIFwKICAgJChldmFsIEFMTF9DT01QQVRJQklMSVRZX0RJU1RfRklMRVMgKz0gJCQobXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkpKSBcCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHQubWsgYi9jb3JlL2RleF9wcmVvcHQubWsKaW5kZXggMjZiOGIxNy4uODhlMGNjNyAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0Lm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdC5tawpAQCAtMTMsNDcgKzEzLDYgQEAKIGluc3RhbGwtb24tc3lzdGVtLW90aGVyID0gJChmaWx0ZXItb3V0ICQoUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUykgJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUyksJChiYXNlbmFtZSAkKG5vdGRpciAkKGZpbHRlciAkKGZvcmVhY2ggZiwkKFNZU1RFTV9PVEhFUl9PREVYX0ZJTFRFUiksJChUQVJHRVRfT1VUKS8kKGYpKSwkKDEpKSkpKQogZW5kaWYKIAotIyBXZSB3YW50IHRvIGluc3RhbGwgdGhlIHByb2ZpbGUgZXZlbiBpZiB3ZSBhcmUgbm90IHVzaW5nIHByZW9wdCBzaW5jZSBpdCBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZQotIyB0aGUgaW1hZ2Ugb24gdGhlIGRldmljZS4KLUFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChERVhQUkVPUFRfSU1BR0VfUFJPRklMRV9CVUlMVF9JTlNUQUxMRUQpLCQoUFJPRFVDVF9PVVQpKQotCi0jIEluc3RhbGwgYm9vdCBpbWFnZXMuIE5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUuCi1teV9ib290X2ltYWdlX2FyY2ggOj0gVEFSR0VUX0FSQ0gKLW15X2Jvb3RfaW1hZ2Vfb3V0IDo9ICQoUFJPRFVDVF9PVVQpCi1teV9ib290X2ltYWdlX3N5bXMgOj0gJChUQVJHRVRfT1VUX1VOU1RSSVBQRUQpCi1ERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSA6PSBcCi0gICQoZm9yZWFjaCBteV9ib290X2ltYWdlX25hbWUsJChERVhQUkVPUFRfSU1BR0VfTkFNRVMpLCQoc3RyaXAgXAotICAgICQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2xpYmFydC5taykgXAotICAgICQobXlfYm9vdF9pbWFnZV9tb2R1bGUpKSkKLWlmZGVmIFRBUkdFVF8yTkRfQVJDSAotICBteV9ib290X2ltYWdlX2FyY2ggOj0gVEFSR0VUXzJORF9BUkNICi0gIDJORF9ERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSA6PSBcCi0gICAgJChmb3JlYWNoIG15X2Jvb3RfaW1hZ2VfbmFtZSwkKERFWFBSRU9QVF9JTUFHRV9OQU1FUyksJChzdHJpcCBcCi0gICAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnQubWspIFwKLSAgICAgICQobXlfYm9vdF9pbWFnZV9tb2R1bGUpKSkKLWVuZGlmCi0jIEluc3RhbGwgYm9vdCBpbWFnZXMgZm9yIHRlc3Rpbmcgb24gaG9zdC4gV2UgZXhjbHVkZSBmcmFtZXdvcmsgaW1hZ2UgYXMgaXQgaXMgbm90IHBhcnQgb2YgYXJ0IG1hbmlmZXN0LgotbXlfYm9vdF9pbWFnZV9hcmNoIDo9IEhPU1RfQVJDSAotbXlfYm9vdF9pbWFnZV9vdXQgOj0gJChIT1NUX09VVCkKLW15X2Jvb3RfaW1hZ2Vfc3ltcyA6PSAkKEhPU1RfT1VUKS9zeW1ib2xzCi1IT1NUX0JPT1RfSU1BR0VfTU9EVUxFIDo9IFwKLSAgJChmb3JlYWNoIG15X2Jvb3RfaW1hZ2VfbmFtZSxhcnRfaG9zdCwkKHN0cmlwIFwKLSAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnQubWspIFwKLSAgICAkKG15X2Jvb3RfaW1hZ2VfbW9kdWxlKSkpCi1IT1NUX0JPT1RfSU1BR0UgOj0gJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChIT1NUX0JPT1RfSU1BR0VfTU9EVUxFKSkKLWlmZGVmIEhPU1RfMk5EX0FSQ0gKLSAgbXlfYm9vdF9pbWFnZV9hcmNoIDo9IEhPU1RfMk5EX0FSQ0gKLSAgMk5EX0hPU1RfQk9PVF9JTUFHRV9NT0RVTEUgOj0gXAotICAgICQoZm9yZWFjaCBteV9ib290X2ltYWdlX25hbWUsYXJ0X2hvc3QsJChzdHJpcCBcCi0gICAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnQubWspIFwKLSAgICAgICQobXlfYm9vdF9pbWFnZV9tb2R1bGUpKSkKLSAgMk5EX0hPU1RfQk9PVF9JTUFHRSA6PSAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKDJORF9IT1NUX0JPT1RfSU1BR0VfTU9EVUxFKSkKLWVuZGlmCi1teV9ib290X2ltYWdlX2FyY2ggOj0KLW15X2Jvb3RfaW1hZ2Vfb3V0IDo9Ci1teV9ib290X2ltYWdlX3N5bXMgOj0KLW15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9Ci0KICMgQnVpbGQgdGhlIGJvb3QuemlwIHdoaWNoIGNvbnRhaW5zIHRoZSBib290IGphcnMgYW5kIHRoZWlyIGNvbXBpbGF0aW9uIG91dHB1dAogIyBXZSBjYW4gZG8gdGhpcyBvbmx5IGlmIHByZW9wdCBpcyBlbmFibGVkIGFuZCBpZiB0aGUgcHJvZHVjdCB1c2VzIGxpYmFydCBjb25maWcgKHdoaWNoIHNldHMgdGhlCiAjIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgcHJlb3B0aW5nKS4KZGlmZiAtLWdpdCBhL2NvcmUvZGV4X3ByZW9wdF9jb25maWcubWsgYi9jb3JlL2RleF9wcmVvcHRfY29uZmlnLm1rCmluZGV4IGQ1MWRlMzMuLmYxZTlmYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdF9jb25maWcubWsKKysrIGIvY29yZS9kZXhfcHJlb3B0X2NvbmZpZy5tawpAQCAtMSw0ICsxLDQgQEAKLURFWF9QUkVPUFRfQ09ORklHIDo9ICQoU09PTkdfT1VUX0RJUikvZGV4cHJlb3B0LmNvbmZpZworREVYX1BSRU9QVF9DT05GSUcgOj0gJChTT09OR19PVVRfRElSKS9kZXhwcmVvcHQke0NPVkVSQUdFX1NVRkZJWH0uY29uZmlnCiAKIEVOQUJMRV9QUkVPUFQgOj0gdHJ1ZQogRU5BQkxFX1BSRU9QVF9CT09UX0lNQUdFUyA6PSB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rIGIvY29yZS9kZXhfcHJlb3B0X2xpYmFydC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjOTk0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBUlQgYm9vdCBpbWFnZSBpbnN0YWxsYXRpb24KLSMgSW5wdXQgdmFyaWFibGVzOgotIyAgIG15X2Jvb3RfaW1hZ2VfbmFtZTogdGhlIGJvb3QgaW1hZ2UgdG8gaW5zdGFsbAotIyAgIG15X2Jvb3RfaW1hZ2VfYXJjaDogdGhlIGFyY2hpdGVjdHVyZSB0byBpbnN0YWxsIChlLmcuIFRBUkdFVF9BUkNILCBub3QgZXhwYW5kZWQpCi0jICAgbXlfYm9vdF9pbWFnZV9vdXQ6ICB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgKGUuZy4gJChQUk9EVUNUX09VVCkpCi0jICAgbXlfYm9vdF9pbWFnZV9zeW1zOiB0aGUgc3ltYm9scyBkaXJlY3RvciAoZS5nLiAkKFRBUkdFVF9PVVRfVU5TVFJJUFBFRCkpCi0jCi0jIE91dHB1dCB2YXJpYWJsZXM6Ci0jICAgbXlfYm9vdF9pbWFnZV9tb2R1bGU6IHRoZSBjcmVhdGVkIG1vZHVsZSBuYW1lLiBFbXB0eSBpZiBubyBtb2R1bGUgaXMgY3JlYXRlZC4KLSMKLSMgSW5zdGFsbCB0aGUgYm9vdCBpbWFnZXMgY29tcGlsZWQgYnkgU29vbmcuCi0jIENyZWF0ZSBhIG1vZHVsZSBuYW1lZCBkZXhwcmVvcHRfYm9vdGphci4kKG15X2Jvb3RfaW1hZ2VfbmFtZSlfJCgkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpCi0jIHRoYXQgaW5zdGFsbHMgYWxsIG9mIGJvb3QgaW1hZ2UgZmlsZXMuCi0jIElmIHRoZXJlIGlzIG5vIGZpbGUgdG8gaW5zdGFsbCBmb3IgJChteV9ib290X2ltYWdlX25hbWUpLCBmb3IgZXhhbXBsZSB3aGVuCi0jIGJ1aWxkaW5nIGFuIHVuYnVuZGxlZCBidWlsZCwgdGhlbiBubyBtb2R1bGUgaXMgY3JlYXRlZC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCBhIHBhdGgKLSMgcHJlZml4ZWQgdG8gZWFjaCBkZXN0IHZhbHVlLgotIyAkKDEpOiBsaXN0IG9mIHNyYzpkZXN0IGluc3RhbGwgcGFpcnMKLSMgJCgyKTogcGF0aCB0byBwcmVmaXggdG8gZWFjaCBkZXN0IHZhbHVlCi1kZWZpbmUgcHJlZml4LWNvcHktbWFueS1maWxlcy1kZXN0Ci0kKGZvcmVhY2ggdiwkKDEpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJCh2KSk6JCgyKSQoY2FsbCB3b3JkLWNvbG9uLDIsJCh2KSkpCi1lbmRlZgotCi0jIENvbnZlcnRzIGFuIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyB2ZGV4IHBhdGggaW50byBhIGxvY2F0aW9uIHRoYXQgY2FuIGJlIHNoYXJlZAotIyBiZXR3ZWVuIGFyY2hpdGVjdHVyZXMuCi1kZWZpbmUgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoCi0kKGRpciAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJCgxKSkpKSQobm90ZGlyICQoMSkpCi1lbmRlZgotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIG9mIHZkZXggZmlsZXMgYW5kIHJldHVybnMgYSBuZXcgbGlzdAotIyB3aGVyZSBlYWNoIGRlc3QgaGFzIGJlZW4gcmV3cml0dGVuIHRvIHRoZSBzaGFyZWQgbG9jYXRpb24gZm9yIHZkZXggZmlsZXMuCi1kZWZpbmUgdmRleC1jb3B5LW1hbnktZmlsZXMtc2hhcmVkLWRlc3QKLSQoZm9yZWFjaCB2LCQoMSksJChjYWxsIHdvcmQtY29sb24sMSwkKHYpKTokKGNhbGwgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoLCQoY2FsbCB3b3JkLWNvbG9uLDIsJCh2KSkpKQotZW5kZWYKLQotIyBDcmVhdGVzIGEgcnVsZSB0byBzeW1saW5rIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB2ZGV4IGZpbGUgdG8gdGhlIHNoYXJlZAotIyBsb2NhdGlvbiBmb3IgdGhhdCB2ZGV4IGZpbGUuCi1kZWZpbmUgc3ltbGluay12ZGV4LWZpbGUKLSQoc3RyaXAgXAotICAkKGNhbGwgc3ltbGluay1maWxlLFwKLSAgICAkKGNhbGwgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoLCQoMSkpLFwKLSAgICAuLi8kKG5vdGRpciAkKDEpKSxcCi0gICAgJCgxKSlcCi0gICQoMSkpCi1lbmRlZgotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIG9mIHZkZXggZmlsZXMgYW5kIGNyZWF0ZXMgcnVsZXMgdG8KLSMgc3ltbGluayBlYWNoIGRlc3QgdG8gdGhlIHNoYXJlZCBsb2NhdGlvbiBmb3IgdGhhdCB2ZGV4IGZpbGUuCi1kZWZpbmUgc3ltbGluay12ZGV4LWZpbGVzCi0kKGZvcmVhY2ggdiwkKDEpLCQoY2FsbCBzeW1saW5rLXZkZXgtZmlsZSwkKGNhbGwgd29yZC1jb2xvbiwyLCQodikpKSkKLWVuZGVmCi0KLW15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9Ci0KLW15X3N1ZmZpeCA6PSAkKG15X2Jvb3RfaW1hZ2VfbmFtZSlfJCgkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpCi1teV9jb3B5X3BhaXJzIDo9ICQoY2FsbCBwcmVmaXgtY29weS1tYW55LWZpbGVzLWRlc3QsJChERVhQUkVPUFRfSU1BR0VfQlVJTFRfSU5TVEFMTEVEXyQobXlfc3VmZml4KSksJChteV9ib290X2ltYWdlX291dCkpCi1teV92ZGV4X2NvcHlfcGFpcnMgOj0gJChjYWxsIHByZWZpeC1jb3B5LW1hbnktZmlsZXMtZGVzdCwkKERFWFBSRU9QVF9JTUFHRV9WREVYX0JVSUxUX0lOU1RBTExFRF8kKG15X3N1ZmZpeCkpLCQobXlfYm9vdF9pbWFnZV9vdXQpKQotbXlfdmRleF9jb3B5X3NoYXJlZF9wYWlycyA6PSAkKGNhbGwgdmRleC1jb3B5LW1hbnktZmlsZXMtc2hhcmVkLWRlc3QsJChteV92ZGV4X2NvcHlfcGFpcnMpKQotaWZlcSAoLCQoZmlsdGVyICVfMk5EX0FSQ0gsJChteV9ib290X2ltYWdlX2FyY2gpKSkKLSAgIyBPbmx5IGluc3RhbGwgdGhlIHZkZXggdG8gdGhlIHNoYXJlZCBsb2NhdGlvbiBmb3IgdGhlIHByaW1hcnkgYXJjaGl0ZWN0dXJlLgotICBteV9jb3B5X3BhaXJzICs9ICQobXlfdmRleF9jb3B5X3NoYXJlZF9wYWlycykKLWVuZGlmCi0KLW15X3Vuc3RyaXBwZWRfY29weV9wYWlycyA6PSAkKGNhbGwgcHJlZml4LWNvcHktbWFueS1maWxlcy1kZXN0LCQoREVYUFJFT1BUX0lNQUdFX1VOU1RSSVBQRURfQlVJTFRfSU5TVEFMTEVEXyQobXlfc3VmZml4KSksJChteV9ib290X2ltYWdlX3N5bXMpKQotCi0jIEdlbmVyYXRlIHRoZSBib290IGltYWdlIG1vZHVsZSBvbmx5IGlmIHRoZXJlIGlzIGFueSBmaWxlIHRvIGluc3RhbGwuCi1pZm5lcSAoLCQoc3RyaXAgJChteV9jb3B5X3BhaXJzKSkpCi0gIG15X2ZpcnN0X3BhaXIgOj0gJChmaXJzdHdvcmQgJChteV9jb3B5X3BhaXJzKSkKLSAgbXlfcmVzdF9wYWlycyA6PSAkKHdvcmRsaXN0IDIsJCh3b3JkcyAkKG15X2NvcHlfcGFpcnMpKSwkKG15X2NvcHlfcGFpcnMpKQotCi0gIG15X2ZpcnN0X3NyYyA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQobXlfZmlyc3RfcGFpcikpCi0gIG15X2ZpcnN0X2Rlc3QgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKG15X2ZpcnN0X3BhaXIpKQotCi0gIG15X2luc3RhbGxlZCA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfY29weV9wYWlycykpCi0gIG15X3Vuc3RyaXBwZWRfaW5zdGFsbGVkIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChteV91bnN0cmlwcGVkX2NvcHlfcGFpcnMpKQotCi0gIG15X3N5bWxpbmtzIDo9ICQoY2FsbCBzeW1saW5rLXZkZXgtZmlsZXMsJChteV92ZGV4X2NvcHlfcGFpcnMpKQotCi0gICMgV2UgZG9uJ3QgaGF2ZSBhIExPQ0FMX1BBVEggZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBtb2R1bGVzLCBzbyBsZXQgaXQgYmUgdGhlICQoQlVJTERfU1lTVEVNKS4KLSAgTE9DQUxfUEFUSCA6PSAkKEJVSUxEX1NZU1RFTSkKLSAgIyBIYWNrIHRvIGxldCB0aGVzZSBwc2V1ZG8tbW9kdWxlcyB3cmFwcGVkIGFyb3VuZCBTb29uZyBtb2R1bGVzIHVzZSBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFLgotICBMT0NBTF9NT0RVTEVfTUFLRUZJTEUgOj0gJChTT09OR19BTkRST0lEX01LKQotCi0gIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotICBMT0NBTF9NT0RVTEUgOj0gZGV4cHJlb3B0X2Jvb3RqYXIuJChteV9zdWZmaXgpCi0gIExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQobXlfZmlyc3Rfc3JjKQotICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKGRpciAkKG15X2ZpcnN0X2Rlc3QpKQotICBMT0NBTF9NT0RVTEVfU1RFTSA6PSAkKG5vdGRpciAkKG15X2ZpcnN0X2Rlc3QpKQotICBMT0NBTF9TT09OR19JTlNUQUxMX1BBSVJTIDo9ICQobXlfY29weV9wYWlycykKLSAgTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyA6PSAkKG15X3N5bWxpbmtzKQotICBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIDo9ICQobXlfZmlyc3RfZGVzdCkKLSAgTE9DQUxfU09PTkdfTElDRU5TRV9NRVRBREFUQSA6PSAkKERFWFBSRU9QVF9JTUFHRV9MSUNFTlNFX01FVEFEQVRBXyQobXlfc3VmZml4KSkKLSAgaWZuZXEgKCwkKHN0cmlwICQoZmlsdGVyIEhPU1RfJSwkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpKSkKLSAgICBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCi0gIGVuZGlmCi0gIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLSAgaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IHwgJChteV91bnN0cmlwcGVkX2luc3RhbGxlZCkKLSAgIyBJbnN0YWxsaW5nIGJvb3QuYXJ0IGNhdXNlcyBhbGwgYm9vdCBpbWFnZSBiaXRzIHRvIGJlIGluc3RhbGxlZC4KLSAgIyBLZWVwIHRoaXMgb2xkIGJlaGF2aW9yIGluIGNhc2UgYW55b25lIHN0aWxsIG5lZWRzIGl0LgotICAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKHdvcmRsaXN0IDIsJCh3b3JkcyAkKG15X2luc3RhbGxlZCkpLCQobXlfaW5zdGFsbGVkKSkgJChteV9zeW1saW5rcykKLSAgJChteV9hbGxfdGFyZ2V0cyk6ICQobXlfaW5zdGFsbGVkKSAkKG15X3N5bWxpbmtzKQotCi0gIG15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9ICQoTE9DQUxfTU9EVUxFKQotZW5kaWYgICMgbXlfY29weV9wYWlycyAhPSBlbXB0eQpkaWZmIC0tZ2l0IGEvY29yZS9kdW1wY29uZmlnLm1rIGIvY29yZS9kdW1wY29uZmlnLm1rCmluZGV4IDY0MGZlMTAuLmViNGM4MjIgMTAwNjQ0Ci0tLSBhL2NvcmUvZHVtcGNvbmZpZy5taworKysgYi9jb3JlL2R1bXBjb25maWcubWsKQEAgLTU2LDcgKzU2LDcgQEAKIAogIyBFc2NhcGUgcXVvdGF0aW9uIG1hcmtzIGZvciBDU1YsIGFuZCB3cmFwcyBpbiBxdW90YXRpb24gbWFya3MuCiBkZWZpbmUgZXNjYXBlLWZvci1jc3YKLSIkKHN1YnN0ICIsIiIsJDEpIgorIiQoc3Vic3QgIiwiIiwkKHN1YnN0ICQobmV3bGluZSksICwkMSkpIgogZW5kZWYKIAogIyBBcmdzOgpAQCAtNjgsNyArNjgsNyBAQAogIyBBcmdzOgogIyAgICQoMSk6IGluY2x1ZGUgc3RhY2sKIGRlZmluZSBkdW1wLWltcG9ydC1kb25lCi0kKGV2YWwgJChmaWxlID4+ICQoRFVNUENPTkZJR19GSUxFKSxpbXBvcnRlZCwkKHN0cmlwICQoMSkpKSkKKyQoZXZhbCAkKGZpbGUgPj4gJChEVU1QQ09ORklHX0ZJTEUpLGltcG9ydGVkLCQoc3RyaXAgJCgxKSksJChmaWx0ZXItb3V0ICQoMSksJChNQUtFRklMRV9MSVNUKSkpKQogZW5kZWYKIAogIyBBcmdzOgpkaWZmIC0tZ2l0IGEvY29yZS9lbnZzZXR1cC5tayBiL2NvcmUvZW52c2V0dXAubWsKaW5kZXggYzA2M2Y2MC4uZjgyZTg2MSAxMDA2NDQKLS0tIGEvY29yZS9lbnZzZXR1cC5taworKysgYi9jb3JlL2VudnNldHVwLm1rCkBAIC00MTcsNiArNDE3LDcgQEAKIEhPU1RfT1VUX05BVElWRV9URVNUUyA6PSAkKEhPU1RfT1VUKS9uYXRpdmV0ZXN0NjQKIEhPU1RfT1VUX0NPVkVSQUdFIDo9ICQoSE9TVF9PVVQpL2NvdmVyYWdlCiBIT1NUX09VVF9URVNUQ0FTRVMgOj0gJChIT1NUX09VVCkvdGVzdGNhc2VzCitIT1NUX09VVF9FVEMgOj0gJChIT1NUX09VVCkvZXRjCiAuS0FUSV9SRUFET05MWSA6PSBcCiAgIEhPU1RfT1VUX0VYRUNVVEFCTEVTIFwKICAgSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUyBcCkBAIC00MjUsNyArNDI2LDggQEAKICAgSE9TVF9PVVRfU0RLX0FERE9OIFwKICAgSE9TVF9PVVRfTkFUSVZFX1RFU1RTIFwKICAgSE9TVF9PVVRfQ09WRVJBR0UgXAotICBIT1NUX09VVF9URVNUQ0FTRVMKKyAgSE9TVF9PVVRfVEVTVENBU0VTIFwKKyAgSE9TVF9PVVRfRVRDCiAKIEhPU1RfQ1JPU1NfT1VUX0VYRUNVVEFCTEVTIDo9ICQoSE9TVF9DUk9TU19PVVQpL2JpbgogSE9TVF9DUk9TU19PVVRfU0hBUkVEX0xJQlJBUklFUyA6PSAkKEhPU1RfQ1JPU1NfT1VUKS9saWIKZGlmZiAtLWdpdCBhL2NvcmUvaW5zdGFsbF9qbmlfbGlic19pbnRlcm5hbC5tayBiL2NvcmUvaW5zdGFsbF9qbmlfbGlic19pbnRlcm5hbC5tawppbmRleCA1NDkxMjQ3Li40OTU5ZWRkIDEwMDY0NAotLS0gYS9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsKKysrIGIvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rCkBAIC0zOCw4ICszOCw5IEBACiAgICAgICAkKGVycm9yIExPQ0FMX1NES19WRVJTSU9OIG11c3QgYmUgZGVmaW5lZCB3aXRoIExPQ0FMX05ES19TVExfVkFSSUFOVCwgXAogICAgICAgICAgIExPQ0FMX1BBQ0tBR0VfTkFNRT0kKExPQ0FMX1BBQ0tBR0VfTkFNRSkpCiAgICAgZW5kaWYKKyAgICBteV9saWJjeHhfYXJjaCA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClQUkVCVUlMVF9MSUJDWFhfQVJDSF9ESVIpCiAgICAgbXlfam5pX3NoYXJlZF9saWJyYXJpZXMgKz0gXAotICAgICAgICAkKEhJU1RPUklDQUxfTkRLX1ZFUlNJT05TX1JPT1QpLyQoTE9DQUxfTkRLX1ZFUlNJT04pL3NvdXJjZXMvY3h4LXN0bC9sbHZtLWxpYmMrKy9saWJzLyQoVEFSR0VUXyQobXlfMm5kX2FyY2hfcHJlZml4KUNQVV9BQkkpL2xpYmMrK19zaGFyZWQuc28KKyAgICAgICAgJChMTFZNX1BSRUJVSUxUU19CQVNFKS8kKEJVSUxEX09TKS14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9hbmRyb2lkX2xpYmMrKy9uZGsvJChteV9saWJjeHhfYXJjaCkvbGliL2xpYmMrK19zaGFyZWQuc28KICAgZW5kaWYKIAogICAjIFNldCB0aGUgYWJpIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBsb2NhbCBKTkkgc2hhcmVkIGxpYnJhcmllcy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS5tayBiL2NvcmUvamF2YS5tawppbmRleCA1ZmJjOTE2Li40MWExYjFiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEubWsKKysrIGIvY29yZS9qYXZhLm1rCkBAIC0xNDAsOCArMTQwLDcgQEAKIGxvZ3RhZ3NfamF2YV9zb3VyY2VzIDo9ICQocGF0c3Vic3QgJS5sb2d0YWdzLCUuamF2YSwkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9sb2d0YWdzLywgJChsb2d0YWdzX3NvdXJjZXMpKSkKIGxvZ3RhZ3Nfc291cmNlcyA6PSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywgJChsb2d0YWdzX3NvdXJjZXMpKQogCi0kKGxvZ3RhZ3NfamF2YV9zb3VyY2VzKTogUFJJVkFURV9NRVJHRURfVEFHIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYWxsLWV2ZW50LWxvZy10YWdzLnR4dAotJChsb2d0YWdzX2phdmFfc291cmNlcyk6ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2xvZ3RhZ3MvJS5qYXZhOiAkKExPQ0FMX1BBVEgpLyUubG9ndGFncyAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FsbC1ldmVudC1sb2ctdGFncy50eHQgJChKQVZBVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQorJChsb2d0YWdzX2phdmFfc291cmNlcyk6ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2xvZ3RhZ3MvJS5qYXZhOiAkKExPQ0FMX1BBVEgpLyUubG9ndGFncyAkKEpBVkFUQUdTKQogCSQodHJhbnNmb3JtLWxvZ3RhZ3MtdG8tamF2YSkKIAogZWxzZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2NvbW1vbi5tayBiL2NvcmUvamF2YV9jb21tb24ubWsKaW5kZXggYTIxZjA2Mi4uZjU3NGI3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhX2NvbW1vbi5taworKysgYi9jb3JlL2phdmFfY29tbW9uLm1rCkBAIC0zMiw3ICszMiw3IEBACiAgICAgZWxzZSBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfVVNFX1BSRUJVSUxUX1NES1MpKQogICAgICAgIyBUT0RPKGNjcm9zcyk6IGFsbG93IDEuOSBmb3IgY3VycmVudCBhbmQgdW5idW5kbGVkIG9uY2Ugd2UgaGF2ZSBTREsgc3lzdGVtIG1vZHVsZXMKICAgICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxLjgKLSAgICBlbHNlIGlmZXEgKCQoRVhQRVJJTUVOVEFMX1RBUkdFVF9KQVZBX1ZFUlNJT05fMjEpLHRydWUpCisgICAgZWxzZSBpZmVxICgkKFJFTEVBU0VfVEFSR0VUX0pBVkFfMjEpLHRydWUpCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMjEKICAgICBlbHNlCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMTcKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCA0NjM5M2FjLi40YjZlZWE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmFfcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9qYXZhX3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC0xNzIsNiArMTcyLDEyIEBACiBlbmRpZgogZW5kaWYKIAorIyB0cmFuc2l0aXZlLXJlcy1wYWNrYWdlcyBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgU29vbmcgbW9kdWxlcyBmb3Igbm93LCBidXQgbmVlZHMKKyMgdG8gZXhpc3Qgc28gdGhhdCBvdGhlciBNYWtlIG1vZHVsZXMgY2FuIGRlcGVuZCBvbiBpdC4gIENyZWF0ZSBhbiBlbXB0eSBmaWxlLgorbXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvdHJhbnNpdGl2ZS1yZXMtcGFja2FnZXMKKyQobXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMpOgorCXRvdWNoICRACisKIG15X3Jlc19wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3BhY2thZ2UtcmVzLmFwawogCiAjIFdlIG5lZWRlZCBvbmx5IHZlcnkgZmV3IFBSSVZBVEUgdmFyaWFibGVzIGFuZCBhYXB0Mi5tayBpbnB1dCB2YXJpYWJsZXMuIFJlc2V0IHRoZSB1bm5lY2Vzc2FyeSBvbmVzLgpkaWZmIC0tZ2l0IGEvY29yZS9sYXlvdXRsaWJfZGF0YS5tayBiL2NvcmUvbGF5b3V0bGliX2RhdGEubWsKaW5kZXggZTQ1ZjdlZi4uZGFiY2ZiMiAxMDA2NDQKLS0tIGEvY29yZS9sYXlvdXRsaWJfZGF0YS5taworKysgYi9jb3JlL2xheW91dGxpYl9kYXRhLm1rCkBAIC0zMSw4ICszMSwxOCBAQAogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSBjcCAtdmYgJDwgJEAKIAotIyBMaXN0IG9mIGFsbCBkYXRhIGZpbGVzIC0gZm9udCBmaWxlcywgZm9udCBjb25maWd1cmF0aW9uIGZpbGVzLCBrZXkgY2hhcmFjdGVyIG1hcCBmaWxlcwotTEFZT1VUTElCX0ZJTEVTIDo9ICQoZm9udHNfZGV2aWNlKSAkKGZvbnRfY29uZmlnKSAkKGtleWJvYXJkcykKK0hZUEhFTl9URU1QIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGh5cGhlbixIT1NULENPTU1PTikKKworIyBUaGUgaHlwaGVuYXRpb24gcGF0dGVybiBmaWxlcyBuZWVkZWQgdG8gc3VwcG9ydCB0ZXh0IGh5cGhlbmF0aW9uCitoeXBoZW4gOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS91c3IvaHlwaGVuLWRhdGEvJS5oeWIsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQoraHlwaGVuIDo9ICQoYWRkcHJlZml4ICQoSFlQSEVOX1RFTVApLywgJChub3RkaXIgJChoeXBoZW4pKSkKKworJChoeXBoZW4pOiAkKEhZUEhFTl9URU1QKS8lOiAkKFRBUkdFVF9PVVQpL3Vzci9oeXBoZW4tZGF0YS8lCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIGNwIC12ZiAkPCAkQAorCisjIExpc3Qgb2YgYWxsIGRhdGEgZmlsZXMgLSBmb250IGZpbGVzLCBmb250IGNvbmZpZ3VyYXRpb24gZmlsZXMsIGtleSBjaGFyYWN0ZXIgbWFwIGZpbGVzLCBoeXBoZW5hdGlvbiBwYXR0ZXJuIGZpbGVzCitMQVlPVVRMSUJfRklMRVMgOj0gJChmb250c19kZXZpY2UpICQoZm9udF9jb25maWcpICQoa2V5Ym9hcmRzKSAkKGh5cGhlbikKIAogLlBIT05ZOiBsYXlvdXRsaWIgbGF5b3V0bGliLXRlc3RzCiBsYXlvdXRsaWIgbGF5b3V0bGliLXRlc3RzOiAkKExBWU9VVExJQl9GSUxFUykKQEAgLTQwLDYgKzUwLDcgQEAKICQoY2FsbCBkaXN0LWZvci1nb2FscywgbGF5b3V0bGliLCAkKGZvcmVhY2ggbSwkKGZvbnRzX2RldmljZSksICQobSk6bGF5b3V0bGliX25hdGl2ZS9mb250cy8kKG5vdGRpciAkKG0pKSkpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGxheW91dGxpYiwgJChmb3JlYWNoIG0sJChmb250X2NvbmZpZyksICQobSk6bGF5b3V0bGliX25hdGl2ZS9mb250cy8kKG5vdGRpciAkKG0pKSkpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGxheW91dGxpYiwgJChmb3JlYWNoIG0sJChrZXlib2FyZHMpLCAkKG0pOmxheW91dGxpYl9uYXRpdmUva2V5Ym9hcmRzLyQobm90ZGlyICQobSkpKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgbGF5b3V0bGliLCAkKGZvcmVhY2ggbSwkKGh5cGhlbiksICQobSk6bGF5b3V0bGliX25hdGl2ZS9oeXBoZW4tZGF0YS8kKG5vdGRpciAkKG0pKSkpCiAKIEZPTlRfVEVNUCA6PQogZm9udF9jb25maWcgOj0KQEAgLTY2LDExICs3NywxOSBAQAogIyBSZXNvdXJjZSBmaWxlcyBmcm9tIGZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMKIExBWU9VVExJQl9SRVMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsbGF5b3V0bGliLXJlcyxIT1NULENPTU1PTikKIExBWU9VVExJQl9SRVNfRklMRVMgOj0gJChzaGVsbCBmaW5kIGZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMgLXR5cGUgZiAtbm90IC1wYXRoICdmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy1tW25jXWMqJyB8IHNvcnQpCi0kKExBWU9VVExJQl9SRVMpL2xheW91dGxpYi1yZXMuemlwOiAkKFNPT05HX1pJUCkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWFwdDIgJChMQVlPVVRMSUJfUkVTX0ZJTEVTKQorRU1VTEFURURfT1ZFUkxBWVNfRklMRVMgOj0gJChzaGVsbCBmaW5kIGZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcy9vdmVybGF5cy8qL3Jlcy8gfCBzb3J0KQorREVWSUNFX09WRVJMQVlTX0ZJTEVTIDo9ICQoc2hlbGwgZmluZCBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9waG9uZS9vdmVybGF5L2ZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcy9vdmVybGF5cy8qL0FuZHJvaWRPdmVybGF5L3Jlcy8gfCBzb3J0KQorJChMQVlPVVRMSUJfUkVTKS9sYXlvdXRsaWItcmVzLnppcDogJChTT09OR19aSVApICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyICQoTEFZT1VUTElCX1JFU19GSUxFUykgJChFTVVMQVRFRF9PVkVSTEFZU19GSUxFUykgJChERVZJQ0VfT1ZFUkxBWVNfRklMRVMpCiAJcm0gLXJmICRACi0JZWNobyAkKExBWU9VVExJQl9SRVNfRklMRVMpID4gJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdC50eHQKLQkkKFNPT05HX1pJUCkgLUMgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzIC1sICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3QudHh0IC1vICQoTEFZT1VUTElCX1JFUykvdGVtcC56aXAKLQlybSAtcmYgJChMQVlPVVRMSUJfUkVTKS9kYXRhICYmIHVuemlwIC1xIC1kICQoTEFZT1VUTElCX1JFUykvZGF0YSAkKExBWU9VVExJQl9SRVMpL3RlbXAuemlwCisJZWNobyAkKExBWU9VVExJQl9SRVNfRklMRVMpID4gJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdF9yZXMudHh0CisJJChTT09OR19aSVApIC1DIGZyYW1ld29ya3MvYmFzZS9jb3JlL3JlcyAtbCAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0X3Jlcy50eHQgLW8gJChMQVlPVVRMSUJfUkVTKS90ZW1wX3Jlcy56aXAKKwllY2hvICQoRU1VTEFURURfT1ZFUkxBWVNfRklMRVMpID4gJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdF9lbXVsYXRlZF9vdmVybGF5cy50eHQKKwkkKFNPT05HX1pJUCkgLUMgZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzIC1sICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3RfZW11bGF0ZWRfb3ZlcmxheXMudHh0IC1vICQoTEFZT1VUTElCX1JFUykvdGVtcF9lbXVsYXRlZF9vdmVybGF5cy56aXAKKwllY2hvICQoREVWSUNFX09WRVJMQVlTX0ZJTEVTKSA+ICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3RfZGV2aWNlX292ZXJsYXlzLnR4dAorCSQoU09PTkdfWklQKSAtQyBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9waG9uZS9vdmVybGF5L2ZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcyAtbCAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0X2RldmljZV9vdmVybGF5cy50eHQgLW8gJChMQVlPVVRMSUJfUkVTKS90ZW1wX2RldmljZV9vdmVybGF5cy56aXAKKwlybSAtcmYgJChMQVlPVVRMSUJfUkVTKS9kYXRhICYmIHVuemlwIC1xIC1kICQoTEFZT1VUTElCX1JFUykvZGF0YSAkKExBWU9VVExJQl9SRVMpL3RlbXBfcmVzLnppcAorCXVuemlwIC1xIC1kICQoTEFZT1VUTElCX1JFUykvZGF0YSAkKExBWU9VVExJQl9SRVMpL3RlbXBfZW11bGF0ZWRfb3ZlcmxheXMuemlwCisJdW56aXAgLXEgLWQgJChMQVlPVVRMSUJfUkVTKS9kYXRhICQoTEFZT1VUTElCX1JFUykvdGVtcF9kZXZpY2Vfb3ZlcmxheXMuemlwCiAJcm0gLXJmICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQgJiYgbWtkaXIgJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZCAmJiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0MiBjb21waWxlICQoTEFZT1VUTElCX1JFUykvZGF0YS9yZXMvKiovKi45LnBuZyAtbyAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkCiAJcHJpbnRmICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PlxuPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmdvb2dsZS5hbmRyb2lkLmxheW91dGxpYiIgLz4nID4gJChMQVlPVVRMSUJfUkVTKS9BbmRyb2lkTWFuaWZlc3QueG1sCiAJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWFwdDIgbGluayAtUiAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkLyogLW8gJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZC5hcGsgLS1tYW5pZmVzdCAkKExBWU9VVExJQl9SRVMpL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTc4LDcgKzk3LDcgQEAKIAlmb3IgZiBpbiAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2Fway9yZXMvKjsgZG8gbXYgIiQkZiIgIiQke2YvLXY0L30iO2RvbmUKIAlmb3IgZiBpbiAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2Fway9yZXMvKiovKi45LnBuZzsgZG8gbXYgIiQkZiIgIiQke2YvLjkucG5nLy5jb21waWxlZC45LnBuZ30iO2RvbmUKIAljcCAtciAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2Fway9yZXMgJChMQVlPVVRMSUJfUkVTKS9kYXRhCi0JJChTT09OR19aSVApIC1DICQoTEFZT1VUTElCX1JFUykvZGF0YSAtRCAkKExBWU9VVExJQl9SRVMpL2RhdGEvcmVzIC1vICRACisJJChTT09OR19aSVApIC1DICQoTEFZT1VUTElCX1JFUykvZGF0YSAtRCAkKExBWU9VVExJQl9SRVMpL2RhdGEvIC1vICRACiAKICQoY2FsbCBkaXN0LWZvci1nb2FscyxsYXlvdXRsaWIsJChMQVlPVVRMSUJfUkVTKS9sYXlvdXRsaWItcmVzLnppcDpsYXlvdXRsaWJfbmF0aXZlL3Jlcy56aXApCiAKQEAgLTg3LDYgKzEwNiw3IEBACiBfbGF5b3V0bGliX2ZvbnRfY29uZmlnX2ZpbGVzIDo9ICQoc29ydCAkKHdpbGRjYXJkIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLyoueG1sKSkKIF9sYXlvdXRsaWJfZm9udHNfZmlsZXMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS9mb250cy8lLnR0ZiAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRjICQoVEFSR0VUX09VVCkvZm9udHMvJS5vdGYsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQogX2xheW91dGxpYl9rZXlib2FyZF9maWxlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9rZXlib2FyZHMvKi5rY20pKQorX2xheW91dGxpYl9oeXBoZW5fZmlsZXMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS91c3IvaHlwaGVuLWRhdGEvJS5oeWIsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQogCiAjIEZpbmQgb3V0IGZpbGVzIGRpc3RlZCB3aXRoIGxheW91dGxpYiBpbiBTb29uZy4KICMjIyBGaWx0ZXIgb3V0IHN0YXRpYyBsaWJyYXJpZXMgZm9yIFdpbmRvd3MgYW5kIGZpbGVzIGFscmVhZHkgaGFuZGxlZCBpbiBtYWtlLgpAQCAtMTE2LDYgKzEzNiwxMyBAQAogCSAgZWNobyBkYXRhL2tleWJvYXJkcy8kKG5vdGRpciAkZiksZnJhbWV3b3Jrcy9iYXNlL2RhdGEva2V5Ym9hcmRzLHByZWJ1aWx0X2V0YywsLCwsJGYsLCwgPj4gJEA7IFwKIAkpCiAKKwkkKGZvcmVhY2ggZiwkKF9sYXlvdXRsaWJfaHlwaGVuX2ZpbGVzKSwgXAorCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYpKSBcCisJICAkKGV2YWwgX21vZHVsZV9wYXRoIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlBBVEgpKSkpIFwKKwkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpKSkpIFwKKwkgIGVjaG8gZGF0YS9oeXBoZW4tZGF0YS8kKG5vdGRpciAkZiksJChfbW9kdWxlX3BhdGgpLCQoX3Nvb25nX21vZHVsZV90eXBlKSwsLCwsJGYsLCwgPj4gJEA7IFwKKwkpCisKIAkkKGZvcmVhY2ggZiwkKF9sYXlvdXRsaWJfZmlsZXNfZGlzdGVkX2J5X3Nvb25nKSwgXAogCSAgJChldmFsIF9wcmVidWlsdF9tb2R1bGVfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCRmKSkgXAogCSAgJChldmFsIF9kaXN0X2ZpbGUgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkZikpIFwKQEAgLTEzMiwxNiArMTU5LDI2IEBACiAJICBlY2hvICQoX3BhdGgpLCwsLCwsWSwkZiwsLCA+PiAkQDsgXAogCSkKIAorCSQoZm9yZWFjaCBmLCQoRU1VTEFURURfT1ZFUkxBWVNfRklMRVMpLCBcCisJICAkKGV2YWwgX3BhdGggOj0gJChzdWJzdCBmcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMsZGF0YSwkZikpIFwKKwkgIGVjaG8gJChfcGF0aCksLCwsLCxZLCRmLCwsID4+ICRAOyBcCisJKQorCisJJChmb3JlYWNoIGYsJChERVZJQ0VfT1ZFUkxBWVNfRklMRVMpLCBcCisJICAkKGV2YWwgX3BhdGggOj0gJChzdWJzdCBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9waG9uZS9vdmVybGF5L2ZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcyxkYXRhLCRmKSkgXAorCSAgZWNobyAkKF9wYXRoKSwsLCwsLFksJGYsLCwgPj4gJEA7IFwKKwkpCisKIC5QSE9OWTogbGF5b3V0bGliLXNib20KIGxheW91dGxpYi1zYm9tOiAkKExBWU9VVExJQl9TQk9NKS9sYXlvdXRsaWIuc3BkeC5qc29uCi0kKExBWU9VVExJQl9TQk9NKS9sYXlvdXRsaWIuc3BkeC5qc29uOiAkKFBST0RVQ1RfT1VUKS9hbHdheXNfZGlydHlfZmlsZS50eHQgJChHRU5fU0JPTSkgJChMQVlPVVRMSUJfU0JPTSkvc2JvbS1tZXRhZGF0YS5jc3YgJChfbGF5b3V0bGliX2ZvbnRfY29uZmlnX2ZpbGVzKSAkKF9sYXlvdXRsaWJfZm9udHNfZmlsZXMpICQoTEFZT1VUTElCX0JVSUxEX1BST1ApL2xheW91dGxpYi1idWlsZC5wcm9wICQoX2xheW91dGxpYl9rZXlib2FyZF9maWxlcykgJChMQVlPVVRMSUJfUkVTX0ZJTEVTKQorJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbjogJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0ICQoR0VOX1NCT00pICQoTEFZT1VUTElCX1NCT00pL3Nib20tbWV0YWRhdGEuY3N2ICQoX2xheW91dGxpYl9mb250X2NvbmZpZ19maWxlcykgJChfbGF5b3V0bGliX2ZvbnRzX2ZpbGVzKSAkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcCAkKF9sYXlvdXRsaWJfa2V5Ym9hcmRfZmlsZXMpICQoX2xheW91dGxpYl9oeXBoZW5fZmlsZXMpICQoTEFZT1VUTElCX1JFU19GSUxFUykgJChFTVVMQVRFRF9PVkVSTEFZU19GSUxFUykgJChERVZJQ0VfT1ZFUkxBWVNfRklMRVMpCiAJcm0gLXJmICRACiAJJChHRU5fU0JPTSkgLS1vdXRwdXRfZmlsZSAkQCAtLW1ldGFkYXRhICQoTEFZT1VUTElCX1NCT00pL3Nib20tbWV0YWRhdGEuY3N2IC0tYnVpbGRfdmVyc2lvbiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkgLS1wcm9kdWN0X21mciAiJChQUk9EVUNUX01BTlVGQUNUVVJFUikiIC0tbW9kdWxlX25hbWUgImxheW91dGxpYiIgLS1qc29uCiAKICQoY2FsbCBkaXN0LWZvci1nb2FscyxsYXlvdXRsaWIsJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbjpsYXlvdXRsaWJfbmF0aXZlL3Nib20vbGF5b3V0bGliLnNwZHguanNvbikKIAogIyBHZW5lcmF0ZSBTQk9NIG9mIGZyYW1ld29ya19yZXMuamFyIHRoYXQgaXMgY3JlYXRlZCBpbiByZWxlYXNlX2xheW91dGxpYi5zaC4KLSMgVGhlIGdlbmVyYXRlZCBTQk9NIGNvbnRhaW5zIHBsYWNlaG9sZGVycyBmb3IgcmVsZWFzZV9sYXlvdGxpYi5zaCB0byBzdWJzdGl0dXRlLCBhbmQgdGhlIHBsYWNlaG9sZGVycyBpbmNsdWRlOgorIyBUaGUgZ2VuZXJhdGVkIFNCT00gY29udGFpbnMgcGxhY2Vob2xkZXJzIGZvciByZWxlYXNlX2xheW91dGxpYi5zaCB0byBzdWJzdGl0dXRlLCBhbmQgdGhlIHBsYWNlaG9sZGVycyBpbmNsdWRlOgogIyBkb2N1bWVudCBuYW1lLCBkb2N1bWVudCBuYW1lc3BhY2UsIGRvY3VtZW50IGNyZWF0aW9uIGluZm8sIG9yZ2FuaXphdGlvbiBhbmQgU0hBMSB2YWx1ZSBvZiBmcmFtZXdvcmtfcmVzLmphci4KIEdFTl9TQk9NX0ZSQU1FV09SS19SRVMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzCiAuUEhPTlk6IGxheW91dGxpYi1mcmFtZXdvcmtfcmVzLXNib20KZGlmZiAtLWdpdCBhL2NvcmUvbWFpbi5tayBiL2NvcmUvbWFpbi5tawppbmRleCA4ZDczNzkzLi42MjRkZjQ5IDEwMDY0NAotLS0gYS9jb3JlL21haW4ubWsKKysrIGIvY29yZS9tYWluLm1rCkBAIC0zMSw4ICszMSw3IEBACiAuS0FUSV9SRUFET05MWSA6PSAkKGZvcmVhY2ggbiwkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSxTT09OR19DT05GSUdfJChuKSkKIC5LQVRJX1JFQURPTkxZIDo9ICQoZm9yZWFjaCBuLCQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpLCQoZm9yZWFjaCBrLCQoU09PTkdfQ09ORklHXyQobikpLFNPT05HX0NPTkZJR18kKG4pXyQoaykpKQogCi1pbmNsdWRlICQoU09PTkdfTUFLRVZBUlNfTUspCi0KK2luY2x1ZGUgJChTT09OR19PVVRfRElSKS9tYWtlX3ZhcnMtJChUQVJHRVRfUFJPRFVDVCkkKENPVkVSQUdFX1NVRkZJWCkubWsKIFlBQ0MgOj0kPSAkKEJJU09OKSAtZAogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jbGFuZy9jb25maWcubWsKQEAgLTg0LDYgKzgzLDggQEAKIC1pbmNsdWRlIHRlc3QvY3RzLXJvb3QvdG9vbHMvYnVpbGQvY29uZmlnLm1rCiAjIFdWVFMtc3BlY2lmaWMgY29uZmlnLgogLWluY2x1ZGUgdGVzdC93dnRzL3Rvb2xzL2J1aWxkL2NvbmZpZy5taworIyBEVFMtc3BlY2lmaWMgY29uZmlnLgorLWluY2x1ZGUgdGVzdC9kdHMvdG9vbHMvYnVpbGQvY29uZmlnLm1rCiAKIAogIyBDbGVhbiBydWxlcwpAQCAtMjc2LDE3ICsyNzcsMzYgQEAKICMgSW5jbHVkZSBhbGwgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc3lzdGVtCiAjCiAKLXN1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19PVVRfRElSKS9pbnN0YWxscy0kKFRBUkdFVF9QUk9EVUNUKS5tayAkKFNPT05HX0FORFJPSURfTUspCitzdWJkaXJfbWFrZWZpbGVzIDo9IFwKKyAgICAkKFNPT05HX09VVF9ESVIpL2luc3RhbGxzLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rIFwKKyAgICAkKFNPT05HX0FORFJPSURfTUspIFwKKyAgICBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9hbmRyb2lkLWluZm8ubWsKKwogIyBBbmRyb2lkLm1rIGZpbGVzIGFyZSBvbmx5IHVzZWQgb24gTGludXggYnVpbGRzLCBNYWMgb25seSBzdXBwb3J0cyBBbmRyb2lkLmJwCiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotICBzdWJkaXJfbWFrZWZpbGVzICs9ICQoZmlsZSA8JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL0FuZHJvaWQubWsubGlzdCkKKyAgaWZlcSAoJChQUk9EVUNUX0lHTk9SRV9BTExfQU5EUk9JRE1LKSx0cnVlKQorICAgIGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzIDo9CisgICAgaWZkZWYgUFJPRFVDVF9BTkRST0lETUtfQUxMT1dMSVNUX0ZJTEUKKyAgICAgIC1pbmNsdWRlICQoUFJPRFVDVF9BTkRST0lETUtfQUxMT1dMSVNUX0ZJTEUpCisgICAgZW5kaWYKKyAgICBhbGxvd2VkX2FuZHJvaWRta19maWxlcyArPSAkKFBST0RVQ1RfQUxMT1dFRF9BTkRST0lETUtfRklMRVMpCisgICAgc3ViZGlyX21ha2VmaWxlcyArPSAkKGZpbHRlciAkKGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzKSwkKGZpbGUgPCQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9BbmRyb2lkLm1rLmxpc3QpKQorICAgIGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzIDo9CisgIGVsc2UKKyAgICBzdWJkaXJfbWFrZWZpbGVzICs9ICQoZmlsZSA8JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL0FuZHJvaWQubWsubGlzdCkKKyAgZW5kaWYKIGVuZGlmCi1zdWJkaXJfbWFrZWZpbGVzICs9ICQoU09PTkdfT1VUX0RJUikvbGF0ZS0kKFRBUkdFVF9QUk9EVUNUKS5taworCitzdWJkaXJfbWFrZWZpbGVzICs9ICQoU09PTkdfT1VUX0RJUikvbGF0ZS0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS5taworCiBzdWJkaXJfbWFrZWZpbGVzX3RvdGFsIDo9ICQod29yZHMgaW50ICQoc3ViZGlyX21ha2VmaWxlcykgcG9zdCBmaW5pc2gpCiAuS0FUSV9SRUFET05MWSA6PSBzdWJkaXJfbWFrZWZpbGVzX3RvdGFsCiAKICQoZm9yZWFjaCBtaywkKHN1YmRpcl9tYWtlZmlsZXMpLCQoaW5mbyBbJChjYWxsIGluY19hbmRfcHJpbnQsc3ViZGlyX21ha2VmaWxlc19pbmMpLyQoc3ViZGlyX21ha2VmaWxlc190b3RhbCldIGluY2x1ZGluZyAkKG1rKSAuLi4pJChldmFsIGluY2x1ZGUgJChtaykpKQogCisjIEJ1aWxkIGJvb3Rsb2FkZXIuaW1nL3JhZGlvLmltZywgYW5kIHVucGFjayB0aGUgcGFydGl0aW9ucy4KKy1pbmNsdWRlIHZlbmRvci9nb29nbGUvYnVpbGQvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsKKwogIyBGb3IgYW4gdW5idW5kbGVkIGltYWdlLCB3ZSBjYW4gc2tpcCBibHVlcHJpbnRfdG9vbHMgYmVjYXVzZSB1bmJ1bmRsZWQgaW1hZ2UKICMgYWltcyB0byByZW1vdmUgYSBsYXJnZSBudW1iZXIgZnJhbWV3b3JrIHByb2plY3RzIGZyb20gdGhlIG1hbmlmZXN0LCB0aGUKICMgc291cmNlcyBvciBkZXBlbmRlbmNpZXMgZm9yIHRoZXNlIHRvb2xzIG1heSBiZSBtaXNzaW5nIGZyb20gdGhlIHRyZWUuCkBAIC0yOTUsNiArMzE1LDkgQEAKIGNoZWNrYnVpbGQ6IGJsdWVwcmludF90ZXN0cwogZW5kaWYKIAorIyBDcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBzeW1saW5rcyBpbiB0aGUgcm9vdCBmaWxlc3lzdGVtCitpbmNsdWRlIHN5c3RlbS9jb3JlL3Jvb3RkaXIvY3JlYXRlX3Jvb3Rfc3RydWN0dXJlLm1rCisKIGVuZGlmICMgZG9udF9ib3RoZXIKIAogaWZuZGVmIHN1YmRpcl9tYWtlZmlsZXNfdG90YWwKQEAgLTY3OSwxNyArNzAyLDIwIEBACiAjIFNjYW4gYWxsIG1vZHVsZXMgaW4gZ2VuZXJhbC10ZXN0cywgZGV2aWNlLXRlc3RzIGFuZCBvdGhlciBzZWxlY3RlZCBzdWl0ZXMgYW5kCiAjIGZsYXR0ZW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcy4KIGRlZmluZSB1cGRhdGUtaG9zdC1zaGFyZWQtbGlicy1kZXBzLWZvci1zdWl0ZXMKLSQoZm9yZWFjaCBzdWl0ZSxnZW5lcmFsLXRlc3RzIGRldmljZS10ZXN0cyB2dHMgdHZ0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMsXAorJChmb3JlYWNoIHN1aXRlLGdlbmVyYWwtdGVzdHMgZGV2aWNlLXRlc3RzIHZ0cyB0dnRzIGFydC1ob3N0LXRlc3RzIGhvc3QtdW5pdC10ZXN0cyBjYW1lcmEtaGFsLXRlc3RzLFwKICAgJChmb3JlYWNoIG0sJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLk1PRFVMRVMpLFwKICAgICAkKGV2YWwgbXlfZGVwcyA6PSAkKGNhbGwgZ2V0LWFsbC1zaGFyZWQtbGlicy1kZXBzLCQobSkpKVwKICAgICAkKGZvcmVhY2ggZGVwLCQobXlfZGVwcyksXAogICAgICAgJChmb3JlYWNoIGYsJChBTExfTU9EVUxFUy4kKGRlcCkuSE9TVF9TSEFSRURfTElCUkFSWV9GSUxFUyksXAotICAgICAgICAkKGlmICQoZmlsdGVyICQoc3VpdGUpLGRldmljZS10ZXN0cyBnZW5lcmFsLXRlc3RzIGFydC1ob3N0LXRlc3RzIGhvc3QtdW5pdC10ZXN0cyksXAorICAgICAgICAkKGlmICQoZmlsdGVyICQoc3VpdGUpLGRldmljZS10ZXN0cyBnZW5lcmFsLXRlc3RzIGFydC1ob3N0LXRlc3RzIGhvc3QtdW5pdC10ZXN0cyBjYW1lcmEtaGFsLXRlc3RzKSxcCiAgICAgICAgICAgJChldmFsIG15X3Rlc3RjYXNlcyA6PSAkKEhPU1RfT1VUX1RFU1RDQVNFUykpLFwKICAgICAgICAgICAkKGV2YWwgbXlfdGVzdGNhc2VzIDo9ICQkKENPTVBBVElCSUxJVFlfVEVTVENBU0VTX09VVF8kKHN1aXRlKSkpKVwKICAgICAgICAgJChldmFsIHRhcmdldCA6PSAkKG15X3Rlc3RjYXNlcykvJChsYXN0d29yZCAkKHN1YnN0IC8sICwkKGRpciAkKGYpKSkpLyQobm90ZGlyICQoZikpKVwKLSAgICAgICAgJChldmFsIGxpbmtfdGFyZ2V0IDo9IC4uLy4uLy4uLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCi0gICAgICAgICQoZXZhbCBzeW1saW5rIDo9ICQobXlfdGVzdGNhc2VzKS8kKG0pL3NoYXJlZF9saWJzLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBwcmVmaXggOj0gLi4vLi4vLi4pCisgICAgICAgICQoaWYgJChzdHJpcCAkKHBhdHN1YnN0ICV4ODYsLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkpKSwgXAorICAgICAgICAgICQoaWYgJChzdHJpcCAkKHBhdHN1YnN0ICV4ODZfNjQsLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkpKSwkKGV2YWwgcHJlZml4IDo9IC4uLy4uKSwpLCkgXAorICAgICAgICAkKGV2YWwgbGlua190YXJnZXQgOj0gJChwcmVmaXgpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBzeW1saW5rIDo9ICQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkvc2hhcmVkX2xpYnMvJChub3RkaXIgJChmKSkpXAogICAgICAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUyA6PSBcCiAgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUykgJChmKTokKGxpbmtfdGFyZ2V0KTokKHN5bWxpbmspKVwKICAgICAgICAgJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDKSksLCQoY2FsbCBkZWNsYXJlLWNvcHktdGFyZ2V0LWxpY2Vuc2UtbWV0YWRhdGEsJCh0YXJnZXQpLCQoZikpKVwKQEAgLTk3MCw4ICs5OTYsOCBAQAogIyBSZXR1cm5zIG1vZHVsZXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSBhcyBhIHJlc3VsdCBvZiBjZXJ0YWluIEJvYXJkQ29uZmlnCiAjIHZhcmlhYmxlcyBiZWluZyBzZXQuCiBkZWZpbmUgYXV0by1pbmNsdWRlZC1tb2R1bGVzCi0gIGxsbmRrX2luX3N5c3RlbSBcCi0gICQoaWYgJChERVZJQ0VfTUFOSUZFU1RfRklMRSksdmVuZG9yX21hbmlmZXN0LnhtbCkgXAorICAkKGZvcmVhY2ggdm5ka192ZXIsJChQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMpLGNvbS5hbmRyb2lkLnZuZGsudiQodm5ka192ZXIpKSBcCisgIGxsbmRrLmxpYnJhcmllcy50eHQgXAogICAkKGlmICQoREVWSUNFX01BTklGRVNUX1NLVVMpLCQoZm9yZWFjaCBza3UsICQoREVWSUNFX01BTklGRVNUX1NLVVMpLHZlbmRvcl9tYW5pZmVzdF8kKHNrdSkueG1sKSkgXAogICAkKGlmICQoT0RNX01BTklGRVNUX0ZJTEVTKSxvZG1fbWFuaWZlc3QueG1sKSBcCiAgICQoaWYgJChPRE1fTUFOSUZFU1RfU0tVUyksJChmb3JlYWNoIHNrdSwgJChPRE1fTUFOSUZFU1RfU0tVUyksb2RtX21hbmlmZXN0XyQoc2t1KS54bWwpKSBcCkBAIC0xMzczLDYgKzEzOTksNyBAQAogICAgICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX0lOSVRfQk9PVF9JTUFHRV9UQVJHRVQpIFwKKyAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfUkFESU9JTUFHRV9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9ERUJVR19SQU1ESVNLX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX0RFQlVHX0JPT1RJTUFHRV9UQVJHRVQpIFwKQEAgLTE4NTUsODAgKzE4ODIsMTggQEAKIGZpbHRlcl9vdXRfZmlsZXMgKz0gJChQUk9EVUNUX09VVCkvcmVjb3ZlcnkvJQogZW5kaWYKIAorIyB1c2VyZGF0YS5pbWcKK2lmbmRlZiBCVUlMRElOR19VU0VSREFUQV9JTUFHRQorZmlsdGVyX291dF9maWxlcyArPSAkKFBST0RVQ1RfT1VUKS9kYXRhLyUKK2VuZGlmCisKIGluc3RhbGxlZF9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXItb3V0ICQoZmlsdGVyX291dF9maWxlcyksJChmaWx0ZXIgJChQUk9EVUNUX09VVCkvJSwkKG1vZHVsZXNfdG9faW5zdGFsbCkpKSkKIGVsc2UKIGluc3RhbGxlZF9maWxlcyA6PSAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCiBlbmRpZiAgIyBUQVJHRVRfQlVJTERfQVBQUwogCi0jIHNib20tbWV0YWRhdGEuY3N2IGNvbnRhaW5zIGFsbCByYXcgZGF0YSBjb2xsZWN0ZWQgaW4gTWFrZSBmb3IgZ2VuZXJhdGluZyBTQk9NIGluIGdlbmVyYXRlLXNib20ucHkuCi0jIFRoZXJlIGFyZSBtdWx0aXBsZSBjb2x1bW5zIGFuZCBlYWNoIGlkZW50aWZpZXMgdGhlIHNvdXJjZSBvZiBhbiBpbnN0YWxsZWQgZmlsZSBmb3IgYSBzcGVjaWZpYyBjYXNlLgotIyBUaGUgY29sdW1ucyBhbmQgdGhlaXIgdXNlcyBhcmUgZGVzY3JpYmVkIGFzIGJlbG93OgotIyAgIGluc3RhbGxlZF9maWxlOiB0aGUgZmlsZSBwYXRoIG9uIGRldmljZSwgZS5nLiAvcHJvZHVjdC9hcHAvQnJvd3NlcjIvQnJvd3NlcjIuYXBrCi0jICAgbW9kdWxlX3BhdGg6IHRoZSBwYXRoIG9mIHRoZSBtb2R1bGUgdGhhdCBnZW5lcmF0ZXMgdGhlIGluc3RhbGxlZCBmaWxlLCBlLmcuIHBhY2thZ2VzL2FwcHMvQnJvd3NlcjIKLSMgICBzb29uZ19tb2R1bGVfdHlwZTogU29vbmcgbW9kdWxlIHR5cGUsIGUuZy4gYW5kcm9pZF9hcHAsIGNjX2JpbmFyeQotIyAgIGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlOiBZLCBpZiB0aGUgaW5zdGFsbGVkIGZpbGUgaXMgZnJvbSBhIHByZWJ1aWx0IE1ha2UgbW9kdWxlLCBzZWUgcHJlYnVpbHRfaW50ZXJuYWwubWsKLSMgICBwcm9kdWN0X2NvcHlfZmlsZXM6IHRoZSBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIHZhcmlhYmxlIFBST0RVQ1RfQ09QWV9GSUxFUywgZS5nLiBkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gvc2hhcmVkL2NvbmZpZy9pbml0LnByb2R1Y3QucmM6cHJvZHVjdC9ldGMvaW5pdC9pbml0LnJjCi0jICAga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzOiB0aGUgaW5zdGFsbGVkIGZpbGUgaXMgZnJvbSB2YXJpYWJsZSBLRVJORUxfTU9EVUxFX0NPUFlfRklMRVMsIHNpbWlsYXIgdG8gcHJvZHVjdF9jb3B5X2ZpbGVzCi0jICAgaXNfcGxhdGZvcm1fZ2VuZXJhdGVkOiB0aGlzIGlzIGFuIGFnZ3JlZ2F0ZWQgdmFsdWUgaW5jbHVkaW5nIHNvbWUgc21hbGwgY2FzZXMgaW5zdGVhZCBvZiBhZGRpbmcgbW9yZSBjb2x1bW5zLiBJdCBpcyBzZXQgdG8gWSBpZiBhbnkgY2FzZSBpcyBZCi0jICAgICAgIGlzX2J1aWxkX3Byb3A6IGJ1aWxkLnByb3AgaW4gZWFjaCBwYXJ0aXRpb24sIHNlZSBzeXNwcm9wLm1rLgotIyAgICAgICBpc19ub3RpY2VfZmlsZTogTk9USUNFLnhtbC5neiBpbiBlYWNoIHBhcnRpdGlvbiwgc2VlIE1ha2VmaWxlLgotIyAgICAgICBpc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZTogc2VlIHRoZSB1c2FnZSBvZiBERVhQUkVPUFRfSU1BR0VfUFJPRklMRV9CVUlMVF9JTlNUQUxMRUQgaW4gU29vbmcgYW5kIE1ha2UKLSMgICAgICAgaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5OiBzZWUgSU5TVEFMTEVEX1BST0RVQ1RfU1lTVEVNX09USEVSX0FWQktFWV9UQVJHRVQKLSMgICAgICAgaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyOiBzZWUgSU5TVEFMTEVEX1NZU1RFTV9PVEhFUl9PREVYX01BUktFUgotIyAgICAgICBpc19ldmVudF9sb2dfdGFnc19maWxlOiBzZWUgdmFyaWFibGUgZXZlbnRfbG9nX3RhZ3NfZmlsZSBpbiBNYWtlZmlsZQotIyAgICAgICBpc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3Q6IG1vZHVsZXMuYmxvY2tsaXN0IGNyZWF0ZWQgZm9yIF9kbGttIHBhcnRpdGlvbnMsIHNlZSBtYWNybyBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcy1kaXIgaW4gTWFrZWZpbGUuCi0jICAgICAgIGlzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwazogQnVpbGRNYW5pZmVzdDxwYXJ0Pi5hcGsgZmlsZXMgZm9yIHN5c3RlbSBhbmQgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIHNlZSBBTExfRlNWRVJJVFlfQlVJTERfTUFOSUZFU1RfQVBLIGluIE1ha2VmaWxlLgotIyAgICAgICBpc19saW5rZXJfY29uZmlnOiBzZWUgU1lTVEVNX0xJTktFUl9DT05GSUcgYW5kIHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUgaW4gTWFrZWZpbGUuCi0jICAgYnVpbGRfb3V0cHV0X3BhdGg6IHRoZSBwYXRoIG9mIHRoZSBidWlsdCBmaWxlLCB1c2VkIHRvIGNhbGN1bGF0ZSBjaGVja3N1bQotIyAgIHN0YXRpY19saWJyYXJpZXMvd2hvbGVfc3RhdGljX2xpYnJhcmllczogbGlzdCBvZiBtb2R1bGUgbmFtZSBvZiB0aGUgc3RhdGljIGxpYnJhcmllcyB0aGUgZmlsZSBsaW5rcyBhZ2FpbnN0LCBlLmcuIGxpYmNsYW5nX3J0LmJ1aWx0aW5zIG9yIGxpYmNsYW5nX3J0LmJ1aWx0aW5zXzMyCi0jICAgICAgIEluZm8gb2YgYWxsIHN0YXRpYyBsaWJyYXJpZXMgb2YgYWxsIGluc3RhbGxlZCBmaWxlcyBhcmUgY29sbGVjdGVkIGluIHZhcmlhYmxlIF9hbGxfc3RhdGljX2xpYnMgdGhhdCBpcyB1c2VkIHRvIGxpc3QgYWxsIHRoZSBzdGF0aWMgbGlicmFyeSBmaWxlcyBpbiBzYm9tLW1ldGFkYXRhLmNzdi4KLSMgICAgICAgU2VlIHRoZSBzZWNvbmQgZm9yZWFjaCBsb29wIGluIHRoZSBydWxlIG9mIHNib20tbWV0YWRhdGEuY3N2IGZvciB0aGUgZGV0YWlsZWQgaW5mbyBvZiBzdGF0aWMgbGlicmFyaWVzIGNvbGxlY3RlZCBpbiBfYWxsX3N0YXRpY19saWJzLgotIyAgIGlzX3N0YXRpY19saWI6IHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBzdGF0aWMgbGlicmFyeQotCiBtZXRhZGF0YV9saXN0IDo9ICQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9NRVRBREFUQS5saXN0CiBtZXRhZGF0YV9maWxlcyA6PSAkKHN1YnN0ICQobmV3bGluZSksJChzcGFjZSksJChmaWxlIDwkKG1ldGFkYXRhX2xpc3QpKSkKLSQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2OgotCXJtIC1mICRACi0JZWNobyAnaW5zdGFsbGVkX2ZpbGUsbW9kdWxlX3BhdGgsc29vbmdfbW9kdWxlX3R5cGUsaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUscHJvZHVjdF9jb3B5X2ZpbGVzLGtlcm5lbF9tb2R1bGVfY29weV9maWxlcyxpc19wbGF0Zm9ybV9nZW5lcmF0ZWQsYnVpbGRfb3V0cHV0X3BhdGgsc3RhdGljX2xpYnJhcmllcyx3aG9sZV9zdGF0aWNfbGlicmFyaWVzLGlzX3N0YXRpY19saWInID4+ICRACi0JJChldmFsIF9hbGxfc3RhdGljX2xpYnMgOj0pCi0JJChmb3JlYWNoIGYsJChpbnN0YWxsZWRfZmlsZXMpLFwKLQkgICQoZXZhbCBfbW9kdWxlX25hbWUgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmKSkgXAotCSAgJChldmFsIF9wYXRoX29uX2RldmljZSA6PSAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkZikpIFwKLQkgICQoZXZhbCBfYnVpbGRfb3V0cHV0X3BhdGggOj0gJChQUk9EVUNUX09VVCkvJChfcGF0aF9vbl9kZXZpY2UpKSBcCi0JICAkKGV2YWwgX21vZHVsZV9wYXRoIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlBBVEgpKSkpIFwKLQkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpKSkpIFwKLQkgICQoZXZhbCBfaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUgOj0gJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuSVNfUFJFQlVJTFRfTUFLRV9NT0RVTEUpKSBcCi0JICAkKGV2YWwgX3Byb2R1Y3RfY29weV9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJTokKF9wYXRoX29uX2RldmljZSksJChwcm9kdWN0X2NvcHlfZmlsZXNfd2l0aG91dF9vd25lcikpKSkgXAotCSAgJChldmFsIF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgOj0gJChzb3J0ICQoZmlsdGVyICUkKF9wYXRoX29uX2RldmljZSksJChLRVJORUxfTU9EVUxFX0NPUFlfRklMRVMpKSkpIFwKLQkgICQoZXZhbCBfaXNfYnVpbGRfcHJvcCA6PSAkKGNhbGwgaXMtYnVpbGQtcHJvcCwkZikpIFwKLQkgICQoZXZhbCBfaXNfbm90aWNlX2ZpbGUgOj0gJChjYWxsIGlzLW5vdGljZS1maWxlLCRmKSkgXAotCSAgJChldmFsIF9pc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZSA6PSAkKGlmICQoZmlsdGVyICU6LyQoX3BhdGhfb25fZGV2aWNlKSwkKERFWFBSRU9QVF9JTUFHRV9QUk9GSUxFX0JVSUxUX0lOU1RBTExFRCkpLFkpKSBcCi0JICAkKGV2YWwgX2lzX3Byb2R1Y3Rfc3lzdGVtX290aGVyX2F2YmtleSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKElOU1RBTExFRF9QUk9EVUNUX1NZU1RFTV9PVEhFUl9BVkJLRVlfVEFSR0VUKSksWSkpIFwKLQkgICQoZXZhbCBfaXNfZXZlbnRfbG9nX3RhZ3NfZmlsZSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKGV2ZW50X2xvZ190YWdzX2ZpbGUpKSxZKSkgXAotCSAgJChldmFsIF9pc19zeXN0ZW1fb3RoZXJfb2RleF9tYXJrZXIgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChJTlNUQUxMRURfU1lTVEVNX09USEVSX09ERVhfTUFSS0VSKSksWSkpIFwKLQkgICQoZXZhbCBfaXNfa2VybmVsX21vZHVsZXNfYmxvY2tsaXN0IDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoQUxMX0tFUk5FTF9NT0RVTEVTX0JMT0NLTElTVCkpLFkpKSBcCi0JICAkKGV2YWwgX2lzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwayA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKEFMTF9GU1ZFUklUWV9CVUlMRF9NQU5JRkVTVF9BUEspKSxZKSkgXAotCSAgJChldmFsIF9pc19saW5rZXJfY29uZmlnIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoU1lTVEVNX0xJTktFUl9DT05GSUcpICQodmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSkpLFkpKSBcCi0JICAkKGV2YWwgX2lzX3BhcnRpdGlvbl9jb21wYXRfc3ltbGluayA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKFBBUlRJVElPTl9DT01QQVRfU1lNTElOS1MpKSxZKSkgXAotCSAgJChldmFsIF9pc19mbGFnc19maWxlIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCAkKEFMTF9GTEFHU19GSUxFUykpLFkpKSBcCi0JICAkKGV2YWwgX2lzX3Jvb3RkaXJfc3ltbGluayA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwgJChBTExfUk9PVERJUl9TWU1MSU5LUykpLFkpKSBcCi0JICAkKGV2YWwgX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCA6PSAkKF9pc19idWlsZF9wcm9wKSQoX2lzX25vdGljZV9maWxlKSQoX2lzX2RleHByZW9wdF9pbWFnZV9wcm9maWxlKSQoX2lzX3Byb2R1Y3Rfc3lzdGVtX290aGVyX2F2YmtleSkkKF9pc19ldmVudF9sb2dfdGFnc19maWxlKSQoX2lzX3N5c3RlbV9vdGhlcl9vZGV4X21hcmtlcikkKF9pc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3QpJChfaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrKSQoX2lzX2xpbmtlcl9jb25maWcpJChfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rKSQoX2lzX2ZsYWdzX2ZpbGUpJChfaXNfcm9vdGRpcl9zeW1saW5rKSkgXAotCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYuU1RBVElDX0xJQlJBUklFUykpIFwKLQkgICQoZXZhbCBfd2hvbGVfc3RhdGljX2xpYnMgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmLldIT0xFX1NUQVRJQ19MSUJSQVJJRVMpKSBcCi0JICAkKGZvcmVhY2ggbCwkKF9zdGF0aWNfbGlicyksJChldmFsIF9hbGxfc3RhdGljX2xpYnMgKz0gJGw6JChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kbC5QQVRIKSkpOiQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJGwuU09PTkdfTU9EVUxFX1RZUEUpKSk6JChBTExfU1RBVElDX0xJQlJBUklFUy4kbC5CVUlMVF9GSUxFKSkpIFwKLQkgICQoZm9yZWFjaCBsLCQoX3dob2xlX3N0YXRpY19saWJzKSwkKGV2YWwgX2FsbF9zdGF0aWNfbGlicyArPSAkbDokKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiRsLlBBVEgpKSk6JChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kbC5TT09OR19NT0RVTEVfVFlQRSkpKTokKEFMTF9TVEFUSUNfTElCUkFSSUVTLiRsLkJVSUxUX0ZJTEUpKSkgXAotCSAgZWNobyAnLyQoX3BhdGhfb25fZGV2aWNlKSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCQoX2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlKSwkKF9wcm9kdWN0X2NvcHlfZmlsZXMpLCQoX2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyksJChfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkKSwkKF9idWlsZF9vdXRwdXRfcGF0aCksJChfc3RhdGljX2xpYnMpLCQoX3dob2xlX3N0YXRpY19saWJzKSwnID4+ICRAOyBcCi0JKQotCSQoZm9yZWFjaCBsLCQoc29ydCAkKF9hbGxfc3RhdGljX2xpYnMpKSwgXAotCSAgJChldmFsIF9saWJfc3RlbSA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCRsKSkgXAotCSAgJChldmFsIF9tb2R1bGVfcGF0aCA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCRsKSkgXAotCSAgJChldmFsIF9zb29uZ19tb2R1bGVfdHlwZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwzLCRsKSkgXAotCSAgJChldmFsIF9idWlsdF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDQsJGwpKSBcCi0JICAkKGV2YWwgX3N0YXRpY19saWJzIDo9ICQoQUxMX1NUQVRJQ19MSUJSQVJJRVMuJGwuU1RBVElDX0xJQlJBUklFUykpIFwKLQkgICQoZXZhbCBfd2hvbGVfc3RhdGljX2xpYnMgOj0gJChBTExfU1RBVElDX0xJQlJBUklFUy4kbC5XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSkgXAotCSAgJChldmFsIF9pc19zdGF0aWNfbGliIDo9IFkpIFwKLQkgIGVjaG8gJyQoX2xpYl9zdGVtKS5hLCQoX21vZHVsZV9wYXRoKSwkKF9zb29uZ19tb2R1bGVfdHlwZSksLCwsLCQoX2J1aWx0X2ZpbGUpLCQoX3N0YXRpY19saWJzKSwkKF93aG9sZV9zdGF0aWNfbGlicyksJChfaXNfc3RhdGljX2xpYiknID4+ICRAOyBcCi0JKQogCiAjIENyZWF0ZSBtZXRhZGF0YSBmb3IgY29tcGxpYW5jZSBzdXBwb3J0IGluIFNvb25nCiAuUEhPTlk6IG1ha2UtY29tcGxpYW5jZS1tZXRhZGF0YQpAQCAtMTk1MCw3ICsxOTE1LDYgQEAKIAkgICQoZXZhbCBfa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAlJChfcGF0aF9vbl9kZXZpY2UpLCQoS0VSTkVMX01PRFVMRV9DT1BZX0ZJTEVTKSkpKSBcCiAJICAkKGV2YWwgX2lzX2J1aWxkX3Byb3AgOj0gJChjYWxsIGlzLWJ1aWxkLXByb3AsJGYpKSBcCiAJICAkKGV2YWwgX2lzX25vdGljZV9maWxlIDo9ICQoY2FsbCBpcy1ub3RpY2UtZmlsZSwkZikpIFwKLQkgICQoZXZhbCBfaXNfZGV4cHJlb3B0X2ltYWdlX3Byb2ZpbGUgOj0gJChpZiAkKGZpbHRlciAlOi8kKF9wYXRoX29uX2RldmljZSksJChERVhQUkVPUFRfSU1BR0VfUFJPRklMRV9CVUlMVF9JTlNUQUxMRUQpKSxZKSkgXAogCSAgJChldmFsIF9pc19wcm9kdWN0X3N5c3RlbV9vdGhlcl9hdmJrZXkgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChJTlNUQUxMRURfUFJPRFVDVF9TWVNURU1fT1RIRVJfQVZCS0VZX1RBUkdFVCkpLFkpKSBcCiAJICAkKGV2YWwgX2lzX2V2ZW50X2xvZ190YWdzX2ZpbGUgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChldmVudF9sb2dfdGFnc19maWxlKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoSU5TVEFMTEVEX1NZU1RFTV9PVEhFUl9PREVYX01BUktFUikpLFkpKSBcCkBAIC0xOTYwLDcgKzE5MjQsNyBAQAogCSAgJChldmFsIF9pc19wYXJ0aXRpb25fY29tcGF0X3N5bWxpbmsgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChQQVJUSVRJT05fQ09NUEFUX1NZTUxJTktTKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfZmxhZ3NfZmlsZSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwgJChBTExfRkxBR1NfRklMRVMpKSxZKSkgXAogCSAgJChldmFsIF9pc19yb290ZGlyX3N5bWxpbmsgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsICQoQUxMX1JPT1RESVJfU1lNTElOS1MpKSxZKSkgXAotCSAgJChldmFsIF9pc19wbGF0Zm9ybV9nZW5lcmF0ZWQgOj0gJChfaXNfYnVpbGRfcHJvcCkkKF9pc19ub3RpY2VfZmlsZSkkKF9pc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZSkkKF9pc19wcm9kdWN0X3N5c3RlbV9vdGhlcl9hdmJrZXkpJChfaXNfZXZlbnRfbG9nX3RhZ3NfZmlsZSkkKF9pc19zeXN0ZW1fb3RoZXJfb2RleF9tYXJrZXIpJChfaXNfa2VybmVsX21vZHVsZXNfYmxvY2tsaXN0KSQoX2lzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwaykkKF9pc19saW5rZXJfY29uZmlnKSQoX2lzX3BhcnRpdGlvbl9jb21wYXRfc3ltbGluaykkKF9pc19mbGFnc19maWxlKSQoX2lzX3Jvb3RkaXJfc3ltbGluaykpIFwKKwkgICQoZXZhbCBfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkIDo9ICQoX2lzX2J1aWxkX3Byb3ApJChfaXNfbm90aWNlX2ZpbGUpJChfaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5KSQoX2lzX2V2ZW50X2xvZ190YWdzX2ZpbGUpJChfaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyKSQoX2lzX2tlcm5lbF9tb2R1bGVzX2Jsb2NrbGlzdCkkKF9pc19mc3Zlcml0eV9idWlsZF9tYW5pZmVzdF9hcGspJChfaXNfbGlua2VyX2NvbmZpZykkKF9pc19wYXJ0aXRpb25fY29tcGF0X3N5bWxpbmspJChfaXNfZmxhZ3NfZmlsZSkkKF9pc19yb290ZGlyX3N5bWxpbmspKSBcCiAJICAkKGV2YWwgX3N0YXRpY19saWJzIDo9ICQoaWYgJChfaXNfc29vbmdfbW9kdWxlKSwsJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmLlNUQVRJQ19MSUJSQVJJRVMpKSkgXAogCSAgJChldmFsIF93aG9sZV9zdGF0aWNfbGlicyA6PSAkKGlmICQoX2lzX3Nvb25nX21vZHVsZSksLCQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSkpIFwKIAkgICQoZXZhbCBfbGljZW5zZV90ZXh0IDo9ICQoaWYgJChmaWx0ZXIgJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoQUxMX05PTl9NT0RVTEVTKSksJChBTExfTk9OX01PRFVMRVMuJChfYnVpbGRfb3V0cHV0X3BhdGgpLk5PVElDRVMpKSkgXApAQCAtMTk4OCwyMiArMTk1MiwxMyBAQAogJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL2luc3RhbGxlZF9maWxlcy5zdGFtcDogJChpbnN0YWxsZWRfZmlsZXMpCiAJdG91Y2ggJEAKIAotIyAoVE9ETzogYi8yNzIzNTg1ODMgZmluZCBhbm90aGVyIHdheSBvZiBhbHdheXMgcmVidWlsZGluZyBzYm9tLnNwZHgpCiAjIFJlbW92ZSB0aGUgYWx3YXlzX2RpcnR5X2ZpbGUudHh0IHdoZW5ldmVyIHRoZSBtYWtlZmlsZSBpcyBldmFsdWF0ZWQKICQoc2hlbGwgcm0gLWYgJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0KQogJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0OgogCXRvdWNoICRACiAKIC5QSE9OWTogc2JvbQotaWZlcSAoJChUQVJHRVRfQlVJTERfQVBQUyksKQotc2JvbTogJChQUk9EVUNUX09VVCkvc2JvbS5zcGR4Lmpzb24KLSQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeC5qc29uOiAkKFBST0RVQ1RfT1VUKS9zYm9tLnNwZHgKLSQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeDogJChQUk9EVUNUX09VVCkvc2JvbS1tZXRhZGF0YS5jc3YgJChHRU5fU0JPTSkgJChpbnN0YWxsZWRfZmlsZXMpICQobWV0YWRhdGFfbGlzdCkgJChtZXRhZGF0YV9maWxlcykgJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0Ci0Jcm0gLXJmICRACi0JJChHRU5fU0JPTSkgLS1vdXRwdXRfZmlsZSAkQCAtLW1ldGFkYXRhICQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2IC0tYnVpbGRfdmVyc2lvbiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkgLS1wcm9kdWN0X21mciAiJChQUk9EVUNUX01BTlVGQUNUVVJFUikiIC0tanNvbgotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWQsJChQUk9EVUNUX09VVCkvc2JvbS5zcGR4Lmpzb246c2JvbS9zYm9tLnNwZHguanNvbikKLWVsc2UKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9BUFBTKSwpCiAjIENyZWF0ZSBidWlsZCBydWxlcyBmb3IgZ2VuZXJhdGluZyBTQk9NcyBvZiB1bmJ1bmRsZWQgQVBLcyBhbmQgQVBFWHMKICMgJDE6IHNib20gZmlsZQogIyAkMjogc2JvbSBmcmFnbWVudCBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL29zX2xpY2Vuc2luZy5tayBiL2NvcmUvb3NfbGljZW5zaW5nLm1rCmluZGV4IDFlMWI3ZGYuLmQxNWEzZDAgMTAwNjQ0Ci0tLSBhL2NvcmUvb3NfbGljZW5zaW5nLm1rCisrKyBiL2NvcmUvb3NfbGljZW5zaW5nLm1rCkBAIC0xNywxMyArMTcsMTcgQEAKIAogJChldmFsICQoY2FsbCB0ZXh0LW5vdGljZS1ydWxlLCQodGFyZ2V0X25vdGljZV9maWxlX3R4dCksIlN5c3RlbSBpbWFnZSIsJChzeXN0ZW1fbm90aWNlX2ZpbGVfbWVzc2FnZSksJChTWVNURU1fTk9USUNFX0RFUFMpLCQoU1lTVEVNX05PVElDRV9ERVBTKSkpCiAKK2lmbmVxICgkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksdHJ1ZSkKICQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neik6ICQodGFyZ2V0X25vdGljZV9maWxlX3htbF9neikKIAkkKGNvcHktZmlsZS10by10YXJnZXQpCiBlbmRpZgorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGFyZ2V0X25vdGljZV9maWxlX3htbF9neikpCitpZm5lcSAoJChVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLHRydWUpCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChpbnN0YWxsZWRfbm90aWNlX2h0bWxfb3JfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IHZlbmRvcmxpY2Vuc2UKIHZlbmRvcmxpY2Vuc2U6ICQoY2FsbCBjb3JyZXNwb25kaW5nLWxpY2Vuc2UtbWV0YWRhdGEsICQoVkVORE9SX05PVElDRV9ERVBTKSkgcmVwb3J0bWlzc2luZ2xpY2Vuc2VzCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2luZy9mbGFncy5tayBiL2NvcmUvcGFja2FnaW5nL2ZsYWdzLm1rCmluZGV4IGE3Nzk1NmIuLmEzNzFhMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcGFja2FnaW5nL2ZsYWdzLm1rCisrKyBiL2NvcmUvcGFja2FnaW5nL2ZsYWdzLm1rCkBAIC0xOCwxMyArMTgsMTMgQEAKICMKIAogIyBUT0RPOiBTaG91bGQgd2UgZG8gYWxsIG9mIHRoZSBpbWFnZXMgaW4gJChJTUFHRVNfVE9fQlVJTEQpPwotX0ZMQUdfUEFSVElUSU9OUyA6PSBwcm9kdWN0IHN5c3RlbSBzeXN0ZW1fZXh0IHZlbmRvcgorX0ZMQUdfUEFSVElUSU9OUyA6PSBwcm9kdWN0IHN5c3RlbSB2ZW5kb3IKIAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEFjb25maWcgRmxhZ3MKIAotIyBDcmVhdGUgYSBzdW1tYXJ5IGZpbGUgb2YgYnVpbGQgZmxhZ3MgZm9yIGVhY2ggcGFydGl0aW9uCisjIENyZWF0ZSBhIHN1bW1hcnkgZmlsZSBvZiBidWlsZCBmbGFncyBmb3IgYSBzaW5nbGUgcGFydGl0aW9uCiAjICQoMSk6IGJ1aWx0IGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQogIyAkKDIpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBmaWxlIChvdXQpCiAjICQoMyk6IHRoZSBwYXJ0aXRpb24gKGluKQpAQCAtMzYsMTIgKzM2LDE1IEBACiAJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKIAkkJChpZiAkJChQUklWQVRFX0lOKSwgXAogCQkkJChBQ09ORklHKSBkdW1wIC0tZGVkdXAgLS1mb3JtYXQgcHJvdG9idWYgLS1vdXQgJCQoUFJJVkFURV9PVVQpIFwKLQkJCS0tZmlsdGVyIGNvbnRhaW5lcjokJChzdHJpcCAkKDMpKSAkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCisJCQktLWZpbHRlciBjb250YWluZXI6JChzdHJpcCAkKDMpKStzdGF0ZTpFTkFCTEVEIFwKKwkJCS0tZmlsdGVyIGNvbnRhaW5lcjokKHN0cmlwICQoMykpK3Blcm1pc3Npb246UkVBRF9XUklURSBcCisJCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCiAJCWVjaG8gLW4gPiAkJChQUklWQVRFX09VVCkgXAogCSkKICQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKDEpLCAkKDIpKQogZW5kZWYKIAorCiAjIENyZWF0ZSBhIHN1bW1hcnkgZmlsZSBvZiBidWlsZCBmbGFncyBmb3IgZWFjaCBwYXJ0aXRpb24KICMgJCgxKTogYnVpbHQgYWNvbmZpZyBmbGFncyBmaWxlIChvdXQpCiAjICQoMik6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIGZpbGUgKG91dCkKQEAgLTU5LDE2ICs2MiwyMiBAQAogJChjYWxsIGNvcHktb25lLWZpbGUsICQoMSksICQoMikpCiBlbmRlZgogCi0KICQoZm9yZWFjaCBwYXJ0aXRpb24sICQoX0ZMQUdfUEFSVElUSU9OUyksIFwKIAkkKGV2YWwgYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikgOj0gJChQUk9EVUNUX09VVCkvJChwYXJ0aXRpb24pL2V0Yy9hY29uZmlnX2ZsYWdzLnBiKSBcCiAJJChldmFsICQoY2FsbCBnZW5lcmF0ZS1wYXJ0aXRpb24tYWNvbmZpZy1mbGFnLWZpbGUsIFwKLQkJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9hY29uZmlnX2ZsYWdzLnBiLCBcCi0JCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSksIFwKLQkJCQkkKHBhcnRpdGlvbiksIFwKLQkJCQkkKHNvcnQgJChmb3JlYWNoIG0sJChjYWxsIHJlZ2lzdGVyLW5hbWVzLWZvci1wYXJ0aXRpb24sICQocGFydGl0aW9uKSksIFwKKwkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2Fjb25maWdfZmxhZ3MucGIsIFwKKwkJCSQoYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikpLCBcCisJCQkkKHBhcnRpdGlvbiksIFwKKwkJCSQoc29ydCBcCisJCQkJJChmb3JlYWNoIG0sICQoY2FsbCByZWdpc3Rlci1uYW1lcy1mb3ItcGFydGl0aW9uLCAkKHBhcnRpdGlvbikpLCBcCiAJCQkJCSQoQUxMX01PRFVMRVMuJChtKS5BQ09ORklHX0ZJTEVTKSBcCi0JCQkJKSksIFwKKwkJCQkpIFwKKwkJCQkkKGlmICQoZmlsdGVyIHN5c3RlbSwgJChwYXJ0aXRpb24pKSwgXAorCQkJCQkkKGZvcmVhY2ggbSwgJChjYWxsIHJlZ2lzdGVyLW5hbWVzLWZvci1wYXJ0aXRpb24sIHN5c3RlbV9leHQpLCBcCisJCQkJCQkkKEFMTF9NT0RVTEVTLiQobSkuQUNPTkZJR19GSUxFUykgXAorCQkJCQkpIFwKKwkJCQkpIFwKKwkJCSkgXAogCSkpIFwKICkKIApAQCAtOTAsNDIgKzk5LDYxIEBACiAjICQoMSk6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBwYWNrYWdlIG1hcCBmaWxlIChvdXQpCiAjICQoMik6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIG1hcCBmaWxlIChvdXQpCiAjICQoMyk6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIHZhbCBmaWxlIChvdXQpCi0jICQoNCk6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgcGFja2FnZSBtYXAgZmlsZSAob3V0KQotIyAkKDUpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIGZsYWcgbWFwIGZpbGUgKG91dCkKLSMgJCg2KTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIHZhbHVlIGZpbGUgKG91dCkKLSMgJCg3KTogaW5wdXQgYWNvbmZpZyBmaWxlcyBmb3IgdGhlIHBhcnRpdGlvbiAoaW4pCi0jICQoOCk6IHBhcnRpdGlvbiBuYW1lCisjICQoNCk6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIGluZm8gZmlsZSAob3V0KQorIyAkKDUpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIHBhY2thZ2UgbWFwIGZpbGUgKG91dCkKKyMgJCg2KTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIG1hcCBmaWxlIChvdXQpCisjICQoNyk6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyB2YWx1ZSBmaWxlIChvdXQpCisjICQoOCk6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyBpbmZvIGZpbGUgKG91dCkKKyMgJCg5KTogaW5wdXQgYWNvbmZpZyBmaWxlcyBmb3IgdGhlIHBhcnRpdGlvbiAoaW4pCisjICQoMTApOiBwYXJ0aXRpb24gbmFtZQogZGVmaW5lIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLXN0b3JhZ2UtZmlsZQogJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgxKSkpCi0kKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoNykpKQotJChzdHJpcCAkKDEpKTogJChBQ09ORklHKSAkKHN0cmlwICQoNykpCiskKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorCitpZm5lcSAoLCQoUkVMRUFTRV9GSU5HRVJQUklOVF9BQ09ORklHX1BBQ0tBR0VTKSkKK1NUT1JBR0VfRklMRV9WRVJTSU9OIDo9IDIKK2Vsc2UKK1NUT1JBR0VfRklMRV9WRVJTSU9OIDo9IDEKK2VuZGlmCisKKyQoc3RyaXAgJCgxKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDkpKQogCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCiAJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKLQkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCg4KSAtLWZpbGUgcGFja2FnZV9tYXAgLS1vdXQgJCQoUFJJVkFURV9PVVQpIFwKKwkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCgxMCkgLS1maWxlIHBhY2thZ2VfbWFwIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSAtLXZlcnNpb24gJCQoU1RPUkFHRV9GSUxFX1ZFUlNJT04pIFwKIAkJCSQkKGFkZHByZWZpeCAtLWNhY2hlICwkJChQUklWQVRFX0lOKSksIFwKIAkpCiAJdG91Y2ggJCQoUFJJVkFURV9PVVQpCiAkKGV2YWwgJChzdHJpcCAkKDIpKTogUFJJVkFURV9PVVQgOj0gJChzdHJpcCAkKDIpKSkKLSQoZXZhbCAkKHN0cmlwICQoMikpOiBQUklWQVRFX0lOIDo9ICQoc3RyaXAgJCg3KSkpCi0kKHN0cmlwICQoMikpOiAkKEFDT05GSUcpICQoc3RyaXAgJCg3KSkKKyQoZXZhbCAkKHN0cmlwICQoMikpOiBQUklWQVRFX0lOIDo9ICQoc3RyaXAgJCg5KSkpCiskKHN0cmlwICQoMikpOiAkKEFDT05GSUcpICQoc3RyaXAgJCg5KSkKIAlta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PVVQpKQogCSQkKGlmICQkKFBSSVZBVEVfSU4pLCBcCi0JCSQkKEFDT05GSUcpIGNyZWF0ZS1zdG9yYWdlIC0tY29udGFpbmVyICQoOCkgLS1maWxlIGZsYWdfbWFwIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCisJCSQkKEFDT05GSUcpIGNyZWF0ZS1zdG9yYWdlIC0tY29udGFpbmVyICQoMTApIC0tZmlsZSBmbGFnX21hcCAtLW91dCAkJChQUklWQVRFX09VVCkgLS12ZXJzaW9uICQkKFNUT1JBR0VfRklMRV9WRVJTSU9OKSBcCiAJCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCiAJKQogCXRvdWNoICQkKFBSSVZBVEVfT1VUKQogJChldmFsICQoc3RyaXAgJCgzKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgzKSkpCi0kKGV2YWwgJChzdHJpcCAkKDMpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoNykpKQotJChzdHJpcCAkKDMpKTogJChBQ09ORklHKSAkKHN0cmlwICQoNykpCiskKGV2YWwgJChzdHJpcCAkKDMpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorJChzdHJpcCAkKDMpKTogJChBQ09ORklHKSAkKHN0cmlwICQoOSkpCiAJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKIAkkJChpZiAkJChQUklWQVRFX0lOKSwgXAotCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDgpIC0tZmlsZSBmbGFnX3ZhbCAtLW91dCAkJChQUklWQVRFX09VVCkgXAorCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDEwKSAtLWZpbGUgZmxhZ192YWwgLS1vdXQgJCQoUFJJVkFURV9PVVQpIC0tdmVyc2lvbiAkJChTVE9SQUdFX0ZJTEVfVkVSU0lPTikgXAogCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCiAJKQogCXRvdWNoICQkKFBSSVZBVEVfT1VUKQotJChjYWxsIGNvcHktb25lLWZpbGUsICQoc3RyaXAgJCgxKSksICQoNCkpCi0kKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDIpKSwgJCg1KSkKLSQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoMykpLCAkKDYpKQorJChldmFsICQoc3RyaXAgJCg0KSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCg0KSkpCiskKGV2YWwgJChzdHJpcCAkKDQpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorJChzdHJpcCAkKDQpKTogJChBQ09ORklHKSAkKHN0cmlwICQoOSkpCisJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKKwkkJChpZiAkJChQUklWQVRFX0lOKSwgXAorCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDEwKSAtLWZpbGUgZmxhZ19pbmZvIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSAtLXZlcnNpb24gJCQoU1RPUkFHRV9GSUxFX1ZFUlNJT04pIFwKKwkJJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAorCSkKKwl0b3VjaCAkJChQUklWQVRFX09VVCkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoMSkpLCAkKDUpKQorJChjYWxsIGNvcHktb25lLWZpbGUsICQoc3RyaXAgJCgyKSksICQoNikpCiskKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDMpKSwgJCg3KSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoNCkpLCAkKDgpKQogZW5kZWYKIAogaWZlcSAoJChSRUxFQVNFX0NSRUFURV9BQ09ORklHX1NUT1JBR0VfRklMRSksdHJ1ZSkKQEAgLTEzMywxMyArMTYxLDE2IEBACiAJJChldmFsIGFjb25maWdfc3RvcmFnZV9wYWNrYWdlX21hcC4kKHBhcnRpdGlvbikgOj0gJChQUk9EVUNUX09VVCkvJChwYXJ0aXRpb24pL2V0Yy9hY29uZmlnL3BhY2thZ2UubWFwKSBcCiAJJChldmFsIGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbikgOj0gJChQUk9EVUNUX09VVCkvJChwYXJ0aXRpb24pL2V0Yy9hY29uZmlnL2ZsYWcubWFwKSBcCiAJJChldmFsIGFjb25maWdfc3RvcmFnZV9mbGFnX3ZhbC4kKHBhcnRpdGlvbikgOj0gJChQUk9EVUNUX09VVCkvJChwYXJ0aXRpb24pL2V0Yy9hY29uZmlnL2ZsYWcudmFsKSBcCisJJChldmFsIGFjb25maWdfc3RvcmFnZV9mbGFnX2luZm8uJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9mbGFnLmluZm8pIFwKIAkkKGV2YWwgJChjYWxsIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLXN0b3JhZ2UtZmlsZSwgXAogCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL3BhY2thZ2UubWFwLCBcCiAJCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvZmxhZy5tYXAsIFwKIAkJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9mbGFnLnZhbCwgXAorCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2ZsYWcuaW5mbywgXAogCQkJCSQoYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKSksIFwKIAkJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbikpLCBcCiAJCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pKSwgXAorCQkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfaW5mby4kKHBhcnRpdGlvbikpLCBcCiAJCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSksIFwKIAkJCQkkKHBhcnRpdGlvbiksIFwKIAkpKSBcCkBAIC0xNTUsNiArMTg2LDcgQEAKIAkJCSQoYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKSkgXAogCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ19tYXAuJChwYXJ0aXRpb24pKSBcCiAJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX3ZhbC4kKHBhcnRpdGlvbikpIFwKKwkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfaW5mby4kKHBhcnRpdGlvbikpIFwKIAkJKSkKIAogQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChyZXF1aXJlZF9mbGFnc19maWxlcykKQEAgLTE3NCw1ICsyMDYsNSBAQAogCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfcGFja2FnZV9tYXAuJChwYXJ0aXRpb24pOj0pIFwKIAkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfbWFwLiQocGFydGl0aW9uKTo9KSBcCiAJJChldmFsIGFjb25maWdfc3RvcmFnZV9mbGFnX3ZhbC4kKHBhcnRpdGlvbik6PSkgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ19pbmZvLiQocGFydGl0aW9uKTo9KSBcCiApCi0KZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdC5tayBiL2NvcmUvcHJvZHVjdC5tawppbmRleCA4MzJkMDk0Li4xYjMzNmIwIDEwMDY0NAotLS0gYS9jb3JlL3Byb2R1Y3QubWsKKysrIGIvY29yZS9wcm9kdWN0Lm1rCkBAIC0yNiw2ICsyNiw3IEBACiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX01PREVMCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX01PREVMX0ZPUl9BVFRFU1RBVElPTgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CQVNFX09TCiAKICMgRGVmaW5lcyB0aGUgRUxGIHNlZ21lbnQgYWxpZ25tZW50IGZvciBiaW5hcmllcyAoZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMpLgogIyBUaGUgRUxGIHNlZ21lbnQgYWxpZ25tZW50IGhhcyB0byBiZSBhIFBBR0VfU0laRSBtdWx0aXBsZS4gRm9yIGV4YW1wbGUsIGlmCkBAIC0yODMsNiArMjg0LDkgQEAKICMgV2hldGhlciBBUEVYIHNob3VsZCBiZSBjb21wcmVzc2VkIG9yIG5vdAogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9DT01QUkVTU0VEX0FQRVgKIAorIyBEZWZhdWx0IGZzIHR5cGUgZm9yIEFQRVggcGF5bG9hZCBpbWFnZSAoYXBleF9wYXlsb2FkLmltZykKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRQorCiAjIFZOREsgdmVyc2lvbiBvZiBwcm9kdWN0IHBhcnRpdGlvbi4gSXQgY2FuIGJlICdjdXJyZW50JyBpZiB0aGUgcHJvZHVjdAogIyBwYXJ0aXRpb25zIHVzZXMgUExBVEZPUk1fVk5ES19WRVJTSU9OLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTgpAQCAtMzY1LDYgKzM2OSw4IEBACiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX1ZCTUVUQV9JTUFHRQogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9TVVBFUl9FTVBUWV9JTUFHRQogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9QVk1GV19JTUFHRQorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9ERVNLVE9QX1JFQ09WRVJZX0lNQUdFCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX0RFU0tUT1BfVVBEQVRFX0lNQUdFCiAKICMgTGlzdCBvZiBib290IGphcnMgZGVsaXZlcmVkIHZpYSB1cGRhdGFibGUgQVBFWGVzLCBmb2xsb3dpbmcgdGhlIHNhbWUgZm9ybWF0IGFzCiAjIFBST0RVQ1RfQk9PVF9KQVJTLgpAQCAtMzg5LDIwICszOTUsNiBAQAogIyBJZiBzZXQsIEphdmEgbW9kdWxlIGluIHByb2R1Y3QgcGFydGl0aW9uIGNhbm5vdCB1c2UgaGlkZGVuIEFQSXMuCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFCiAKLSMgSWYgc2V0LCBvbmx5IGphdmFfc2RrX2xpYnJhcnkgY2FuIGJlIHVzZWQgYXQgaW50ZXItcGFydGl0aW9uIGRlcGVuZGVuY3kuCi0jIE5vdGU6IEJ1aWxkIGVycm9yIGlmIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBub3Qgc2V0IHdoaWxlCi0jICAgICAgIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBpcyB0cnVlLCBiZWNhdXNlCi0jICAgICAgIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBoYXMgbm8gbWVhbmluZyBpZgotIyAgICAgICBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgbm90IHNldC4KLSMgTm90ZTogV2hlbiBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFIGlzIG5vdCBzZXQsIHRoZXJlIGFyZQotIyAgICAgICBubyByZXN0cmljdGlvbnMgYXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHN5c3RlbSBhbmQgcHJvZHVjdCBwYXJ0aXRpb24uCi1fcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkKLQotIyBBbGxvd2xpc3QgZm9yIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBvcHRpb24uCi0jIExpc3RlZCBtb2R1bGVzIGFyZSBhbGxvd2VkIGF0IGludGVyLXBhcnRpdGlvbiBkZXBlbmRlbmN5IGV2ZW4gaWYgaXQgaXNuJ3QKLSMgYSBqYXZhX3Nka19saWJyYXJ5IG1vZHVsZS4KLV9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0lOVEVSX1BBUlRJVElPTl9KQVZBX0xJQlJBUllfQUxMT1dMSVNUCi0KICMgSW5zdGFsbCBhIGNvcHkgb2YgdGhlIGRlYnVnIHBvbGljeSB0byB0aGUgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIGFuZCBhbGxvdwogIyBpbml0LXNlY29uZC1zdGFnZSB0byBsb2FkIGRlYnVnIHBvbGljeSBmcm9tIHN5c3RlbV9leHQuCiAjIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbnQgdG8gYmUgc2V0IGJ5IGNvbXBsaWFuY2UgR1NJIHRhcmdldHMuCkBAIC00MzUsOCArNDI3LDkgQEAKICMgSWYgdHJ1ZSwgdGhlIGNncm91cCB2MiBoaWVyYXJjaHkgd2lsbCBiZSBzcGxpdCBpbnRvIGFwcHMvc3lzdGVtIHN1YnRyZWVzCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0NHUk9VUF9WMl9TWVNfQVBQX0lTT0xBVElPTl9FTkFCTEVECiAKLSMgTGlzdCBvZiAuanNvbiBmaWxlcyB0byBiZSBtZXJnZWQvY29tcGlsZWQgaW50byB2ZW5kb3IvZXRjL2xpbmtlci5jb25maWcucGIKKyMgTGlzdCBvZiAuanNvbiBmaWxlcyB0byBiZSBtZXJnZWQvY29tcGlsZWQgaW50byB2ZW5kb3IvZXRjL2xpbmtlci5jb25maWcucGIgYW5kIHByb2R1Y3QvZXRjL2xpbmtlci5jb25maWcucGIKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1ZFTkRPUl9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUworX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfUFJPRFVDVF9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUwogCiAjIFdoZXRoZXIgdG8gdXNlIHVzZXJmYXVsdGZkIEdDLgogIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOgpAQCAtNDk4LDYgKzQ5MSwxNyBAQAogIyBJZiBzZXQsIGJ1aWxkIHdvdWxkIGdlbmVyYXRlIHN5c3RlbSBpbWFnZSBmcm9tIFNvb25nLWRlZmluZWQgbW9kdWxlLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRQogCisjIExpc3Qgb2Ygc3R1YiBsaWJyYXJpZXMgc3BlY2lmaWMgdG8gdGhlIHByb2R1Y3QgdGhhdCBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzeXN0ZW0gaW1hZ2UgYW5kCisjIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc3lzdGVtX2xpbmtlcl9jb25maWcuCitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9FWFRSQV9TVFVCX0xJQlJBUklFUworCisjIElmIHNldCB0byB0cnVlLCBhbGwgQW5kcm9pZC5tayBmaWxlcyB3aWxsIGJlIGlnbm9yZWQuCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0lHTk9SRV9BTExfQU5EUk9JRE1LCisjIFdoZW4gUFJPRFVDVF9JR05PUkVfQUxMX0FORFJPSURNSyBpcyBzZXQgdG8gdHJ1ZSwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgdG8gYWxsb3cgc29tZSBBbmRyb2lkLm1rIGZpbGVzLgorX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfQUxMT1dFRF9BTkRST0lETUtfRklMRVMKKyMgV2hlbiBQUk9EVUNUX0lHTk9SRV9BTExfQU5EUk9JRE1LIGlzIHNldCB0byB0cnVlLCBwYXRoIG9mIGZpbGUgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYWxsb3dlZCBBbmRyb2lkLm1rIGZpbGVzCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0FORFJPSURNS19BTExPV0xJU1RfRklMRQorCiAuS0FUSV9SRUFET05MWSA6PSBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyBfcHJvZHVjdF9saXN0X3ZhcnMKIF9wcm9kdWN0X3Zhcl9saXN0IDo9JD0gJChfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycykgJChfcHJvZHVjdF9saXN0X3ZhcnMpCiAKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdF9jb25maWcubWsgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCmluZGV4IGNjMmZlYTkuLmY5M2I2M2MgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdF9jb25maWcubWsKKysrIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5tawpAQCAtMzExLDYgKzMxMSwxNCBAQAogCiBUQVJHRVRfREVWSUNFIDo9ICQoUFJPRFVDVF9ERVZJQ0UpCiAKKyMgQWxsb3cgb3ZlcnJpZGluZyBQTEFURk9STV9CQVNFX09TIHdoZW4gUFJPRFVDVF9CQVNFX09TIGlzIGRlZmluZWQKK2lmZGVmIFBST0RVQ1RfQkFTRV9PUworICBQTEFURk9STV9CQVNFX09TIDo9ICQoUFJPRFVDVF9CQVNFX09TKQorZWxzZQorICBQTEFURk9STV9CQVNFX09TIDo9ICQoUExBVEZPUk1fQkFTRV9PU19FTlZfSU5QVVQpCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fQkFTRV9PUworCiAjIFRPRE86IGFsc28ga2VlcCB0cmFjayBvZiB0aGluZ3MgbGlrZSAicG9ydCIsICJsYW5kIiBpbiBwcm9kdWN0IGZpbGVzLgogCiAjIEZpZ3VyZSBvdXQgd2hpY2ggcmVzb3VyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzCkBAIC00MTYsMTAgKzQyNCwxMiBAQAogICBlbmRpZgogZW5kaWYKIAotJChmb3JlYWNoIHBhaXIsJChQUk9EVUNUX0FQRVhfQk9PVF9KQVJTKSwgXAotICAkKGV2YWwgamFyIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpIFwKLSAgJChpZiAkKGZpbmRzdHJpbmcgJChqYXIpLCAkKFBST0RVQ1RfQk9PVF9KQVJTKSksIFwKLSAgICAkKGVycm9yIEEgamFyIGluIFBST0RVQ1RfQVBFWF9CT09UX0pBUlMgbXVzdCBub3QgYmUgaW4gUFJPRFVDVF9CT09UX0pBUlMsIGJ1dCAkKGphcikgaXMpKSkKKyQoZm9yZWFjaCBhcGV4cGFpciwkKFBST0RVQ1RfQVBFWF9CT09UX0pBUlMpLCBcCisgICQoZm9yZWFjaCBwbGF0Zm9ybXBhaXIsJChQUk9EVUNUX0JPT1RfSkFSUyksIFwKKyAgICAkKGV2YWwgYXBleGphciA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQoYXBleHBhaXIpKSkgXAorICAgICQoZXZhbCBwbGF0Zm9ybWphciA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQocGxhdGZvcm1wYWlyKSkpIFwKKyAgICAkKGlmICQoZmlsdGVyICQoYXBleGphciksICQocGxhdGZvcm1qYXIpKSwgXAorICAgICAgJChlcnJvciBBIGphciBpbiBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTIG11c3Qgbm90IGJlIGluIFBST0RVQ1RfQk9PVF9KQVJTLCBidXQgJChhcGV4amFyKSBpcykpKSkKIAogRU5GT1JDRV9TWVNURU1fQ0VSVElGSUNBVEUgOj0gJChQUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfU1lTVEVNX0NFUlRJRklDQVRFX1JFUVVJUkVNRU5UKQogRU5GT1JDRV9TWVNURU1fQ0VSVElGSUNBVEVfQUxMT1dfTElTVCA6PSAkKFBST0RVQ1RfQVJUSUZBQ1RfU1lTVEVNX0NFUlRJRklDQVRFX1JFUVVJUkVNRU5UX0FMTE9XX0xJU1QpCkBAIC00NTgsMTcgKzQ2OCwyNiBAQAogICAgICQoZXZhbCBTQU5JVElaRVIuJChUQVJHRVRfUFJPRFVDVCkuJChtKS5DT05GSUcgOj0gJChjZikpKSkKIF9wc21jX21vZHVsZXMgOj0KIAotIyBSZXNldCBBREIga2V5cyBmb3Igbm9uLWRlYnVnZ2FibGUgYnVpbGRzCi1pZmVxICgsJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisjIFJlc2V0IEFEQiBrZXlzLiBJZiBSRUxFQVNFX0JVSUxEX1VTRV9WQVJJQU5UX0ZMQUdTIGlzIHNldCBsb29rIGZvcgorIyB0aGUgdmFsdWUgb2YgYSBkZWRpY2F0ZWQgZmxhZy4gT3RoZXJ3aXNlIGNoZWNrIGlmIGJ1aWxkIHZhcmlhbnQgaXMKKyMgbm9uLWRlYnVnZ2FibGUuCitpZm5lcSAoLCQoUkVMRUFTRV9CVUlMRF9VU0VfVkFSSUFOVF9GTEFHUykpCitpZm5lcSAoLCQoUkVMRUFTRV9CVUlMRF9QVVJHRV9QUk9EVUNUX0FEQl9LRVlTKSkKICAgUFJPRFVDVF9BREJfS0VZUyA6PQogZW5kaWYKK2Vsc2UgaWZlcSAoLCQoZmlsdGVyIGVuZyB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorICBQUk9EVUNUX0FEQl9LRVlTIDo9CitlbmRpZgorCiBpZm5lcSAoJChmaWx0ZXItb3V0IDAgMSwkKHdvcmRzICQoUFJPRFVDVF9BREJfS0VZUykpKSwpCiAgICQoZXJyb3IgT25seSBvbmUgZmlsZSBtYXkgYmUgaW4gUFJPRFVDVF9BREJfS0VZUzogJChQUk9EVUNUX0FEQl9LRVlTKSkKIGVuZGlmCiAKICMgU2hvdyBhIHdhcm5pbmcgd2FsbCBvZiB0ZXh0IGlmIG5vbi1jb21wbGlhbmNlLUdTSSBwcm9kdWN0cyBzZXQgdGhpcyBvcHRpb24uCiBpZmRlZiBQUk9EVUNUX0lOU1RBTExfREVCVUdfUE9MSUNZX1RPX1NZU1RFTV9FWFQKLSAgaWZlcSAoLCQoZmlsdGVyIGdzaV9hcm0gZ3NpX2FybTY0IGdzaV94ODYgZ3NpX3g4Nl82NCBnc2lfY2FyX2FybTY0IGdzaV9jYXJfeDg2XzY0IGdzaV90dl9hcm0gZ3NpX3R2X2FybTY0LCQoUFJPRFVDVF9OQU1FKSkpCisgIGlmZXEgKCwkKGZpbHRlciBnc2lfYXJtIGdzaV9hcm02NCBnc2lfYXJtNjRfc29vbmdfc3lzdGVtIGdzaV94ODYgZ3NpX3g4Nl82NCBcCisgICAgICAgICAgICAgICAgICBnc2lfeDg2XzY0X3Nvb25nX3N5c3RlbSBnc2lfY2FyX2FybTY0IGdzaV9jYXJfeDg2XzY0IFwKKyAgICAgICAgICAgICAgICAgIGdzaV90dl9hcm0gZ3NpX3R2X2FybTY0LCQoUFJPRFVDVF9OQU1FKSkpCiAgICAgJCh3YXJuaW5nIFBST0RVQ1RfSU5TVEFMTF9ERUJVR19QT0xJQ1lfVE9fU1lTVEVNX0VYVCBpcyBzZXQgYnV0IFwKICAgICAgIFBST0RVQ1RfTkFNRSAoJChQUk9EVUNUX05BTUUpKSBkb2Vzbid0IGxvb2sgbGlrZSBhIEdTSSBmb3IgY29tcGxpYW5jZSBcCiAgICAgICB0ZXN0aW5nLiBUaGlzIGlzIGEgc3BlY2lhbCBjb25maWd1cmF0aW9uIGZvciBjb21wbGlhbmNlIEdTSSwgc28gZG8gbWFrZSBcCkBAIC01MjQsNiArNTQzLDE3IEBACiAgIFBST0RVQ1RfQ09NUFJFU1NFRF9BUEVYIDo9ICQoT1ZFUlJJREVfUFJPRFVDVF9DT01QUkVTU0VEX0FQRVgpCiBlbmRpZgogCitpZmRlZiBPVkVSUklERV9QUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUKKyAgUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFIDo9ICQoT1ZFUlJJREVfUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFKQorZWxzZSBpZmVxICgkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSksKQorICAjIFVzZSBleHQ0IGFzIGEgZGVmYXVsdCBwYXlsb2FkIGZzIHR5cGUKKyAgUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFIDo9IGV4dDQKK2VuZGlmCitpZmVxICgkKGZpbHRlciBleHQ0IGVyb2ZzLCQoUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFKSksKQorICAkKGVycm9yIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSBzaG91bGQgYmUgZWl0aGVyIGVyb2ZzIG9yIGV4dDQsXAorICAgIG5vdCAkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSkuKQorZW5kaWYKKwogJChLQVRJX29ic29sZXRlX3ZhciBPVkVSUklERV9QUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMgXAogICAgICxVc2UgUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TIGluc3RlYWQpCiAKQEAgLTU5NCw3ICs2MjQsMTIgQEAKICAgICAjIFZlbmRvcnMgd2l0aCBHUkYgbXVzdCBkZWZpbmUgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMIGZvciB0aGUgdmVuZG9yIEFQSSBsZXZlbC4KICAgICAjIEluIHRoaXMgY2FzZSwgdGhlIFZTUiBBUEkgbGV2ZWwgaXMgdGhlIG1pbmltdW0gb2YgdGhlIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCiAgICAgIyBhbmQgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwKLSAgICBWU1JfVkVORE9SX0FQSV9MRVZFTCA6PSAkKGNhbGwgbWF0aF9taW4sJChWU1JfVkVORE9SX0FQSV9MRVZFTCksJChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTCkpCisgICAgYm9hcmRfYXBpX2xldmVsIDo9ICQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCisgICAgaWZkZWYgQk9BUkRfQVBJX0xFVkVMX1BST1BfT1ZFUlJJREUKKyAgICAgIGJvYXJkX2FwaV9sZXZlbCA6PSAkKEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFKQorICAgIGVuZGlmCisgICAgVlNSX1ZFTkRPUl9BUElfTEVWRUwgOj0gJChjYWxsIG1hdGhfbWluLCQoVlNSX1ZFTkRPUl9BUElfTEVWRUwpLCQoYm9hcmRfYXBpX2xldmVsKSkKKyAgICBib2FyZF9hcGlfbGV2ZWwgOj0KICAgZW5kaWYKIGVuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBWU1JfVkVORE9SX0FQSV9MRVZFTApkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLnJiYwppbmRleCA1OWUyYzk1Li4yMDM0NGY0IDEwMDY0NAotLS0gYS9jb3JlL3Byb2R1Y3RfY29uZmlnLnJiYworKysgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLnJiYwpAQCAtMzgyLDYgKzM4MiwxMSBAQAogICAgIF9zb29uZ19jb25maWdfbmFtZXNwYWNlKGcsIG5zbmFtZSkKICAgICBnW19zb29uZ19jb25maWdfbmFtZXNwYWNlc19rZXldW25zbmFtZV1bdmFyXT1fbWtzdHJpcCh2YWx1ZSkKIAorZGVmIF9zb29uZ19jb25maWdfc2V0X2Jvb2woZywgbnNuYW1lLCB2YXIsIHZhbHVlKToKKyAgICAiIiJBc3NpZ25zIHRoZSB2YWx1ZSB0byB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZSwgYW5kIG1hcmtzIGl0IGFzIGEgYm9vbGVhbi4iIiIKKyAgICBfc29vbmdfY29uZmlnX3NldChnLCBuc25hbWUsIHZhciwgX2ZpbHRlcigidHJ1ZSIsIHZhbHVlKSkKKyAgICBnWyJTT09OR19DT05GSUdfVFlQRV8lc18lcyIgJSAobnNuYW1lLCB2YXIpXSA9ICJib29sIgorCiBkZWYgX3Nvb25nX2NvbmZpZ19hcHBlbmQoZywgbnNuYW1lLCB2YXIsIHZhbHVlKToKICAgICAiIiJBcHBlbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZS4iIiIKICAgICBfc29vbmdfY29uZmlnX25hbWVzcGFjZShnLCBuc25hbWUpCkBAIC04NjEsNiArODY2LDcgQEAKICAgICBzb29uZ19jb25maWdfbmFtZXNwYWNlID0gX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UsCiAgICAgc29vbmdfY29uZmlnX2FwcGVuZCA9IF9zb29uZ19jb25maWdfYXBwZW5kLAogICAgIHNvb25nX2NvbmZpZ19zZXQgPSBfc29vbmdfY29uZmlnX3NldCwKKyAgICBzb29uZ19jb25maWdfc2V0X2Jvb2wgPSBfc29vbmdfY29uZmlnX3NldF9ib29sLAogICAgIHNvb25nX2NvbmZpZ19nZXQgPSBfc29vbmdfY29uZmlnX2dldCwKICAgICBhYnNwYXRoID0gX2Fic3BhdGgsCiAgICAgYWRkX3Byb2R1Y3RfZGV4X3ByZW9wdF9tb2R1bGVfY29uZmlnID0gX2FkZF9wcm9kdWN0X2RleF9wcmVvcHRfbW9kdWxlX2NvbmZpZywKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZ3VhcmQuZmxhZ3MgYi9jb3JlL3Byb2d1YXJkLmZsYWdzCmluZGV4IGFhNDA2YjkuLjUxNDhlNTYgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZ3VhcmQuZmxhZ3MKKysrIGIvY29yZS9wcm9ndWFyZC5mbGFncwpAQCAtMzgsNiArMzgsMTcgQEAKICAgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLktlZXBGb3JXZWFrUmVmZXJlbmNlIDxmaWVsZHM+OwogfQogCisjIE5lZWRlZCB0byBlbnN1cmUgY2FsbGJhY2sgZmllbGQgcmVmZXJlbmNlcyBhcmUga2VwdCBpbiB0aGVpciByZXNwZWN0aXZlCisjIG93bmluZyBjbGFzc2VzIHdoZW4gdGhlIGRvd25zdHJlYW0gY2FsbGJhY2sgcmVnaXN0cmFycyBvbmx5IHN0b3JlIHdlYWsgcmVmcy4KKy1pZiBAY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuV2Vha2x5UmVmZXJlbmNlZENhbGxiYWNrIGNsYXNzICoKKy1rZWVwY2xhc3NtZW1iZXJzLGFsbG93YWNjZXNzbW9kaWZpY2F0aW9uIGNsYXNzICogeworICA8MT4gKjsKK30KKy1pZiBjbGFzcyAqIGV4dGVuZHMgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLldlYWtseVJlZmVyZW5jZWRDYWxsYmFjayAqKgorLWtlZXBjbGFzc21lbWJlcnMsYWxsb3dhY2Nlc3Ntb2RpZmljYXRpb24gY2xhc3MgKiB7CisgIDwxPiAqOworfQorCiAjIFVuZGVyc3RhbmQgdGhlIGNvbW1vbiBAS2VlcCBhbm5vdGF0aW9uIGZyb20gdmFyaW91cyBBbmRyb2lkIHBhY2thZ2VzOgogIyAgKiBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbgogIyAgKiBhbmRyb2lkeC5hbm5vdGF0aW9uCmRpZmYgLS1naXQgYS9jb3JlL3Byb2plY3RfZGVmaW5pdGlvbnMubWsgYi9jb3JlL3Byb2plY3RfZGVmaW5pdGlvbnMubWsKaW5kZXggNTcyOGI2Ny4uMTg0YjAzZSAxMDA2NDQKLS0tIGEvY29yZS9wcm9qZWN0X2RlZmluaXRpb25zLm1rCisrKyBiL2NvcmUvcHJvamVjdF9kZWZpbml0aW9ucy5tawpAQCAtMjIsMyArMjIsNiBAQAogIyBJbmNsdWRlIGRlZmluaXRpb25zIGZvciBwcmVidWlsdCBTREssIGlmIHByZXNlbnQuCiAjCiAtaW5jbHVkZSBwcmVidWlsdHMvc2RrL2N1cnJlbnQvZGVmaW5pdGlvbnMubWsKKworIyBTRFYtc3BlY2lmaWMgY29uZmlnLgorLWluY2x1ZGUgc3lzdGVtL3NvZnR3YXJlX2RlZmluZWRfdmVoaWNsZS9wbGF0Zm9ybS9jb25maWcubWsKZGlmZiAtLWdpdCBhL2NvcmUvcmF2ZW53b29kX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCBiL2NvcmUvcmF2ZW53b29kX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCAxNmEyMmMwLi45ZTlkZDc2IDEwMDY0NAotLS0gYS9jb3JlL3JhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCkBAIC0xOCwxMSArMTgsMTEgQEAKICAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0icmF2ZW53b29kIiAvPgogICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJyYXZlbndvb2QtdGVzdHMiIC8+CiAKLSAgICA8b3B0aW9uIG5hbWU9ImphdmEtZm9sZGVyIiB2YWx1ZT0icHJlYnVpbHRzL2pkay9qZGsxNy9saW51eC14ODYvIiAvPgorICAgIDxvcHRpb24gbmFtZT0iamF2YS1mb2xkZXIiIHZhbHVlPSJwcmVidWlsdHMvamRrL2pkazIxL2xpbnV4LXg4Ni8iIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJ1c2UtcmF2ZW53b29kLXJlc291cmNlcyIgdmFsdWU9InRydWUiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJleGNsdWRlLXBhdGhzIiB2YWx1ZT0iamF2YSIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InNvY2tldC10aW1lb3V0IiB2YWx1ZT0iMTAwMDAiIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJudWxsLWRldmljZSIgdmFsdWU9InRydWUiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJkby1ub3Qtc3dhbGxvdy1ydW5uZXItZXJyb3JzIiB2YWx1ZT0idHJ1ZSIgLz4KIAogICAgIHtFWFRSQV9DT05GSUdTfQogCmRpZmYgLS1naXQgYS9jb3JlL3JlbGVhc2VfY29uZmlnLm1rIGIvY29yZS9yZWxlYXNlX2NvbmZpZy5tawppbmRleCAyODk4ODY4Li42OGUxMTVmIDEwMDY0NAotLS0gYS9jb3JlL3JlbGVhc2VfY29uZmlnLm1rCisrKyBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKQEAgLTEzMSw2ICsxMzEsOSBAQAogICAgICAgICBfYXJncyArPSAtLWd1YXJkPWZhbHNlCiAgICAgZW5kaWYKICAgICBfYXJncyArPSAtLWFsbG93LW1pc3Npbmc9dHJ1ZQorICAgIGlmbmVxICgsJChUQVJHRVRfUFJPRFVDVCkpCisgICAgICAgIF9hcmdzICs9IC0tcHJvZHVjdCAkKFRBUkdFVF9QUk9EVUNUKQorICAgIGVuZGlmCiAgICAgX2ZsYWdzX2Rpcjo9JChPVVRfRElSKS9zb29uZy9yZWxlYXNlLWNvbmZpZwogICAgIF9mbGFnc19maWxlOj0kKF9mbGFnc19kaXIpL3JlbGVhc2VfY29uZmlnLSQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX1JFTEVBU0UpLnZhcnMKICAgICAjIHJlbGVhc2UtY29uZmlnIGdlbmVyYXRlcyAkKF9mbGFnc192YXJtaykKQEAgLTE0Myw2ICsxNDYsOSBAQAogICAgICAgICAjIFRoaXMgd2lsbCBhbHNvIHNldCBBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUIGFuZCBfdXNlZF9maWxlcyBmb3IgdXMuCiAgICAgICAgICQoZXZhbCBpbmNsdWRlICQoX2ZsYWdzX2ZpbGUpKQogICAgICAgICAkKEtBVElfZXh0cmFfZmlsZV9kZXBzICQoT1VUX0RJUikvcmVsZWFzZS1jb25maWcgJChwcm90b2J1Zl9tYXBfZmlsZXMpICQoX2ZsYWdzX2ZpbGUpKQorICAgICAgICBpZm5lcSAoLCQoX2Rpc2FsbG93X2x1bmNoX3VzZSkpCisgICAgICAgICAgICAkKGVycm9yIFJlbGVhc2UgY29uZmlnICR7VEFSR0VUX1JFTEVBU0V9IGlzIGRpc2FsbG93ZWQgZm9yIGJ1aWxkLiAgUGxlYXNlIHVzZSBvbmUgb2Y6ICQoQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCkpCisgICAgICAgIGVuZGlmCiAgICAgZWxzZQogICAgICAgICAjIFRoaXMgaXMgdGhlIGZpcnN0IHBhc3Mgb2YgcHJvZHVjdCBjb25maWcuCiAgICAgICAgICQoZXZhbCBpbmNsdWRlICQoX2ZsYWdzX3Zhcm1rKSkKZGlmZiAtLWdpdCBhL2NvcmUvcm9ib2xlY3RyaWNfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKaW5kZXggNTZkMjMxMi4uMTk1NmI2ZSAxMDA2NDQKLS0tIGEvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTE4LDEwICsxOCwxNyBAQAogICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJyb2JvbGVjdHJpYyIgLz4KICAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0icm9ib2xlY3RyaWMtdGVzdHMiIC8+CiAKLSAgICA8b3B0aW9uIG5hbWU9ImphdmEtZm9sZGVyIiB2YWx1ZT0icHJlYnVpbHRzL2pkay9qZGsxNy9saW51eC14ODYvIiAvPgorICAgIDxvcHRpb24gbmFtZT0iamF2YS1mb2xkZXIiIHZhbHVlPSJwcmVidWlsdHMvamRrL2pkazIxL2xpbnV4LXg4Ni8iIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJleGNsdWRlLXBhdGhzIiB2YWx1ZT0iamF2YSIgLz4KICAgICA8b3B0aW9uIG5hbWU9InVzZS1yb2JvbGVjdHJpYy1yZXNvdXJjZXMiIHZhbHVlPSJ0cnVlIiAvPgogCisgICAgPCEtLSBhdHRlbXB0IHRvIGFsd2F5cyBzaG93IFRyYWRlZmVkIGVycm9ycyAtLT4KKyAgICA8b3B0aW9uIG5hbWU9ImRvLW5vdC1zd2FsbG93LXJ1bm5lci1lcnJvcnMiIHZhbHVlPSJ0cnVlIiAvPgorCisgICAgPCEtLSBwcmV2ZW50IFRyYWRlZmVkIGZyb20gaGFuZ2luZyBpbmRlZmluaXRlbHkgaW4gQ0kgLS0+CisgICAgPG9wdGlvbiBuYW1lPSJzb2NrZXQtdGltZW91dCIgdmFsdWU9IjYwMDAwMCIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3QtY2FzZS10aW1lb3V0IiB2YWx1ZT0iMm0iIC8+CisKICAgICB7RVhUUkFfQ09ORklHU30KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5Jc29sYXRlZEhvc3RUZXN0IiA+CkBAIC0zMyw1ICs0MCwxNSBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamRrLmludGVybmFsLnV0aWwucmFuZG9tPUFMTC1VTk5BTUVEIi8+CiAgICAgICAgIDwhLS0gYi8yNTEzODcyNTUgLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLmlvPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLm5ldD1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS5uaW89QUxMLVVOTkFNRUQiLz4gPCEtLSByZXF1aXJlZCBmb3IgU2hhZG93Vk1SdW50aW1lIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS5zZWN1cml0eT1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS50ZXh0PUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLnV0aWw9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5iYXNlL2pkay5pbnRlcm5hbC5hY2Nlc3M9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5kZXNrdG9wL2phdmEuYXd0LmZvbnQ9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuYXBpPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLm1haW49QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMudXRpbD1BTEwtVU5OQU1FRCIvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYW5kcm9pZF9hcHBfc2V0Lm1rIGIvY29yZS9zb29uZ19hbmRyb2lkX2FwcF9zZXQubWsKaW5kZXggZWMzZDhjOC4uZDk3OTgwZCAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19hbmRyb2lkX2FwcF9zZXQubWsKKysrIGIvY29yZS9zb29uZ19hbmRyb2lkX2FwcF9zZXQubWsKQEAgLTksMTAgKzksNiBAQAogTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gcGFja2FnZS5hcGsKIExPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSAkKG5vdGRpciAkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKSkKIAotIyBVc2UgdGhlIFNvb25nIG91dHB1dCBhcyB0aGUgY2hlY2tidWlsZCB0YXJnZXQgaW5zdGVhZCBvZiBMT0NBTF9CVUlMVF9NT0RVTEUKLSMgdG8gYXZvaWQgY2hlY2tidWlsZHMgbWFraW5nIGFuIGV4dHJhIGNvcHkgb2YgZXZlcnkgbW9kdWxlLgotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKaW5kZXggM2FhMjQ0Yy4uYWI5MjI3ZiAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKKysrIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKQEAgLTI5LDE2ICsyOSw2IEBACiBmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIAogCi0jIFVzZSB0aGUgU29vbmcgb3V0cHV0IGFzIHRoZSBjaGVja2J1aWxkIHRhcmdldCBpbnN0ZWFkIG9mIExPQ0FMX0JVSUxUX01PRFVMRQotIyB0byBhdm9pZCBjaGVja2J1aWxkcyBtYWtpbmcgYW4gZXh0cmEgY29weSBvZiBldmVyeSBtb2R1bGUuCi1MT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0hFQURFUl9KQVIpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0RFWFBSRU9QVF9DT05GSUcpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfREVYX0pBUikKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTIzNCwzMCArMjI0LDYgQEAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xpbmtfdHlwZS5tawogZW5kaWYgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKIAotaWZlcSAoLCQoZmlsdGVyIHRlc3RzLCQoTE9DQUxfTU9EVUxFX1RBR1MpKSkKLSAgaWZkZWYgTE9DQUxfU09PTkdfREVWSUNFX1JST19ESVJTCi0gICAgJChjYWxsIGFwcGVuZF9lbmZvcmNlX3Jyb19zb3VyY2VzLCBcCi0gICAgICAgICQobXlfcmVnaXN0ZXJfbmFtZSksIFwKLSAgICAgICAgZmFsc2UsIFwKLSAgICAgICAgJChMT0NBTF9GVUxMX01BTklGRVNUX0ZJTEUpLCBcCi0gICAgICAgICQoaWYgJChMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMpLHRydWUsZmFsc2UpLCBcCi0gICAgICAgICQoTE9DQUxfU09PTkdfREVWSUNFX1JST19ESVJTKSwgXAotICAgICAgICB2ZW5kb3IgXAotICAgICkKLSAgZW5kaWYKLQotICBpZmRlZiBMT0NBTF9TT09OR19QUk9EVUNUX1JST19ESVJTCi0gICAgJChjYWxsIGFwcGVuZF9lbmZvcmNlX3Jyb19zb3VyY2VzLCBcCi0gICAgICAgICQobXlfcmVnaXN0ZXJfbmFtZSksIFwKLSAgICAgICAgZmFsc2UsIFwKLSAgICAgICAgJChMT0NBTF9GVUxMX01BTklGRVNUX0ZJTEUpLCBcCi0gICAgICAgICQoaWYgJChMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMpLHRydWUsZmFsc2UpLCBcCi0gICAgICAgICQoTE9DQUxfU09PTkdfUFJPRFVDVF9SUk9fRElSUyksIFwKLSAgICAgICAgcHJvZHVjdCBcCi0gICAgKQotICBlbmRpZgotZW5kaWYKLQogaWZkZWYgTE9DQUxfUFJFQlVJTFRfQ09WRVJBR0VfQVJDSElWRQogICBteV9jb3ZlcmFnZV9kaXIgOj0gJChUQVJHRVRfT1VUX0NPVkVSQUdFKS8kKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKG15X21vZHVsZV9wYXRoKSkKICAgbXlfY292ZXJhZ2VfY29weV9wYWlycyA6PSAkKGZvcmVhY2ggZiwkKExPQ0FMX1BSRUJVSUxUX0NPVkVSQUdFX0FSQ0hJVkUpLCQoZik6JChteV9jb3ZlcmFnZV9kaXIpLyQobm90ZGlyICAkKGYpKSkKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfY2NfcnVzdF9wcmVidWlsdC5tayBiL2NvcmUvc29vbmdfY2NfcnVzdF9wcmVidWlsdC5tawppbmRleCBhMWM2NDc4Li5kYTYwODMyIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2NjX3J1c3RfcHJlYnVpbHQubWsKKysrIGIvY29yZS9zb29uZ19jY19ydXN0X3ByZWJ1aWx0Lm1rCkBAIC0zOCwxMCArMzgsNiBAQAogICBlbmRpZgogZW5kaWYKIAotIyBVc2UgdGhlIFNvb25nIG91dHB1dCBhcyB0aGUgY2hlY2tidWlsZCB0YXJnZXQgaW5zdGVhZCBvZiBMT0NBTF9CVUlMVF9NT0RVTEUKLSMgdG8gYXZvaWQgY2hlY2tidWlsZHMgbWFraW5nIGFuIGV4dHJhIGNvcHkgb2YgZXZlcnkgbW9kdWxlLgotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKLQogbXlfY2hlY2tfc2FtZV92bmRrX3ZhcmlhbnRzIDo9CiBzYW1lX3ZuZGtfdmFyaWFudHNfc3RhbXAgOj0KIGlmZXEgKCQoTE9DQUxfQ0hFQ0tfU0FNRV9WTkRLX1ZBUklBTlRTKSx0cnVlKQpAQCAtNjEsNyArNTcsNyBAQAogICAjIE5vdGUgdGhhdCBiZWNhdXNlIGBjaGVja2J1aWxkYCBkb2Vzbid0IGNoZWNrIExPQ0FMX0JVSUxUX01PRFVMRSBmb3Igc29vbmctYnVpbHQgbW9kdWxlcyBhZGRpbmcKICAgIyB0aGUgdGltZXN0YW1wIHRvIExPQ0FMX0JVSUxUX01PRFVMRSBpc24ndCBlbm91Z2guIEl0IGlzIHNraXBwZWQgd2hlbiB0aGUgdmVuZG9yIHZhcmlhbnQKICAgIyBpc24ndCB1c2VkIGF0IGFsbCBhbmQgaXQgbWF5IGJyZWFrIGluIHRoZSBkb3duc3RyZWFtIHRyZWVzLgotICBMT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFIDo9ICQoc2FtZV92bmRrX3ZhcmlhbnRzX3N0YW1wKQorICBMT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoc2FtZV92bmRrX3ZhcmlhbnRzX3N0YW1wKQogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2NvbmZpZy5tayBiL2NvcmUvc29vbmdfY29uZmlnLm1rCmluZGV4IDEyYjQxMzUuLjczOTkwNWQgMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfY29uZmlnLm1rCisrKyBiL2NvcmUvc29vbmdfY29uZmlnLm1rCkBAIC0xLDUgKzEsNSBAQAotU09PTkdfTUFLRVZBUlNfTUsgOj0gJChTT09OR19PVVRfRElSKS9tYWtlX3ZhcnMtJChUQVJHRVRfUFJPRFVDVCkubWsKLVNPT05HX0FORFJPSURfTUsgOj0gJChTT09OR19PVVRfRElSKS9BbmRyb2lkLSQoVEFSR0VUX1BST0RVQ1QpLm1rCitTT09OR19NQUtFVkFSU19NSyA6PSAkKFNPT05HX09VVF9ESVIpL21ha2VfdmFycy0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS5taworU09PTkdfQU5EUk9JRF9NSyA6PSAkKFNPT05HX09VVF9ESVIpL0FuZHJvaWQtJChUQVJHRVRfUFJPRFVDVCkkKENPVkVSQUdFX1NVRkZJWCkubWsKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYXJ0X2NvbmZpZy5tawogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9jb25maWcubWsKQEAgLTI2LDcgKzI2LDcgQEAKICQoc2hlbGwgbWtkaXIgLXAgJChkaXIgJChTT09OR19WQVJJQUJMRVMpKSkKICQoY2FsbCBqc29uX3N0YXJ0KQogCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFrZV9zdWZmaXgsIC0kKFRBUkdFVF9QUk9EVUNUKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBNYWtlX3N1ZmZpeCwgLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRJZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxEX0lEKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBCdWlsZEZpbmdlcnByaW50RmlsZSwgICAgICAgICAgICAgIGJ1aWxkX2ZpbmdlcnByaW50LnR4dCkKQEAgLTE1MCw5ICsxNTAsOSBAQAogJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ0Q29uZmlnSW5jbHVkZURpciwgICAgICAgICAgICAgICAgJChCT0FSRF9CTFVFVE9PVEhfQkRST0lEX0JVSUxEQ0ZHX0lOQ0xVREVfRElSKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBEZXZpY2VLZXJuZWxIZWFkZXJzLCAgICAgICAgICAgICAgICQoVEFSR0VUX0RFVklDRV9LRVJORUxfSEVBREVSUykgJChUQVJHRVRfQk9BUkRfS0VSTkVMX0hFQURFUlMpICQoVEFSR0VUX1BST0RVQ1RfS0VSTkVMX0hFQURFUlMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvckFwaUxldmVsLCAgICAgICAgICAgICAgICAgICAgJChCT0FSRF9BUElfTEVWRUwpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvckFwaUxldmVsUHJvcE92ZXJyaWRlLCAgICAgICAgJChCT0FSRF9BUElfTEVWRUxfUFJPUF9PVkVSUklERSkpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgRXh0cmFWbmRrVmVyc2lvbnMsICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlU3lzdGVtU2RrVmVyc2lvbnMsICAgICAgICAgICAkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgUmVjb3ZlcnlTbmFwc2hvdFZlcnNpb24sICAgICAgICAgICAkKFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04pKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFBsYXRmb3JtX3N5c3RlbXNka192ZXJzaW9ucywgICAgICAgJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE1hbGxvY19sb3dfbWVtb3J5LCAgICAgICAgICAgICAgICAgJChmaW5kc3RyaW5nIHRydWUsJChNQUxMT0NfU1ZFTFRFKSAkKE1BTExPQ19MT1dfTUVNT1JZKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgTWFsbG9jX3plcm9fY29udGVudHMsICAgICAgICAgICAgICAkKGNhbGwgaW52ZXJ0X2Jvb2wsJChmaWx0ZXIgZmFsc2UsJChNQUxMT0NfWkVST19DT05URU5UUykpKSkKQEAgLTE2Nyw4ICsxNjcsNiBAQAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvb3RKYXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0JPT1RfSkFSUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQXBleEJvb3RKYXJzLCAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgJChBUEVYX0JPT1RfSkFSU19FWENMVURFRCksICQoUFJPRFVDVF9BUEVYX0JPT1RfSkFSUykpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgVm5ka1NuYXBzaG90QnVpbGRBcnRpZmFjdHMsICAgICAgICAkKFZOREtfU05BUFNIT1RfQlVJTERfQVJUSUZBQ1RTKSkKLQogJChjYWxsIGFkZF9qc29uX21hcCwgIEJ1aWxkRmxhZ3MpCiAkKGZvcmVhY2ggZmxhZywkKF9BTExfUkVMRUFTRV9GTEFHUyksXAogICAkKGNhbGwgYWRkX2pzb25fc3RyLCQoZmxhZyksJChfQUxMX1JFTEVBU0VfRkxBR1MuJChmbGFnKS5WQUxVRSkpKQpAQCAtMTc4LDI0ICsxNzYsNiBAQAogICAkKGNhbGwgYWRkX2pzb25fc3RyLCQoZmxhZyksJChfQUxMX1JFTEVBU0VfRkxBR1MuJChmbGFnKS5UWVBFKSkpCiAkKGNhbGwgZW5kX2pzb25fbWFwKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlyZWN0ZWRWZW5kb3JTbmFwc2hvdCwgICAgICAgICAgICAkKERJUkVDVEVEX1ZFTkRPUl9TTkFQU0hPVCkpCi0kKGNhbGwgYWRkX2pzb25fbWFwLCAgVmVuZG9yU25hcHNob3RNb2R1bGVzKQotJChmb3JlYWNoIG1vZHVsZSwkKFZFTkRPUl9TTkFQU0hPVF9NT0RVTEVTKSxcCi0gICQoY2FsbCBhZGRfanNvbl9ib29sLCQobW9kdWxlKSx0cnVlKSkKLSQoY2FsbCBlbmRfanNvbl9tYXApCi0KLSQoY2FsbCBhZGRfanNvbl9ib29sLCBEaXJlY3RlZFJlY292ZXJ5U25hcHNob3QsICAgICAgICAgICQoRElSRUNURURfUkVDT1ZFUllfU05BUFNIT1QpKQotJChjYWxsIGFkZF9qc29uX21hcCwgIFJlY292ZXJ5U25hcHNob3RNb2R1bGVzKQotJChmb3JlYWNoIG1vZHVsZSwkKFJFQ09WRVJZX1NOQVBTSE9UX01PRFVMRVMpLFwKLSAgJChjYWxsIGFkZF9qc29uX2Jvb2wsJChtb2R1bGUpLHRydWUpKQotJChjYWxsIGVuZF9qc29uX21hcCkKLQotJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclNuYXBzaG90RGlyc0luY2x1ZGVkLCAgICAgICAgJChWRU5ET1JfU05BUFNIT1RfRElSU19JTkNMVURFRCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgVmVuZG9yU25hcHNob3REaXJzRXhjbHVkZWQsICAgICAgICAkKFZFTkRPUl9TTkFQU0hPVF9ESVJTX0VYQ0xVREVEKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBSZWNvdmVyeVNuYXBzaG90RGlyc0luY2x1ZGVkLCAgICAgICQoUkVDT1ZFUllfU05BUFNIT1RfRElSU19JTkNMVURFRCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgUmVjb3ZlcnlTbmFwc2hvdERpcnNFeGNsdWRlZCwgICAgICAkKFJFQ09WRVJZX1NOQVBTSE9UX0RJUlNfRVhDTFVERUQpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEhvc3RGYWtlU25hcHNob3RFbmFibGVkLCAgICAgICAgICAgJChIT1NUX0ZBS0VfU05BUFNIT1RfRU5BQkxFKSkKLQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE11bHRpdHJlZVVwZGF0ZU1ldGEsICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9NVUxUSVRSRUVfVVBEQVRFX01FVEEpKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRyZWJsZV9saW5rZXJfbmFtZXNwYWNlcywgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTKSkpCkBAIC0yMDMsMTAgKzE4MywxOSBAQAogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVW1sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVJfTU9ERV9MSU5VWCkpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvclBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBWZW5kb3JEbGttUGF0aCwgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUl9ETEtNKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1ZlbmRvckltYWdlLCAgICAgICAgICAgICAgICQoQlVJTERJTkdfVkVORE9SX0lNQUdFKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBPZG1QYXRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX09ETSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdPZG1JbWFnZSwgICAgICAgICAgICAgICAgICAkKEJVSUxESU5HX09ETV9JTUFHRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgT2RtRGxrbVBhdGgsICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9PRE1fRExLTSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdFBhdGgsICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1Byb2R1Y3RJbWFnZSwgICAgICAgICAgICAgICQoQlVJTERJTkdfUFJPRFVDVF9JTUFHRSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgU3lzdGVtRXh0UGF0aCwgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fRVhUKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBTeXN0ZW1EbGttUGF0aCwgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9ETEtNKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBPZW1QYXRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX09FTSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgTWluaW1pemVKYXZhRGVidWdJbmZvLCAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8pKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBSZWNvdmVyeVBhdGgsICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1JFQ09WRVJZKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1JlY292ZXJ5SW1hZ2UsICAgICAgICAgICAgICQoQlVJTERJTkdfUkVDT1ZFUllfSU1BR0UpKQogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlR29tYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgZmFsc2UsJChVU0VfR09NQSkpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZVJCRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0IGZhbHNlLCQoVVNFX1JCRSkpKQpAQCAtMjI3LDYgKzIxNiw3IEBACiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQm9hcmRTZXBvbGljeVZlcnMsICAgICAgICAgICAgICAgICAkKEJPQVJEX1NFUE9MSUNZX1ZFUlMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFN5c3RlbUV4dFNlcG9saWN5UHJlYnVpbHRBcGlEaXIsICAgJChCT0FSRF9TWVNURU1fRVhUX1BSRUJVSUxUX0RJUikpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdFNlcG9saWN5UHJlYnVpbHRBcGlEaXIsICAgICAkKEJPQVJEX1BST0RVQ1RfUFJFQlVJTFRfRElSKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBCb2FyZFBsYXRmb3JtLCAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtU2Vwb2xpY3lWZXJzaW9uLCAgICAgICAgICAgJChQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybVNlcG9saWN5Q29tcGF0VmVyc2lvbnMsICAgICQoUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TKSkKQEAgLTI1Niw2ICsyNDYsMTIgQEAKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIFRhcmdldEZTQ29uZmlnR2VuLCAgICAgICAgICAgICAgICAgJChUQVJHRVRfRlNfQ09ORklHX0dFTikpCiAKKyMgQWx0aG91Z2ggVVNFX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIGRldGVybWluZXMgd2hldGhlciB0byB1c2UgdGhlIHN5c3RlbSBpbWFnZSBzcGVjaWZpZWQgYnkKKyMgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSwgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBpcyBzdGlsbCB1c2VkIHRvIGNvbXBhcmUKKyMgaW5zdGFsbGVkIGZpbGVzIGJldHdlZW4gbWFrZSBhbmQgc29vbmcsIHJlZ2FyZGxlc3Mgb2YgdGhlIFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBzZXR0aW5nLgorJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZVNvb25nU3lzdGVtSW1hZ2UsICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RTb29uZ0RlZmluZWRTeXN0ZW1JbWFnZSwgICAgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSkKKwogJChjYWxsIGFkZF9qc29uX21hcCwgVmVuZG9yVmFycykKICQoZm9yZWFjaCBuYW1lc3BhY2UsJChzb3J0ICQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpKSxcCiAgICQoY2FsbCBhZGRfanNvbl9tYXAsICQobmFtZXNwYWNlKSlcCkBAIC0yNzksMTQgKzI3NSw4IEBACiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5mb3JjZVByb2R1Y3RQYXJ0aXRpb25JbnRlcmZhY2UsICAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSkpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZUN1cnJlbnRBcGlMZXZlbEZvclZlbmRvck1vZHVsZXMsICAkKEJPQVJEX0NVUlJFTlRfQVBJX0xFVkVMX0ZPUl9WRU5ET1JfTU9EVUxFUykpCiAKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBFbmZvcmNlSW50ZXJQYXJ0aXRpb25KYXZhU2RrTGlicmFyeSwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSkpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIEludGVyUGFydGl0aW9uSmF2YUxpYnJhcnlBbGxvd0xpc3QsICQoUFJPRFVDVF9JTlRFUl9QQVJUSVRJT05fSkFWQV9MSUJSQVJZX0FMTE9XTElTVCkpCi0KICQoY2FsbCBhZGRfanNvbl9ib29sLCBDb21wcmVzc2VkQXBleCwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQ09NUFJFU1NFRF9BUEVYKSkpCi0KLWlmbmRlZiBBUEVYX0JVSUxEX0ZPUl9QUkVfU19ERVZJQ0VTCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgVHJpbW1lZEFwZXgsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1RSSU1NRURfQVBFWCkpKQotZW5kaWYKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERlZmF1bHRBcGV4UGF5bG9hZFR5cGUsICQoUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJvYXJkVXNlc1JlY292ZXJ5QXNCb290LCAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkpCiAKQEAgLTMwNiw3ICsyOTYsNiBAQAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEdlbnJ1bGVTYW5kYm94aW5nLCAgICAgICAgICAgICAgICAgICAkKGlmICQoR0VOUlVMRV9TQU5EQk9YSU5HKSwkKGZpbHRlciB0cnVlLCQoR0VOUlVMRV9TQU5EQk9YSU5HKSksJChpZiAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0dFTlJVTEVfU0FOREJPWElORykpLCx0cnVlKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5FbmZvcmNlU3lzcHJvcE93bmVyLCAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fRU5GT1JDRV9TWVNQUk9QX09XTkVSKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5UcmVibGVTeXNwcm9wTmV2ZXJhbGxvdywgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fVFJFQkxFX1NZU1BST1BfTkVWRVJBTExPVykpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuVXNlc1Nvb25nUHl0aG9uMk1vZHVsZXMsICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX1VTRVNfU09PTkdfUFlUSE9OMl9NT0RVTEVTKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5WZW5kb3JQcm9wZXJ0eU5hbWVzcGFjZSwgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fVkVORE9SX1BST1BFUlRZX05BTUVTUEFDRSkpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuSW5jb3JyZWN0UGFydGl0aW9uSW1hZ2VzLCAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSkpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQnVpbGRCcm9rZW5JbnB1dERpck1vZHVsZXMsICAgICAgICAgICQoQlVJTERfQlJPS0VOX0lOUFVUX0RJUl9NT0RVTEVTKSkKQEAgLTMzNCw2ICszMjMsOCBAQAogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdE1hbnVmYWN0dXJlciwgJChQUk9EVUNUX01BTlVGQUNUVVJFUikpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdEJyYW5kLCAgICAgICAgJChQUk9EVUNUX0JSQU5EKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0RGV2aWNlLCAgICAgICAkKFBST0RVQ1RfREVWSUNFKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0TW9kZWwsICAgICAgICAkKFBST0RVQ1RfTU9ERUwpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCBSZWxlYXNlVmVyc2lvbiwgICAgJChfUkVMRUFTRV9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBSZWxlYXNlQWNvbmZpZ1ZhbHVlU2V0cywgICAgJChSRUxFQVNFX0FDT05GSUdfVkFMVUVfU0VUUykpCkBAIC0zNjEsNiArMzUyLDIyNCBAQAogCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgT2VtUHJvcGVydGllcywgJChQUk9EVUNUX09FTV9QUk9QRVJUSUVTKSkKIAorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbVByb3BGaWxlcywgJChUQVJHRVRfU1lTVEVNX1BST1ApKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbUV4dFByb3BGaWxlcywgJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UHJvcEZpbGVzLCAkKFRBUkdFVF9QUk9EVUNUX1BST1ApKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIE9kbVByb3BGaWxlcywgJChUQVJHRVRfT0RNX1BST1ApKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclByb3BGaWxlcywgJChUQVJHRVRfVkVORE9SX1BST1ApKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBFeHRyYUFsbG93ZWREZXBzVHh0LCAkKEVYVFJBX0FMTE9XRURfREVQU19UWFQpKQorCisjIERvIG5vdCBzZXQgQXJ0VGFyZ2V0SW5jbHVkZURlYnVnQnVpbGQgaW50byBhbnkgdmFsdWUgaWYgUFJPRFVDVF9BUlRfVEFSR0VUX0lOQ0xVREVfREVCVUdfQlVJTEQgaXMgbm90IHNldCwKKyMgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBmcm9tIHJ1bnRpbWVfbGliYXJ0Lm1rLgoraWZuZXEgKCQoUFJPRFVDVF9BUlRfVEFSR0VUX0lOQ0xVREVfREVCVUdfQlVJTEQpLCkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBBcnRUYXJnZXRJbmNsdWRlRGVidWdCdWlsZCwgJChQUk9EVUNUX0FSVF9UQVJHRVRfSU5DTFVERV9ERUJVR19CVUlMRCkpCitlbmRpZgorCitfY29uZmlnX2VuYWJsZV91ZmZkX2djIDo9IFwKKyAgJChmaXJzdHdvcmQgJChPVkVSUklERV9FTkFCTEVfVUZGRF9HQykgJChQUk9EVUNUX0VOQUJMRV9VRkZEX0dDKSBkZWZhdWx0KQorJChjYWxsIGFkZF9qc29uX3N0ciwgRW5hYmxlVWZmZEdjLCAkKF9jb25maWdfZW5hYmxlX3VmZmRfZ2MpKQorX2NvbmZpZ19lbmFibGVfdWZmZF9nYyA6PQorJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRLZXJuZWxWZXJzaW9uLCAkKEJPQVJEX0tFUk5FTF9WRVJTSU9OKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZUZyYW1ld29ya0NvbXBhdGliaWxpdHlNYXRyaXhGaWxlLCAkKERFVklDRV9GUkFNRVdPUktfQ09NUEFUSUJJTElUWV9NQVRSSVhfRklMRSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlUHJvZHVjdENvbXBhdGliaWxpdHlNYXRyaXhGaWxlLCAkKERFVklDRV9QUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0ZJTEUpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkQXZiU3lzdGVtQWRkSGFzaHRyZWVGb290ZXJBcmdzLCAkKEJPQVJEX0FWQl9TWVNURU1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZEF2YkVuYWJsZSwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgQWRiS2V5cywgJChQUk9EVUNUX0FEQl9LRVlTKSkKKworJChjYWxsIGFkZF9qc29uX21hcCwgUGFydGl0aW9uVmFyc0ZvclNvb25nTWlncmF0aW9uT25seURvTm90VXNlKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdERpcmVjdG9yeSwgICAgJChkaXIgJChJTlRFUk5BTF9QUk9EVUNUKSkpCisKKyAgJChjYWxsIGFkZF9qc29uX21hcCxQYXJ0aXRpb25RdWFsaWZpZWRWYXJpYWJsZXMpCisgICQoZm9yZWFjaCBpbWFnZV90eXBlLElOSVRfQk9PVCBCT09UIFZFTkRPUl9CT09UIFNZU1RFTSBWRU5ET1IgQ0FDSEUgVVNFUkRBVEEgUFJPRFVDVCBTWVNURU1fRVhUIE9FTSBPRE0gVkVORE9SX0RMS00gT0RNX0RMS00gU1lTVEVNX0RMS00sIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fbWFwLCQoY2FsbCB0by1sb3dlciwkKGltYWdlX3R5cGUpKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ0ltYWdlLCAkKGZpbHRlciB0cnVlLCQoQlVJTERJTkdfJChpbWFnZV90eXBlKV9JTUFHRSkpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc0NvbXByZXNzb3IsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VST0ZTX0NPTVBSRVNTT1IpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc0NvbXByZXNzSGludHMsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNQY2x1c3RlclNpemUsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VST0ZTX1BDTFVTVEVSX1NJWkUpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFeHRmc0lub2RlQ291bnQsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXh0ZnNSc3ZQY3QsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VYVEZTX1JTVl9QQ1QpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGMmZzU2xvYWRDb21wcmVzc0ZsYWdzLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9GMkZTX1NMT0FEX0NPTVBSRVNTX0ZMQUdTKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRmlsZVN5c3RlbUNvbXByZXNzLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9GSUxFX1NZU1RFTV9DT01QUkVTUykpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEZpbGVTeXN0ZW1UeXBlLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkSm91cm5hbFNpemUsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0pPVVJOQUxfU0laRSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFBhcnRpdGlvblJlc2VydmVkU2l6ZSwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfUEFSVElUSU9OX1JFU0VSVkVEX1NJWkUpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRQYXJ0aXRpb25TaXplLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9QQVJUSVRJT05fU0laRSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFNxdWFzaGZzQmxvY2tTaXplLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19CTE9DS19TSVpFKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3F1YXNoZnNDb21wcmVzc29yLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3F1YXNoZnNDb21wcmVzc29yT3B0LCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SX09QVCkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFNxdWFzaGZzRGlzYWJsZTRrQWxpZ24sICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX1NRVUFTSEZTX0RJU0FCTEVfNEtfQUxJR04pKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJLZXlQYXRoLCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX0tFWV9QQVRIKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiQWxnb3JpdGhtLCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX0FMR09SSVRITSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEF2YlJvbGxiYWNrSW5kZXgsICQoQk9BUkRfQVZCXyQoaW1hZ2VfdHlwZSlfUk9MTEJBQ0tfSU5ERVgpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJSb2xsYmFja0luZGV4TG9jYXRpb24sICQoQk9BUkRfQVZCXyQoaW1hZ2VfdHlwZSlfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJBZGRIYXNodHJlZUZvb3RlckFyZ3MsICQoQk9BUkRfQVZCXyQoaW1hZ2VfdHlwZSlfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RCYXNlRnNQYXRoLCAkKFBST0RVQ1RfJChpbWFnZV90eXBlKV9CQVNFX0ZTX1BBVEgpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEhlYWRyb29tLCAkKFBST0RVQ1RfJChpbWFnZV90eXBlKV9IRUFEUk9PTSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0VmVyaXR5UGFydGl0aW9uLCAkKFBST0RVQ1RfJChpbWFnZV90eXBlKV9WRVJJVFlfUEFSVElUSU9OKSkgXAorICAgICQoY2FsbCBlbmRfanNvbl9tYXApIFwKKyAgKQorICAkKGNhbGwgZW5kX2pzb25fbWFwKQorCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzVXNlRXh0MiwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQyKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzVXNlRXh0MywgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQzKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzVXNlRXh0NCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQ0KSkpCisKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRhcmdldFVzZXJpbWFnZXNTcGFyc2VFeHREaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQpKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRhcmdldFVzZXJpbWFnZXNTcGFyc2VFcm9mc0Rpc2FibGVkLCAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VST0ZTX0RJU0FCTEVEKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzU3BhcnNlU3F1YXNoZnNEaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9TUVVBU0hGU19ESVNBQkxFRCkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0VXNlcmltYWdlc1NwYXJzZUYyZnNEaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9GMkZTX0RJU0FCTEVEKSkpCisKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc0NvbXByZXNzb3IsICQoQk9BUkRfRVJPRlNfQ09NUFJFU1NPUikpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNDb21wcmVzc29ySGludHMsICQoQk9BUkRfRVJPRlNfQ09NUFJFU1NfSElOVFMpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzUGNsdXN0ZXJTaXplLCAkKEJPQVJEX0VST0ZTX1BDTFVTVEVSX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzU2hhcmVEdXBCbG9ja3MsICQoQk9BUkRfRVJPRlNfU0hBUkVfRFVQX0JMT0NLUykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNVc2VMZWdhY3lDb21wcmVzc2lvbiwgJChCT0FSRF9FUk9GU19VU0VfTEVHQUNZX0NPTVBSRVNTSU9OKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFeHQ0U2hhcmVEdXBCbG9ja3MsICQoQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGbGFzaExvZ2ljYWxCbG9ja1NpemUsICQoQk9BUkRfRkxBU0hfTE9HSUNBTF9CTE9DS19TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGbGFzaEVyYXNlQmxvY2tTaXplLCAkKEJPQVJEX0ZMQVNIX0VSQVNFX0JMT0NLX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdWYm1ldGFJbWFnZSwgJChCVUlMRElOR19WQk1FVEFfSU1BR0UpKQorCisgICMgYm9vdCBpbWFnZSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdSYW1kaXNrSW1hZ2UsICQoZmlsdGVyIHRydWUsJChCVUlMRElOR19SQU1ESVNLX0lNQUdFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0QnVpbGRCb290SW1hZ2UsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0JVSUxEX0JPT1RfSU1BR0UpKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEJ1aWxkVmVuZG9yQm9vdEltYWdlLCAkKFBST0RVQ1RfQlVJTERfVkVORE9SX0JPT1RfSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdEJ1aWxkSW5pdEJvb3RJbWFnZSwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQlVJTERfSU5JVF9CT09UX0lNQUdFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZFVzZXNSZWNvdmVyeUFzQm9vdCwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFByZWJ1aWx0Qm9vdGltYWdlLCAkKEJPQVJEX1BSRUJVSUxUX0JPT1RfSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFByZWJ1aWx0SW5pdEJvb3RpbWFnZSwgJChCT0FSRF9QUkVCVUlMVF9JTklUX0JPT1RfSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEJvb3RpbWFnZVBhcnRpdGlvblNpemUsICQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRJbml0Qm9vdGltYWdlUGFydGl0aW9uU2l6ZSwgJChCT0FSRF9JTklUX0JPT1RfSU1BR0VfUEFSVElUSU9OX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEJvb3RIZWFkZXJWZXJzaW9uLCAkKEJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04pKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBUYXJnZXRLZXJuZWxQYXRoLCAkKFRBUkdFVF9LRVJORUxfUEFUSCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZFVzZXNHZW5lcmljS2VybmVsSW1hZ2UsICQoQk9BUkRfVVNFU19HRU5FUklDX0tFUk5FTF9JTUFHRSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3RTZWN1cml0eVBhdGNoLCAkKEJPT1RfU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBJbml0Qm9vdFNlY3VyaXR5UGF0Y2gsICQoSU5JVF9CT09UX1NFQ1VSSVRZX1BBVENIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yU2VjdXJpdHlQYXRjaCwgJChWRU5ET1JfU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBPZG1TZWN1cml0eVBhdGNoLCAkKE9ETV9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbURsa21TZWN1cml0eVBhdGNoLCAkKFNZU1RFTV9ETEtNX1NFQ1VSSVRZX1BBVENIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yRGxrbVNlY3VyaXR5UGF0Y2gsICQoVkVORE9SX0RMS01fU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBPZG1EbGttU2VjdXJpdHlQYXRjaCwgJChPRE1fRExLTV9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZEluY2x1ZGVEdGJJbkJvb3RpbWcsICQoQk9BUkRfSU5DTFVERV9EVEJfSU5fQk9PVElNRykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBJbnRlcm5hbEtlcm5lbENtZGxpbmUsICQoSU5URVJOQUxfS0VSTkVMX0NNRExJTkUpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgSW50ZXJuYWxCb290Y29uZmlnLCAkKElOVEVSTkFMX0JPT1RDT05GSUcpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBJbnRlcm5hbEJvb3Rjb25maWdGaWxlLCAkKElOVEVSTkFMX0JPT1RDT05GSUdfRklMRSkpCisKKyAgIyBzdXBlciBpbWFnZSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFVzZUR5bmFtaWNQYXJ0aXRpb25zLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0UmV0cm9maXREeW5hbWljUGFydGl0aW9ucywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0QnVpbGRTdXBlclBhcnRpdGlvbiwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQlVJTERfU1VQRVJfUEFSVElUSU9OKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3VwZXJQYXJ0aXRpb25TaXplLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRTdXBlclBhcnRpdGlvbk1ldGFkYXRhRGV2aWNlLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9NRVRBREFUQV9ERVZJQ0UpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRTdXBlclBhcnRpdGlvbkJsb2NrRGV2aWNlcywgJChCT0FSRF9TVVBFUl9QQVJUSVRJT05fQkxPQ0tfREVWSUNFUykpCisgICQoY2FsbCBhZGRfanNvbl9tYXAsIEJvYXJkU3VwZXJQYXJ0aXRpb25Hcm91cHMpCisgICAgJChmb3JlYWNoIGdyb3VwLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9HUk9VUFMpLCBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fbWFwLCAkKGdyb3VwKSkgXAorICAgICAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBHcm91cFNpemUsICQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQoZ3JvdXApKV9TSVpFKSkgXAorICAgICAgICAkKGlmICQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQoZ3JvdXApKV9QQVJUSVRJT05fTElTVCksIFwKKyAgICAgICAgICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUGFydGl0aW9uTGlzdCwgJChCT0FSRF8kKGNhbGwgdG8tdXBwZXIsJChncm91cCkpX1BBUlRJVElPTl9MSVNUKSkpIFwKKyAgICAgICQoY2FsbCBlbmRfanNvbl9tYXApKQorICAgICQoY2FsbCBlbmRfanNvbl9tYXApCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0VmlydHVhbEFiT3RhLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX09UQSkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFZpcnR1YWxBYk90YVJldHJvZml0LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX09UQV9SRVRST0ZJVCkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQWJPdGFVcGRhdGVyLCAkKGZpbHRlciB0cnVlLCQoQUJfT1RBX1VQREFURVIpKSkKKworICAjIEF2YiAoYW5kcm9pZCB2ZXJpZmllZCBib290KSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRBdmJFbmFibGUsICQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiQWxnb3JpdGhtLCAkKEJPQVJEX0FWQl9BTEdPUklUSE0pKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEF2YktleVBhdGgsICQoQk9BUkRfQVZCX0tFWV9QQVRIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJSb2xsYmFja0luZGV4LCAkKEJPQVJEX0FWQl9ST0xMQkFDS19JTkRFWCkpCisgICQoY2FsbCBhZGRfanNvbl9tYXAsIENoYWluZWRWYm1ldGFQYXJ0aXRpb25zKQorICAkKGZvcmVhY2ggcGFydGl0aW9uLHN5c3RlbSB2ZW5kb3IgJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSxcCisgICAgJChjYWxsIGFkZF9qc29uX21hcCwgJChwYXJ0aXRpb24pKSBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fbGlzdCxQYXJ0aXRpb25zLCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKSkpIFwKKyAgICAgICQoY2FsbCBhZGRfanNvbl9zdHIsS2V5LCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkpIFwKKyAgICAgICQoY2FsbCBhZGRfanNvbl9zdHIsQWxnb3JpdGhtLCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9BTEdPUklUSE0pKSBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fc3RyLFJvbGxiYWNrSW5kZXgsJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYKSkgXAorICAgICAgJChjYWxsIGFkZF9qc29uX3N0cixSb2xsYmFja0luZGV4TG9jYXRpb24sJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSkgXAorICAgICQoY2FsbCBlbmRfanNvbl9tYXApKQorICAkKGNhbGwgZW5kX2pzb25fbWFwKQorCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0VXNlRHluYW1pY1BhcnRpdGlvblNpemUsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBDb3B5SW1hZ2VzRm9yVGFyZ2V0RmlsZXNaaXAsICQoZmlsdGVyIHRydWUsJChDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUCkpKQorCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UGFja2FnZXMsICQoUFJPRFVDVF9QQUNLQUdFUykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UGFja2FnZXNEZWJ1ZywgJChQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3ZlbmRvci9saW5rZXIuY29uZmlnLnBiCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBWZW5kb3JMaW5rZXJDb25maWdTcmNzLCAkKFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RMaW5rZXJDb25maWdTcmNzLCAkKFBST0RVQ1RfUFJPRFVDVF9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUykpCisKKyAgIyBVc2VkIHRvIGdlbmVyYXRlIF9kbGttIHBhcnRpdGlvbnMKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nU3lzdGVtRGxrbUltYWdlLCAgICAgICAgICAgICAgICQoQlVJTERJTkdfU1lTVEVNX0RMS01fSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtS2VybmVsTW9kdWxlcywgJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1LZXJuZWxCbG9ja2xpc3RGaWxlLCAkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFU19CTE9DS0xJU1RfRklMRSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1LZXJuZWxMb2FkTW9kdWxlcywgJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVNfTE9BRCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1ZlbmRvckRsa21JbWFnZSwgICAgICAgICAgICAgICAkKEJVSUxESU5HX1ZFTkRPUl9ETEtNX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvcktlcm5lbE1vZHVsZXMsICQoQk9BUkRfVkVORE9SX0tFUk5FTF9NT0RVTEVTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yS2VybmVsQmxvY2tsaXN0RmlsZSwgJChCT0FSRF9WRU5ET1JfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUX0ZJTEUpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdPZG1EbGttSW1hZ2UsICAgICAgICAgICAgICAgJChCVUlMRElOR19PRE1fRExLTV9JTUFHRSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBPZG1LZXJuZWxNb2R1bGVzLCAkKEJPQVJEX09ETV9LRVJORUxfTU9EVUxFUykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIE9kbUtlcm5lbEJsb2NrbGlzdEZpbGUsICQoQk9BUkRfT0RNX0tFUk5FTF9NT0RVTEVTX0JMT0NLTElTVF9GSUxFKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclJhbWRpc2tLZXJuZWxNb2R1bGVzLCAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0tFUk5FTF9NT0RVTEVTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yUmFtZGlza0tlcm5lbEJsb2NrbGlzdEZpbGUsICQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUX0ZJTEUpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgVmVuZG9yUmFtZGlza0tlcm5lbExvYWRNb2R1bGVzLCAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0tFUk5FTF9NT0RVTEVTX0xPQUQpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBWZW5kb3JSYW1kaXNrS2VybmVsT3B0aW9uc0ZpbGUsICQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVNfT1BUSU9OU19GSUxFKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3ZlbmRvci9idWlsZC5wcm9wCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZEluZm9GaWxlcywgJChpZiAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSwkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSwkKGZpcnN0d29yZCAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUpICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvYm9hcmQtaW5mby50eHQpKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3RMb2FkZXJCb2FyZE5hbWUsICQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkpCisKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RDb3B5RmlsZXMsICQoUFJPRFVDVF9DT1BZX0ZJTEVTKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgZnN2IG1ldGEKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3RGc3Zlcml0eUdlbmVyYXRlTWV0YWRhdGEsICAgICAgICAgICAgICAgJChQUk9EVUNUX0ZTVkVSSVRZX0dFTkVSQVRFX01FVEFEQVRBKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgcmVjb3ZlcnkgcGFydGl0aW9uCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFRhcmdldFNjcmVlbkRlbnNpdHksICQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3JlY292ZXJ5L3Jvb3QvYnVpbGQucHJvcAorICAkKGNhbGwgYWRkX2pzb25fbWFwLCBQcml2YXRlUmVjb3ZlcnlVaVByb3BlcnRpZXMpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgYW5pbWF0aW9uX2ZwcywgJChUQVJHRVRfUkVDT1ZFUllfVUlfQU5JTUFUSU9OX0ZQUykpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWFyZ2luX2hlaWdodCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUFSR0lOX0hFSUdIVCkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWFyZ2luX3dpZHRoLCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9NQVJHSU5fV0lEVEgpKQorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIG1lbnVfdW51c2FibGVfcm93cywgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUVOVV9VTlVTQUJMRV9ST1dTKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBwcm9ncmVzc19iYXJfYmFzZWxpbmUsICQoVEFSR0VUX1JFQ09WRVJZX1VJX1BST0dSRVNTX0JBUl9CQVNFTElORSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgdG91Y2hfbG93X3RocmVzaG9sZCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfTE9XX1RIUkVTSE9MRCkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgdG91Y2hfaGlnaF90aHJlc2hvbGQsICQoVEFSR0VUX1JFQ09WRVJZX1VJX1RPVUNIX0hJR0hfVEhSRVNIT0xEKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCB2cl9zdGVyZW9fb2Zmc2V0LCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9WUl9TVEVSRU9fT0ZGU0VUKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBicmlnaHRuZXNzX2ZpbGUsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfRklMRSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWF4X2JyaWdodG5lc3NfZmlsZSwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUFYX0JSSUdIVE5FU1NfRklMRSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgYnJpZ2h0bmVzc19ub3JtYWxfcGVyY2VudCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfQlJJR0hUTkVTU19OT1JNQUwpKQorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIGJyaWdodG5lc3NfZGltbWVkX3BlcmNlbnQsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfRElNTUVEKSkKKyAgJChjYWxsIGVuZF9qc29uX21hcCkKKworJChjYWxsIGVuZF9qc29uX21hcCkKKworIyBGb3IgY29udmVydGluZyB2aW50Zl9kYXRhCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlTWF0cml4RmlsZSwgJChERVZJQ0VfTUFUUklYX0ZJTEUpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RNYW5pZmVzdEZpbGVzLCAkKFBST0RVQ1RfTUFOSUZFU1RfRklMRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbU1hbmlmZXN0RmlsZSwgJChERVZJQ0VfRlJBTUVXT1JLX01BTklGRVNUX0ZJTEUpKQorU1lTVEVNX0VYVF9IV1NFUlZJQ0VfRklMRVMgOj0KK2lmZXEgKCQoUFJPRFVDVF9ISURMX0VOQUJMRUQpLHRydWUpCisgIGlmbmVxICgkKGZpbHRlciBod3NlcnZpY2VtYW5hZ2VyLCQoUFJPRFVDVF9QQUNLQUdFUykpLCkKKyAgICBTWVNURU1fRVhUX0hXU0VSVklDRV9GSUxFUyArPSBzeXN0ZW0vaHdzZXJ2aWNlbWFuYWdlci9od3NlcnZpY2VtYW5hZ2VyX25vX21heC54bWwKKyAgZWxzZQorICAgICQoZXJyb3IgSWYgUFJPRFVDVF9ISURMX0VOQUJMRUQgaXMgc2V0LCBod3NlcnZpY2VtYW5hZ2VyIG11c3QgYmUgYWRkZWQgdG8gUFJPRFVDVF9QQUNLQUdFUyBleHBsaWNpdGx5KQorICBlbmRpZgorZWxzZQorICBpZm5lcSAoJChmaWx0ZXIgaHdzZXJ2aWNlbWFuYWdlciwkKFBST0RVQ1RfUEFDS0FHRVMpKSwpCisgICAgU1lTVEVNX0VYVF9IV1NFUlZJQ0VfRklMRVMgKz0gc3lzdGVtL2h3c2VydmljZW1hbmFnZXIvaHdzZXJ2aWNlbWFuYWdlci54bWwKKyAgZWxzZSBpZm5lcSAoJChmaWx0ZXIgaHdzZXJ2aWNlbWFuYWdlciwkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0KSksKQorICAgIFNZU1RFTV9FWFRfSFdTRVJWSUNFX0ZJTEVTICs9IHN5c3RlbS9od3NlcnZpY2VtYW5hZ2VyL2h3c2VydmljZW1hbmFnZXIueG1sCisgIGVuZGlmCitlbmRpZgorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbUV4dE1hbmlmZXN0RmlsZXMsICQoU1lTVEVNX0VYVF9NQU5JRkVTVF9GSUxFUykgJChTWVNURU1fRVhUX0hXU0VSVklDRV9GSUxFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlTWFuaWZlc3RGaWxlcywgJChERVZJQ0VfTUFOSUZFU1RfRklMRSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgT2RtTWFuaWZlc3RGaWxlcywgJChPRE1fTUFOSUZFU1RfRklMRVMpKQorCiAkKGNhbGwganNvbl9lbmQpCiAKICQoZmlsZSA+JChTT09OR19WQVJJQUJMRVMpLnRtcCwkKGpzb25fY29udGVudHMpKQpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19leHRyYV9jb25maWcubWsgYi9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5tawppbmRleCBlNDQzMmQyLi44ZWVlNTBhIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5tawpAQCAtNDMsMTYgKzQzLDEyIEBACiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMsICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9PRE1fUFJPUEVSVElFUywgICAgICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX09ETV9QUk9QRVJUSUVTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUywgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTLCAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3Rsb2FkZXJCb2FyZE5hbWUsICQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBTZGtCdWlsZCwgJChmaWx0ZXIgc2RrIHNka19hZGRvbiwkKE1BS0VDTURHT0FMUykpKQogCi1fY29uZmlnX2VuYWJsZV91ZmZkX2djIDo9IFwKLSAgJChmaXJzdHdvcmQgJChPVkVSUklERV9FTkFCTEVfVUZGRF9HQykgJChQUk9EVUNUX0VOQUJMRV9VRkZEX0dDKSBkZWZhdWx0KQotJChjYWxsIGFkZF9qc29uX3N0ciwgRW5hYmxlVWZmZEdjLCAkKF9jb25maWdfZW5hYmxlX3VmZmRfZ2MpKQotX2NvbmZpZ19lbmFibGVfdWZmZF9nYyA6PQotCiAkKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1TZXJ2ZXJDb21waWxlckZpbHRlciwgJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3QxNktEZXZlbG9wZXJPcHRpb24sICQoZmlsdGVyIHRydWUsJChQUk9EVUNUXzE2S19ERVZFTE9QRVJfT1BUSU9OKSkpCkBAIC04NCw3ICs4MCw3IEBACiAKICQoY2FsbCBhZGRfanNvbl9zdHIsIFNjcmVlbkRlbnNpdHksICQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZXNWdWxrYW4sICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFU19WVUxLQU4pKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFVzZXNWdWxrYW4sICQoVEFSR0VUX1VTRVNfVlVMS0FOKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFp5Z290ZUZvcmNlNjQsICQoZmlsdGVyIHRydWUsJChaWUdPVEVfRk9SQ0VfNjQpKSkKIApAQCAtOTMsNiArODksMTIgQEAKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJ1aWxkVmVyc2lvblRhZ3MsICQoQlVJTERfVkVSU0lPTl9UQUdTKSkKIAorJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3ROb3REZWJ1Z2dhYmxlSW5Vc2VyZGVidWcsICQoUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlc1Byb2R1Y3RJbWFnZSwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRCb290czE2SywgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9CT09UU18xNkspKSkKKwogJChjYWxsIGpzb25fZW5kKQogCiAkKHNoZWxsIG1rZGlyIC1wICQoZGlyICQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKSkpCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsgYi9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsKaW5kZXggN2Y4NTIzMS4uOGMzODgyZiAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19qYXZhX3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tawpAQCAtMjEsMTkgKzIxLDYgQEAKIGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtaGVhZGVyLmphcgogY29tbW9uX2phdmFsaWIuamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phdmFsaWIuamFyCiAKLWlmZGVmIExPQ0FMX1NPT05HX0FBUgotICBMT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfQUFSKQotZW5kaWYKLQotIyBVc2UgdGhlIFNvb25nIG91dHB1dCBhcyB0aGUgY2hlY2tidWlsZCB0YXJnZXQgaW5zdGVhZCBvZiBMT0NBTF9CVUlMVF9NT0RVTEUKLSMgdG8gYXZvaWQgY2hlY2tidWlsZHMgbWFraW5nIGFuIGV4dHJhIGNvcHkgb2YgZXZlcnkgbW9kdWxlLgotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19IRUFERVJfSkFSKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRSkKLUxPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19ERVhQUkVPUFRfQ09ORklHKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0RFWF9KQVIpCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMTUsMTYgKzEwMiwxNCBAQAogICAgIGJvb3RfamFycyA6PSAkKGZvcmVhY2ggcGFpciwkKFBST0RVQ1RfQk9PVF9KQVJTKSwgJChjYWxsIHdvcmQtY29sb24sMiwkKHBhaXIpKSkKICAgICBpZm5lcSAoJChmaWx0ZXIgJChMT0NBTF9NT0RVTEUpLCQoYm9vdF9qYXJzKSksKSAjIGlzX2Jvb3RfamFyCiAgICAgICBpZmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFQpKQotICAgICAgICAjICQoREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUpIGNvbnRhaW5zIG1vZHVsZXMgdGhhdCBpbnN0YWxscwotICAgICAgICAjIGFsbCBvZiBib290amFycycgZGV4cHJlb3B0IGZpbGVzICguYXJ0LCAub2F0LCAudmRleCwgLi4uKQorICAgICAgICAjIGRleF9ib290amFycyBzaW5nbGV0b24gaW5zdGFsbHMgYWxsIG9mIGJvb3RqYXJzJyBkZXhwcmVvcHQgZmlsZXMgKC5hcnQsIC5vYXQsIC52ZGV4LCAuLi4pCisgICAgICAgICMgVGhpcyBpbmNsdWRlcyBib3RoIHRoZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgYXJjaGVzLgogICAgICAgICAjIEFkZCB0aGVtIHRvIHRoZSByZXF1aXJlZCBsaXN0IHNvIHRoZXkgYXJlIGluc3RhbGxlZCBhbG9uZ3NpZGUgdGhpcyBtb2R1bGUuCi0gICAgICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUkVRVUlSRURfRlJPTV9UQVJHRVQgKz0gXAotICAgICAgICAgICQoREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUpIFwKLSAgICAgICAgICAkKDJORF9ERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSkKKyAgICAgICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5SRVFVSVJFRF9GUk9NX1RBUkdFVCArPSBkZXhfYm9vdGphcnMKICAgICAgICAgIyBDb3B5ICQoTE9DQUxfQlVJTFRfTU9EVUxFKSBhbmQgaXRzIGRlcGVuZGVuY2llcyB3aGVuIGluc3RhbGxpbmcgYm9vdC5hcnQKICAgICAgICAgIyBzbyB0aGF0IGRlcGVuZGVuY2llcyBvZiAkKExPQ0FMX0JVSUxUX01PRFVMRSkgKHdoaWNoIG1heSBpbmNsdWRlCiAgICAgICAgICMgamFjb2NvLXJlcG9ydC1jbGFzc2VzLmphcikgYXJlIGNvcGllZCBmb3IgZXZlcnkgYnVpbGQuCi0gICAgICAgICQoZm9yZWFjaCBtLCQoREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUpICQoMk5EX0RFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0VfTU9EVUxFKSwgXAorICAgICAgICAkKGZvcmVhY2ggbSxkZXhfYm9vdGphcnMsIFwKICAgICAgICAgICAkKGV2YWwgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoZmlyc3R3b3JkICQoY2FsbCBtb2R1bGUtaW5zdGFsbGVkLWZpbGVzLCQobSkpKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKSBcCiAgICAgICAgICkKICAgICAgIGVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3N5c3Byb3AubWsgYi9jb3JlL3N5c3Byb3AubWsKaW5kZXggNDdkOGE0MS4uZTRmOTk0ZiAxMDA2NDQKLS0tIGEvY29yZS9zeXNwcm9wLm1rCisrKyBiL2NvcmUvc3lzcHJvcC5tawpAQCAtMzMsMzQgKzMzLDI2IEBACiAgICAgZWNobyAiIyBmcm9tIGdlbmVyYXRlLWNvbW1vbi1idWlsZC1wcm9wcyIgPj4gJCgyKTtcCiAgICAgZWNobyAiIyBUaGVzZSBwcm9wZXJ0aWVzIGlkZW50aWZ5IHRoaXMgcGFydGl0aW9uIGltYWdlLiIgPj4gJCgyKTtcCiAgICAgZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIiA+PiAkKDIpO1wKLSAgICAkKGlmICQoZmlsdGVyIHN5c3RlbSwkKDEpKSxcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5icmFuZD0kKFBST0RVQ1RfU1lTVEVNX0JSQU5EKSIgPj4gJCgyKTtcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5kZXZpY2U9JChQUk9EVUNUX1NZU1RFTV9ERVZJQ0UpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1hbnVmYWN0dXJlcj0kKFBST0RVQ1RfU1lTVEVNX01BTlVGQUNUVVJFUikiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubW9kZWw9JChQUk9EVUNUX1NZU1RFTV9NT0RFTCkiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubmFtZT0kKFBST0RVQ1RfU1lTVEVNX05BTUUpIiA+PiAkKDIpO1wKLSAgICAgICxcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5icmFuZD0kKFBST0RVQ1RfQlJBTkQpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLmRldmljZT0kKFRBUkdFVF9ERVZJQ0UpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1hbnVmYWN0dXJlcj0kKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgPj4gJCgyKTtcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tb2RlbD0kKFBST0RVQ1RfTU9ERUwpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm5hbWU9JChUQVJHRVRfUFJPRFVDVCkiID4+ICQoMik7XAotICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKLSAgICAgICAgICAgIGVjaG8gInJvLnByb2R1Y3QuYnJhbmRfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZmk7IFwKLSAgICAgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTkFNRV9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm5hbWVfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAotICAgICAgICBmaTsgXAotICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAotICAgICAgICAgICAgZWNobyAicm8ucHJvZHVjdC5kZXZpY2VfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcl9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZmk7IFwKLSAgICApXAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5icmFuZD0kKFBST0RVQ1RfQlJBTkQpIiA+PiAkKDIpO1wKKyAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkuZGV2aWNlPSQoVEFSR0VUX0RFVklDRSkiID4+ICQoMik7XAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tYW51ZmFjdHVyZXI9JChQUk9EVUNUX01BTlVGQUNUVVJFUikiID4+ICQoMik7XAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tb2RlbD0kKFBST0RVQ1RfTU9ERUwpIiA+PiAkKDIpO1wKKyAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubmFtZT0kKFRBUkdFVF9QUk9EVUNUKSIgPj4gJCgyKTtcCisgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgZmk7IFwKKyAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgIGVjaG8gInJvLnByb2R1Y3QuYnJhbmRfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICBmaTsgXAorICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm5hbWVfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAorICAgIGZpOyBcCisgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfREVWSUNFX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKKyAgICAgICAgZWNobyAicm8ucHJvZHVjdC5kZXZpY2VfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgZmk7IFwKKyAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9NQU5VRkFDVFVSRVJfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcl9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICBmaTsgXAogICAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFpZR09URV9GT1JDRV82NCkpLFwKICAgICAgICAgJChpZiAkKGZpbHRlciB2ZW5kb3IsJCgxKSksXAogICAgICAgICAgICAgZWNobyAicm8uJCgxKS5wcm9kdWN0LmNwdS5hYmlsaXN0PSQoVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQpIiA+PiAkKDIpO1wKQEAgLTEzMCwxMSArMTIyLDE5IEBACiBpZm5lcSAoJChzdHJpcCAkKDcpKSwgdHJ1ZSkKIAkkKGhpZGUpICQkKGNhbGwgZ2VuZXJhdGUtY29tbW9uLWJ1aWxkLXByb3BzLCQoY2FsbCB0by1sb3dlciwkKHN0cmlwICQoMSkpKSwkJEApCiBlbmRpZgorICAgICAgICAjIE1ha2UgYW5kIFNvb25nIHVzZSBkaWZmZXJlbnQgaW50ZXJtZWRpYXRlIGZpbGVzIHRvIGJ1aWxkIHZlbmRvci9idWlsZC5wcm9wLgorICAgICAgICAjIEFsdGhvdWdoIHRoZSBzeXNwcm9wIGNvbnRlbnRzIGFyZSBzYW1lLCB0aGUgYWJzb2x1dGUgcGF0aHMgb2YgYW5kcm9pZF9pbmZvLnByb3AgYXJlIGRpZmZlcmVudC4KKyAgICAgICAgIyBQcmludCB0aGUgZmlsZW5hbWUgZm9yIHRoZSBpbnRlcm1lZGlhdGUgZmlsZXMgKGZpbGVzIGluIE9VVF9ESVIpLgorICAgICAgICAjIFRoaXMgaGVscHMgd2l0aCB2YWxpZGF0aW5nIG1rLT5zb29uZyBtaWdyYXRpb24gb2YgYW5kcm9pZCBwYXJ0aXRpb25zLgogCSQoaGlkZSkgJChmb3JlYWNoIGZpbGUsJChzdHJpcCAkKDMpKSxcCiAJICAgIGlmIFsgLWYgIiQoZmlsZSkiIF07IHRoZW5cCiAJICAgICAgICBlY2hvICIiID4+ICQkQDtcCiAJICAgICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICQkQDtcCi0JICAgICAgICBlY2hvICIjIGZyb20gJChmaWxlKSIgPj4gJCRAO1wKKwkgICAgICAgICQoaWYgJChmaWx0ZXIgJChPVVRfRElSKS8lLCQoZmlsZSkpLCBcCisJCWVjaG8gIiMgZnJvbSAkKG5vdGRpciAkKGZpbGUpKSIgPj4gJCRAO1wKKwkJLFwKKwkJZWNobyAiIyBmcm9tICQoZmlsZSkiID4+ICQkQDtcCisJCSlcCiAJICAgICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICQkQDtcCiAJICAgICAgICBjYXQgJChmaWxlKSA+PiAkJEA7XAogCSAgICBmaTspCkBAIC0xNjAsNjEgKzE2MCw2IEBACiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCgyKSkKIGVuZGVmCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGZpbmdlcnByaW50LCB0aHVtYnByaW50LCBhbmQgdmVyc2lvbiB0YWdzIGZvciB0aGUgY3VycmVudCBidWlsZAotIwotIyBCVUlMRF9WRVJTSU9OX1RBR1MgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YWdzIGNob3NlbiBieSB0aGUgZGV2aWNlCi0jIGltcGxlbWVudGVyIHRoYXQgZnVydGhlciBkaXN0aW5ndWlzaGVzIHRoZSBidWlsZC4gSXQncyBiYXNpY2FsbHkgZGVmaW5lZAotIyBieSB0aGUgZGV2aWNlIGltcGxlbWVudGVyLiBIZXJlLCB3ZSBhcmUgYWRkaW5nIGEgbWFuZGF0b3J5IHRhZyB0aGF0Ci0jIGlkZW50aWZpZXMgdGhlIHNpZ25pbmcgY29uZmlnIG9mIHRoZSBidWlsZC4KLUJVSUxEX1ZFUlNJT05fVEFHUyA6PSAkKEJVSUxEX1ZFUlNJT05fVEFHUykKLWlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQotICBCVUlMRF9WRVJTSU9OX1RBR1MgKz0gZGVidWcKLWVuZGlmCi0jIFRoZSAidGVzdC1rZXlzIiB0YWcgbWFya3MgYnVpbGRzIHNpZ25lZCB3aXRoIHRoZSBvbGQgdGVzdCBrZXlzLAotIyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBTREsuICAiZGV2LWtleXMiIG1hcmtzIGJ1aWxkcyBzaWduZWQgd2l0aAotIyBub24tZGVmYXVsdCBkZXYga2V5cyAodXN1YWxseSBwcml2YXRlIGtleXMgZnJvbSBhIHZlbmRvciBkaXJlY3RvcnkpLgotIyBCb3RoIG9mIHRoZXNlIHRhZ3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoICJyZWxlYXNlLWtleXMiCi0jIHdoZW4gdGhlIHRhcmdldC1maWxlcyBpcyBzaWduZWQgaW4gYSBwb3N0LWJ1aWxkIHN0ZXAuCi1pZmVxICgkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSksYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5KQotQlVJTERfS0VZUyA6PSB0ZXN0LWtleXMKLWVsc2UKLUJVSUxEX0tFWVMgOj0gZGV2LWtleXMKLWVuZGlmCi1CVUlMRF9WRVJTSU9OX1RBR1MgKz0gJChCVUlMRF9LRVlTKQotQlVJTERfVkVSU0lPTl9UQUdTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQlVJTERfVkVSU0lPTl9UQUdTKSkpCi0KLSMgQlVJTERfRklOR0VSUFJJTlQgaXMgdXNlZCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb21iaW5lZCBidWlsZCBhbmQKLSMgcHJvZHVjdDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KLWlmZXEgKCwkKHN0cmlwICQoQlVJTERfRklOR0VSUFJJTlQpKSkKLSAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKTokKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS8kKEJVSUxEX1ZFUlNJT05fVEFHUykKLWVuZGlmCi0KLUJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfZmluZ2VycHJpbnQudHh0Ci1pZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX0ZJTkdFUlBSSU5UKSA+JChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSAmJiBncmVwICIgIiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSkKLSAgJChlcnJvciBCVUlMRF9GSU5HRVJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKGZpbGUgPCQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpIikKLWVuZGlmCi1CVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpCi0jIHVuc2V0IGl0IGZvciBzYWZldHkuCi1CVUlMRF9GSU5HRVJQUklOVCA6PQotCi0jIEJVSUxEX1RIVU1CUFJJTlQgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgc3lzdGVtIGJ1aWxkOyB1c2VkIGJ5IHRoZQotIyBPVEEgc2VydmVyLiBUaGlzIHB1cnBvc2VmdWxseSBleGNsdWRlcyBhbnkgcHJvZHVjdC1zcGVjaWZpYyB2YXJpYWJsZXMuCi1pZmVxICgsJChzdHJpcCAkKEJVSUxEX1RIVU1CUFJJTlQpKSkKLSAgQlVJTERfVEhVTUJQUklOVCA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLyQoQlVJTERfSUQpLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSk6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCi1lbmRpZgotCi1CVUlMRF9USFVNQlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfdGh1bWJwcmludC50eHQKLWlmZXEgKCQoc3RyaXAgJChIQVNfQlVJTERfTlVNQkVSKSksdHJ1ZSkKLSQoQlVJTERfVEhVTUJQUklOVF9GSUxFKTogJChCVUlMRF9OVU1CRVJfRklMRSkKLWVuZGlmCi1pZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKLSAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCi1lbmRpZgotIyB1bnNldCBpdCBmb3Igc2FmZXR5LgotQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9Ci1CVUlMRF9USFVNQlBSSU5UIDo9Ci0KIEtOT1dOX09FTV9USFVNQlBSSU5UX1BST1BFUlRJRVMgOj0gXAogICAgIHJvLnByb2R1Y3QuYnJhbmQgXAogICAgIHJvLnByb2R1Y3QubmFtZSBcCkBAIC0yMjYsNTAgKzE3MSwxMSBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBzeXN0ZW0vYnVpbGQucHJvcAogIwotIyBOb3RlOiBwYXJ0cyBvZiB0aGlzIGZpbGUgdGhhdCBjYW4ndCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkLXByb3BlcnRpZXMKLSMgbWFjcm8gYXJlIG1hbnVhbGx5IGNyZWF0ZWQgYXMgc2VwYXJhdGUgZmlsZXMgYW5kIHRoZW4gZmVkIGludG8gdGhlIG1hY3JvCi0KLWJ1aWxkaW5mb19wcm9wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLGJ1aWxkaW5mby5wcm9wKS9idWlsZGluZm8ucHJvcAotCi1pZmRlZiBUQVJHRVRfU1lTVEVNX1BST1AKLXN5c3RlbV9wcm9wX2ZpbGUgOj0gJChUQVJHRVRfU1lTVEVNX1BST1ApCi1lbHNlCi1zeXN0ZW1fcHJvcF9maWxlIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvc3lzdGVtLnByb3ApCi1lbmRpZgotCi1fcHJvcF9maWxlc18gOj0gXAotICAkKGJ1aWxkaW5mb19wcm9wKSBcCi0gICQoc3lzdGVtX3Byb3BfZmlsZSkKLQotIyBPcmRlciBtYXR0ZXJzIGhlcmUuIFdoZW4gdGhlcmUgYXJlIGR1cGxpY2F0ZXMsIHRoZSBsYXN0IG9uZSB3aW5zLgotIyBUT0RPKGIvMTE3ODkyMzE4KTogZG9uJ3QgYWxsb3cgZHVwbGljYXRlcyBzbyB0aGF0IHRoZSBvcmRlcmluZyBkb2Vzbid0IG1hdHRlcgotX3Byb3BfdmFyc18gOj0gXAotICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgXAotICAgIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMKLQotIyBUT0RPKGIvMTE3ODkyMzE4KTogZGVwcmVjYXRlIHRoaXMKLV9wcm9wX3ZhcnNfICs9IFwKLSAgICBQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMKLQotaWZuZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCi1fcHJvcF92YXJzXyArPSBcCi0gICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyBcCi0gICAgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUwotZW5kaWYKKyMgc3lzdGVtL2J1aWxkLnByb3AgaXMgYnVpbHQgYnkgU29vbmcuIFNlZSBzeXN0ZW0tYnVpbGQucHJvcCBtb2R1bGUgaW4KKyMgYnVpbGQvc29vbmcvQW5kcm9pZC5icC4KIAogSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVCkvYnVpbGQucHJvcAogCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIHN5c3RlbSxcCi0gICAgJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKF9wcm9wX2ZpbGVzXyksXAotICAgICQoX3Byb3BfdmFyc18pLFwKLSAgICAkKFBST0RVQ1RfU1lTVEVNX1BST1BFUlRZX0JMQUNLTElTVCksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpKSkKLQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB2ZW5kb3IvYnVpbGQucHJvcAogIwpAQCAtMzEzLDE3MSArMjE5LDQ3IEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHByb2R1Y3QvZXRjL2J1aWxkLnByb3AKICMKLQotX3Byb3BfZmlsZXNfIDo9ICQoaWYgJChUQVJHRVRfUFJPRFVDVF9QUk9QKSxcCi0gICAgJChUQVJHRVRfUFJPRFVDVF9QUk9QKSxcCi0gICAgJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9wcm9kdWN0LnByb3ApKQotCi0jIE9yZGVyIG1hdHRlcnMgaGVyZS4gV2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlcywgdGhlIGxhc3Qgb25lIHdpbnMuCi0jIFRPRE8oYi8xMTc4OTIzMTgpOiBkb24ndCBhbGxvdyBkdXBsaWNhdGVzIHNvIHRoYXQgdGhlIG9yZGVyaW5nIGRvZXNuJ3QgbWF0dGVyCi1fcHJvcF92YXJzXyA6PSBcCi0gICAgQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgXAotICAgIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTCisjIHByb2R1Y3QvZXRjL2J1aWxkLnByb3AgaXMgYnVpbHQgYnkgU29vbmcuIFNlZSBwcm9kdWN0LWJ1aWxkLnByb3AgbW9kdWxlIGluCisjIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAuCiAKIElOU1RBTExFRF9QUk9EVUNUX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9QUk9EVUNUKS9ldGMvYnVpbGQucHJvcAogCi1pZmRlZiBQUk9EVUNUX09FTV9QUk9QRVJUSUVTCi1pbXBvcnRfb2VtX3Byb3AgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsaW1wb3J0X29lbV9wcm9wKS9vZW0ucHJvcAotCi0kKGltcG9ydF9vZW1fcHJvcCk6Ci0JJChoaWRlKSBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICRAOyBcCi0JICAgICAgICBlY2hvICIjIFBST0RVQ1RfT0VNX1BST1BFUlRJRVMiID4+ICRAOyBcCi0JICAgICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICRAOwotCSQoaGlkZSkgJChmb3JlYWNoIHByb3AsJChQUk9EVUNUX09FTV9QUk9QRVJUSUVTKSwgXAotCSAgICBlY2hvICJpbXBvcnQgL29lbS9vZW0ucHJvcCAkKHByb3ApIiA+PiAkQDspCi0KLV9mb290ZXJzXyA6PSAkKGltcG9ydF9vZW1fcHJvcCkKLWVsc2UKLV9mb290ZXJzXyA6PQotZW5kaWYKLQotIyBTa2lwIGNvbW1vbiAvcHJvZHVjdCBwcm9wZXJ0aWVzIGdlbmVyYXRpb24gaWYgZGV2aWNlIHJlbGVhc2VkIGJlZm9yZSBSIGFuZAotIyBoYXMgbm8gcHJvZHVjdCBwYXJ0aXRpb24uIFRoaXMgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNoZWNrLgotaWZlcSAoJChjYWxsIG1hdGhfbHQsJChpZiAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwzMCksMzApLCB0cnVlKQotICBfc2tpcF9jb21tb25fcHJvcGVydGllcyA6PSB0cnVlCi1lbmRpZgotCi0jIFRoZSBzZWNvbmQgcGFydCBvZiB0aGUgY2hlY2sgLSBhbHdheXMgZ2VuZXJhdGUgY29tbW9uIHByb3BlcnRpZXMgZm9yIHRoZQotIyBkZXZpY2VzIHdpdGggcHJvZHVjdCBwYXJ0aXRpb24gcmVnYXJkbGVzcyBvZiBzaGlwcGluZyBsZXZlbC4KLWlmbmVxICgkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSwpCi0gIF9za2lwX2NvbW1vbl9wcm9wZXJ0aWVzIDo9Ci1lbmRpZgotCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIHByb2R1Y3QsXAotICAgICQoSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKF9wcm9wX2ZpbGVzXyksXAotICAgICQoX3Byb3BfdmFyc18pLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChfZm9vdGVyc18pLFwKLSAgICAkKF9za2lwX2NvbW1vbl9wcm9wZXJ0aWVzKSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi1fc2tpcF9jb21tb25fcHJvcGVydGllcyA6PQotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgb2RtL2V0Yy9idWlsZC5wcm9wCiAjCi1fcHJvcF9maWxlc18gOj0gJChpZiAkKFRBUkdFVF9PRE1fUFJPUCksXAotICAgICQoVEFSR0VUX09ETV9QUk9QKSxcCi0gICAgJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9vZG0ucHJvcCkpCi0KLSMgT3JkZXIgbWF0dGVycyBoZXJlLiBXaGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCB0aGUgbGFzdCBvbmUgd2lucy4KLSMgVE9ETyhiLzExNzg5MjMxOCk6IGRvbid0IGFsbG93IGR1cGxpY2F0ZXMgc28gdGhhdCB0aGUgb3JkZXJpbmcgZG9lc24ndCBtYXR0ZXIKLV9wcm9wX3ZhcnNfIDo9IFwKLSAgICBBRERJVElPTkFMX09ETV9QUk9QRVJUSUVTIFwKLSAgICBQUk9EVUNUX09ETV9QUk9QRVJUSUVTCisjIG9kbS9ldGMvYnVpbGQucHJvcCBpcyBidWlsdCBieSBTb29uZy4gU2VlIG9kbS1idWlsZC5wcm9wIG1vZHVsZSBpbgorIyBidWlsZC9zb29uZy9BbmRyb2lkLmJwLgogCiBJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9PRE0pL2V0Yy9idWlsZC5wcm9wCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIG9kbSxcCi0gICAgJChJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChfcHJvcF9maWxlc18pLFwKLSAgICAkKF9wcm9wX3ZhcnNfKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUKSkpCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB2ZW5kb3JfZGxrbS9ldGMvYnVpbGQucHJvcAotIworIyBvZG1fZGxrbS9ldGMvYnVpbGQucHJvcAorIyBzeXN0ZW1fZGxrbS9idWlsZC5wcm9wCisjIFRoZXNlIGFyZSBidWlsdCBieSBTb29uZy4gU2VlIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAKIAogSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkvZXRjL2J1aWxkLnByb3AKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgdmVuZG9yX2Rsa20sXAotICAgICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9WRU5ET1JfRExLTV9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgb2RtX2Rsa20vZXRjL2J1aWxkLnByb3AKLSMKLQogSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9PRE1fRExLTSkvZXRjL2J1aWxkLnByb3AKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgb2RtX2Rsa20sXAotICAgICQoSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9PRE1fRExLTV9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgc3lzdGVtX2Rsa20vYnVpbGQucHJvcAotIwotCiBJTlNUQUxMRURfU1lTVEVNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMvYnVpbGQucHJvcAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBzeXN0ZW1fZGxrbSxcCi0gICAgJChJTlNUQUxMRURfU1lTVEVNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSkpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSBcCisgICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSBcCisgICQoSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSBcCisgICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSBcCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgc3lzdGVtX2V4dC9ldGMvYnVpbGQucHJvcAogIwotX3Byb3BfZmlsZXNfIDo9ICQoaWYgJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSxcCi0gICAgJChUQVJHRVRfU1lTVEVNX0VYVF9QUk9QKSxcCi0gICAgJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9zeXN0ZW1fZXh0LnByb3ApKQotCi0jIE9yZGVyIG1hdHRlcnMgaGVyZS4gV2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlcywgdGhlIGxhc3Qgb25lIHdpbnMuCi0jIFRPRE8oYi8xMTc4OTIzMTgpOiBkb24ndCBhbGxvdyBkdXBsaWNhdGVzIHNvIHRoYXQgdGhlIG9yZGVyaW5nIGRvZXNuJ3QgbWF0dGVyCi1fcHJvcF92YXJzXyA6PSBQUk9EVUNUX1NZU1RFTV9FWFRfUFJPUEVSVElFUworIyBzeXN0ZW1fZXh0L2V0Yy9idWlsZC5wcm9wIGlzIGJ1aWx0IGJ5IFNvb25nLiBTZWUgc3lzdGVtLWJ1aWxkLnByb3AgbW9kdWxlIGluCisjIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAuCiAKIElOU1RBTExFRF9TWVNURU1fRVhUX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9ldGMvYnVpbGQucHJvcAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBzeXN0ZW1fZXh0LFwKLSAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChfcHJvcF9maWxlc18pLFwKLSAgICAkKF9wcm9wX3ZhcnNfKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfU1lTVEVNX0VYVF9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgcmFtZGlzay9ib290L2V0Yy9idWlsZC5wcm9wCi0jCiAKIFJBTURJU0tfQlVJTERfUFJPUF9SRUxfUEFUSCA6PSBzeXN0ZW0vZXRjL3JhbWRpc2svYnVpbGQucHJvcAoraWZlcSAodHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpCitJTlNUQUxMRURfUkFNRElTS19CVUlMRF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvZmlyc3Rfc3RhZ2VfcmFtZGlzay8kKFJBTURJU0tfQlVJTERfUFJPUF9SRUxfUEFUSCkKK2Vsc2UKIElOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX1JBTURJU0tfT1VUKS8kKFJBTURJU0tfQlVJTERfUFJPUF9SRUxfUEFUSCkKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgYm9vdGltYWdlLFwKLSAgICAkKElOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUKSkpCitlbmRpZgogCiBBTExfSU5TVEFMTEVEX0JVSUxEX1BST1BfRklMRVMgOj0gXAogICAkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCkgXApkaWZmIC0tZ2l0IGEvY29yZS9zeXNwcm9wX2NvbmZpZy5tayBiL2NvcmUvc3lzcHJvcF9jb25maWcubWsKaW5kZXggZjliOWQxYy4uMTk5MTUwMyAxMDA2NDQKLS0tIGEvY29yZS9zeXNwcm9wX2NvbmZpZy5taworKysgYi9jb3JlL3N5c3Byb3BfY29uZmlnLm1rCkBAIC0xNSw2MyArMTUsOSBAQAogKQogX2FkZGl0aW9uYWxfcHJvcF92YXJfbmFtZXMgOj0KIAotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBZGQgdGhlIHByb2R1Y3QtZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIHRoZSBidWlsZCBwcm9wZXJ0aWVzLgotaWZuZXEgKCQoQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQpLCB0cnVlKQotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9ICQoUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMpCi1lbHNlCi0gIGlmbmRlZiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCi0gICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKQotICBlbmRpZgotZW5kaWYKLQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby50cmVibGUuZW5hYmxlZD0ke1BST0RVQ1RfRlVMTF9UUkVCTEV9Ci0KLSMgU2V0IHJvLmxsbmRrLmFwaV9sZXZlbCB0byBzaG93IHRoZSBtYXhpbXVtIHZlbmRvciBBUEkgbGV2ZWwgdGhhdCB0aGUgTExOREsgaW4KLSMgdGhlIHN5c3RlbSBwYXJ0aXRpb24gc3VwcG9ydHMuCi1pZmRlZiBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTAotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5sbG5kay5hcGlfbGV2ZWw9JChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTCkKLWVuZGlmCi0KLSMgU2V0cyByby5hY3Rpb25hYmxlX2NvbXBhdGlibGVfcHJvcGVydHkuZW5hYmxlZCB0byBrbm93IG9uIHJ1bnRpbWUgd2hldGhlciB0aGUKLSMgYWxsb3dlZCBsaXN0IG9mIGFjdGlvbmFibGUgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIGlzIGVuYWJsZWQgb3Igbm90LgotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hY3Rpb25hYmxlX2NvbXBhdGlibGVfcHJvcGVydHkuZW5hYmxlZD10cnVlCi0KLSMgQWRkIHRoZSBzeXN0ZW0gc2VydmVyIGNvbXBpbGVyIGZpbHRlciBpZiB0aGV5IGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBwcm9kdWN0LgotaWZuZXEgKCwkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIpKQotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLnN5c3RlbXNlcnZlcmNvbXBpbGVyZmlsdGVyPSQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0NPTVBJTEVSX0ZJTFRFUikKLWVuZGlmCi0KLSMgQWRkIHRoZSAxNksgZGV2ZWxvcGVyIG9wdGlvbiBpZiBpdCBpcyBkZWZpbmVkIGZvciB0aGUgcHJvZHVjdC4KLWlmZXEgKCQoUFJPRFVDVF8xNktfREVWRUxPUEVSX09QVElPTiksdHJ1ZSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYnVpbGQuMTZrX3BhZ2UuZW5hYmxlZD10cnVlCi1lbHNlCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LmJ1aWxkLjE2a19wYWdlLmVuYWJsZWQ9ZmFsc2UKLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX0JPT1RTXzE2SyksdHJ1ZSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QucGFnZV9zaXplPTE2Mzg0Ci1lbHNlCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LnBhZ2Vfc2l6ZT00MDk2Ci1lbmRpZgotCi0jIEVuYWJsZSBjb3JlIHBsYXRmb3JtIEFQSSB2aW9sYXRpb24gd2FybmluZ3Mgb24gdXNlcmRlYnVnIGFuZCBlbmcgYnVpbGRzLgotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHBlcnNpc3QuZGVidWcuZGFsdmlrLnZtLmNvcmVfcGxhdGZvcm1fYXBpX3BvbGljeT1qdXN0LXdhcm4KLWVuZGlmCi0KLSMgRGVmaW5lIHJvLnNhbml0aXplLjxuYW1lPiBwcm9wZXJ0aWVzIGZvciBhbGwgZ2xvYmFsIHNhbml0aXplcnMuCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9ICQoZm9yZWFjaCBzLCQoU0FOSVRJWkVfVEFSR0VUKSxyby5zYW5pdGl6ZS4kKHMpPXRydWUpCi0KLSMgU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXggdG8gL3N5c3RlbS4KLSMgRGV2aWNlIGJvYXJkIGNvbmZpZyBzaG91bGQgb3ZlcnJpZGUgdGhlIHZhbHVlIHRvIC9wcm9kdWN0IHdoZW4gbmVlZGVkIGJ5OgotIwotIyAgICAgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucG9zdGluc3RhbGwuZnN0YWIucHJlZml4PS9wcm9kdWN0Ci0jCi0jIEl0IHRoZW4gdXNlcyAke3JvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeH0vZXRjL2ZzdGFiLnBvc3RpbnN0YWxsIHRvCi0jIG1vdW50IHN5c3RlbV9vdGhlciBwYXJ0aXRpb24uCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeD0vc3lzdGVtCiskKEtBVElfb2Jzb2xldGVfdmFyIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMsVXNlIGJ1aWxkL3Nvb25nL3NjcmlwdHMvZ2VuX2J1aWxkX3Byb3AucHkgaW5zdGVhZCkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQURESVRJT05BTF9PRE1fUFJPUEVSVElFUyxVc2UgYnVpbGQvc29vbmcvc2NyaXB0cy9nZW5fYnVpbGRfcHJvcC5weSBpbnN0ZWFkKQorJChLQVRJX29ic29sZXRlX3ZhciBBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyxVc2UgYnVpbGQvc29vbmcvc2NyaXB0cy9nZW5fYnVpbGRfcHJvcC5weSBpbnN0ZWFkKQogCiAjIEFkZCBjcHUgcHJvcGVydGllcyBmb3IgYmlvbmljIGFuZCBBUlQuCiBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5hcmNoPSQoVEFSR0VUX0FSQ0gpCkBAIC0xNDUsOCArOTEsMTIgQEAKICMgQnVpbGQgc3lzdGVtIHNldCBCT0FSRF9BUElfTEVWRUwgdG8gc2hvdyB0aGUgYXBpIGxldmVsIG9mIHRoZSB2ZW5kb3IgQVBJIHN1cmZhY2UuCiAjIFRoaXMgbXVzdCBub3QgYmUgYWx0ZXJlZCBvdXRzaWRlIG9mIGJ1aWxkIHN5c3RlbS4KIGlmZGVmIEJPQVJEX0FQSV9MRVZFTAotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8uYm9hcmQuYXBpX2xldmVsPSQoQk9BUkRfQVBJX0xFVkVMKQorICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby5ib2FyZC5hcGlfbGV2ZWw/PSQoQk9BUkRfQVBJX0xFVkVMKQorICBpZmRlZiBCT0FSRF9BUElfTEVWRUxfUFJPUF9PVkVSUklERQorICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgICAgcm8uYm9hcmQuYXBpX2xldmVsPSQoQk9BUkRfQVBJX0xFVkVMX1BST1BfT1ZFUlJJREUpCisgIGVuZGlmCiBlbmRpZgogIyBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gaXMgdHJ1ZSB3aGVuIHRoZSB2ZW5kb3IgQVBJIHN1cmZhY2UgaXMgZnJvemVuLgogaWZkZWYgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUxfRlJPWkVOCkBAIC0xODQsMTE4ICsxMzQsMTYgQEAKICAgICByby5idWlsZC5hYl91cGRhdGU9JChBQl9PVEFfVVBEQVRFUikKIGVuZGlmCiAKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLmJ1aWxkLmNoYXJhY3RlcmlzdGljcz0kKFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUykKLQogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYWJfb3RhX3BhcnRpdGlvbnM9JChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHNvcnQgJChBQl9PVEFfUEFSVElUSU9OUykpKQogQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52ZW5kb3IuYnVpbGQuYWJfb3RhX3BhcnRpdGlvbnM9JChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHNvcnQgJChBQl9PVEFfUEFSVElUSU9OUykpKQogZW5kaWYKIAotIyBTZXQgdGhpcyBwcm9wZXJ0eSBmb3IgVlRTIHRvIHNraXAgbGFyZ2UgcGFnZSBzaXplIHRlc3RzIG9uIHVuc3VwcG9ydGVkIGRldmljZXMuCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCi0gICAgcm8ucHJvZHVjdC5jcHUucGFnZXNpemUubWF4PSQoVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEKQotCi1pZmVxICgkKFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyksdHJ1ZSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYnVpbGQubm9fYmlvbmljX3BhZ2Vfc2l6ZV9tYWNybz10cnVlCi1lbmRpZgotCiB1c2VyX3ZhcmlhbnQgOj0gJChmaWx0ZXIgdXNlciB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpCi1lbmFibGVfdGFyZ2V0X2RlYnVnZ2luZyA6PSB0cnVlCi1lbmFibGVfZGFsdmlrX2xvY2tfY29udGVudGlvbl9sb2dnaW5nIDo9IHRydWUKLWlmbmVxICgsJCh1c2VyX3ZhcmlhbnQpKQotICAjIFRhcmdldCBpcyBzZWN1cmUgaW4gdXNlciBidWlsZHMuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTEKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBzZWN1cml0eS5wZXJmX2hhcmRlbj0xCi0KLSAgaWZlcSAoJCh1c2VyX3ZhcmlhbnQpLHVzZXIpCi0gICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hZGIuc2VjdXJlPTEKLSAgZW5kaWYKLQotICBpZm5lcSAoJCh1c2VyX3ZhcmlhbnQpLHVzZXJkZWJ1ZykKLSAgICAjIERpc2FibGUgZGVidWdnaW5nIGluIHBsYWluIHVzZXIgYnVpbGRzLgotICAgIGVuYWJsZV90YXJnZXRfZGVidWdnaW5nIDo9Ci0gICAgZW5hYmxlX2RhbHZpa19sb2NrX2NvbnRlbnRpb25fbG9nZ2luZyA6PQotICBlbHNlCi0gICAgIyBEaXNhYmxlIGRlYnVnZ2luZyBpbiB1c2VyZGVidWcgYnVpbGRzIGlmIFBST0RVQ1RfTk9UX0RFQlVHR0FCTEVfSU5fVVNFUkRFQlVHCi0gICAgIyBpcyBzZXQuCi0gICAgaWZuZXEgKCwkKHN0cmlwICQoUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcpKSkKLSAgICAgIGVuYWJsZV90YXJnZXRfZGVidWdnaW5nIDo9Ci0gICAgZW5kaWYKLSAgZW5kaWYKLQotICAjIERpc2FsbG93IG1vY2sgbG9jYXRpb25zIGJ5IGRlZmF1bHQgZm9yIHVzZXIgYnVpbGRzCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWxsb3cubW9jay5sb2NhdGlvbj0wCi0KLWVsc2UgIyAhdXNlcl92YXJpYW50Ci0gICMgVHVybiBvbiBjaGVja2puaSBmb3Igbm9uLXVzZXIgYnVpbGRzLgotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmtlcm5lbC5hbmRyb2lkLmNoZWNram5pPTEKLSAgIyBTZXQgZGV2aWNlIGluc2VjdXJlIGZvciBub24tdXNlciBidWlsZHMuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTAKLSAgIyBBbGxvdyBtb2NrIGxvY2F0aW9ucyBieSBkZWZhdWx0IGZvciBub24gdXNlciBidWlsZHMKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hbGxvdy5tb2NrLmxvY2F0aW9uPTEKLWVuZGlmICMgIXVzZXJfdmFyaWFudAotCi1pZmVxICh0cnVlLCQoc3RyaXAgJChlbmFibGVfZGFsdmlrX2xvY2tfY29udGVudGlvbl9sb2dnaW5nKSkpCi0gICMgRW5hYmxlIERhbHZpayBsb2NrIGNvbnRlbnRpb24gbG9nZ2luZy4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0ubG9ja3Byb2YudGhyZXNob2xkPTUwMAotZW5kaWYgIyAhZW5hYmxlX2RhbHZpa19sb2NrX2NvbnRlbnRpb25fbG9nZ2luZwotCi1pZmVxICh0cnVlLCQoc3RyaXAgJChlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZykpKQotICAjIFRhcmdldCBpcyBtb3JlIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb24gYnkgZGVmYXVsdAotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmRlYnVnZ2FibGU9MQotZWxzZSAjICFlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZwotICAjIFRhcmdldCBpcyBsZXNzIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb2ZmIGJ5IGRlZmF1bHQKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5kZWJ1Z2dhYmxlPTAKLWVuZGlmICMgIWVuYWJsZV90YXJnZXRfZGVidWdnaW5nCi0KLWVuYWJsZV90YXJnZXRfZGVidWdnaW5nOj0KLWVuYWJsZV9kYWx2aWtfbG9ja19jb250ZW50aW9uX2xvZ2dpbmc6PQotCi1pZm5lcSAoJChmaWx0ZXIgc2RrIHNka19hZGRvbiwkKE1BS0VDTURHT0FMUykpLCkKLV9pc19zZGtfYnVpbGQgOj0gdHJ1ZQotZW5kaWYKLQotaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksZW5nKQotaWZuZXEgKCQoZmlsdGVyIHJvLnNldHVwd2l6YXJkLm1vZGU9RU5BQkxFRCwgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpKSksKQotICAjIERvbid0IHJlcXVpcmUgdGhlIHNldHVwIHdpemFyZCBvbiBlbmcgYnVpbGRzCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgOj0gJChmaWx0ZXItb3V0IHJvLnNldHVwd2l6YXJkLm1vZGU9JSxcCi0gICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpKSkgXAotICAgICAgICAgIHJvLnNldHVwd2l6YXJkLm1vZGU9T1BUSU9OQUwKLWVuZGlmCi1pZm5kZWYgX2lzX3Nka19idWlsZAotICAjIFRvIHNwZWVkdXAgc3RhcnR1cCBvZiBub24tcHJlb3B0ZWQgYnVpbGRzLCBkb24ndCB2ZXJpZnkgb3IgY29tcGlsZSB0aGUgYm9vdCBpbWFnZS4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaW1hZ2UtZGV4Mm9hdC1maWx0ZXI9ZXh0cmFjdAotZW5kaWYKLSMgYi8zMjM1NjY1MzUKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gaW5pdC5zdmNfZGVidWcubm9fZmF0YWwuenlnb3RlPXRydWUKLWVuZGlmCi0KLWlmZGVmIF9pc19zZGtfYnVpbGQKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0geG1wcC5hdXRvLXByZXNlbmNlPXRydWUKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uY29uZmlnLm5vY2hlY2tpbj15ZXMKLWVuZGlmCi0KLV9pc19zZGtfYnVpbGQgOj0KLQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBuZXQuYnQubmFtZT1BbmRyb2lkCi0KLSMgVGhpcyBwcm9wZXJ0eSBpcyBzZXQgYnkgZmxhc2hpbmcgZGVidWcgYm9vdCBpbWFnZSwgc28gZGVmYXVsdCB0byBmYWxzZS4KLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZm9yY2UuZGVidWdnYWJsZT0wCiAKIGNvbmZpZ19lbmFibGVfdWZmZF9nYyA6PSBcCiAgICQoZmlyc3R3b3JkICQoT1ZFUlJJREVfRU5BQkxFX1VGRkRfR0MpICQoUFJPRFVDVF9FTkFCTEVfVUZGRF9HQykgZGVmYXVsdCkKIAotIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN5c3RlbSBwcm9wZXJ0eSB0aGF0IGNvbnRyb2xzIHRoZSBBUlQgbW9kdWxlLiBUaGUgcGxhbiBpcwotIyB0byByZW1vdmUgaXQgYnkgQXVnIDIwMjUsIGF0IHdoaWNoIHRpbWUgTWFpbmxpbmUgdXBkYXRlcyBvZiB0aGUgQVJUIG1vZHVsZQotIyB3aWxsIGlnbm9yZSBpdCBhcyB3ZWxsLgotIyBJZiB0aGUgdmFsdWUgaXMgImRlZmF1bHQiLCBpdCB3aWxsIGJlIG1hbmdsZWQgYnkgcG9zdF9wcm9jZXNzX3Byb3BzLnB5LgotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8uZGFsdmlrLnZtLmVuYWJsZV91ZmZkX2djPSQoY29uZmlnX2VuYWJsZV91ZmZkX2djKQotCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTKSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUykpCiBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTKSkKIAogLktBVElfUkVBRE9OTFkgKz0gXAotICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgXAotICAgIEFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIFwKICAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rIGIvY29yZS90YXNrcy9hcnQtaG9zdC10ZXN0cy5tawppbmRleCBjOTVmNmU3Li5lYjU0ZmFlIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvYXJ0LWhvc3QtdGVzdHMubWsKQEAgLTQ3LDIxICs0NywxNiBAQAogCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCiAJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3Q7IFwKIAlkb25lCi0JZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0IFwKLQkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IFwKIAkgIC1QIGhvc3QvdGVzdGNhc2VzIC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdCBcCiAJICAtc2hhMjU2CiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0ID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKLQlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfYXJ0X2hvc3RfdGVzdHNfY29uZmlnc196aXApIFwKLQkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKLQkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC10ZXN0LWNvbmZpZ3MubGlzdAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QtdGVzdC1jb25maWdzLmxpc3QKIAlncmVwICQoSE9TVF9PVVQpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfYXJ0X2hvc3RfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApIFwKIAkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXNoYXJlZC1saWJzLmxpc3QKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgfCBzZWQgcyUkKEhPU1RfT1VUKSVob3N0JWcgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2FydC1ob3N0LXRlc3RzX2xpc3QKLQlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQubGlzdCB8IHNlZCBzJSQoUFJPRFVDVF9PVVQpJXRhcmdldCVnID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvYXJ0LWhvc3QtdGVzdHNfbGlzdAogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9hcnRfaG9zdF90ZXN0c19saXN0X3ppcCkgLUMgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKSAtZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2FydC1ob3N0LXRlc3RzX2xpc3QKIAogYXJ0LWhvc3QtdGVzdHM6ICQoYXJ0X2hvc3RfdGVzdHNfemlwKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9hdXRvcmVwcm8ubWsgYi9jb3JlL3Rhc2tzL2F1dG9yZXByby5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgxZjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9hdXRvcmVwcm8ubWsKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZuZXEgKCQod2lsZGNhcmQgdGVzdC9zdHMvUkVBRE1FLWF1dG9yZXByby5tZCksKQordGVzdF9zdWl0ZV9uYW1lIDo9IGF1dG9yZXBybwordGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBzdHMtdHJhZGVmZWQKK3Rlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3Qvc3RzL1JFQURNRS1hdXRvcmVwcm8ubWQKK2F1dG9yZXByb196aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2F1dG9yZXByby56aXAKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taworCithdXRvcmVwcm9fcGx1Z2luX3NrZWwgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsYXV0b3JlcHJvLXBsdWdpbi1za2VsLnppcCkvYXV0b3JlcHJvLXBsdWdpbi1za2VsLnppcAorCiskKGF1dG9yZXByb196aXApOiBBVVRPUkVQUk9fWklQIDo9ICQoY29tcGF0aWJpbGl0eV96aXApCiskKGF1dG9yZXByb196aXApOiBBVVRPUkVQUk9fUExVR0lOX1NLRUwgOj0gJChhdXRvcmVwcm9fcGx1Z2luX3NrZWwpCiskKGF1dG9yZXByb196aXApOiAkKE1FUkdFX1pJUFMpICQoWklQMlpJUCkgJChjb21wYXRpYmlsaXR5X3ppcCkgJChhdXRvcmVwcm9fcGx1Z2luX3NrZWwpCisJcm0gLWYgJEAgJChBVVRPUkVQUk9fWklQKV9maWx0ZXJlZAorCSQoWklQMlpJUCkgLWkgJChBVVRPUkVQUk9fWklQKSAtbyAkKEFVVE9SRVBST19aSVApX2ZpbHRlcmVkIFwKKwkJLXggYW5kcm9pZC1hdXRvcmVwcm8vdG9vbHMvc3RzLXRyYWRlZmVkLXRlc3RzLmphciBcCisJCSdhbmRyb2lkLWF1dG9yZXByby90b29scy8qOmF1dG9yZXByby9zcmMvbWFpbi9yZXNvdXJjZXMvc3RzLXRyYWRlZmVkLXRvb2xzLycKKwkkKE1FUkdFX1pJUFMpICRAICQoQVVUT1JFUFJPX1pJUClfZmlsdGVyZWQgJChBVVRPUkVQUk9fUExVR0lOX1NLRUwpCisJcm0gLWYgJChBVVRPUkVQUk9fWklQKV9maWx0ZXJlZAorCisuUEhPTlk6IGF1dG9yZXBybworYXV0b3JlcHJvOiAkKGF1dG9yZXByb196aXApCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGF1dG9yZXBybywgJChhdXRvcmVwcm9femlwKSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLm1rIGIvY29yZS90YXNrcy9jaGVjay1hYmktZHVtcC1saXN0Lm1rCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIHRhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLm1rCnJlbmFtZSB0byBjb3JlL3Rhc2tzL2NoZWNrLWFiaS1kdW1wLWxpc3QubWsKaW5kZXggMzY4OTdmZS4uODFkNTQ5ZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQubWsKKysrIGIvY29yZS90YXNrcy9jaGVjay1hYmktZHVtcC1saXN0Lm1rCkBAIC0xLDQgKzEsMTYgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENoZWNrIHRoZSBnZW5lcmF0ZSBsaXN0IGFnYWluc3QgdGhlIGxhdGVzdCBsaXN0IHN0b3JlZCBpbiB0aGUKQEAgLTEwOSw2MCArMTIxLDMgQEAKIAkkKGlmICQoYWRkZWRfdm5ka19hYmlfZHVtcHMpJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLGV4aXQgMSkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgdG91Y2ggJEAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFZOREsgcGFja2FnZSBhbmQgc25hcHNob3QuCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gdm5ka19hcGV4X3NuYXBzaG90X3BhY2thZ2UKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGZvcmVhY2ggdm5ka192ZXIsJChQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMpLGNvbS5hbmRyb2lkLnZuZGsudiQodm5ka192ZXIpKQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZWZpbmUgUGhvbnkgbW9kdWxlIHRvIGluc3RhbGwgTExOREsgbW9kdWxlcyB3aGljaCBhcmUgaW5zdGFsbGVkIGluCi0jIHRoZSBzeXN0ZW0gaW1hZ2UKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxsbmRrX2luX3N5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi0KLSMgRmlsdGVyIExMTkRLIGxpYnMgbW92ZWQgdG8gQVBFWCB0byBhdm9pZCBwdWxsaW5nIHRoZW0gaW50byAvc3lzdGVtL0xJQgotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gICAgJChmaWx0ZXItb3V0ICQoTExOREtfTU9WRURfVE9fQVBFWF9MSUJSQVJJRVMpLCQoTExOREtfTElCUkFSSUVTKSkgXAotICAgIGxsbmRrLmxpYnJhcmllcy50eHQKLQotCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGluaXQuZ3NpLnJjLCBHU0ktc3BlY2lmaWMgaW5pdCBzY3JpcHQuCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGluaXQuZ3NpLnJjCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGluaXQKLQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGluaXQudm5kay1ub2RlZi5yYwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9TWVNURU1fRVhUX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBnc2kKLQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jdHMubWsgYi9jb3JlL3Rhc2tzL2N0cy5tawppbmRleCAyOTRjYjU3Li5kOWY2MTUwIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2N0cy5taworKysgYi9jb3JlL3Rhc2tzL2N0cy5tawpAQCAtOTcsMTIgKzk3LDI4IEBACiBjb3ZlcmFnZV9vdXQgOj0gJChIT1NUX09VVCkvY3RzLWFwaS1jb3ZlcmFnZQogYXBpX21hcF9vdXQgOj0gJChIT1NUX09VVCkvY3RzLWFwaS1tYXAKIAotY3RzX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9hcGlfbWFwX2ZpbGVzLnR4dAorY3RzX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9jdHNfamFyX2ZpbGVzLnR4dAorY3RzX2ludGVyYWN0aXZlX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9jdHNfaW50ZXJhY3RpdmVfamFyX2ZpbGVzLnR4dAorY3RzX2FsbF9qYXJfZmlsZXMgOj0gJChhcGlfbWFwX291dCkvY3RzX2FsbF9qYXJfZmlsZXMudHh0CisKICQoY3RzX2phcl9maWxlcyk6IFBSSVZBVEVfQVBJX01BUF9GSUxFUyA6PSAkKHNvcnQgJChDT01QQVRJQklMSVRZLmN0cy5BUElfTUFQX0ZJTEVTKSkKICQoY3RzX2phcl9maWxlcyk6CiAJbWtkaXIgLXAgJChkaXIgJEApCiAJZWNobyAkKFBSSVZBVEVfQVBJX01BUF9GSUxFUykgPiAkQAogCiskKGN0c19pbnRlcmFjdGl2ZV9qYXJfZmlsZXMpOiBQUklWQVRFX0FQSV9NQVBfRklMRVMgOj0gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5jdHMtaW50ZXJhY3RpdmUuQVBJX01BUF9GSUxFUykpCiskKGN0c19pbnRlcmFjdGl2ZV9qYXJfZmlsZXMpOiAkKFNPT05HX0FORFJPSURfQ1RTX1ZFUklGSUVSX0FQUF9MSVNUKQorCW1rZGlyIC1wICQoZGlyICRAKQorCWNwICQ8ICRACisJZWNobyAkKFBSSVZBVEVfQVBJX01BUF9GSUxFUykgPj4gJEAKKworJChjdHNfYWxsX2phcl9maWxlcyk6IFBSSVZBVEVfQVBJX01BUF9GSUxFUyA6PSAkKHNvcnQgJChDT01QQVRJQklMSVRZLmN0cy5BUElfTUFQX0ZJTEVTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKENPTVBBVElCSUxJVFkuY3RzLWludGVyYWN0aXZlLkFQSV9NQVBfRklMRVMpKQorJChjdHNfYWxsX2phcl9maWxlcyk6ICQoU09PTkdfQU5EUk9JRF9DVFNfVkVSSUZJRVJfQVBQX0xJU1QpCisJbWtkaXIgLXAgJChkaXIgJEApCisJY3AgJDwgJEAKKwllY2hvICQoUFJJVkFURV9BUElfTUFQX0ZJTEVTKSA+PiAkQAorCiBhcGlfeG1sX2Rlc2NyaXB0aW9uIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYXBpLnhtbAogCiBuYXBpX3RleHRfZGVzY3JpcHRpb24gOj0gY3RzL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2UvZXRjL25kay1hcGkueG1sCkBAIC0xMjQsMTMgKzE0MCwxNCBAQAogY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX2NvdmVyYWdlX2V4ZSkgJChkZXhkZXBzX2V4ZSkgJChhcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKG5hcGlfeG1sX2Rlc2NyaXB0aW9uKQogY3RzX3N5c3RlbV9hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpICQoZGV4ZGVwc19leGUpICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiAKLWN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2FwaS1tYXAueG1sCi1jdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvYXBpLW1hcC5odG1sCi1jdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvc3lzdGVtLWFwaS1tYXAueG1sCi1jdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL3N5c3RlbS1hcGktbWFwLmh0bWwKK2N0cy1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy1zeXN0ZW0tYXBpLW1hcC54bWwKK2N0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC54bWwKK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC54bWwKK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC1odG1sLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9jdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAuaHRtbAogCiBjdHNfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9tYXBfZXhlKSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c19qYXJfZmlsZXMpCi1jdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX21hcF9leGUpICQoYXBpX3htbF9kZXNjcmlwdGlvbikgJChjdHNfamFyX2ZpbGVzKQorY3RzX2ludGVyYWN0aXZlX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfbWFwX2V4ZSkgJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikgJChjdHNfaW50ZXJhY3RpdmVfamFyX2ZpbGVzKQorY3RzX2NvbWJpbmVkX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfbWFwX2V4ZSkgJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikgJChjdHNfYWxsX2phcl9maWxlcykKIAogYW5kcm9pZF9jdHNfemlwIDo9ICQoSE9TVF9PVVQpL2N0cy9hbmRyb2lkLWN0cy56aXAKIGN0c192ZXJpZmllcl9hcGsgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLEN0c1ZlcmlmaWVyKS9wYWNrYWdlLmFwawpAQCAtMjEwLDQ1ICsyMjcsNDIgQEAKIC5QSE9OWTogY3RzLWNvdmVyYWdlLXJlcG9ydC1hbGwgY3RzLWFwaS1jb3ZlcmFnZQogY3RzLWNvdmVyYWdlLXJlcG9ydC1hbGw6IGN0cy10ZXN0LWNvdmVyYWdlIGN0cy12ZXJpZmllci1jb3ZlcmFnZSBjdHMtY29tYmluZWQtY292ZXJhZ2UgY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZQogCi0kKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQotJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKQotJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCi0kKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfamFyX2ZpbGVzKQorJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQogCSQoY2FsbCBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMsIkNUUyBTeXN0ZW0gQVBJIE1BUCBSZXBvcnQgLSBYTUwiLFwKIAkJCSQoUFJJVkFURV9KQVJfRklMRVMpLHhtbCkKIAotJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCi0kKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKQotJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfamFyX2ZpbGVzKQotJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCi0JJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIFN5c3RlbSBBUEkgTUFQIFJlcG9ydCAtIEhUTUwiLFwKLQkJCSQoUFJJVkFURV9KQVJfRklMRVMpLGh0bWwpCi0KLSQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKLSQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGFwaV94bWxfZGVzY3JpcHRpb24pCi0kKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfamFyX2ZpbGVzKQotJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCi0JJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIEFQSSBNQVAgUmVwb3J0IC0gWE1MIixcCiskKGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikKKyQoY3RzLWludGVyYWN0aXZlLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19pbnRlcmFjdGl2ZV9qYXJfZmlsZXMpCiskKGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KSA6ICQodmVyaWZpZXJfemlwKSAkKGN0c19pbnRlcmFjdGl2ZV9zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIEludGVyYWN0aXZlIFN5c3RlbSBBUEkgTUFQIFJlcG9ydCAtIFhNTCIsXAogCQkJJChQUklWQVRFX0pBUl9GSUxFUykseG1sKQogCi0kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQotJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGFwaV94bWxfZGVzY3JpcHRpb24pCi0kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2phcl9maWxlcykKLSQoY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKLQkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQVBJIE1BUCBSZXBvcnQgLSBIVE1MIixcCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikKKyQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19hbGxfamFyX2ZpbGVzKQorJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkgOiAkKHZlcmlmaWVyX3ppcCkgJChhbmRyb2lkX2N0c196aXApICQoY3RzX2NvbWJpbmVkX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQ29tYmluZWQgU3lzdGVtIEFQSSBNQVAgUmVwb3J0IC0gWE1MIixcCisJCQkkKFBSSVZBVEVfSkFSX0ZJTEVTKSx4bWwpCisKKyQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLWh0bWwtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC1odG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC1odG1sLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2FsbF9qYXJfZmlsZXMpCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC1odG1sLXJlcG9ydCkgOiAkKHZlcmlmaWVyX3ppcCkgJChhbmRyb2lkX2N0c196aXApICQoY3RzX2NvbWJpbmVkX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQ29tYmluZWQgU3lzdGVtIEFQSSBNQVAgUmVwb3J0IC0gSFRNTCIsXAogCQkJJChQUklWQVRFX0pBUl9GSUxFUyksaHRtbCkKIAotLlBIT05ZOiBjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcAotY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAgOiAkKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkKKy5QSE9OWTogY3RzLXN5c3RlbS1hcGktbWFwLXhtbAorY3RzLXN5c3RlbS1hcGktbWFwLXhtbCA6ICQoY3RzLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpCiAKLS5QSE9OWTogY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwCi1jdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAgOiAkKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpCisuUEhPTlk6IGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwKK2N0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWw6ICQoY3RzLWludGVyYWN0aXZlLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpCiAKLS5QSE9OWTogY3RzLWFwaS14bWwtYXBpLW1hcAotY3RzLWFwaS14bWwtYXBpLW1hcCA6ICQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpCi0KLS5QSE9OWTogY3RzLWFwaS1odG1sLWFwaS1tYXAKLWN0cy1hcGktaHRtbC1hcGktbWFwIDogJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpCisuUEhPTlk6IGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwKK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwgOiAkKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KQogCiAuUEhPTlk6IGN0cy1hcGktbWFwLWFsbAogCkBAIC0yNjgsMTUgKzI4MiwxMyBAQAogQUxMX1RBUkdFVFMuJChjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCiAKICMgUHV0IHRoZSB0ZXN0IGFwaSBtYXAgcmVwb3J0IGluIHRoZSBkaXN0IGRpciBpZiAiY3RzLWFwaS1tYXAtYWxsIiBpcyBhbW9uZyB0aGUgYnVpbGQgZ29hbHMuCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktbWFwLWFsbCwgJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOmN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydC54bWwpCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktbWFwLWFsbCwgJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTpjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0Lmh0bWwpCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktbWFwLWFsbCwgJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6Y3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQueG1sKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTpjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQuaHRtbCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTpjdHMtYXBpLW1hcC1yZXBvcnQueG1sKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLWh0bWwtcmVwb3J0KTpjdHMtYXBpLW1hcC1yZXBvcnQuaHRtbCkKIAotQUxMX1RBUkdFVFMuJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQotQUxMX1RBUkdFVFMuJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KS5NRVRBX0xJQzo9JChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkKLUFMTF9UQVJHRVRTLiQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQotQUxMX1RBUkdFVFMuJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KS5NRVRBX0xJQzo9JChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkKK0FMTF9UQVJHRVRTLiQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQogCiAjIEFyZ3VtZW50czsKICMgIDEgLSBOYW1lIG9mIHRoZSByZXBvcnQgcHJpbnRlZCBvdXQgb24gdGhlIHNjcmVlbgpAQCAtMzAxLDE4ICszMTMsMTkgQEAKICMgUmVzZXQgdGVtcCB2YXJzCiBjdHNfYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcyA6PQogY3RzX3N5c3RlbV9hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9Ci1jdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KIGN0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KK2N0c19pbnRlcmFjdGl2ZV9zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KK2N0c19jb21iaW5lZF9zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KIGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtdGVzdC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1zeXN0ZW0tYXBpLWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLXN5c3RlbS1hcGkteG1sLWNvdmVyYWdlLXJlcG9ydCA6PQotY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQgOj0KLWN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCA6PQotY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9Ci1jdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0IDo9CitjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCA6PQorY3RzLWludGVyYWN0aXZlLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQgOj0KK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9CitjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQgOj0KIGFwaV94bWxfZGVzY3JpcHRpb24gOj0KIGFwaV90ZXh0X2Rlc2NyaXB0aW9uIDo9CiBzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbiA6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5tawppbmRleCA1ODUwYzRlLi42MTY0YzJlIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5tawpAQCAtMTQsNiArMTQsNyBAQAogCiAKIC5QSE9OWTogZGV2aWNlLXRlc3RzCisuUEhPTlk6IGRldmljZS10ZXN0cy1ob3N0LXNoYXJlZC1saWJzCiAKIGRldmljZS10ZXN0cy16aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXRlc3RzLnppcAogIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhIGxpc3Qgb2YgdGVzdCBjb25maWcgZmlsZXMgaW4gZGV2aWNlLXRlc3RzLgpAQCAtMjMsMzcgKzI0LDQ1IEBACiBteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpCiBkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXRlc3RzX2hvc3Qtc2hhcmVkLWxpYnMuemlwCiAKLSQoZGV2aWNlLXRlc3RzLXppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAkKGRldmljZS10ZXN0cy1jb25maWdzLXppcCkgJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGRldmljZS10ZXN0cy16aXApIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKGRldmljZS10ZXN0cy1saXN0LXppcCkgJChkZXZpY2UtdGVzdHMtY29uZmlncy16aXApCiAkKGRldmljZS10ZXN0cy16aXApIDogUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtdGVzdHNfbGlzdAogJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKQotJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfZGV2aWNlX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQogJChkZXZpY2UtdGVzdHMtemlwKSA6ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cykgJChTT09OR19aSVApCi0Jcm0gLWYgJEAtc2hhcmVkLWxpYnMubGlzdAogCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CiAJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCA+ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCiAJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1ob3N0Lmxpc3Q7IFwKLQkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICRALXNoYXJlZC1saWJzLmxpc3Q7IFwKIAlkb25lCi0JZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAtc2hhcmVkLWxpYnMubGlzdCA+ICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC10YXJnZXQubGlzdCA+ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0IC1zaGEyNTYKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKGRldmljZS10ZXN0cy1jb25maWdzLXppcCkgXAogCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKIAkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QKLQkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2RldmljZV9ob3N0X3NoYXJlZF9saWJzX3ppcCkgXAotCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QKIAlybSAtZiAkKFBSSVZBVEVfZGV2aWNlX3Rlc3RzX2xpc3QpCiAJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALXRhcmdldC5saXN0IHwgc2VkIHMlJChQUk9EVUNUX09VVCkldGFyZ2V0JWcgPj4gJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCXJtIC1mICRALmxpc3QgJEAtaG9zdC5saXN0ICRALXRhcmdldC5saXN0ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgJEAtdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0IFwKLQkgICRALXNoYXJlZC1saWJzLmxpc3QgJEAtaG9zdC1zaGFyZWQtbGlicy5saXN0ICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKKwkJJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQorCiskKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkgOiBQUklWQVRFX2RldmljZV9ob3N0X3NoYXJlZF9saWJzX3ppcCA6PSAkKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkKKyQoZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKQorJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApIDogJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cykgJChTT09OR19aSVApCisJcm0gLWYgJEAtc2hhcmVkLWxpYnMubGlzdAorCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCisJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1zaGFyZWQtbGlicy5saXN0OyBcCisJZG9uZQorCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALXNoYXJlZC1saWJzLmxpc3QgPiAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QgfHwgdHJ1ZQorCSQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZGV2aWNlX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdAogCiBkZXZpY2UtdGVzdHM6ICQoZGV2aWNlLXRlc3RzLXppcCkKK2RldmljZS10ZXN0cy1ob3N0LXNoYXJlZC1saWJzOiAkKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkKKwogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkZXZpY2UtdGVzdHMsICQoZGV2aWNlLXRlc3RzLXppcCkgJChkZXZpY2UtdGVzdHMtbGlzdC16aXApICQoZGV2aWNlLXRlc3RzLWNvbmZpZ3MtemlwKSAkKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRldmljZS10ZXN0cy1ob3N0LXNoYXJlZC1saWJzLCAkKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkpCiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKGRldmljZS10ZXN0cy16aXApLCkKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChkZXZpY2UtdGVzdHMtemlwKSwkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKSwkKFBST0RVQ1RfT1VUKS86LykKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZHRzLm1rIGIvY29yZS90YXNrcy9kdHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwOTA4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvZHRzLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRGVza3RvcCB0ZXN0IHN1aXRlCitpZm5lcSAoJCh3aWxkY2FyZCB0ZXN0L2R0cy90b29scy9kdHMtdHJhZGVmZWQvUkVBRE1FKSwpCit0ZXN0X3N1aXRlX25hbWUgOj0gZHRzCit0ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IGR0cy10cmFkZWZlZAordGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9kdHMvdG9vbHMvZHRzLXRyYWRlZmVkL1JFQURNRQordGVzdF9zdWl0ZV90b29scyA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9hdHNfY29uc29sZV9kZXBsb3kuamFyIFwKKyAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvYXRzX29sY19zZXJ2ZXJfbG9jYWxfbW9kZV9kZXBsb3kuamFyCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKKworLlBIT05ZOiBkdHMKK2R0czogJChjb21wYXRpYmlsaXR5X3ppcCkgJChjb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkdHMsICQoY29tcGF0aWJpbGl0eV96aXApICQoY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCkpCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rCmluZGV4IGQ2ZmMwNzIuLjE5MDFlZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMubWsKQEAgLTI3LDIxICsyNyw5IEBACiAjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGFsbCB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBnZW5lcmFsLXRlc3RzLgogZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9nZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwCiAKLSMgQ29weSBrZXJuZWwgdGVzdCBtb2R1bGVzIHRvIHRlc3RjYXNlcyBkaXJlY3RvcmllcwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvdnRzLWtlcm5lbC10ZXN0cy5tawotbHRwX2NvcHlfcGFpcnMgOj0gXAotICAkKGNhbGwgdGFyZ2V0LW5hdGl2ZS1jb3B5LXBhaXJzLCQoa2VybmVsX2x0cF9tb2R1bGVzKSwkKGtlcm5lbF9sdHBfaG9zdF9vdXQpKQotY29weV9sdHBfdGVzdHMgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKGx0cF9jb3B5X3BhaXJzKSkKLQotIyBQSE9OWSB0YXJnZXQgdG8gYmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCBgdnRzX2x0cF90ZXN0c2Agd2l0aG91dCBidWlsZGluZyBmdWxsIHZ0cwotLlBIT05ZOiB2dHNfa2VybmVsX2x0cF90ZXN0cwotdnRzX2tlcm5lbF9sdHBfdGVzdHM6ICQoY29weV9sdHBfdGVzdHMpCi0KIGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2dlbmVyYWwtdGVzdHNfaG9zdC1zaGFyZWQtbGlicy56aXAKIAogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGNvcHlfbHRwX3Rlc3RzKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0tFUk5FTF9MVFBfSE9TVF9PVVQgOj0gJChrZXJuZWxfbHRwX2hvc3Rfb3V0KQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdF96aXAgOj0gJChnZW5lcmFsX3Rlc3RzX2xpc3RfemlwKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkgJChnZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX1RPT0xTIDo9ICQoZ2VuZXJhbF90ZXN0c190b29scykKQEAgLTUyLDcgKzQwLDYgQEAKIAlybSAtZiAkQCAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkKIAlta2RpciAtcCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdG9vbHMKIAllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QKLQlmaW5kICQoUFJJVkFURV9LRVJORUxfTFRQX0hPU1RfT1VUKSA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IHx8IHRydWUKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tY3RzLm1rIGIvY29yZS90YXNrcy9tY3RzLm1rCmluZGV4IDA5YTQxOTEuLjAyZTkxNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvbWN0cy5taworKysgYi9jb3JlL3Rhc2tzL21jdHMubWsKQEAgLTE1LDcgKzE1LDggQEAKIGlmbmVxICgkKHdpbGRjYXJkIHRlc3QvbXRzL1JFQURNRS5tZCksKQogCiBtY3RzX3Rlc3Rfc3VpdGVzIDo9Ci1tY3RzX3Rlc3Rfc3VpdGVzICs9IG1jdHMKK21jdHNfYWxsX3Rlc3Rfc3VpdGVzIDo9CittY3RzX2FsbF90ZXN0X3N1aXRlcyArPSBtY3RzCiAKICQoZm9yZWFjaCBtb2R1bGUsICQobXRzX21vZHVsZXMpLCAkKGV2YWwgbWN0c190ZXN0X3N1aXRlcyArPSBtY3RzLSQobW9kdWxlKSkpCiAKQEAgLTI5LDQgKzMwLDE0IEBACiAJJChldmFsICQoY2FsbCBkaXN0LWZvci1nb2FscywgJChzdWl0ZSksICQoY29tcGF0aWJpbGl0eV96aXApKSkgXAogKQogCiskKGZvcmVhY2ggc3VpdGUsICQobWN0c19hbGxfdGVzdF9zdWl0ZXMpLCBcCisJJChldmFsIHRlc3Rfc3VpdGVfbmFtZSA6PSAkKHN1aXRlKSkgXAorCSQoZXZhbCB0ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IG1jdHMtdHJhZGVmZWQpIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9tdHMvUkVBRE1FLm1kKSBcCisJJChldmFsIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWspIFwKKwkkKGV2YWwgLlBIT05ZOiAkKHN1aXRlKSkgXAorCSQoZXZhbCAkKHN1aXRlKTogJChjb21wYXRpYmlsaXR5X3ppcCkpIFwKKwkkKGV2YWwgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCAkKHN1aXRlKSwgJChjb21wYXRpYmlsaXR5X3ppcCkpKSBcCispCisKIGVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL21ldGEtbGljLm1rIGIvY29yZS90YXNrcy9tZXRhLWxpYy5tawppbmRleCA4NTM1N2ViLi42MjBiMWUyIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL21ldGEtbGljLm1rCisrKyBiL2NvcmUvdGFza3MvbWV0YS1saWMubWsKQEAgLTgzLDYgKzgzLDQwIEBACiAkKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2NvcmFsLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCiAkKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2NvcmFsLGRpc3BsYXlfMTkyNjA1MDQ1NzUwOTA4MTcueG1sKSkKIAorIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLC5pZGMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsbGlibmZjLW5jaS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGZzdGFiLnBvc3RpbnN0YWxsLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHVldmVudGQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxoYWxzLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHAycF9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCx3cGFfc3VwcGxpY2FudF9vdmVybGF5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsd3BhX3N1cHBsaWNhbnQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsaW5pdC5jdXRmX2N2bS5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxmc3RhYi5jZi5mMmZzLmhjdHIyLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGZzdGFiLmNmLmYyZnMuY3RzLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGZzdGFiLmNmLmV4dDQuaGN0cjIsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZnN0YWIuY2YuZXh0NC5jdHMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsaW5pdC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxhdWRpb19wb2xpY3kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCisKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoL3NoYXJlZC9jb25maWcscGNpLmlkcyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QtMy1DbGF1c2Usbm90aWNlLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaC9zaGFyZWQvY29uZmlnL0xJQ0VOU0VfQlNELCkpCisKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxwcml2YXBwLXBlcm1pc3Npb25zLWN1dHRsZWZpc2gueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxtZWRpYV9wcm9maWxlc19WMV8wLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsY3V0dGxlZmlzaF9leGNsdWRlZF9oYXJkd2FyZS54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLG1lZGlhX2NvZGVjcy54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLG1lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxjYXJfYXVkaW9fY29uZmlndXJhdGlvbi54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gscHJlaW5zdGFsbGVkLXBhY2thZ2VzLXByb2R1Y3QtY2FyLWN1dHRsZWZpc2gueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2dvb2dsZS9jYW1lcmEvZGV2aWNlcywuanNvbikpCisKICMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvZ3MxMDEvQW5kcm9pZC5tawogJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLGRlZmF1bHQtcGVybWlzc2lvbnMueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9nczEwMSxsaWJuZmMtbmNpLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQpAQCAtMTkxLDMgKzIyNSw2IEBACiAKICMgTW92ZWQgaGVyZSBmcm9tIGhhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9BbmRyb2lkLm1rCiAkKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxoYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3ksKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gc3lzdGVtL2NvcmUvcm9vdGRpci9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxzeXN0ZW0vY29yZS9yb290ZGlyLCkpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL21rZTJmcy1kaXN0Lm1rIGIvY29yZS90YXNrcy9ta2UyZnMtZGlzdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQwYzFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9ta2UyZnMtZGlzdC5tawpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAyNCBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUT0RPOiBBZnRlciBTb29uZydzIHJlY292ZXJ5IHBhcnRpdGlvbiB2YXJpYXRpb24gY2FuIGJlIHNldCB0byBzZWxlY3RhYmxlCisjICAgICAgIGFuZCB0aGUgbWV0YV9saWMgZmlsZSBkdXBsaWNhdGlvbiBpc3N1ZSBpcyByZXNvbHZlZCwgbW92ZSBpdCB0byB0aGUKKyMgICAgICAgZGlzdCBzZWN0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSdzIEFuZHJvaWQuYnAuCitteV9kaXN0X2ZpbGVzIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rZTJmcworbXlfZGlzdF9maWxlcyArPSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tYWtlX2YyZnMKK215X2Rpc3RfZmlsZXMgKz0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFrZV9mMmZzX2Nhc2Vmb2xkCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZGlzdF9maWxlcyBzZGssJChteV9kaXN0X2ZpbGVzKSkKK215X2Rpc3RfZmlsZXMgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsgYi9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCmluZGV4IDc1OTM2NjguLjBjYTI3ZDggMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKKysrIGIvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tawpAQCAtMTMsNyArMTMsNyBAQAogJChpZiAkKHN0cmlwICQoMikpLCckKENPTU1BKSQoc3RyaXAgJCgxKSk6ICIkKHN0cmlwICQoMikpIicpCiBlbmRlZgogCi1TT09OR19NT0RVTEVfSU5GTyA6PSAkKFNPT05HX09VVF9ESVIpL21vZHVsZS1pbmZvLSQoVEFSR0VUX1BST0RVQ1QpLmpzb24KK1NPT05HX01PRFVMRV9JTkZPIDo9ICQoU09PTkdfT1VUX0RJUikvbW9kdWxlLWluZm8tJChUQVJHRVRfUFJPRFVDVCkke0NPVkVSQUdFX1NVRkZJWH0uanNvbgogCiAkKE1PRFVMRV9JTkZPX0pTT04pOiBQUklWQVRFX1NPT05HX01PRFVMRV9JTkZPIDo9ICQoU09PTkdfTU9EVUxFX0lORk8pCiAkKE1PRFVMRV9JTkZPX0pTT04pOiBQUklWQVRFX01FUkdFX0pTT05fT0JKRUNUUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tZXJnZV9tb2R1bGVfaW5mb19qc29uCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3ByZWJ1aWx0X3RyYWRlZmVkLm1rIGIvY29yZS90YXNrcy9wcmVidWlsdF90cmFkZWZlZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM1N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9wcmVidWlsdF90cmFkZWZlZC5tawpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZmVxICgsJCh3aWxkY2FyZCB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZSkpCisuUEhPTlk6IHRyYWRlZmVkLWNvcmUKK3RyYWRlZmVkLWNvcmU6IHRyYWRlZmVkIGF0ZXN0X3RyYWRlZmVkLnNoCisuUEhPTlk6IHRyYWRlZmVkLWFsbAordHJhZGVmZWQtYWxsOiB0cmFkZWZlZCBhdGVzdF90cmFkZWZlZC5zaAorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHRyYWRlZmVkLCAkKEhPU1RfT1VUKS9ldGMvdHJhZGVmZWQuemlwKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvcmVjb3Zlcnlfc25hcHNob3QubWsgYi9jb3JlL3Rhc2tzL3JlY292ZXJ5X3NuYXBzaG90Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUyNzNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3MvcmVjb3Zlcnlfc25hcHNob3QubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1jdXJyZW50X21ha2VmaWxlIDo9ICQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKLQotIyBSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50JyBpbiBvcmRlciB0byBnZW5lcmF0ZSBhIHJlY292ZXJ5IHNuYXBzaG90LgotaWZlcSAoJChSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OKSxjdXJyZW50KQotCi0uUEhPTlk6IHJlY292ZXJ5LXNuYXBzaG90Ci1yZWNvdmVyeS1zbmFwc2hvdDogJChTT09OR19SRUNPVkVSWV9TTkFQU0hPVF9aSVApCi0KLSQoY2FsbCBkaXN0LWZvci1nb2FscywgcmVjb3Zlcnktc25hcHNob3QsICQoU09PTkdfUkVDT1ZFUllfU05BUFNIT1RfWklQKSkKLQotZWxzZSAjIFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04gaXMgTk9UIHNldCB0byAnY3VycmVudCcKLQotLlBIT05ZOiByZWNvdmVyeS1zbmFwc2hvdAotcmVjb3Zlcnktc25hcHNob3Q6IFBSSVZBVEVfTUFLRUZJTEUgOj0gJChjdXJyZW50X21ha2VmaWxlKQotcmVjb3Zlcnktc25hcHNob3Q6Ci0JJChjYWxsIGVjaG8tZXJyb3IsJChQUklWQVRFX01BS0VGSUxFKSxcCi0JCSJDQU5OT1QgZ2VuZXJhdGUgUmVjb3Zlcnkgc25hcHNob3QuIFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnLiIpCi0JZXhpdCAxCi0KLWVuZGlmICMgUkVDT1ZFUllfU05BUFNIT1RfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9zdHMtbGl0ZS5tayBiL2NvcmUvdGFza3Mvc3RzLWxpdGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzY1YzMuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy9zdHMtbGl0ZS5taworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWlmbmVxICgkKHdpbGRjYXJkIHRlc3Qvc3RzL1JFQURNRS1zdHMtc2RrLm1kKSwpCi10ZXN0X3N1aXRlX25hbWUgOj0gc3RzLWxpdGUKLXRlc3Rfc3VpdGVfdHJhZGVmZWQgOj0gc3RzLXRyYWRlZmVkCi10ZXN0X3N1aXRlX3JlYWRtZSA6PSB0ZXN0L3N0cy9SRUFETUUtc3RzLXNkay5tZAotc3RzX3Nka196aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL3N0cy1zZGsuemlwCi0KLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKLQotc3RzX3Nka19zYW1wbGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLHN0cy1zZGstc2FtcGxlcy56aXApL3N0cy1zZGstc2FtcGxlcy56aXAKLQotJChzdHNfc2RrX3ppcCk6IFNUU19MSVRFX1pJUCA6PSAkKGNvbXBhdGliaWxpdHlfemlwKQotJChzdHNfc2RrX3ppcCk6IFNUU19TREtfU0FNUExFUyA6PSAkKHN0c19zZGtfc2FtcGxlcykKLSQoc3RzX3Nka196aXApOiAkKE1FUkdFX1pJUFMpICQoWklQMlpJUCkgJChjb21wYXRpYmlsaXR5X3ppcCkgJChzdHNfc2RrX3NhbXBsZXMpCi0Jcm0gLWYgJEAgJChTVFNfTElURV9aSVApX2ZpbHRlcmVkCi0JJChaSVAyWklQKSAtaSAkKFNUU19MSVRFX1pJUCkgLW8gJChTVFNfTElURV9aSVApX2ZpbHRlcmVkIFwKLQkJLXggYW5kcm9pZC1zdHMtbGl0ZS90b29scy9zdHMtdHJhZGVmZWQtdGVzdHMuamFyIFwKLQkJJ2FuZHJvaWQtc3RzLWxpdGUvdG9vbHMvKjpzdHMtdGVzdC9saWJzLycgXAotCQknYW5kcm9pZC1zdHMtbGl0ZS90ZXN0Y2FzZXMvKjpzdHMtdGVzdC91dGlscy8nIFwKLQkJJ2FuZHJvaWQtc3RzLWxpdGUvamRrLyoqLyo6c3RzLXRlc3QvamRrLycKLQkkKE1FUkdFX1pJUFMpICRAICQoU1RTX0xJVEVfWklQKV9maWx0ZXJlZCAkKFNUU19TREtfU0FNUExFUykKLQlybSAtZiAkKFNUU19MSVRFX1pJUClfZmlsdGVyZWQKLQotLlBIT05ZOiBzdHMtc2RrCi1zdHMtc2RrOiAkKHN0c19zZGtfemlwKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBzdHMtc2RrLCAkKHN0c19zZGtfemlwKSkKLQotZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tayBiL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawppbmRleCA5MTg5YzJkLi5mMjA1Y2VhIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKKysrIGIvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCkBAIC0yNyw3ICsyNyw2IEBACiAjICAgY29tcGF0aWJpbGl0eV96aXA6IHRoZSBwYXRoIHRvIHRoZSBvdXRwdXQgemlwIGZpbGUuCiAKIHNwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzIDo9Ci1zcGVjaWFsX210c190ZXN0X3N1aXRlcyArPSBtY3RzCiBzcGVjaWFsX210c190ZXN0X3N1aXRlcyArPSAkKG10c19tb2R1bGVzKQogaWZuZXEgKCQoZmlsdGVyICQoc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMpLCQocGF0c3Vic3QgbWN0cy0lLCUsJCh0ZXN0X3N1aXRlX25hbWUpKSksKQogCXRlc3Rfc3VpdGVfc3ViZGlyIDo9IGFuZHJvaWQtbXRzCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjdkYzEuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy90b29scy92dHMta2VybmVsLXRlc3RzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLWluY2x1ZGUgZXh0ZXJuYWwvbHRwL2FuZHJvaWQvbHRwX3BhY2thZ2VfbGlzdC5tawotCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy92dHNfcGFja2FnZV91dGlscy5tawotCi0jIENvcHkga2VybmVsIHRlc3QgbW9kdWxlcyB0byB0ZXN0Y2FzZXMgZGlyZWN0b3JpZXMKLWtlcm5lbF9sdHBfaG9zdF9vdXQgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpL3Z0c19rZXJuZWxfbHRwX3Rlc3RzCi1rZXJuZWxfbHRwX3Z0c19vdXQgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2FuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpL3Rlc3RjYXNlcy92dHNfa2VybmVsX2x0cF90ZXN0cwota2VybmVsX2x0cF9tb2R1bGVzIDo9IFwKLSAgICBsdHAgXAotICAgICQobHRwX3BhY2thZ2VzKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy92dHNfcGFja2FnZV91dGlscy5tayBiL2NvcmUvdGFza3MvdG9vbHMvdnRzX3BhY2thZ2VfdXRpbHMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODE5ZjIuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy90b29scy92dHNfcGFja2FnZV91dGlscy5taworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgJCgxKTogTGlzdCBvZiB0YXJnZXQgbmF0aXZlIGZpbGVzIHRvIGNvcHkuCi0jICQoMik6IENvcHkgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotIyBFdmFsdWF0ZXMgdG8gYSBsaXN0IG9mICI6Ii1zZXBhcmF0ZWQgcGFpcnMgc3JjOmRzdC4KLWRlZmluZSB0YXJnZXQtbmF0aXZlLWNvcHktcGFpcnMKLSQoZm9yZWFjaCBtLCQoMSksXAotICAkKGV2YWwgX2J1aWx0X2ZpbGVzIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG0pLkJVSUxUX0lOU1RBTExFRClcCi0gICQoQUxMX01PRFVMRVMuJChtKSQoVEFSR0VUXzJORF9BUkNIX01PRFVMRV9TVUZGSVgpLkJVSUxUX0lOU1RBTExFRCkpKVwKLSAgJChmb3JlYWNoIGksICQoc29ydCAkKF9idWlsdF9maWxlcykpLFwKLSAgICAkKGV2YWwgYnVpX2lucyA6PSAkKHN1YnN0IDosJChzcGFjZSksJChpKSkpXAotICAgICQoZXZhbCBpbnMgOj0gJCh3b3JkIDIsJChidWlfaW5zKSkpXAotICAgICQoaWYgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1JPT1QpLyUsJChpbnMpKSxcCi0gICAgICAkKGV2YWwgYnVpIDo9ICQod29yZCAxLCQoYnVpX2lucykpKVwKLSAgICAgICQoZXZhbCBteV9jb3B5X2Rlc3QgOj0gJChwYXRzdWJzdCBkYXRhLyUsREFUQS8lLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHBhdHN1YnN0IHN5c3RlbS8lLERBVEEvJSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCQoaW5zKSkpKSlcCi0gICAgICAkKGNhbGwgZGVjbGFyZS1jb3B5LXRhcmdldC1saWNlbnNlLW1ldGFkYXRhLCQoMikvJChteV9jb3B5X2Rlc3QpLCQoYnVpKSlcCi0gICAgICAkKGJ1aSk6JCgyKS8kKG15X2NvcHlfZGVzdCkpKSkKLWVuZGVmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsgYi9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsKaW5kZXggNjFiZjEzNi4uNDdjMzYwZCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rCisrKyBiL2NvcmUvdGFza3MvdHJhZGVmZWQtdGVzdHMtbGlzdC5tawpAQCAtMTUsNiArMTUsMTEgQEAKICMgTGlzdCBhbGwgVHJhZGVGZWQgdGVzdHMgZnJvbSBDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpcgogLlBIT05ZOiB0cmFkZWZlZC10ZXN0cy1saXN0CiAKK0NPTVBBVElCSUxJVFkudHJhZGVmZWRfdGVzdHNfZGlyIDo9IFwKKyAgJChDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpcikgXAorICB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZS9yZXMvY29uZmlnIFwKKyAgdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2NvcmUvamF2YXRlc3RzL3Jlcy9jb25maWcKKwogdHJhZGVmZWRfdGVzdHMgOj0KICQoZm9yZWFjaCBkaXIsICQoQ09NUEFUSUJJTElUWS50cmFkZWZlZF90ZXN0c19kaXIpLCBcCiAgICQoZXZhbCB0cmFkZWZlZF90ZXN0cyArPSAkKHNoZWxsIGZpbmQgJChkaXIpIC10eXBlIGYgLW5hbWUgIioueG1sIikpKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy92ZW5kb3Jfc25hcHNob3QubWsgYi9jb3JlL3Rhc2tzL3ZlbmRvcl9zbmFwc2hvdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMTM3OS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL3ZlbmRvcl9zbmFwc2hvdC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWN1cnJlbnRfbWFrZWZpbGUgOj0gJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQotCi0jIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSB2ZW5kb3Igc25hcHNob3QuCi1pZmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKLQotLlBIT05ZOiB2ZW5kb3Itc25hcHNob3QKLXZlbmRvci1zbmFwc2hvdDogJChTT09OR19WRU5ET1JfU05BUFNIT1RfWklQKQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHZlbmRvci1zbmFwc2hvdCwgJChTT09OR19WRU5ET1JfU05BUFNIT1RfWklQKSkKLQotLlBIT05ZOiB2ZW5kb3ItZmFrZS1zbmFwc2hvdAotdmVuZG9yLWZha2Utc25hcHNob3Q6ICQoU09PTkdfVkVORE9SX0ZBS0VfU05BUFNIT1RfWklQKQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHZlbmRvci1mYWtlLXNuYXBzaG90LCAkKFNPT05HX1ZFTkRPUl9GQUtFX1NOQVBTSE9UX1pJUCk6ZmFrZS8kKG5vdGRpciAkKFNPT05HX1ZFTkRPUl9GQUtFX1NOQVBTSE9UX1pJUCkpKQotCi1lbHNlICMgQk9BUkRfVk5ES19WRVJTSU9OIGlzIE5PVCBzZXQgdG8gJ2N1cnJlbnQnCi0KLS5QSE9OWTogdmVuZG9yLXNuYXBzaG90Ci12ZW5kb3Itc25hcHNob3Q6IFBSSVZBVEVfTUFLRUZJTEUgOj0gJChjdXJyZW50X21ha2VmaWxlKQotdmVuZG9yLXNuYXBzaG90OgotCSQoY2FsbCBlY2hvLWVycm9yLCQoUFJJVkFURV9NQUtFRklMRSksXAotCQkiQ0FOTk9UIGdlbmVyYXRlIFZlbmRvciBzbmFwc2hvdC4gQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50Jy4iKQotCWV4aXQgMQotCi0uUEhPTlk6IHZlbmRvci1mYWtlLXNuYXBzaG90Ci12ZW5kb3ItZmFrZS1zbmFwc2hvdDogUFJJVkFURV9NQUtFRklMRSA6PSAkKGN1cnJlbnRfbWFrZWZpbGUpCi12ZW5kb3ItZmFrZS1zbmFwc2hvdDoKLQkkKGNhbGwgZWNoby1lcnJvciwkKFBSSVZBVEVfTUFLRUZJTEUpLFwKLQkJIkNBTk5PVCBnZW5lcmF0ZSBWZW5kb3Igc25hcHNob3QuIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcuIikKLQlleGl0IDEKLQotZW5kaWYgIyBCT0FSRF9WTkRLX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdnRzLWNvcmUtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL3Z0cy1jb3JlLXRlc3RzLm1rCmluZGV4IDFlZWIwNzguLjExYmI5MzIgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdnRzLWNvcmUtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy92dHMtY29yZS10ZXN0cy5tawpAQCAtMTYsMTUgKzE2LDYgQEAKIHRlc3Rfc3VpdGVfdHJhZGVmZWQgOj0gdnRzLXRyYWRlZmVkCiB0ZXN0X3N1aXRlX3JlYWRtZSA6PSB0ZXN0L3Z0cy90b29scy92dHMtY29yZS10cmFkZWZlZC9SRUFETUUKIAotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvdnRzLWtlcm5lbC10ZXN0cy5tawotCi1sdHBfY29weV9wYWlycyA6PSBcCi0gICQoY2FsbCB0YXJnZXQtbmF0aXZlLWNvcHktcGFpcnMsJChrZXJuZWxfbHRwX21vZHVsZXMpLCQoa2VybmVsX2x0cF92dHNfb3V0KSkKLQotY29weV9sdHBfdGVzdHMgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKGx0cF9jb3B5X3BhaXJzKSkKLQotdGVzdF9zdWl0ZV9leHRyYV9kZXBzIDo9ICQoY29weV9sdHBfdGVzdHMpCi0KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKIAogLlBIT05ZOiB2dHMKZGlmZiAtLWdpdCBhL2NvcmUvdmVyc2lvbl91dGlsLm1rIGIvY29yZS92ZXJzaW9uX3V0aWwubWsKaW5kZXggZWI1NjhiZS4uMmJmNDFlYyAxMDA2NDQKLS0tIGEvY29yZS92ZXJzaW9uX3V0aWwubWsKKysrIGIvY29yZS92ZXJzaW9uX3V0aWwubWsKQEAgLTIzLDYgKzIzLDcgQEAKICMgICAgIFBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTgogIyAgICAgUExBVEZPUk1fU0RLX1ZFUlNJT04KICMgICAgIFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTgorIyAgICAgUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04KICMgICAgIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKICMgICAgIERFRkFVTFRfQVBQX1RBUkdFVF9TREsKICMgICAgIEJVSUxEX0lECkBAIC02Nyw4ICs2OCwxNiBAQAogUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9ICQoUkVMRUFTRV9QTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04pCiAuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04KIAotIyBUaGlzIGlzIHRoZSBzZGsgZXh0ZW5zaW9uIHZlcnNpb24gdGhhdCBQTEFURk9STV9TREtfVkVSU0lPTiBzaGlwcyB3aXRoLgotUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04gOj0gJChQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04pCitpZmRlZiBQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTgorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04gZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OLiB2YWx1ZTogJChQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTikpCitlbmRpZgoraWZkZWYgUkVMRUFTRV9QTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTgorICAjIFRoaXMgaXMgdGhlIHNkayBleHRlbnNpb24gdmVyc2lvbiB0aGF0IFBMQVRGT1JNX1NES19WRVJTSU9OIHNoaXBzIHdpdGguCisgIFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9ICQoUkVMRUFTRV9QTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTikKK2Vsc2UKKyAgIyBGYWxsYmFjayB0byBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04gaWYgUkVMRUFTRV9QTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTiBpcyB1bmRlZmluZWQuCisgIFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQorZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OCiAKIGlmZGVmIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKQEAgLTE4MywxNCArMTkyLDE3IEBACiBlbmRpZgogLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0hfVElNRVNUQU1QCiAKLWlmbmRlZiBQTEFURk9STV9CQVNFX09TCi0gICMgVXNlZCB0byBpbmRpY2F0ZSB0aGUgYmFzZSBvcyBhcHBsaWVkIHRvIHRoZSBkZXZpY2UuCi0gICMgQ2FuIGJlIGFuIGFyYml0cmFyeSBzdHJpbmcsIGJ1dCBtdXN0IGJlIGEgc2luZ2xlIHdvcmQuCi0gICMKLSAgIyBJZiB0aGVyZSBpcyBubyAkUExBVEZPUk1fQkFTRV9PUyBzZXQsIGtlZXAgaXQgZW1wdHkuCi0gIFBMQVRGT1JNX0JBU0VfT1MgOj0KLWVuZGlmCi0uS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9CQVNFX09TCisjIFBMQVRGT1JNX0JBU0VfT1MgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYmFzZSBvcyBhcHBsaWVkCisjIHRvIHRoZSBkZXZpY2UuIENhbiBiZSBhbiBhcmJpdHJhcnkgc3RyaW5nLCBidXQgbXVzdCBiZSBhCisjIHNpbmdsZSB3b3JkLgorIworIyBJZiB0aGVyZSBpcyBubyAkUExBVEZPUk1fQkFTRV9PUyBzZXQsIGtlZXAgaXQgZW1wdHkuCisjCisjIFBMQVRGT1JNX0JBU0VfT1MgY2FuIGVpdGhlciBiZSBzZXQgdmlhIGFuIGVudmlvcm5tZW50CisjIHZhcmlhYmxlLCBvciBzZXQgdmlhIHRoZSBQUk9EVUNUX0JBU0VfT1MgcHJvZHVjdCB2YXJpYWJsZS4KK1BMQVRGT1JNX0JBU0VfT1NfRU5WX0lOUFVUIDo9ICQoUExBVEZPUk1fQkFTRV9PUykKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX0JBU0VfT1NfRU5WX0lOUFVUCitQTEFURk9STV9CQVNFX09TIDo9CiAKIGlmbmRlZiBCVUlMRF9JRAogICAjIFVzZWQgdG8gc2lnbmlmeSBzcGVjaWFsIGJ1aWxkcy4gIEUuZy4sIGJyYW5jaGVzIGFuZC9vciByZWxlYXNlcywKZGlmZiAtLWdpdCBhL2VudnNldHVwLnNoIGIvZW52c2V0dXAuc2gKaW5kZXggMDZkYWRkMy4uNTU0YTIyMCAxMDA2NDQKLS0tIGEvZW52c2V0dXAuc2gKKysrIGIvZW52c2V0dXAuc2gKQEAgLTM2Miw3ICszNjIsNiBAQAogICAgICAgcGFja2FnZXMvbW9kdWxlcy9hZGIvYWRiLmJhc2gKICAgICAgIHN5c3RlbS9jb3JlL2Zhc3Rib290L2Zhc3Rib290LmJhc2gKICAgICAgIHRvb2xzL2FzdWl0ZS9hc3VpdGUuc2gKLSAgICAgIHByZWJ1aWx0cy9iYXplbC9jb21tb24vYmF6ZWwtY29tcGxldGUuYmFzaAogICAgICkKICAgICAjIENvbXBsZXRpb24gY2FuIGJlIGRpc2FibGVkIHNlbGVjdGl2ZWx5IHRvIGFsbG93IHVzZXJzIHRvIHVzZSBub24tc3RhbmRhcmQgY29tcGxldGlvbi4KICAgICAjIGUuZy4KQEAgLTQ0Miw2ICs0NDEsNyBAQAogZnVuY3Rpb24gbHVuY2goKQogewogICAgIGxvY2FsIGFuc3dlcgorICAgIHNldHVwX2NvZ19lbnZfaWZfbmVlZGVkCiAKICAgICBpZiBbWyAkIyAtZ3QgMSBdXTsgdGhlbgogICAgICAgICBlY2hvICJ1c2FnZTogbHVuY2ggW3RhcmdldF0iID4mMgpAQCAtMTA3OSwxMCArMTA3OSw3IEBACiAgICAgICAgIGRvbmUKICAgICBkb25lCiAKLSAgICBpZiBbWyAiJHtQV0R9IiA9PSAvZ29vZ2xlL2NvZy8qIF1dOyB0aGVuCi0gICAgICAgIGY9ImJ1aWxkL21ha2UvY29nc2V0dXAuc2giCi0gICAgICAgIGVjaG8gImluY2x1ZGluZyAkZiI7IC4gIiRULyRmIgotICAgIGZpCisgICAgc2V0dXBfY29nX2Vudl9pZl9uZWVkZWQKIH0KIAogZnVuY3Rpb24gc2hvd2NvbW1hbmRzKCkgewpkaWZmIC0tZ2l0IGEvc2hlbGxfdXRpbHMuc2ggYi9zaGVsbF91dGlscy5zaAppbmRleCA4NmYzZjQ5Li4zMTI0ZGI1IDEwMDY0NAotLS0gYS9zaGVsbF91dGlscy5zaAorKysgYi9zaGVsbF91dGlscy5zaApAQCAtNjMsNiArNjMsNzAgQEAKIH0KIGZpCiAKKyMgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudCB0byBiZSBhcHByb3ByaWF0ZSBmb3IgQ29nLgorZnVuY3Rpb24gc2V0dXBfY29nX2Vudl9pZl9uZWVkZWQoKSB7CisgIGxvY2FsIHRvcD0kKGdldHRvcCkKKworICAjIHJldHVybiBlYXJseSBpZiBub3QgaW4gYSBjb2cgd29ya3NwYWNlCisgIGlmIFtbICEgIiR0b3AiID1+IF4vZ29vZ2xlL2NvZyBdXTsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisKKyAgc2V0dXBfY29nX3N5bWxpbmsKKworICBleHBvcnQgQU5EUk9JRF9CVUlMRF9FTlZJUk9OTUVOVF9DT05GSUc9Imdvb2dsZXItY29nIgorCisgICMgUnVubmluZyByZXBvIGNvbW1hbmQgd2l0aGluIENvZyB3b3Jrc3BhY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHNvIG92ZXJyaWRlCisgICMgaXQgd2l0aCB0aGlzIGZ1bmN0aW9uLiBJZiB0aGUgdXNlciBpcyBydW5uaW5nIHJlcG8gd2l0aGluIGEgQ29nIHdvcmtzcGFjZSwKKyAgIyB3ZSdsbCBmYWlsIHdpdGggYW4gZXJyb3IsIG90aGVyd2lzZSwgd2UgcnVuIHRoZSBvcmlnaW5hbCByZXBvIGNvbW1hbmQgd2l0aAorICAjIHRoZSBnaXZlbiBhcmdzLgorICBpZiAhIE9SSUdfUkVQT19QQVRIPWB3aGljaCByZXBvYDsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisgIGZ1bmN0aW9uIHJlcG8geworICAgIGlmIFtbICIke1BXRH0iID09IC9nb29nbGUvY29nLyogXV07IHRoZW4KKyAgICAgIGVjaG8gLWUgIlxlWzAxOzMxbUVSUk9SOlxlWzBtcmVwbyBjb21tYW5kIGlzIGRpc2FsbG93ZWQgd2l0aGluIENvZyB3b3Jrc3BhY2VzLiIKKyAgICAgIGtpbGwgLUlOVCAkJCAjIGV4aXRzIHRoZSBzY3JpcHQgd2l0aG91dCBleGl0aW5nIHRoZSB1c2VyJ3Mgc2hlbGwKKyAgICBmaQorICAgICR7T1JJR19SRVBPX1BBVEh9ICIkQCIKKyAgfQorfQorCisjIGNyZWF0ZXMgYSBzeW1saW5rIGZvciB0aGUgb3V0LyBkaXIgd2hlbiBpbnNpZGUgYSBjb2cgd29ya3NwYWNlLgorZnVuY3Rpb24gc2V0dXBfY29nX3N5bWxpbmsoKSB7CisgIGxvY2FsIG91dF9kaXI9JChnZXRvdXRkaXIpCisgIGxvY2FsIHRvcD0kKGdldHRvcCkKKworICAjIHJldHVybiBlYXJseSBpZiBvdXQgZGlyIGlzIGFscmVhZHkgYSBzeW1saW5rCisgIGlmIFtbIC1MICIkb3V0X2RpciIgXV07IHRoZW4KKyAgICByZXR1cm4gMAorICBmaQorCisgICMgcmV0dXJuIGVhcmx5IGlmIG91dCBkaXIgaXMgbm90IGluIHRoZSB3b3Jrc3BhY2UKKyAgaWYgW1sgISAiJG91dF9kaXIiID1+IF4kdG9wLyBdXTsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisKKyAgbG9jYWwgbGlua19kZXN0aW5hdGlvbj0iJHtIT01FfS8uY29nL2FuZHJvaWQtYnVpbGQtb3V0IgorCisgICMgcmVtb3ZlIGV4aXN0aW5nIG91dC8gZGlyIGlmIGl0IGV4aXN0cworICBpZiBbWyAtZCAiJG91dF9kaXIiIF1dOyB0aGVuCisgICAgZWNobyAiRGV0ZWN0ZWQgZXhpc3Rpbmcgb3V0LyBkaXJlY3RvcnkgaW4gdGhlIENvZyB3b3Jrc3BhY2Ugd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gUmVwYWlyaW5nIHdvcmtzcGFjZSBieSByZW1vdmluZyBpdCBhbmQgY3JlYXRpbmcgdGhlIHN5bWxpbmsgdG8gfi8uY29nL2FuZHJvaWQtYnVpbGQtb3V0IgorICAgIGlmICEgcm0gLXJmICIkb3V0X2RpciI7IHRoZW4KKyAgICAgIGVjaG8gIkZhaWxlZCB0byByZW1vdmUgZXhpc3Rpbmcgb3V0LyBkaXJlY3Rvcnk6ICRvdXRfZGlyIiA+JjIKKyAgICAgIGtpbGwgLUlOVCAkJCAjIGV4aXRzIHRoZSBzY3JpcHQgd2l0aG91dCBleGl0aW5nIHRoZSB1c2VyJ3Mgc2hlbGwKKyAgICBmaQorICBmaQorCisgICMgY3JlYXRlIHN5bWxpbmsKKyAgZWNobyAiQ3JlYXRpbmcgc3ltbGluazogJG91dF9kaXIgLT4gJGxpbmtfZGVzdGluYXRpb24iCisgIG1rZGlyIC1wICR7bGlua19kZXN0aW5hdGlvbn0KKyAgaWYgISBsbiAtcyAiJGxpbmtfZGVzdGluYXRpb24iICIkb3V0X2RpciI7IHRoZW4KKyAgICBlY2hvICJGYWlsZWQgdG8gY3JlYXRlIGNvZyBzeW1saW5rOiAkb3V0X2RpciAtPiAkbGlua19kZXN0aW5hdGlvbiIgPiYyCisgICAga2lsbCAtSU5UICQkICMgZXhpdHMgdGhlIHNjcmlwdCB3aXRob3V0IGV4aXRpbmcgdGhlIHVzZXIncyBzaGVsbAorICBmaQorfQorCiBmdW5jdGlvbiBnZXRvdXRkaXIKIHsKICAgICBsb2NhbCB0b3A9JChnZXR0b3ApCkBAIC0xMTQsMTEgKzE3OCwxMSBAQAogICAgICAgICBlY2hvIC1uICIke2NvbG9yX2ZhaWxlZH0jIyMjIGZhaWxlZCB0byBidWlsZCBzb21lIHRhcmdldHMgIgogICAgIGZpCiAgICAgaWYgWyAkaG91cnMgLWd0IDAgXSA7IHRoZW4KLSAgICAgICAgcHJpbnRmICIoJTAyZzolMDJnOiUwMmcgKGhoOm1tOnNzKSkiICRob3VycyAkbWlucyAkc2VjcworICAgICAgICBwcmludGYgIiglMDJkOiUwMmQ6JTAyZCAoaGg6bW06c3MpKSIgJGhvdXJzICRtaW5zICRzZWNzCiAgICAgZWxpZiBbICRtaW5zIC1ndCAwIF0gOyB0aGVuCi0gICAgICAgIHByaW50ZiAiKCUwMmc6JTAyZyAobW06c3MpKSIgJG1pbnMgJHNlY3MKKyAgICAgICAgcHJpbnRmICIoJTAyZDolMDJkIChtbTpzcykpIiAkbWlucyAkc2VjcwogICAgIGVsaWYgWyAkc2VjcyAtZ3QgMCBdIDsgdGhlbgotICAgICAgICBwcmludGYgIiglcyBzZWNvbmRzKSIgJHNlY3MKKyAgICAgICAgcHJpbnRmICIoJWQgc2Vjb25kcykiICRzZWNzCiAgICAgZmkKICAgICBlY2hvICIgIyMjIyR7Y29sb3JfcmVzZXR9IgogICAgIGVjaG8KQEAgLTE1MCwzICsyMTQsMTkgQEAKICAgICAnIFNJR0lOVCBTSUdURVJNIFNJR1FVSVQgRVhJVAogfQogCisjIEltcG9ydCB0aGUgYnVpbGQgdmFyaWFibGVzIHN1cHBsaWVkIGFzIGFyZ3VtZW50cyBpbnRvIHRoaXMgc2hlbGwncyBlbnZpcm9ubWVudC4KKyMgRm9yIGFic29sdXRlIHZhcmlhYmxlcywgcHJlZml4IHRoZSB2YXJpYWJsZSBuYW1lIHdpdGggYSAnLycuIEZvciBleGFtcGxlOgorIyAgICBpbXBvcnRfYnVpbGRfdmFycyBPVVRfRElSIERJU1RfRElSIC9IT1NUX09VVF9FWEVDVVRBQkxFUworIyBSZXR1cm5zIG5vbnplcm8gaWYgdGhlIGJ1aWxkIGNvbW1hbmQgZmFpbGVkLiBTdGRlcnIgaXMgcGFzc2VkIHRocm91Z2guCitmdW5jdGlvbiBpbXBvcnRfYnVpbGRfdmFycygpCit7CisgICAgcmVxdWlyZV90b3AKKyAgICBsb2NhbCBzY3JpcHQKKyAgICBzY3JpcHQ9JChjZCAkVE9QICYmIGJ1aWxkL3Nvb25nL2Jpbi9nZXRfYnVpbGRfdmFycyAiJEAiKQorICAgIGxvY2FsIHJldD0kPworICAgIGlmIFsgJHJldCAtbmUgMCBdIDsgdGhlbgorICAgICAgICByZXR1cm4gJHJldAorICAgIGZpCisgICAgZXZhbCAiJHNjcmlwdCIKKyAgICByZXR1cm4gJD8KK30KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rIGIvdGFyZ2V0L2JvYXJkL2FuZHJvaWQtaW5mby5tawpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSB0YXJnZXQvYm9hcmQvQW5kcm9pZC5tawpyZW5hbWUgdG8gdGFyZ2V0L2JvYXJkL2FuZHJvaWQtaW5mby5tawppbmRleCBkZWNjMzQ1Li4zNmJlMDAyIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvQW5kcm9pZC5taworKysgYi90YXJnZXQvYm9hcmQvYW5kcm9pZC1pbmZvLm1rCkBAIC01MSwzMCArNTEsNiBAQAogCiAjIENvcHkgY29tcGF0aWJpbGl0eSBtZXRhZGF0YSB0byB0aGUgZGV2aWNlLgogCi0jIERldmljZSBNYW5pZmVzdAotaWZkZWYgREVWSUNFX01BTklGRVNUX0ZJTEUKLSMgJChERVZJQ0VfTUFOSUZFU1RfRklMRSkgY2FuIGJlIGEgbGlzdCBvZiBmaWxlcwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgICAgICAgIDo9IHZlbmRvcl9tYW5pZmVzdC54bWwKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCBsZWdhY3lfbm90X2FfY29udHJpYnV0aW9uCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gYnlfZXhjZXB0aW9uX29ubHkgbm90X2FsbG93ZWQgbm90aWNlCi1MT0NBTF9NT0RVTEVfU1RFTSAgIDo9IG1hbmlmZXN0LnhtbAotTE9DQUxfTU9EVUxFX0NMQVNTICA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIICAgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjL3ZpbnRmCi0KLUdFTiA6PSAkKGxvY2FsLWdlbmVyYXRlZC1zb3VyY2VzLWRpcikvbWFuaWZlc3QueG1sCi0kKEdFTik6IFBSSVZBVEVfREVWSUNFX01BTklGRVNUX0ZJTEUgOj0gJChERVZJQ0VfTUFOSUZFU1RfRklMRSkKLSQoR0VOKTogJChERVZJQ0VfTUFOSUZFU1RfRklMRSkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYKLQlCT0FSRF9TRVBPTElDWV9WRVJTPSQoQk9BUkRfU0VQT0xJQ1lfVkVSUykgXAotCVBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVD0kKFBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVCkgXAotCVBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMPSQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpIFwKLQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtbyAkQCBcCi0JCS1pICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9ERVZJQ0VfTUFOSUZFU1RfRklMRSkpCi0KLUxPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoR0VOKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotZW5kaWYKLQogIyBERVZJQ0VfTUFOSUZFU1RfU0tVUzogYSBsaXN0IG9mIFNLVVMgd2hlcmUgREVWSUNFX01BTklGRVNUXzxza3U+X0ZJTEVTIGlzIGRlZmluZWQuCiBpZmRlZiBERVZJQ0VfTUFOSUZFU1RfU0tVUwogCkBAIC05OSw3ICs3NSw2IEBACiAkJChHRU4pOiAkJChteV9mcmFnbWVudF9maWxlcykgJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmCiAJQk9BUkRfU0VQT0xJQ1lfVkVSUz0kJChCT0FSRF9TRVBPTElDWV9WRVJTKSBcCiAJUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUPSQkKFBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVCkgXAotCVBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMPSQkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSBcCiAJJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1vICQkQCBcCiAJCS1pICQkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkJChQUklWQVRFX1NSQ19GSUxFUykpCiAKQEAgLTExNCwzMCArODksNiBAQAogCiBlbmRpZiAjIERFVklDRV9NQU5JRkVTVF9TS1VTCiAKLSMgT0RNIG1hbmlmZXN0Ci1pZmRlZiBPRE1fTUFOSUZFU1RfRklMRVMKLSMgT0RNX01BTklGRVNUX0ZJTEVTIGlzIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGlzIGNvbWJpbmVkIGFuZCBpbnN0YWxsZWQgYXMgdGhlIGRlZmF1bHQgT0RNIG1hbmlmZXN0LgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gb2RtX21hbmlmZXN0LnhtbAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIGxlZ2FjeV9ub3RfYV9jb250cmlidXRpb24KLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBieV9leGNlcHRpb25fb25seSBub3RfYWxsb3dlZCBub3RpY2UKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IG1hbmlmZXN0LnhtbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gdmludGYKLUxPQ0FMX09ETV9NT0RVTEUgOj0gdHJ1ZQotCi1HRU4gOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL21hbmlmZXN0LnhtbAotJChHRU4pOiBQUklWQVRFX1NSQ19GSUxFUyA6PSAkKE9ETV9NQU5JRkVTVF9GSUxFUykKLSQoR0VOKTogJChPRE1fTUFOSUZFU1RfRklMRVMpICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmCi0JIyBTZXQgVklOVEZfSUdOT1JFX1RBUkdFVF9GQ01fVkVSU0lPTiB0byB0cnVlIGJlY2F1c2UgaXQgc2hvdWxkIG9ubHkgYmUgaW4gZGV2aWNlIG1hbmlmZXN0LgotCVZJTlRGX0lHTk9SRV9UQVJHRVRfRkNNX1ZFUlNJT049dHJ1ZSBcCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYgLW8gJEAgXAotCQktaSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfU1JDX0ZJTEVTKSkKLQotTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUgOj0gJChHRU4pCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZiAjIE9ETV9NQU5JRkVTVF9GSUxFUwotCiAjIE9ETV9NQU5JRkVTVF9TS1VTOiBhIGxpc3Qgb2YgU0tVUyB3aGVyZSBPRE1fTUFOSUZFU1RfPHNrdT5fRklMRVMgYXJlIGRlZmluZWQuCiBpZmRlZiBPRE1fTUFOSUZFU1RfU0tVUwogCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY182NGJpdG9ubHlfeDg2XzY0L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvZGV2aWNlLm1rCmluZGV4IGJiNDkwNTcuLjVlZGY1ZTAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvZGV2aWNlLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvZGV2aWNlLm1rCkBAIC0xNyw4ICsxNywzIEBACiBpZmRlZiBORVRfRVRIMF9TVEFSVE9OQk9PVAogICBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBuZXQuZXRoMC5zdGFydG9uYm9vdD0xCiBlbmRpZgotCi0jIEVuc3VyZSB3ZSBwYWNrYWdlIHRoZSBCSU9TIGZpbGVzIHRvby4KLVBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCi0gICAgYmlvcy5iaW4gXAotICAgIHZnYWJpb3MtY2lycnVzLmJpbiBcCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5tawppbmRleCA2MGYwY2MzLi4yN2ZiMzEwIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWsKQEAgLTE3LDggKzE3LDMgQEAKIGlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCiAgIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gbmV0LmV0aDAuc3RhcnRvbmJvb3Q9MQogZW5kaWYKLQotIyBFbnN1cmUgd2UgcGFja2FnZSB0aGUgQklPUyBmaWxlcyB0b28uCi1QUk9EVUNUX0hPU1RfUEFDS0FHRVMgKz0gXAotCWJpb3MuYmluIFwKLQl2Z2FiaW9zLWNpcnJ1cy5iaW4gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYXBwX2Z1bmN0aW9uX2V4dGVuc2lvbnMubWsgYi90YXJnZXQvcHJvZHVjdC9hcHBfZnVuY3Rpb25fZXh0ZW5zaW9ucy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFhZmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYXBwX2Z1bmN0aW9uX2V4dGVuc2lvbnMubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGUgYXBwIGZ1bmN0aW9uIHNpZGVjYXIgZXh0ZW5zaW9ucworCisjIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBjb20uZ29vZ2xlLmFuZHJvaWQuYXBwZnVuY3Rpb25zLnNpZGVjYXIgXAorICAgIGFwcGZ1bmN0aW9ucy5zaWRlY2FyLnhtbApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9wcm9kdWN0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9wcm9kdWN0Lm1rCmluZGV4IDBhYzIyMGIuLmFjZmM2NTMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2VfcHJvZHVjdC5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3Byb2R1Y3QubWsKQEAgLTI1LDMgKzI1LDggQEAKICAgICBwcm9kdWN0X2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbCBcCiAgICAgcHJvZHVjdF9tYW5pZmVzdC54bWwgXAogICAgIHNlbGludXhfcG9saWN5X3Byb2R1Y3QgXAorICAgIHByb2R1Y3QtYnVpbGQucHJvcCBcCisKKyMgUGFja2FnZXMgaW5jbHVkZWQgb25seSBmb3IgZW5nIG9yIHVzZXJkZWJ1ZyBidWlsZHMsIHByZXZpb3VzbHkgZGVidWcgdGFnZ2VkCitQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHICs9IFwKKyAgICBhZGJfa2V5cyBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rCmluZGV4IDlhNjc0NmYuLmIzYjU4ZDMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rCkBAIC0xNyw3ICsxNyw3IEBACiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWJ4IFwKLSAgICBhY29uZmlnZCBcCisgICAgYWNvbmZpZ2Qtc3lzdGVtIFwKICAgICBhZGJkX3N5c3RlbV9hcGkgXAogICAgIGFmbGFncyBcCiAgICAgYW0gXApAQCAtMTc4LDYgKzE3OCw3IEBACiAgICAgbGlibWVkaWEgXAogICAgIGxpYm1lZGlhX2puaSBcCiAgICAgbGlibWVkaWFuZGsgXAorICAgIGxpYm1vbmtleV9qbmkgXAogICAgIGxpYm10cCBcCiAgICAgbGlibmV0ZF9jbGllbnQgXAogICAgIGxpYm5ldGxpbmsgXApAQCAtMjA0LDYgKzIwNSw3IEBACiAgICAgbGlic3RkYysrIFwKICAgICBsaWJzeXN1dGlscyBcCiAgICAgbGlidWkgXAorICAgIGxpYnVwcm9iZXN0YXRzX2NsaWVudCBcCiAgICAgbGlidXNiaG9zdCBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYnZpbnRmX2puaSBcCkBAIC0yMTEsNiArMjEzLDcgQEAKICAgICBsaWJ3aWxoZWxtIFwKICAgICBsaW5rZXIgXAogICAgIGxsa2QgXAorICAgIGxsbmRrX2xpYnMgXAogICAgIGxta2QgXAogICAgIExvY2FsVHJhbnNwb3J0IFwKICAgICBsb2Nrc2V0dGluZ3MgXApAQCAtMjQ2LDYgKzI0OSw3IEBACiAgICAgcGludG9vbCBcCiAgICAgcGxhdGZvcm0ueG1sIFwKICAgICBwbSBcCisgICAgcHJlZmV0Y2ggXAogICAgIHByZWluc3RhbGxlZC1wYWNrYWdlcy1hc2wtZmlsZXMueG1sIFwKICAgICBwcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0ueG1sIFwKICAgICBwcmVpbnN0YWxsZWQtcGFja2FnZXMtc3RyaWN0LXNpZ25hdHVyZS54bWwgXApAQCAtMjc0LDExICsyNzgsMTEgQEAKICAgICBTaGVsbCBcCiAgICAgc2hlbGxfYW5kX3V0aWxpdGllc19zeXN0ZW0gXAogICAgIHNtIFwKLSAgICBzbmFwc2hvdGN0bCBcCiAgICAgc25hcHVzZXJkIFwKICAgICBzdG9yYWdlZCBcCiAgICAgc3VyZmFjZWZsaW5nZXIgXAogICAgIHN2YyBcCisgICAgc3lzdGVtLWJ1aWxkLnByb3AgXAogICAgIHRhc2tfcHJvZmlsZXMuanNvbiBcCiAgICAgdGMgXAogICAgIHRlbGVjb20gXApAQCAtMjg2LDExICsyOTAsMTEgQEAKICAgICB0b21ic3RvbmVkIFwKICAgICB0cmFjZWQgXAogICAgIHRyYWNlZF9wcm9iZXMgXAorICAgIHRyYWRlaW5tb2RlIFwKICAgICB0dW5lMmZzIFwKICAgICB1aWF1dG9tYXRvciBcCiAgICAgdWlucHV0IFwKICAgICB1bmNyeXB0IFwKLSAgICB1cHJvYmVzdGF0cyBcCiAgICAgdXNiZCBcCiAgICAgdmRjIFwKICAgICB2aW50ZiBcCkBAIC0zMDgsNiArMzEyLDE3IEBACiAKIGVuZGlmCiAKKyMgV2hlbiB3ZSByZWxlYXNlIHVwcm9iZXN0YXRzIG1vZHVsZQoraWZlcSAoJChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQudXByb2Jlc3RhdHMgXAorCitlbHNlCisgICAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIHVwcm9iZXN0YXRzIFwKKworZW5kaWYKKwogIyBUaGVzZSBwYWNrYWdlcyBhcmUgbm90IHVzZWQgb24gQW5kcm9pZCBUVgogaWZuZXEgKCQoUFJPRFVDVF9JU19BVFYpLHRydWUpCiAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXApAQCAtMzQ0LDYgKzM1OSwyMyBAQAogICAgICAgICBjb20uYW5kcm9pZC53ZWJ2aWV3LmJvb3RzdHJhcAogZW5kaWYKIAorIyBPbmx5IGFkZCB0aGUgamFyIHdoZW4gaXQgaXMgbm90IGluIHRoZSBUZXRoZXJpbmcgbW9kdWxlLiBPdGhlcndpc2UsCisjIGl0IHdpbGwgYmUgYWRkZWQgdmlhIGNvbS5hbmRyb2lkLnRldGhlcmluZworaWZuZXEgKCQoUkVMRUFTRV9NT1ZFX1ZDTl9UT19NQUlOTElORSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgZnJhbWV3b3JrLWNvbm5lY3Rpdml0eS1iCitlbmRpZgorCitpZm5lcSAoLCQoUkVMRUFTRV9SQU5HSU5HX1NUQUNLKSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQucmFuZ2luZworZW5kaWYKKworaWZlcSAoJChSRUxFQVNFX01FTU9SWV9NQU5BR0VNRU5UX0RBRU1PTiksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIG1tX2RhZW1vbgorZW5kaWYKKwogIyBWSU5URiBkYXRhIGZvciBzeXN0ZW0gaW1hZ2UKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHN5c3RlbV9tYW5pZmVzdC54bWwgXApAQCAtNDAyLDcgKzQzNCw2IEBACiAgICAgQnVnUmVwb3J0IFwKICAgICBhZGIgXAogICAgIGFkZXZpY2UgXAotICAgIGFydC10b29scyBcCiAgICAgYXRlc3QgXAogICAgIGJjYyBcCiAgICAgYml0IFwKQEAgLTQxOSw2ICs0NTAsNyBAQAogICAgIGxwZHVtcCBcCiAgICAgbWtlMmZzIFwKICAgICBta2ZzLmVyb2ZzIFwKKyAgICBwYnRvbWJzdG9uZSBcCiAgICAgcmVzaXplMmZzIFwKICAgICBzZ2Rpc2sgXAogICAgIHNxbGl0ZTMgXApAQCAtNDMzLDYgKzQ2NSwyMSBAQAogICAgIHR6X3ZlcnNpb25faG9zdCBcCiAgICAgdHpfdmVyc2lvbl9ob3N0X3R6ZGF0YV9hcGV4IFwKIAorIyBGb3IgYXJ0LXRvb2xzLCBpZiB0aGUgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCwgcGxlYXNlIHN5bmMgdGhlbSB0byBhcnQvQW5kcm9pZC5icCBhcyB3ZWxsLgorUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKKyAgICBhaGF0IFwKKyAgICBkZXhkdW1wIFwKKyAgICBocHJvZi1jb252CisjIEEgc3Vic2V0IG9mIHRoZSB0b29scyBhcmUgZGlzYWJsZWQgd2hlbiBIT1NUX1BSRUZFUl8zMl9CSVQgaXMgZGVmaW5lZCBhcyBtYWtlIHJlcG9ydHMgdGhhdAorIyB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkIG9uIGhvc3QgKGIvMTI5MzIzNzkxKS4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGFydF9hcGV4IGRpc2FibGluZyBob3N0CisjIEFQRVggYnVpbGRzIHdoZW4gSE9TVF9QUkVGRVJfMzJfQklUIGlzIHNldCAoYi8xMjA2MTc4NzYpLgoraWZuZXEgKCQoSE9TVF9QUkVGRVJfMzJfQklUKSx0cnVlKQorUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKKyAgICBkZXhsaXN0IFwKKyAgICBvYXRkdW1wCitlbmRpZgorCisKIFBST0RVQ1RfUEFDS0FHRVMgKz0gaW5pdC51c2IucmMgaW5pdC51c2IuY29uZmlnZnMucmMKIAogUFJPRFVDVF9QQUNLQUdFUyArPSBldGNfaG9zdHMKQEAgLTQ0Miw2ICs0ODksNyBAQAogCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IGRlYnVnLmF0cmFjZS50YWdzLmVuYWJsZWZsYWdzPTAKIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcGVyc2lzdC50cmFjZWQuZW5hYmxlPTEKK1BST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc3VyZmFjZV9mbGluZ2VyLmdhbWVfZGVmYXVsdF9mcmFtZV9yYXRlX292ZXJyaWRlPTYwCiAKICMgSW5jbHVkZSBrZXJuZWwgY29uZmlncy4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXApAQCAtNDUwLDcgKzQ5OCw2IEBACiAKICMgUGFja2FnZXMgaW5jbHVkZWQgb25seSBmb3IgZW5nIG9yIHVzZXJkZWJ1ZyBidWlsZHMsIHByZXZpb3VzbHkgZGVidWcgdGFnZ2VkCiBQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHIDo9IFwKLSAgICBhZGJfa2V5cyBcCiAgICAgYWRldmljZV9maW5nZXJwcmludCBcCiAgICAgYXJwaW5nIFwKICAgICBkbXVzZXJkIFwKQEAgLTQ3Miw2ICs1MTksNyBAQAogICAgIHJlY29yZF9iaW5kZXIgXAogICAgIHNlcnZpY2VkaXNwYXRjaGVyIFwKICAgICBzaG93bWFwIFwKKyAgICBzbmFwc2hvdGN0bCBcCiAgICAgc3FsaXRlMyBcCiAgICAgc3MgXAogICAgIHN0YXJ0X3dpdGhfbG9ja2FnZW50IFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtX2V4dC5tayBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtX2V4dC5tawppbmRleCA5MmNhMjI3Li5mZWJlNTM3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW1fZXh0Lm1rCkBAIC0yNCw2ICsyNCw3IEBACiAgICAgU2F0ZWxsaXRlQ2xpZW50IFwKICAgICBzZWxpbnV4X3BvbGljeV9zeXN0ZW1fZXh0IFwKICAgICBzeXN0ZW1fZXh0X21hbmlmZXN0LnhtbCBcCisgICAgc3lzdGVtX2V4dC1idWlsZC5wcm9wIFwKIAogIyBCYXNlIG1vZHVsZXMgd2hlbiBzaGlwcGluZyBhcGkgbGV2ZWwgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM0CiBQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNCArPSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tayBiL3RhcmdldC9wcm9kdWN0L2Jhc2VfdmVuZG9yLm1rCmluZGV4IDE4NTRmOTcuLjE2ZmM3ZmQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2VfdmVuZG9yLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2VfdmVuZG9yLm1rCkBAIC0xNyw3ICsxNyw2IEBACiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHJlY292ZXJ5LgogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWRiZC5yZWNvdmVyeSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLWltcGwtZGVmYXVsdC5yZWNvdmVyeSBcCiAgICAgYnVpbGRfZmxhZ192ZW5kb3IgXAogICAgIGNncm91cHMucmVjb3ZlcnkuanNvbiBcCiAgICAgY2hhcmdlci5yZWNvdmVyeSBcCkBAIC03Miw3ICs3MSwxNSBAQAogICAgIHBhc3N3ZF9vZG0gXAogICAgIHBhc3N3ZF92ZW5kb3IgXAogICAgIHNlbGludXhfcG9saWN5X25vbnN5c3RlbSBcCisgICAgc2VsaW51eF9wb2xpY3lfdmVuZG9yIFwKKyAgICBzZWxpbnV4X3BvbGljeV9vZG0gXAogICAgIHNoZWxsX2FuZF91dGlsaXRpZXNfdmVuZG9yIFwKKyAgICBvZG0tYnVpbGQucHJvcCBcCisKKyMgbGliaGVhbHRobG9vcCBCUEYgZmlsdGVyLiBUaGlzIGlzIGluIGJhc2VfdmVuZG9yLm1rIGJlY2F1c2UgbGliaGVhbHRobG9vcCBtdXN0CisjIGJlIGEgc3RhdGljIGxpYnJhcnkgYW5kIGJlY2F1c2UgdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtIGlnbm9yZXMgJ3JlcXVpcmVkJworIyBzZWN0aW9ucyBmb3Igc3RhdGljIGxpYnJhcmllcy4KK1BST0RVQ1RfUEFDS0FHRVMgKz0gZmlsdGVyUG93ZXJTdXBwbHlFdmVudHMubwogCiAjIEJhc2UgbW9kdWxlcyB3aGVuIHNoaXBwaW5nIGFwaSBsZXZlbCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzQKIFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0ICs9IFwKQEAgLTk5LDkgKzEwNiwxNiBAQAogIyBWSU5URiBkYXRhIGZvciB2ZW5kb3IgaW1hZ2UKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHZlbmRvcl9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAorICAgIHZlbmRvcl9tYW5pZmVzdC54bWwgXAogCiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBkZWJ1ZyByYW1kaXNrLCB3aGljaCBpcyB0aGVuIHBhY2tlZAogIyBpbnRvIGEgYm9vdC1kZWJ1Zy5pbWcgYW5kIGEgdmVuZG9yX2Jvb3QtZGVidWcuaW1nLgogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWRiX2RlYnVnLnByb3AgXAogICAgIHVzZXJkZWJ1Z19wbGF0X3NlcG9saWN5LmNpbAorCisjIE9uIGVuZyBvciB1c2VyZGVidWcgYnVpbGRzLCBidWlsZCBpbiBwZXJmLXNldHVwLXNoIGJ5IGRlZmF1bHQuCitpZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgcGVyZi1zZXR1cC1zaAorZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5tayBiL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5tawppbmRleCA1ZmU1MzMzLi5lOTlhYjA2IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rCkBAIC0xNyw1ICsxNywxNyBAQAogIyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHRydW5rLXN0YWJsZSBmbGFncyB0aGF0IHNob3VsZCBiZSBleHBvcnRlZCB0byBhbGwKICMgQW5kcm9pZCB0YXJnZXRzLgogCisjIENvbnRyb2wgbGliYmluZGVyIGNsaWVudCBjYWNoaW5nCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbGliYmluZGVyLCByZWxlYXNlX2xpYmJpbmRlcl9jbGllbnRfY2FjaGUsICQoUkVMRUFTRV9MSUJCSU5ERVJfQ0xJRU5UX0NBQ0hFKSkKKworIyBDb250cm9sIGNhY2hpbmcgd2hpbGUgYWRkaW5nIHNlcnZpY2UgaW4gbGliYmluZGVyIGNhY2hlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbGliYmluZGVyLCByZWxlYXNlX2xpYmJpbmRlcl9hZGRzZXJ2aWNlX2NhY2hlLCAkKFJFTEVBU0VfTElCQklOREVSX0FERFNFUlZJQ0VfQ0FDSEUpKQorCisjIFJlbW92ZSBzdGF0aWMgbGlzdCBpbiBsaWJiaW5kZXIgY2FjaGUKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBsaWJiaW5kZXIsIHJlbGVhc2VfbGliYmluZGVyX3JlbW92ZV9jYWNoZV9zdGF0aWNfbGlzdCwgJChSRUxFQVNFX0xJQkJJTkRFUl9SRU1PVkVfQ0FDSEVfU1RBVElDX0xJU1QpKQorCiAjIFVzZSB0aGUgY29uZmlndXJlZCByZWxlYXNlIG9mIHNxbGl0ZQogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIGxpYnNxbGl0ZTMsIHJlbGVhc2VfcGFja2FnZV9saWJzcWxpdGUzLCAkKFJFTEVBU0VfUEFDS0FHRV9MSUJTUUxJVEUzKSkKKworIyBVc2UgdGhlIGNvbmZpZ3VyZWQgTWVzc2FnZVF1ZXVlIGltcGxlbWVudGF0aW9uCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbWVzc2FnZXF1ZXVlLCByZWxlYXNlX3BhY2thZ2VfbWVzc2FnZXF1ZXVlX2ltcGxlbWVudGF0aW9uLCAkKFJFTEVBU0VfUEFDS0FHRV9NRVNTQUdFUVVFVUVfSU1QTEVNRU5UQVRJT04pKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rCmluZGV4IDFhM2YyY2YuLmQ4NTdlMDQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5taworKysgYi90YXJnZXQvcHJvZHVjdC9kZWZhdWx0X2FydF9jb25maWcubWsKQEAgLTc2LDYgKzc2LDcgQEAKICAgICBjb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyOmZyYW1ld29yay1tZWRpYXByb3ZpZGVyIFwKICAgICBjb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyOmZyYW1ld29yay1wZGYgXAogICAgIGNvbS5hbmRyb2lkLm1lZGlhcHJvdmlkZXI6ZnJhbWV3b3JrLXBkZi12IFwKKyAgICBjb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyOmZyYW1ld29yay1waG90b3BpY2tlciBcCiAgICAgY29tLmFuZHJvaWQub25kZXZpY2VwZXJzb25hbGl6YXRpb246ZnJhbWV3b3JrLW9uZGV2aWNlcGVyc29uYWxpemF0aW9uIFwKICAgICBjb20uYW5kcm9pZC5vcy5zdGF0c2Q6ZnJhbWV3b3JrLXN0YXRzZCBcCiAgICAgY29tLmFuZHJvaWQucGVybWlzc2lvbjpmcmFtZXdvcmstcGVybWlzc2lvbiBcCkBAIC0xMTMsNiArMTE0LDIzIEBACiAKIGVuZGlmCiAKK2lmbmVxICgsJChSRUxFQVNFX1JBTkdJTkdfU1RBQ0spKQorICAgIFBST0RVQ1RfQVBFWF9CT09UX0pBUlMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC51d2I6ZnJhbWV3b3JrLXJhbmdpbmcgXAorICAgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LGJvb3RjbGFzc3BhdGgscmVsZWFzZV9yYW5naW5nX3N0YWNrLHRydWUpCitlbmRpZgorCisjIENoZWNrIGlmIFZDTiBzaG91bGQgYmUgYnVpbHQgaW50byB0aGUgdGV0aGVyaW5nIG1vZHVsZSBvciBub3QKK2lmZXEgKCQoUkVMRUFTRV9NT1ZFX1ZDTl9UT19NQUlOTElORSksdHJ1ZSkKKyAgICBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQudGV0aGVyaW5nOmZyYW1ld29yay1jb25uZWN0aXZpdHktYiBcCisKK2Vsc2UKKyAgICBQUk9EVUNUX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGZyYW1ld29yay1jb25uZWN0aXZpdHktYiBcCisKK2VuZGlmCisKICMgTGlzdCBvZiBzeXN0ZW1fc2VydmVyIGNsYXNzcGF0aCBqYXJzIGRlbGl2ZXJlZCB2aWEgYXBleC4KICMgS2VlcCB0aGUgbGlzdCBzb3J0ZWQgYnkgbW9kdWxlIG5hbWVzIGFuZCB0aGVuIGxpYnJhcnkgbmFtZXMuCiAjIE5vdGU6IEZvciBtb2R1bGVzIGF2YWlsYWJsZSBpbiBRLCBETyBOT1QgYWRkIG5ldyBlbnRyaWVzIGhlcmUuCkBAIC0xNjgsNiArMTg2LDExIEBACiAKIGVuZGlmCiAKK2lmbmVxICgsJChSRUxFQVNFX1JBTkdJTkdfU1RBQ0spKQorICAgIFBST0RVQ1RfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnV3YjpzZXJ2aWNlLXJhbmdpbmcKK2VuZGlmCisKICMgT3ZlcnJpZGVzIHRoZSAoYXBleCwgamFyKSBwYWlycyBhYm92ZSB3aGVuIGRldGVybWluaW5nIHRoZSBvbi1kZXZpY2UgbG9jYXRpb24uIFRoZSBmb3JtYXQgaXM6CiAjIDxvbGRfYXBleD46PG9sZF9qYXI+OjxuZXdfYXBleD46PG5ld19qYXI+CiBQUk9EVUNUX0NPTkZJR1VSRURfSkFSX0xPQ0FUSU9OX09WRVJSSURFUyA6PSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5tayBiL3RhcmdldC9wcm9kdWN0L2Z1bGxfeDg2Lm1rCmluZGV4IDA3ZjY0NzIuLmExYjcxY2EgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Z1bGxfeDg2Lm1rCkBAIC0zMiwxMSArMzIsNiBAQAogICBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IG5ldC5ldGgwLnN0YXJ0b25ib290PTEKIGVuZGlmCiAKLSMgRW5zdXJlIHdlIHBhY2thZ2UgdGhlIEJJT1MgZmlsZXMgdG9vLgotUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKLQliaW9zLmJpbiBcCi0JdmdhYmlvcy1jaXJydXMuYmluIFwKLQogIyBFbmFibGUgZHluYW1pYyBwYXJ0aXRpb24gc2l6ZQogUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05fU0laRSA6PSB0cnVlCiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxtdGUubWsgYi90YXJnZXQvcHJvZHVjdC9mdWxsbXRlLm1rCmluZGV4IGI2MjI0OTYuLmZlZDY2ZTcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Z1bGxtdGUubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbG10ZS5tawpAQCAtMjAsNyArMjAsNyBAQAogIyBGb3IgbW9yZSBkZXRhaWxzLCBzZWU6CiAjIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvdGVzdC9tZW1vcnktc2FmZXR5L2FybS1tdGUKIGlmZXEgKCQoZmlsdGVyIG1lbXRhZ19oZWFwLCQoU0FOSVRJWkVfVEFSR0VUKSksKQotICBTQU5JVElaRV9UQVJHRVQgOj0gJChzdHJpcCAkKFNBTklUSVpFX1RBUkdFVCkgbWVtdGFnX2hlYXAgbWVtdGFnX3N0YWNrKQorICBTQU5JVElaRV9UQVJHRVQgOj0gJChzdHJpcCAkKFNBTklUSVpFX1RBUkdFVCkgbWVtdGFnX2hlYXAgbWVtdGFnX3N0YWNrIG1lbXRhZ19nbG9iYWxzKQogICBTQU5JVElaRV9UQVJHRVRfRElBRyA6PSAkKHN0cmlwICQoU0FOSVRJWkVfVEFSR0VUX0RJQUcpIG1lbXRhZ19oZWFwKQogZW5kaWYKIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHBlcnNpc3QuYXJtNjQubWVtdGFnLmRlZmF1bHQ9c3luYwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9BbmRyb2lkLmJwIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDdkN2YKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5OTAgQEAKK2dlbmVyaWNfcm9vdGRpcnMgPSBbCisgICAgImFwZXgiLAorICAgICJib290c3RyYXAtYXBleCIsCisgICAgImNvbmZpZyIsCisgICAgImRhdGEiLAorICAgICJkYXRhX21pcnJvciIsCisgICAgImRlYnVnX3JhbWRpc2siLAorICAgICJkZXYiLAorICAgICJsaW5rZXJjb25maWciLAorICAgICJtZXRhZGF0YSIsCisgICAgIm1udCIsCisgICAgIm9kbSIsCisgICAgIm9kbV9kbGttIiwKKyAgICAib2VtIiwKKyAgICAicG9zdGluc3RhbGwiLAorICAgICJwcm9jIiwKKyAgICAic2Vjb25kX3N0YWdlX3Jlc291cmNlcyIsCisgICAgInN0b3JhZ2UiLAorICAgICJzeXMiLAorICAgICJzeXN0ZW0iLAorICAgICJzeXN0ZW1fZGxrbSIsCisgICAgInRtcCIsCisgICAgInZlbmRvciIsCisgICAgInZlbmRvcl9kbGttIiwKK10KKworYW5kcm9pZF9yb290ZGlycyA9IFsKKyAgICAic3lzdGVtX2V4dCIsCisgICAgInByb2R1Y3QiLAorXQorCitnZW5lcmljX3N5bWxpbmtzID0gWworICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9iaW4vaW5pdCIsCisgICAgICAgIG5hbWU6ICJpbml0IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9ldGMiLAorICAgICAgICBuYW1lOiAiZXRjIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9iaW4iLAorICAgICAgICBuYW1lOiAiYmluIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvciIsCisgICAgICAgIG5hbWU6ICJzeXN0ZW0vdmVuZG9yIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbV9kbGttL2xpYi9tb2R1bGVzIiwKKyAgICAgICAgbmFtZTogInN5c3RlbS9saWIvbW9kdWxlcyIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9kYXRhL3VzZXJfZGUvMC9jb20uYW5kcm9pZC5zaGVsbC9maWxlcy9idWdyZXBvcnRzIiwKKyAgICAgICAgbmFtZTogImJ1Z3JlcG9ydHMiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzL2tlcm5lbC9kZWJ1ZyIsCisgICAgICAgIG5hbWU6ICJkIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N0b3JhZ2Uvc2VsZi9wcmltYXJ5IiwKKyAgICAgICAgbmFtZTogInNkY2FyZCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9wcm9kdWN0L2V0Yy9zZWN1cml0eS9hZGJfa2V5cyIsCisgICAgICAgIG5hbWU6ICJhZGJfa2V5cyIsCisgICAgfSwKKyAgICAvLyBGb3IgVHJlYmxlIEdlbmVyaWMgU3lzdGVtIEltYWdlIChHU0kpLCBzeXN0ZW0tYXMtcm9vdCBHU0kgbmVlZHMgdG8gd29yayBvbiBib3RoIGRldmljZXMgd2l0aAorICAgIC8vIGFuZCB3aXRob3V0IC9vZG0gcGFydGl0aW9uLiBUaG9zZSBzeW1saW5rcyBhcmUgZm9yIGRldmljZXMgd2l0aG91dCAvb2RtIHBhcnRpdGlvbi4gRm9yCisgICAgLy8gZGV2aWNlcyB3aXRoIC9vZG0gcGFydGl0aW9uLCBtb3VudCBvZG0uaW1nIHVuZGVyIC9vZG0gd2lsbCBoaWRlIHRob3NlIHN5bWxpbmtzLgorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vYXBwIiwKKyAgICAgICAgbmFtZTogIm9kbS9hcHAiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9iaW4iLAorICAgICAgICBuYW1lOiAib2RtL2JpbiIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL2V0YyIsCisgICAgICAgIG5hbWU6ICJvZG0vZXRjIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vZmlybXdhcmUiLAorICAgICAgICBuYW1lOiAib2RtL2Zpcm13YXJlIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vZnJhbWV3b3JrIiwKKyAgICAgICAgbmFtZTogIm9kbS9mcmFtZXdvcmsiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9saWIiLAorICAgICAgICBuYW1lOiAib2RtL2xpYiIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL2xpYjY0IiwKKyAgICAgICAgbmFtZTogIm9kbS9saWI2NCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL292ZXJsYXkiLAorICAgICAgICBuYW1lOiAib2RtL292ZXJsYXkiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9wcml2LWFwcCIsCisgICAgICAgIG5hbWU6ICJvZG0vcHJpdi1hcHAiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS91c3IiLAorICAgICAgICBuYW1lOiAib2RtL3VzciIsCisgICAgfSwKK10KKworYW5kcm9pZF9zeW1saW5rcyA9IFsKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9wcm9kdWN0IiwKKyAgICAgICAgbmFtZTogInN5c3RlbS9wcm9kdWN0IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbV9leHQiLAorICAgICAgICBuYW1lOiAic3lzdGVtL3N5c3RlbV9leHQiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvZGF0YS9jYWNoZSIsCisgICAgICAgIG5hbWU6ICJjYWNoZSIsCisgICAgfSwKK10KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiZ2VuZXJpY19zeXN0ZW1fc2lnbl9rZXkiLAorICAgIHNyY3M6IFsiOmF2Yl90ZXN0a2V5X3JzYTQwOTYiXSwKK30KKworcGhvbnkgeworICAgIG5hbWU6ICJnZW5lcmljX3N5c3RlbV9mb250cyIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIkFuZHJvaWRDbG9jay50dGYiLAorICAgICAgICAiQ2Fycm9pc0dvdGhpY1NDLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIkNvbWluZ1Nvb24udHRmIiwKKyAgICAgICAgIkN1dGl2ZU1vbm8udHRmIiwKKyAgICAgICAgIkRhbmNpbmdTY3JpcHQtUmVndWxhci50dGYiLAorICAgICAgICAiRHJvaWRTYW5zTW9uby50dGYiLAorICAgICAgICAiTm90b0NvbG9yRW1vamkudHRmIiwKKyAgICAgICAgIk5vdG9Db2xvckVtb2ppRmxhZ3MudHRmIiwKKyAgICAgICAgIk5vdG9OYXNraEFyYWJpYy1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvTmFza2hBcmFiaWMtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b05hc2toQXJhYmljVUktQm9sZC50dGYiLAorICAgICAgICAiTm90b05hc2toQXJhYmljVUktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNBZGxhbS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNBaG9tLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zQW5hdG9saWFuSGllcm9nbHlwaHMtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNBcm1lbmlhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNBdmVzdGFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQmFsaW5lc2UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCYW11bS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0Jhc3NhVmFoLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zQmF0YWstUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCZW5nYWxpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0JlbmdhbGlVSS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNCaGFpa3N1a2ktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNCcmFobWktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCdWdpbmVzZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0J1aGlkLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ0pLLVJlZ3VsYXIudHRjIiwKKyAgICAgICAgIk5vdG9TYW5zQ2FuYWRpYW5BYm9yaWdpbmFsLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2FyaWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2hha21hLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2hhbS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0NoYW0tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNDaGVyb2tlZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0NvcHRpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0N1bmVpZm9ybS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0N5cHJpb3QtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNEZXNlcmV0LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zRGV2YW5hZ2FyaS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNEZXZhbmFnYXJpVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zRWd5cHRpYW5IaWVyb2dseXBocy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0VsYmFzYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNFdGhpb3BpYy1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNHZW9yZ2lhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNHbGFnb2xpdGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR290aGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3JhbnRoYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1amFyYXRpLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VqYXJhdGktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNHdWphcmF0aVVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VqYXJhdGlVSS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1bmphbGFHb25kaS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1cm11a2hpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1cm11a2hpVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSGFuaWZpUm9oaW5neWEtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNIYW51bm9vLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSGF0cmFuLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zSGVicmV3LUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSGVicmV3LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSW1wZXJpYWxBcmFtYWljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSW5zY3JpcHRpb25hbFBhaGxhdmktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNJbnNjcmlwdGlvbmFsUGFydGhpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNKYXZhbmVzZS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0thaXRoaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0thbm5hZGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2FubmFkYVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0theWFoTGktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNLaGFyb3NodGhpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2htZXItVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2htZXJVSS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0tobWVyVUktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNLaG9qa2ktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNMYW8tQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNMYW8tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMYW9VSS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xhb1VJLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTGVwY2hhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTGltYnUtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMaW5lYXJBLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTGluZWFyQi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xpc3UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMeWNpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMeWRpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNNYWxheWFsYW0tVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFsYXlhbGFtVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFuZGFpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc01hbmljaGFlYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNYXJjaGVuLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFzYXJhbUdvbmRpLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTWVkZWZhaWRyaW4tVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWVldGVpTWF5ZWstUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNNZXJvaXRpYy1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc01pYW8tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNb2RpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTW9uZ29saWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTXJvLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXVsdGFuaS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc015YW5tYXItQm9sZC5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyLU1lZGl1bS5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXlhbm1hclVJLUJvbGQub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXlhbm1hclVJLU1lZGl1bS5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyVUktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNOS28tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNOYWJhdGFlYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNOZXdUYWlMdWUtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNOZXdhLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zT2doYW0tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPbENoaWtpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkSXRhbGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkTm9ydGhBcmFiaWFuLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkUGVybWljLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkUGVyc2lhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09sZFNvdXRoQXJhYmlhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09sZFR1cmtpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09yaXlhLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3JpeWEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPcml5YVVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3JpeWFVSS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09zYWdlLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3NtYW55YS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1BhaGF3aEhtb25nLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zUGFsbXlyZW5lLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zUGF1Q2luSGF1LVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zUGhhZ3NQYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1Bob2VuaWNpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNSZWphbmctUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNSdW5pYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NhbWFyaXRhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NhdXJhc2h0cmEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNTaGFyYWRhLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zU2hhdmlhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NpbmhhbGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU2luaGFsYVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NvcmFTb21wZW5nLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zU295b21iby1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNTdW5kYW5lc2UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNTeWxvdGlOYWdyaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N5bWJvbHMtUmVndWxhci1TdWJzZXR0ZWQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU3ltYm9scy1SZWd1bGFyLVN1YnNldHRlZDIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU3lyaWFjRWFzdGVybi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N5cmlhY0VzdHJhbmdlbGEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNTeXJpYWNXZXN0ZXJuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFnYWxvZy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhZ2JhbndhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFpTGUtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUYWlUaGFtLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFpVmlldC1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1Rha3JpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhbWlsLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhbWlsVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGVsdWd1LVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RlbHVndVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWFuYS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWFuYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNUaGFpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhaVVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhaVVJLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGlmaW5hZ2gtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNVZ2FyaXRpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1ZhaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1dhbmNoby1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc1dhcmFuZ0NpdGktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNZaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWYtQm9sZC50dGYiLAorICAgICAgICAiTm90b1NlcmlmLUJvbGRJdGFsaWMudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZi1JdGFsaWMudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZBcm1lbmlhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmQmVuZ2FsaS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmQ0pLLVJlZ3VsYXIudHRjIiwKKyAgICAgICAgIk5vdG9TZXJpZkRldmFuYWdhcmktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkRvZ3JhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkV0aGlvcGljLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZHZW9yZ2lhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmR3VqYXJhdGktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkd1cm11a2hpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZIZWJyZXctQm9sZC50dGYiLAorICAgICAgICAiTm90b1NlcmlmSGVicmV3LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkhlbnRhaWdhbmEudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkthbm5hZGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZktobWVyLUJvbGQub3RmIiwKKyAgICAgICAgIk5vdG9TZXJpZktobWVyLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TZXJpZkxhby1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZMYW8tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NlcmlmTWFsYXlhbGFtLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZNeWFubWFyLUJvbGQub3RmIiwKKyAgICAgICAgIk5vdG9TZXJpZk15YW5tYXItUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NlcmlmTnlpYWtlbmdQdWFjaHVlSG1vbmctVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlNpbmhhbGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlRhbWlsLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZUZWx1Z3UtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlRoYWktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NlcmlmVGhhaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZUaWJldGFuLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZZZXppZGktVkYudHRmIiwKKyAgICAgICAgIlJvYm90by1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJSb2JvdG9GbGV4LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIlJvYm90b1N0YXRpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJTb3VyY2VTYW5zUHJvLUJvbGQudHRmIiwKKyAgICAgICAgIlNvdXJjZVNhbnNQcm8tQm9sZEl0YWxpYy50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1JdGFsaWMudHRmIiwKKyAgICAgICAgIlNvdXJjZVNhbnNQcm8tUmVndWxhci50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1TZW1pQm9sZC50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1TZW1pQm9sZEl0YWxpYy50dGYiLAorICAgICAgICAiZm9udF9mYWxsYmFjay54bWwiLAorICAgICAgICAiZm9udHMueG1sIiwKKyAgICBdLAorfQorCithbmRyb2lkX2ZpbGVzeXN0ZW1fZGVmYXVsdHMgeworICAgIG5hbWU6ICJzeXN0ZW1fZXh0X2ltYWdlX2RlZmF1bHRzIiwKKyAgICBkZXBzOiBbCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gYmFzZV9zeXN0ZW1fZXh0CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgImJ1aWxkX2ZsYWdfc3lzdGVtX2V4dCIsCisgICAgICAgICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImdyb3VwX3N5c3RlbV9leHQiLAorICAgICAgICAicGFzc3dkX3N5c3RlbV9leHQiLAorICAgICAgICAiU2F0ZWxsaXRlQ2xpZW50IiwKKyAgICAgICAgInNlbGludXhfcG9saWN5X3N5c3RlbV9leHQiLAorICAgICAgICAic3lzdGVtX2V4dF9tYW5pZmVzdC54bWwiLAorICAgICAgICAic3lzdGVtX2V4dC1idWlsZC5wcm9wIiwKKyAgICAgICAgLy8gQmFzZSBtb2R1bGVzIHdoZW4gc2hpcHBpbmcgYXBpIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzNAorICAgICAgICAiaHdzZXJ2aWNlbWFuYWdlciIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMC1zZXJ2aWNlIiwKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIHdpbmRvd19leHRlbnNpb25zX2Jhc2UKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiYW5kcm9pZHgud2luZG93LmV4dGVuc2lvbnMiLAorICAgICAgICAiYW5kcm9pZHgud2luZG93LnNpZGVjYXIiLAorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiY2hhcmdlciIsCisgICAgXSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfQVBQRlVOQ1RJT05fU0lERUNBUiIpLCB7CisgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5leHRlbnNpb25zLmFwcGZ1bmN0aW9ucyIsCisgICAgICAgICAgICAiYXBwZnVuY3Rpb25zLmV4dGVuc2lvbi54bWwiLAorICAgICAgICBdLAorICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICB9KSwKK30KKworYW5kcm9pZF9maWxlc3lzdGVtX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAicHJvZHVjdF9pbWFnZV9kZWZhdWx0cyIsCisgICAgZGVwczogWworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIG1lZGlhX3Byb2R1Y3QKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAid2VidmlldyIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBiYXNlX3Byb2R1Y3QKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIC8vIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBwcm9kdWN0IHBhcnRpdGlvbi4KKyAgICAgICAgImJ1aWxkX2ZsYWdfcHJvZHVjdCIsCisgICAgICAgICJmc19jb25maWdfZGlyc19wcm9kdWN0IiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19wcm9kdWN0IiwKKyAgICAgICAgImdyb3VwX3Byb2R1Y3QiLAorICAgICAgICAiTW9kdWxlTWV0YWRhdGEiLAorICAgICAgICAicGFzc3dkX3Byb2R1Y3QiLAorICAgICAgICAicHJvZHVjdF9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwiLAorICAgICAgICAicHJvZHVjdF9tYW5pZmVzdC54bWwiLAorICAgICAgICAic2VsaW51eF9wb2xpY3lfcHJvZHVjdCIsCisgICAgICAgICJwcm9kdWN0LWJ1aWxkLnByb3AiLAorCisgICAgICAgIC8vIEFVRElPCisgICAgICAgICJmcmFtZXdvcmtzX3NvdW5kcyIsCisgICAgXSArIHNlbGVjdChwcm9kdWN0X3ZhcmlhYmxlKCJkZWJ1Z2dhYmxlIiksIHsKKyAgICAgICAgLy8gUGFja2FnZXMgaW5jbHVkZWQgb25seSBmb3IgZW5nIG9yIHVzZXJkZWJ1ZyBidWlsZHMsIHByZXZpb3VzbHkgZGVidWcgdGFnZ2VkCisgICAgICAgIHRydWU6IFsiYWRiX2tleXMiXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSksCit9CisKK2FuZHJvaWRfZmlsZXN5c3RlbV9kZWZhdWx0cyB7CisgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kZWZhdWx0cyIsCisgICAgcGFydGl0aW9uX25hbWU6ICJzeXN0ZW0iLAorICAgIGJhc2VfZGlyOiAic3lzdGVtIiwKKyAgICBkaXJzOiBnZW5lcmljX3Jvb3RkaXJzLAorICAgIHN5bWxpbmtzOiBnZW5lcmljX3N5bWxpbmtzLAorICAgIGZpbGVfY29udGV4dHM6ICI6cGxhdF9maWxlX2NvbnRleHRzIiwKKyAgICBsaW5rZXJfY29uZmlnOiB7CisgICAgICAgIGdlbl9saW5rZXJfY29uZmlnOiB0cnVlLAorICAgICAgICBsaW5rZXJfY29uZmlnX3NyY3M6IFsiOnN5c3RlbV9saW5rZXJfY29uZmlnX2pzb25fZmlsZSJdLAorICAgIH0sCisgICAgZnN2ZXJpdHk6IHsKKyAgICAgICAgaW5wdXRzOiBbCisgICAgICAgICAgICAiZXRjL2Jvb3QtaW1hZ2UucHJvZiIsCisgICAgICAgICAgICAiZXRjL2NsYXNzcGF0aHMvKi5wYiIsCisgICAgICAgICAgICAiZXRjL2RpcnR5LWltYWdlLW9iamVjdHMiLAorICAgICAgICAgICAgImV0Yy9wcmVsb2FkZWQtY2xhc3NlcyIsCisgICAgICAgICAgICAiZnJhbWV3b3JrLyoiLAorICAgICAgICAgICAgImZyYW1ld29yay8qLyoiLCAvLyBmcmFtZXdvcmsve2FyY2h9CisgICAgICAgICAgICAiZnJhbWV3b3JrL29hdC8qLyoiLCAvLyBmcmFtZXdvcmsvb2F0L3thcmNofQorICAgICAgICBdLAorICAgICAgICBsaWJzOiBbIjpmcmFtZXdvcmstcmVzey5leHBvcnQtcGFja2FnZS5hcGt9Il0sCisgICAgfSwKKyAgICBidWlsZF9sb2d0YWdzOiB0cnVlLAorICAgIGdlbl9hY29uZmlnX2ZsYWdzX3BiOiB0cnVlLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorCisgICAgdXNlX2F2YjogdHJ1ZSwKKyAgICBhdmJfcHJpdmF0ZV9rZXk6ICI6Z2VuZXJpY19zeXN0ZW1fc2lnbl9rZXkiLAorICAgIGF2Yl9hbGdvcml0aG06ICJTSEEyNTZfUlNBNDA5NiIsCisgICAgYXZiX2hhc2hfYWxnb3JpdGhtOiAic2hhMjU2IiwKKworICAgIGRlcHM6IFsKKyAgICAgICAgImFieCIsCisgICAgICAgICJhY29uZmlnZC1zeXN0ZW0iLAorICAgICAgICAiYWZsYWdzIiwKKyAgICAgICAgImFtIiwKKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUuY3JlZGVudGlhbHMucHJlYnVpbHQueG1sIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUud2Vidmlldy5wcmVidWlsdC54bWwiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUud2luZG93X21hZ25pZmljYXRpb24ucHJlYnVpbHQueG1sIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLXNlcnZpY2UiLAorICAgICAgICAiYXBleGQiLAorICAgICAgICAiYXBwb3BzIiwKKyAgICAgICAgImFwcHJvdmVkLW9na2ktYnVpbGRzLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJhcHB3aWRnZXQiLAorICAgICAgICAiYXRyYWNlIiwKKyAgICAgICAgImF1ZGlvc2VydmVyIiwKKyAgICAgICAgImJjYyIsCisgICAgICAgICJibGFua19zY3JlZW4iLAorICAgICAgICAiYmxraWQiLAorICAgICAgICAiYm1nciIsCisgICAgICAgICJib290YW5pbWF0aW9uIiwKKyAgICAgICAgImJvb3RzdGF0IiwKKyAgICAgICAgImJwZmxvYWRlciIsCisgICAgICAgICJidSIsCisgICAgICAgICJidWdyZXBvcnQiLAorICAgICAgICAiYnVncmVwb3J0eiIsCisgICAgICAgICJjYW1lcmFzZXJ2ZXIiLAorICAgICAgICAiY2dyb3Vwcy5qc29uIiwKKyAgICAgICAgImNtZCIsCisgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgImNwcHJlb3B0cy5zaCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJjcmVkc3RvcmUiLAorICAgICAgICAiZGVidWdnZXJkIiwKKyAgICAgICAgImRldmljZV9jb25maWciLAorICAgICAgICAiZGlydHktaW1hZ2Utb2JqZWN0cyIsCisgICAgICAgICJkbWN0bCIsCisgICAgICAgICJkbWVzZ2QiLAorICAgICAgICAiZG5zbWFzcSIsCisgICAgICAgICJkcG0iLAorICAgICAgICAiZHVtcC5lcm9mcyIsCisgICAgICAgICJkdW1wc3RhdGUiLAorICAgICAgICAiZHVtcHN5cyIsCisgICAgICAgICJlMmZzY2siLAorICAgICAgICAiZW5oYW5jZWQtY29uZmlybWF0aW9uLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJldGNfaG9zdHMiLAorICAgICAgICAiZmxhZ3NfaGVhbHRoX2NoZWNrIiwKKyAgICAgICAgImZyYW1ld29yay1hdWRpb19lZmZlY3RzLnhtbCIsIC8vIGZvciBoYW5kaGVsZCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgImZyYW1ld29yay1zeXNjb25maWcueG1sIiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3N5c3RlbSIsCisgICAgICAgICJmc19jb25maWdfZmlsZXNfc3lzdGVtIiwKKyAgICAgICAgImZzY2suZXJvZnMiLAorICAgICAgICAiZnNjay5mMmZzIiwgLy8gZm9yIG1lZGlhX3N5c3RlbQorICAgICAgICAiZnNja19tc2RvcyIsCisgICAgICAgICJmc3Zlcml0eS1yZWxlYXNlLWNlcnQtZGVyIiwKKyAgICAgICAgImdhdGVrZWVwZXJkIiwKKyAgICAgICAgImdwdV9jb3VudGVyX3Byb2R1Y2VyIiwKKyAgICAgICAgImdwdXNlcnZpY2UiLAorICAgICAgICAiZ3JvdXBfc3lzdGVtIiwKKyAgICAgICAgImdzaV90b29sIiwKKyAgICAgICAgImdzaWQiLAorICAgICAgICAiaGVhcHByb2ZkIiwKKyAgICAgICAgImhpZCIsCisgICAgICAgICJoaWRkZW5hcGktcGFja2FnZS13aGl0ZWxpc3QueG1sIiwgLy8gZnJvbSBydW50aW1lX2xpYmFydAorICAgICAgICAiaWRjX2RhdGEiLAorICAgICAgICAiaWRtYXAyIiwKKyAgICAgICAgImlkbWFwMmQiLAorICAgICAgICAiaW1lIiwKKyAgICAgICAgImluY2lkZW50IiwKKyAgICAgICAgImluY2lkZW50LWhlbHBlci1jbWQiLAorICAgICAgICAiaW5jaWRlbnRfaGVscGVyIiwKKyAgICAgICAgImluY2lkZW50ZCIsCisgICAgICAgICJpbml0LmVudmlyb24ucmMtc29vbmciLAorICAgICAgICAiaW5pdC51c2IuY29uZmlnZnMucmMiLAorICAgICAgICAiaW5pdC51c2IucmMiLAorICAgICAgICAiaW5pdC56eWdvdGUzMi5yYyIsCisgICAgICAgICJpbml0Lnp5Z290ZTY0LnJjIiwKKyAgICAgICAgImluaXQuenlnb3RlNjRfMzIucmMiLAorICAgICAgICAiaW5pdGlhbC1wYWNrYWdlLXN0b3BwZWQtc3RhdGVzLnhtbCIsCisgICAgICAgICJpbnB1dCIsCisgICAgICAgICJpbnN0YWxsZCIsCisgICAgICAgICJpcCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJpcHRhYmxlcyIsCisgICAgICAgICJrY21kbGluZWN0cmwiLAorICAgICAgICAia2VybmVsLWxpZmV0aW1lcy54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAia2V5Y2hhcnNfZGF0YSIsCisgICAgICAgICJrZXlsYXlvdXRfZGF0YSIsCisgICAgICAgICJrZXlzdG9yZTIiLAorICAgICAgICAibGQubWMiLAorICAgICAgICAibGxrZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJsbWtkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgImxvY2tzZXR0aW5ncyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJsb2djYXQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibG9nZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJscGR1bXAiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibHNoYWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibWFrZV9mMmZzIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICJtZG5zZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYV9wcm9maWxlc19WMV8wLmR0ZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYWNvZGVjLnBvbGljeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYWV4dHJhY3RvciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYW1ldHJpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibWlzY3RybCIsIC8vIGZyb20gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm1rZTJmcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJta2ZzLmVyb2ZzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm1vbmtleSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtdGVjdHJsIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm5kYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJuZXRkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm5ldHV0aWxzLXdyYXBwZXItMS4wIiwgLy8gZnVsbF9iYXNlCisgICAgICAgICJub3RpY2VfeG1sX3N5c3RlbSIsCisgICAgICAgICJvZHNpZ24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAib3RhcHJlb3B0X3NjcmlwdCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJwYWNrYWdlLXNoYXJlZHVpZC1hbGxvd2xpc3QueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInBhc3N3ZF9zeXN0ZW0iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGVyZmV0dG8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGluZyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwaW5nNiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwaW50b29sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInBsYXRmb3JtLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwcmVmZXRjaCIsIC8vYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1hc2wtZmlsZXMueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1nZW5lcmljLXN5c3RlbS54bWwiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAicHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXN5c3RlbS54bWwiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJlaW5zdGFsbGVkLXBhY2thZ2VzLXN0cmljdC1zaWduYXR1cmUueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWxvYWRlZC1jbGFzc2VzIiwgLy8gb2sKKyAgICAgICAgInByaW50ZmxhZ3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJuZ19zZWVkZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHVibGljLmxpYnJhcmllcy5hbmRyb2lkLnR4dCIsCisgICAgICAgICJyZWNvdmVyeS1wZXJzaXN0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInJlY292ZXJ5LXJlZnJlc2giLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAicmVxdWVzdHN5bmMiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgInJlc2l6ZTJmcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJyc3NfaHdtX3Jlc2V0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInJ1bi1hcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzY2hlZHRlc3QiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2NyZWVuY2FwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNjcmVlbnJlY29yZCIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAic2RjYXJkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNlY2Rpc2NhcmQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2Vuc29yc2VydmljZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzZXJ2aWNlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNlcnZpY2VtYW5hZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNldHRpbmdzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNmZG8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2dkaXNrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNuYXB1c2VyZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdG9yYWdlZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdXJmYWNlZmxpbmdlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdmMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic3lzdGVtX21hbmlmZXN0LnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0YXNrX3Byb2ZpbGVzLmpzb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidGMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidGVsZWNvbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0b21ic3RvbmVkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInRyYWNlZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0cmFjZWRfcHJvYmVzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInRyYWRlaW5tb2RlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInR1bmUyZnMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidWlhdXRvbWF0b3IiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidWlucHV0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInVuY3J5cHQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidXBkYXRlX2VuZ2luZSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJ1cGRhdGVfZW5naW5lX3NpZGVsb2FkIiwgLy8gcmVjb3ZlcnkKKyAgICAgICAgInVwZGF0ZV92ZXJpZmllciIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJ1c2JkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInZkYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ2aXJ0dWFsX2NhbWVyYSIsIC8vIGhhbmRoZWxkX3N5c3RlbSAvLyByZWxlYXNlX3BhY2thZ2VfdmlydHVhbF9jYW1lcmEKKyAgICAgICAgInZvbGQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidnIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgIndhdGNoZG9nZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ3aWZpLnJjIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIndpZmljb25kIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIndtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICBdICsgc2VsZWN0KHJlbGVhc2VfZmxhZygiUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIiksIHsKKyAgICAgICAgIlJFTCI6IFtdLAorICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAiYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay5wcmVidWlsdC54bWwiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgXSwKKyAgICB9KSArIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAicmVsZWFzZV9wYWNrYWdlX3Byb2ZpbGluZ19tb2R1bGUiKSwgeworICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICJ0cmFjZV9yZWRhY3RvciIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkKKyAgICAgICAgXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX01FTU9SWV9NQU5BR0VNRU5UX0RBRU1PTiIpLCB7CisgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICJtbV9kYWVtb24iLCAvLyBiYXNlX3N5c3RlbSAoUkVMRUFTRV9NRU1PUllfTUFOQUdFTUVOVF9EQUVNT04pCisgICAgICAgIF0sCisgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgIH0pICsgc2VsZWN0KHByb2R1Y3RfdmFyaWFibGUoImRlYnVnZ2FibGUiKSwgeworICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAiYWRldmljZV9maW5nZXJwcmludCIsCisgICAgICAgICAgICAiYXJwaW5nIiwKKyAgICAgICAgICAgICJhdmJjdGwiLAorICAgICAgICAgICAgImJvb3RjdGwiLAorICAgICAgICAgICAgImRtdXNlcmQiLAorICAgICAgICAgICAgImV2ZW11LXJlY29yZCIsCisgICAgICAgICAgICAiaWRsY2xpIiwKKyAgICAgICAgICAgICJpbml0LWRlYnVnLnJjIiwKKyAgICAgICAgICAgICJpb3RvcCIsCisgICAgICAgICAgICAiaXBlcmYzIiwKKyAgICAgICAgICAgICJpdyIsCisgICAgICAgICAgICAibGF5ZXJ0cmFjZWdlbmVyYXRvciIsCisgICAgICAgICAgICAibG9ncGVyc2lzdC5zdGFydCIsCisgICAgICAgICAgICAibG9ndGFnZC5yYyIsCisgICAgICAgICAgICAib3QtY2xpLWZ0ZCIsCisgICAgICAgICAgICAib3QtY3RsIiwKKyAgICAgICAgICAgICJwcm9jcmFuayIsCisgICAgICAgICAgICAicHJvZmNvbGxlY3RjdGwiLAorICAgICAgICAgICAgInByb2Zjb2xsZWN0ZCIsCisgICAgICAgICAgICAicmVjb3JkX2JpbmRlciIsCisgICAgICAgICAgICAic2FuaXRpemVyLXN0YXR1cyIsCisgICAgICAgICAgICAic2VydmljZWRpc3BhdGNoZXIiLAorICAgICAgICAgICAgInNob3dtYXAiLAorICAgICAgICAgICAgInNuYXBzaG90Y3RsIiwKKyAgICAgICAgICAgICJzcWxpdGUzIiwKKyAgICAgICAgICAgICJzcyIsCisgICAgICAgICAgICAic3RhcnRfd2l0aF9sb2NrYWdlbnQiLAorICAgICAgICAgICAgInN0cmFjZSIsCisgICAgICAgICAgICAic3UiLAorICAgICAgICAgICAgInRpbnljYXAiLAorICAgICAgICAgICAgInRpbnlob3N0bGVzcyIsCisgICAgICAgICAgICAidGlueW1peCIsCisgICAgICAgICAgICAidGlueXBjbWluZm8iLAorICAgICAgICAgICAgInRpbnlwbGF5IiwgLy8gaG9zdAorICAgICAgICAgICAgInRyYWNlcGF0aCIsCisgICAgICAgICAgICAidHJhY2VwYXRoNiIsCisgICAgICAgICAgICAidHJhY2Vyb3V0ZTYiLAorICAgICAgICAgICAgInVud2luZF9pbmZvIiwKKyAgICAgICAgICAgICJ1bndpbmRfcmVnX2luZm8iLAorICAgICAgICAgICAgInVud2luZF9zeW1ib2xzIiwKKyAgICAgICAgICAgICJ1cGRhdGVfZW5naW5lX2NsaWVudCIsCisgICAgICAgIF0sCisgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgIH0pLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGNvbW1vbjogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJCYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQmFzaWNEcmVhbXMiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQmxvY2tlZE51bWJlclByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkJsdWV0b290aE1pZGlTZXJ2aWNlIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkJvb2ttYXJrUHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQnVpbHRJblByaW50U2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJDYWxlbmRhclByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNhbGxMb2dCYWNrdXAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNhbWVyYUV4dGVuc2lvbnNQcm94eSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJDYXB0aXZlUG9ydGFsTG9naW4iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ2FycmllckRlZmF1bHRBcHAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNlbGxCcm9hZGNhc3RMZWdhY3lBcHAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNlcnRJbnN0YWxsZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ29tcGFuaW9uRGV2aWNlTWFuYWdlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJDb250YWN0c1Byb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbE1hbmFnZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRGV2aWNlQXNXZWJjYW0iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRGV2aWNlRGlhZ25vc3RpY3MiLCAvLyBoYW5kaGVsZF9zeXN0ZW0gLSBpbnRlcm5hbAorICAgICAgICAgICAgICAgICJEb2N1bWVudHNVSSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJEb3dubG9hZFByb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRG93bmxvYWRQcm92aWRlclVpIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkR5bmFtaWNTeXN0ZW1JbnN0YWxsYXRpb25TZXJ2aWNlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRTJlZUNvbnRhY3RLZXlzUHJvdmlkZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJFYXN0ZXJFZ2ciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRXh0U2hhcmVkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRXh0ZXJuYWxTdG9yYWdlUHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRnVzZWRMb2NhdGlvbiIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJIVE1MVmlld2VyIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgIklucHV0RGV2aWNlcyIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJJbnRlbnRSZXNvbHZlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIktleUNoYWluIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkxpdmVXYWxscGFwZXJzUGlja2VyIiwgLy8gZ2VuZXJpY19zeXN0ZW0sIGZ1bGxfYmFzZQorICAgICAgICAgICAgICAgICJMb2NhbFRyYW5zcG9ydCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk1hbmFnZWRQcm92aXNpb25pbmciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiTWVkaWFQcm92aWRlckxlZ2FjeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk1tc1NlcnZpY2UiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiTXRwU2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJNdXNpY0ZYIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIk5ldHdvcmtTdGFjayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk9OUyIsIC8vIHRlbGVwaG9ueV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiUGFjUHJvY2Vzc29yIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlBhY2thZ2VJbnN0YWxsZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJQYXJ0bmVyQm9va21hcmtzUHJvdmlkZXIiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJQcmludFJlY29tbWVuZGF0aW9uU2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJQcmludFNwb29sZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiUHJveHlIYW5kbGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlNlY3VyZUVsZW1lbnQiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU2V0dGluZ3NQcm92aWRlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIlNoYXJlZFN0b3JhZ2VCYWNrdXAiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU2hlbGwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJTaW1BcHBEaWFsb2ciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU291bmRQaWNrZXIiLCAvLyBub3QgaW5zdGFsbGVkIGJ5IGFueW9uZQorICAgICAgICAgICAgICAgICJTdGF0ZW1lbnRTZXJ2aWNlIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgIlN0ayIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRhZyIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRlbGVTZXJ2aWNlIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRlbGVjb20iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiVGVsZXBob255UHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiVHJhY2V1ciIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJVc2VyRGljdGlvbmFyeVByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlZwbkRpYWxvZ3MiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiV2FsbHBhcGVyQmFja3VwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYWRiZF9zeXN0ZW1fYXBpIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oaWRsLmJhc2UtVjEuMC1qYXZhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oaWRsLm1hbmFnZXItVjEuMC1qYXZhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZXN0LmJhc2UiLCAvLyBmcm9tIHJ1bnRpbWVfbGliYXJ0CisgICAgICAgICAgICAgICAgImFuZHJvaWQudGVzdC5tb2NrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZXN0LnJ1bm5lciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImFvc3BfbWFpbmxpbmVfbW9kdWxlcyIsIC8vIG9rCisgICAgICAgICAgICAgICAgImJ1aWxkX2ZsYWdfc3lzdGVtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY2hhcmdlcl9yZXNfaW1hZ2VzIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV9wcmVidWlsdCIsIC8vIG9rCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNlbGxicm9hZGNhc3QiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmZ1dHVyZS51c2IuYWNjZXNzb3J5IiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmxvY2F0aW9uLnByb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEucmVtb3RlZGlzcGxheSIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5yZW1vdGVkaXNwbGF5LnhtbCIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYWRybS5zaWduZXIiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjX2V4dHJhcyIsIC8vIG9rCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzIiwgLy8gYmFzZV9zeXN0ZW0gKFJFTEVBU0VfUEFDS0FHRV9ORkNfU1RBQ0sgIT0gTmZjTmNpKQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ydW50aW1lIiwgLy8gb2sKKyAgICAgICAgICAgICAgICAiZGV4X2Jvb3RqYXJzIiwKKyAgICAgICAgICAgICAgICAiZXh0IiwgLy8gZnJvbSBydW50aW1lX2xpYmFydAorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstZ3JhcGhpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstbG9jYXRpb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstbWludXMtYXBleC1pbnN0YWxsLWRlcGVuZGVuY2llcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImZyYW1ld29ya19jb21wYXRpYmlsaXR5X21hdHJpeC5kZXZpY2UueG1sIiwKKyAgICAgICAgICAgICAgICAiZ2VuZXJpY19zeXN0ZW1fZm9udHMiLCAvLyBvaworICAgICAgICAgICAgICAgICJod3NlcnZpY2VtYW5hZ2VyX2NvbXBhdF9zeW1saW5rX21vZHVsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImh5cGgtZGF0YSIsCisgICAgICAgICAgICAgICAgImltcy1jb21tb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJpbml0X3N5c3RlbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImphdmF4Lm9iZXgiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsbG5kay5saWJyYXJpZXMudHh0IiwgLy9vaworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAicGVyZmV0dG8tZXh0cmFzIiwgLy8gc3lzdGVtCisgICAgICAgICAgICAgICAgInNhbml0aXplci5saWJyYXJpZXMudHh0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAic2VsaW51eF9wb2xpY3lfc3lzdGVtX3Nvb25nIiwgLy8gb2sKKyAgICAgICAgICAgICAgICAic2VydmljZXMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJzaGVsbF9hbmRfdXRpbGl0aWVzX3N5c3RlbSIsIC8vIG9rCisgICAgICAgICAgICAgICAgInN5c3RlbS1idWlsZC5wcm9wIiwKKyAgICAgICAgICAgICAgICAic3lzdGVtX2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbCIsIC8vYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAidGVsZXBob255LWNvbW1vbiIsIC8vIGxpYnMgZnJvbSBUZWxlU2VydmljZQorICAgICAgICAgICAgICAgICJ2b2lwLWNvbW1vbiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNyYXNocmVjb3ZlcnkiLCAvLyBiYXNlX3N5c3RlbSAoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgInJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByb2ZpbGluZyIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX01PVkVfVkNOX1RPX01BSU5MSU5FIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJmcmFtZXdvcmstY29ubmVjdGl2aXR5LWIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfQVZBVEFSX1BJQ0tFUl9BUFAiKSwgeworICAgICAgICAgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICAgICAgICAgIkF2YXRhclBpY2tlciIsIC8vIGdlbmVyaWNfc3lzdGVtIChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC51cHJvYmVzdGF0cyIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0sCisgICAgICAgIHByZWZlcjMyOiB7CisgICAgICAgICAgICBkZXBzOiBbCisgICAgICAgICAgICAgICAgImRybXNlcnZlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJtZWRpYXNlcnZlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS52aXJ0dWFsaXphdGlvbmNvbW1vbi1uZGsiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS52aXJ0dWFsaXphdGlvbnNlcnZpY2UtbmRrIiwKKyAgICAgICAgICAgICAgICAibGliZ3NpIiwKKyAgICAgICAgICAgICAgICAic2VydmljZW1hbmFnZXIiLAorICAgICAgICAgICAgXSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJ1cHJvYmVzdGF0cyIsIC8vIGJhc2Vfc3lzdGVtIGludGVybmFsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9LAorICAgICAgICBib3RoOiB7CisgICAgICAgICAgICBkZXBzOiBbCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5maW5nZXJwcmludEAyLjEiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmNvbmZpZ0AxLjAiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmRlcHJlY2F0ZWRAMS4wIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjAiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4yIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjMiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuNCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJlX2VsZW1lbnRAMS4wIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYXBwX3Byb2Nlc3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJib3Jpbmdzc2xfc2VsZl90ZXN0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiaGVhcHByb2ZkX2NsaWVudCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkVHTCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkVHTF9hbmdsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkVUQzEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJGRlRFbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MV9DTSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MV9DTV9hbmdsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2Ml9hbmdsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYk9wZW5NQVhBTCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYk9wZW5TTEVTIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYWF1ZGlvIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYWxhcm1fam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYW1pZGkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJhbmRyb2lkIiwKKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lIiwKKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZF9zZXJ2ZXJzIiwKKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgICAgICAgICAibGliYXJ0cGFsZXR0ZS1zeXN0ZW0iLAorICAgICAgICAgICAgICAgICJsaWJhdWRpby1yZXNhbXBsZXIiLCAvLyBnZW5lcmljLXN5c3RlbQorICAgICAgICAgICAgICAgICJsaWJhdWRpb2VmZmVjdF9qbmkiLAorICAgICAgICAgICAgICAgICJsaWJhdWRpb2hhbCIsIC8vIGdlbmVyaWMtc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlIiwgLy8gZ2VuZXJpYy1zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICAgICAgICAgImxpYmJpbmRlcl9ycGNfdW5zdGFibGUiLAorICAgICAgICAgICAgICAgICJsaWJjYW1lcmEybmRrIiwKKyAgICAgICAgICAgICAgICAibGliY2dyb3VwcmMiLCAvLyBsbG5kayBsaWJyYXJ5CisgICAgICAgICAgICAgICAgImxpYmNsYW5nX3J0LmFzYW4iLAorICAgICAgICAgICAgICAgICJsaWJjb21waWxlcl9ydCIsCisgICAgICAgICAgICAgICAgImxpYmN1dGlscyIsIC8vIHVzZWQgYnkgbWFueSBsaWJzCisgICAgICAgICAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLCAvLyB1c2VkIGJ5IG1hbnkgbGlicworICAgICAgICAgICAgICAgICJsaWJkcm0iLCAvLyB1c2VkIGJ5IG1hbnkgbGlicyAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJkcm1mcmFtZXdvcmtfam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZmR0cmFjayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmZpbHRlcmZ3IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZmlsdGVycGFja19pbWFnZXByb2MiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZndkbG9ja2VuZ2luZSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmdhdGVrZWVwZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJndWkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJoYXJkd2FyZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmhhcmR3YXJlX2xlZ2FjeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJod2JpbmRlciIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmlucHV0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliaW5wdXRmbGluZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliaXByb3V0ZXV0aWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJqbmlncmFwaGljcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmpwZWciLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJsb2ciLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJsb2d3cmFwIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibHo0IiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibWVkaWEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJtZWRpYV9qbmkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJtZWRpYW5kayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm1pbnVpIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibW9ua2V5X2puaSIsIC8vIGJhc2Vfc3lzdGVtIC0gaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAibGlibXRwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibmV0ZF9jbGllbnQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJuZXRsaW5rIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibmV0dXRpbHMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJuZXVyYWxuZXR3b3Jrc19wYWNrYWdlaW5mbyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm5sIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicGRmaXVtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicG9saWN5LXN1YnN5c3RlbSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnBvd2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicHJvdG9idWYtY3BwLWZ1bGwiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJyYWRpb19tZXRhZGF0YSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnJzX2puaSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJydHBfam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic2Vuc29yc2VydmljZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNraWEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzb25pYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNvbml2b3giLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzb3VuZHBvb2wiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzcGVleHJlc2FtcGxlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNxbGl0ZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0ZGMrKyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN5c3V0aWxzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidWkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ1c2Job3N0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidXRpbHMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ2ZW5kb3JzdXBwb3J0IiwgLy8gbGxuZGsgbGlicmFyeQorICAgICAgICAgICAgICAgICJsaWJ2aW50Zl9qbmkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ2dWxrYW4iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ3ZWJ2aWV3Y2hyb21pdW1fbG9hZGVyIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYndlYnZpZXdjaHJvbWl1bV9wbGF0X3N1cHBvcnQiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlid2lsaGVsbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpbmtlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJUQVJHRVRfRFlOQU1JQ182NF8zMl9EUk1TRVJWRVIiKSwgeworICAgICAgICAgICAgICAgICJ0cnVlIjogWyJkcm1zZXJ2ZXIiXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgICAgIH0pICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJUQVJHRVRfRFlOQU1JQ182NF8zMl9NRURJQVNFUlZFUiIpLCB7CisgICAgICAgICAgICAgICAgInRydWUiOiBbIm1lZGlhc2VydmVyIl0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJsaWJ1cHJvYmVzdGF0c19jbGllbnQiLCAvLyBiYXNlX3N5c3RlbSBpbnRlcm5hbAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGFyY2g6IHsKKyAgICAgICAgYXJtNjQ6IHsKKyAgICAgICAgICAgIGRlcHM6IFsKKyAgICAgICAgICAgICAgICAibGliY2xhbmdfcnQuaHdhc2FuIiwKKyAgICAgICAgICAgICAgICAibGliY19od2FzYW4iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCithbmRyb2lkX3N5c3RlbV9pbWFnZSB7CisgICAgbmFtZTogImFvc3Bfc2hhcmVkX3N5c3RlbV9pbWFnZSIsCisgICAgZGVmYXVsdHM6IFsic3lzdGVtX2ltYWdlX2RlZmF1bHRzIl0sCisgICAgZGlyczogYW5kcm9pZF9yb290ZGlycywKKyAgICBzeW1saW5rczogYW5kcm9pZF9zeW1saW5rcywKKyAgICB0eXBlOiAiZXJvZnMiLAorICAgIGVyb2ZzOiB7CisgICAgICAgIGNvbXByZXNzb3I6ICJsejRoYyw5IiwKKyAgICAgICAgY29tcHJlc3NfaGludHM6ICJlcm9mc19jb21wcmVzc19oaW50cy50eHQiLAorICAgIH0sCisgICAgZGVwczogWworICAgICAgICAvLyBETyBOT1QgdXBkYXRlIHRoaXMgbGlzdC4gSW5zdGVhZCwgdXBkYXRlIHRoZSBzeXN0ZW1faW1hZ2VfZGVmYXVsdHMgdG8KKyAgICAgICAgLy8gc3luYyB3aXRoIHRoZSBiYXNlX3N5c3RlbS5taworICAgICAgICAibG9ncGVyc2lzdC5zdGFydCIsIC8vIGNmIG9ubHkKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9PV05FUlMgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE0NDZmCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9PV05FUlMKQEAgLTAsMCArMSw2IEBACisjIEJ1ZyBjb21wb25lbnQ6IDEzMjI3MTMKK2luc2VvYkBnb29nbGUuY29tCitqZW9uZ2lrQGdvb2dsZS5jb20KK2ppeW9uZ0Bnb29nbGUuY29tCitqdXN0aW55dW5AZ29vZ2xlLmNvbQora2l5b3VuZ2tpbUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljL2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dCBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvZXJvZnNfY29tcHJlc3NfaGludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dApAQCAtMCwwICsxIEBACiswIC4qXC5hcGV4JApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfcmFtZGlzay5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfcmFtZGlzay5tawppbmRleCBlYmFjNjJmLi41ZWNiNTVmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3JhbWRpc2subWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19yYW1kaXNrLm1rCkBAIC0yMyw2ICsyMyw3IEBACiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBpbml0X2ZpcnN0X3N0YWdlIFwKICAgICBzbmFwdXNlcmRfcmFtZGlzayBcCisgICAgcmFtZGlzay1idWlsZC5wcm9wIFwKIAogIyBEZWJ1ZyByYW1kaXNrCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKQEAgLTM1LDggKzM2LDYgQEAKIF9teV9wYXRocyA6PSBcCiAgICAgJChUQVJHRVRfQ09QWV9PVVRfUkFNRElTSykvIFwKICAgICAkKFRBUkdFVF9DT1BZX09VVF9ERUJVR19SQU1ESVNLKS8gXAotICAgIHN5c3RlbS91c3Ivc2hhcmUvem9uZWluZm8vdHpfdmVyc2lvbiBcCi0gICAgc3lzdGVtL3Vzci9zaGFyZS96b25laW5mby90emRhdGEgXAogICAgICQoVEFSR0VUX0NPUFlfT1VUX1JFQ09WRVJZKS9yb290L2ZpcnN0X3N0YWdlX3JhbWRpc2svc3lzdGVtIFwKIAogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCmluZGV4IDBhMDllYjEuLmI5YTYyM2QgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCkBAIC0xNTIsNCArMTUyLDUgQEAKICQoY2FsbCByZXF1aXJlLWFydGlmYWN0cy1pbi1wYXRoLCAkKF9teV9wYXRocyksICQoX215X2FsbG93ZWRfbGlzdCkpCiAKICMgUHJvZHVjdCBjb25maWcgbWFwIHRvIHRvZ2dsZSBiZXR3ZWVuIHNvdXJjZXMgYW5kIHByZWJ1aWx0cyBvZiByZXF1aXJlZCBtYWlubGluZSBtb2R1bGVzCitQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCBidWlsZC9yZWxlYXNlL2dtc19tYWlubGluZS9yZXF1aXJlZC9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKQogUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmUvcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsKaW5kZXggYzkyODUzMC4uY2NjNGYzNiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsKQEAgLTE4LDYgKzE4LDcgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rKQogCiAjIFByb2R1Y3QgY29uZmlnIG1hcCB0byB0b2dnbGUgYmV0d2VlbiBzb3VyY2VzIGFuZCBwcmVidWlsdHMgb2YgcmVxdWlyZWQgbWFpbmxpbmUgbW9kdWxlcworUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmVfZ28vcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKIFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyArPSAkKHdpbGRjYXJkIHZlbmRvci9nb29nbGVfc2hhcmVkL2J1aWxkL3JlbGVhc2UvZ21zX21haW5saW5lX2dvL3JlcXVpcmVkL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8pCiAKICMgQWRkIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tayBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawppbmRleCA1MjE4ZjI5Li4wZmNmMTZiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCkBAIC0yNCwxMSArMjQsNiBAQAogIyBTcGVlZCBwcm9maWxlIHNlcnZpY2VzIGFuZCB3aWZpLXNlcnZpY2UgdG8gcmVkdWNlIFJBTSBhbmQgc3RvcmFnZS4KIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIgOj0gc3BlZWQtcHJvZmlsZQogCi0jIFVzZSBhIHByb2ZpbGUgYmFzZWQgYm9vdCBpbWFnZSBmb3IgdGhpcyBkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBhCi0jIGdlbmVyaWMgcHJvZmlsZSBhbmQgbm90IEFuZHJvaWQgR28gb3B0aW1pemVkLgotUFJPRFVDVF9VU0VfUFJPRklMRV9GT1JfQk9PVF9JTUFHRSA6PSB0cnVlCi1QUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9JTUFHRV9QUk9GSUxFX0xPQ0FUSU9OIDo9IGZyYW1ld29ya3MvYmFzZS9jb25maWcvYm9vdC1pbWFnZS1wcm9maWxlLnR4dAotCiAjIERvIG5vdCBnZW5lcmF0ZSBsaWJhcnRkLgogUFJPRFVDVF9BUlRfVEFSR0VUX0lOQ0xVREVfREVCVUdfQlVJTEQgOj0gZmFsc2UKIApAQCAtMzcsOSArMzIsOSBAQAogIyBsZWF2ZSBsZXNzIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB2aWEgSkRXUC4KIFBST0RVQ1RfTUlOSU1JWkVfSkFWQV9ERUJVR19JTkZPIDo9IHRydWUKIAotIyBEaXNhYmxlIFNjdWRvIG91dHNpZGUgb2YgZW5nIGJ1aWxkcyB0byBzYXZlIFJBTS4KKyMgVXNlIHRoZSBsb3cgbWVtb3J5IGFsbG9jYXRvciBvdXRzaWRlIG9mIGVuZyBidWlsZHMgdG8gc2F2ZSBSU1MuCiBpZm5lcSAoLCQoZmlsdGVyIGVuZywgJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQotICBQUk9EVUNUX0RJU0FCTEVfU0NVRE8gOj0gdHJ1ZQorICBNQUxMT0NfTE9XX01FTU9SWSA6PSB0cnVlCiBlbmRpZgogCiAjIEFkZCB0aGUgc3lzdGVtIHByb3BlcnRpZXMuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icCBiL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLmJwCmluZGV4IDQ1YmExNDMuLmM2ZmMwMjEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLmJwCisrKyBiL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLmJwCkBAIC00NiwzICs0NiwxMTMgQEAKICAgICBpbnN0YWxsZWRfbG9jYXRpb246ICJldGMvaW5pdC9jb25maWciLAogICAgIHN5bWxpbmtfdGFyZ2V0OiAiL3N5c3RlbS9zeXN0ZW1fZXh0L2V0Yy9pbml0L2NvbmZpZyIsCiB9CisKKy8vIGluaXQuZ3NpLnJjLCBHU0ktc3BlY2lmaWMgaW5pdCBzY3JpcHQuCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJpbml0LmdzaS5yYyIsCisgICAgc3JjOiAiaW5pdC5nc2kucmMiLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaW5pdCIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImluaXQudm5kay1ub2RlZi5yYyIsCisgICAgc3JjOiAiaW5pdC52bmRrLW5vZGVmLnJjIiwKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImdzaSIsCit9CisKK2dzaV9zeW1saW5rcyA9IFsKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9zeXN0ZW0vc3lzdGVtX2V4dCIsCisgICAgICAgIG5hbWU6ICJzeXN0ZW1fZXh0IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9wcm9kdWN0IiwKKyAgICAgICAgbmFtZTogInByb2R1Y3QiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvb2RtL29kbV9kbGttL2V0YyIsCisgICAgICAgIG5hbWU6ICJvZG1fZGxrbS9ldGMiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL3ZlbmRvcl9kbGttL2V0YyIsCisgICAgICAgIG5hbWU6ICJ2ZW5kb3JfZGxrbS9ldGMiLAorICAgIH0sCitdCisKK2FuZHJvaWRfc3lzdGVtX2ltYWdlIHsKKyAgICBuYW1lOiAiYW5kcm9pZF9nc2kiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJzeXN0ZW1faW1hZ2VfZGVmYXVsdHMiLAorICAgICAgICAic3lzdGVtX2V4dF9pbWFnZV9kZWZhdWx0cyIsCisgICAgICAgICJwcm9kdWN0X2ltYWdlX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHN5bWxpbmtzOiBnc2lfc3ltbGlua3MsCisgICAgZGlyczogWyJjYWNoZSJdLAorICAgIGRlcHM6IFsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBnc2lfc3lzdGVtX2V4dAorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgLy8gaGFuZGhlbGQgcGFja2FnZXMKKyAgICAgICAgIkxhdW5jaGVyM1F1aWNrU3RlcCIsCisgICAgICAgICJQcm92aXNpb24iLAorICAgICAgICAiU2V0dGluZ3MiLAorICAgICAgICAiU3RvcmFnZU1hbmFnZXIiLAorICAgICAgICAiU3lzdGVtVUkiLAorCisgICAgICAgIC8vIHRlbGVwaG9ueSBwYWNrYWdlcworICAgICAgICAiQ2FycmllckNvbmZpZyIsCisKKyAgICAgICAgLy8gSW5zdGFsbCBhIGNvcHkgb2YgdGhlIGRlYnVnIHBvbGljeSB0byB0aGUgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIGFuZCBhbGxvdworICAgICAgICAvLyBpbml0LXNlY29uZC1zdGFnZSB0byBsb2FkIGRlYnVnIHBvbGljeSBmcm9tIHN5c3RlbV9leHQuCisgICAgICAgIC8vIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbnQgdG8gYmUgc2V0IGJ5IGNvbXBsaWFuY2UgR1NJIHRhcmdldHMuCisgICAgICAgICJzeXN0ZW1fZXh0X3VzZXJkZWJ1Z19wbGF0X3NlcG9saWN5LmNpbCIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBnc2lfcmVsZWFzZQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICJnc2lfc2tpcF9tb3VudC5jZmciLAorICAgICAgICAiaW5pdC5nc2kucmMiLAorICAgICAgICAiaW5pdC52bmRrLW5vZGVmLnJjIiwKKyAgICAgICAgLy8gT3ZlcmxheSB0aGUgR1NJIHNwZWNpZmljIHNldHRpbmcgZm9yIGZyYW1ld29yayBhbmQgU3lzdGVtVUkKKyAgICAgICAgImdzaV9vdmVybGF5X2ZyYW1ld29yayIsCisgICAgICAgICJnc2lfb3ZlcmxheV9zeXN0ZW11aSIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBWTkRLCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMwIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMxIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMyIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMzIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjM0IiwKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIEFWRgorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICJjb20uYW5kcm9pZC5jb21wb3MiLAorICAgICAgICAiZmVhdHVyZXNfY29tLmFuZHJvaWQudmlydC54bWwiLAorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gZ3NpX3Byb2R1Y3QKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiQnJvd3NlcjIiLAorICAgICAgICAiQ2FtZXJhMiIsCisgICAgICAgICJEaWFsZXIiLAorICAgICAgICAiTGF0aW5JTUUiLAorICAgICAgICAiYXBucy1mdWxsLWNvbmYueG1sIiwKKyAgICBdLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGJvdGg6IHsKKyAgICAgICAgICAgIC8vIFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0CisgICAgICAgICAgICBkZXBzOiBbImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLWltcGwiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGVuYWJsZWQ6IHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiUFJPRFVDVF9JTlNUQUxMX0RFQlVHX1BPTElDWV9UT19TWVNURU1fRVhUIiksIHsKKyAgICAgICAgInRydWUiOiB0cnVlLAorICAgICAgICBkZWZhdWx0OiBmYWxzZSwKKyAgICB9KSwKKyAgICB0eXBlOiAiZXh0NCIsCit9CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQgYi90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQKaW5kZXggZjc3MTkxNi4uY2JiOGEwZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL2N1cnJlbnQudHh0CisrKyBiL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dApAQCAtMjQsNyArMjQsNyBAQAogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5jb21tb24tVjItbmRrLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEtbmRrLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvci1WMi1uZGsuc28KLVZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uLVY1LW5kay5zbworVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb24tVjYtbmRrLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMS5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4yLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5tayBiL3RhcmdldC9wcm9kdWN0L2dzaV9yZWxlYXNlLm1rCmluZGV4IGJjMDlmNDYuLjExNWIzNTUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dzaV9yZWxlYXNlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dzaV9yZWxlYXNlLm1rCkBAIC04Nyw2ICs4Nyw3IEBACiAjIEFkZGl0aW9uYWwgc2V0dGluZ3MgdXNlZCBpbiBhbGwgR1NJIGJ1aWxkcwogUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAogICAgIHJvLmNyeXB0by5tZXRhZGF0YV9pbml0X2RlbGV0ZV9hbGxfa2V5cy5lbmFibGVkPWZhbHNlIFwKKyAgICBkZWJ1Zy5jb2RlYzIuYnFwb29sX2RlYWxsb2NfYWZ0ZXJfc3RvcD0xIFwKIAogIyBXaW5kb3cgRXh0ZW5zaW9ucwogaWZuZXEgKCQoUFJPRFVDVF9JU19BVFYpLHRydWUpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsgYi90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsKaW5kZXggNTQ2YmJlNy4uMmIwNTVjNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbS5tawpAQCAtNjksMTMgKzY5LDE5IEBACiAgICAgU2hhcmVkU3RvcmFnZUJhY2t1cCBcCiAgICAgU2ltQXBwRGlhbG9nIFwKICAgICBUZWxlY29tIFwKLSAgICBUZWxlcGhvbnlQcm92aWRlciBcCiAgICAgVGVsZVNlcnZpY2UgXAogICAgIFRyYWNldXIgXAogICAgIFVzZXJEaWN0aW9uYXJ5UHJvdmlkZXIgXAogICAgIFZwbkRpYWxvZ3MgXAogICAgIHZyIFwKIAorIyBDaG9vc2UgdGhlIGNvcnJlY3QgcHJvZHVjdHMgYmFzZWQgb24gSFNVTSBzdGF0dXMKK2lmZXEgKCQoUFJPRFVDVF9VU0VfSFNVTSksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBUZWxlcGhvbnlQcm92aWRlckhzdW0KK2Vsc2UKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBUZWxlcGhvbnlQcm92aWRlcgorZW5kaWYKKwogUFJPRFVDVF9QQUNLQUdFUyArPSAkKFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSkKICMgU2V0IHZpcnR1YWxfY2FtZXJhX3NlcnZpY2VfZW5hYmxlZCBzb29uZyBjb25maWcgdmFyaWFibGUgYmFzZWQgb24gdGhlCiAjIFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSBidWlsZC4gdmlydHVhbF9jYW1lcmFfc2VydmljZV9lbmFibGVkIHNvb25nIGNvbmZpZwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvaHN1bV9jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9oc3VtX2NvbW1vbi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTliYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvaHN1bV9jb21tb24ubWsKQEAgLTAsMCArMSwyOSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBDb250YWlucyBjb21tb24gZGVmYXVsdCBlbGVtZW50cyBmb3IgZGV2aWNlcyBydW5uaW5nIGluIEhlYWRsZXNzIFN5c3RlbSBVc2VyIE1vZGUuCisKKyMgU2hvdWxkIGdlbmVyYWxseSBiZSBpbmhlcml0ZWQgZmlyc3QgYXMgdXNpbmcgYW4gSFNVTSBjb25maWd1cmF0aW9uIGNhbiBhZmZlY3QgZG93bnN0cmVhbSBjaG9pY2VzCisjIChzdWNoIGFzIGVuc3VyaW5nIHRoYXQgdGhlIEhTVU0tdmFyaWFudHMgb2YgcGFja2FnZXMgYXJlIHNlbGVjdGVkKS4KKworUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKKyAgICByby5mdy5tdS5oZWFkbGVzc19zeXN0ZW1fdXNlcj10cnVlCisKKyMgVmFyaWFibGUgZm9yIGVsc2V3aGVyZSBjaG9vc2luZyB0aGUgYXBwcm9wcmlhdGUgcHJvZHVjdHMgYmFzZWQgb24gSFNVTSBzdGF0dXMuCitQUk9EVUNUX1VTRV9IU1VNIDo9IHRydWUKKworUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgSHN1bURlZmF1bHRDb25maWdPdmVybGF5CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9sYXJnZV9zY3JlZW5fY29tbW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbGFyZ2Vfc2NyZWVuX2NvbW1vbi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI5ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbGFyZ2Vfc2NyZWVuX2NvbW1vbi5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFdpbmRvdyBFeHRlbnNpb25zCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3dpbmRvd19leHRlbnNpb25zLm1rKQorCisjIEVuYWJsZSBTZXR0aW5ncyAyLXBhbmUgb3B0aW1pemF0aW9uIGZvciBsYXJnZS1zY3JlZW4KK1BST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAorICAgIHBlcnNpc3Quc2V0dGluZ3MubGFyZ2Vfc2NyZWVuX29wdC5lbmFibGVkPXRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbV9leHQubWsgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW1fZXh0Lm1rCmluZGV4IDMwZGQyZTIuLjExNzk5NjYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbV9leHQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5tawpAQCAtMjAsOSArMjAsMTAgQEAKICMgYmFzZV9zeXN0ZW1fZXh0Lm1rLgogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWspCiAKLSMgL3N5c3RlbV9leHQgcGFja2FnZXMKLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIHZuZGtfYXBleF9zbmFwc2hvdF9wYWNrYWdlIFwKLQogIyBXaW5kb3cgRXh0ZW5zaW9ucwogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9uc19iYXNlLm1rKQorCisjIEFwcEZ1bmN0aW9uIEV4dGVuc2lvbnMKK2lmbmVxICgsJChSRUxFQVNFX0FQUEZVTkNUSU9OX1NJREVDQVIpKQorICAgICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYXBwX2Z1bmN0aW9uX2V4dGVuc2lvbnMubWspCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWsgYi90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tawppbmRleCA1ODIzNGE4Li45ZThhZmE4IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5taworKysgYi90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tawpAQCAtMTgxLDMgKzE4MSw1IEBACiAKICMgQ29weSBwcmVvcHRlZCBmaWxlcyBmcm9tIHN5c3RlbV9iIG9uIGZpcnN0IGJvb3QuCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmNwX3N5c3RlbV9vdGhlcl9vZGV4PTEKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICBjcHByZW9wdHMuc2gKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwCmluZGV4IDBkN2IzNWUuLjIxNGMwMDkgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icApAQCAtMzMsNyArMzMsMTggQEAKIC8vIGltYWdlCiBvdGFjZXJ0c196aXAgewogICAgIG5hbWU6ICJvdGFjZXJ0cyIsCi0gICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNlY3VyaXR5IiwKICAgICBmaWxlbmFtZTogIm90YWNlcnRzLnppcCIsCiB9CisKK290YWNlcnRzX3ppcCB7CisgICAgbmFtZTogIm90YWNlcnRzLnJlY292ZXJ5IiwKKyAgICByZWNvdmVyeTogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzZWN1cml0eSIsCisgICAgZmlsZW5hbWU6ICJvdGFjZXJ0cy56aXAiLAorfQorCithZGJfa2V5cyB7CisgICAgbmFtZTogImFkYl9rZXlzIiwKKyAgICBwcm9kdWN0X3NwZWNpZmljOiB0cnVlLAorfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5tayBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYjI3MmMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWRiIGtleSwgaWYgY29uZmlndXJlZCB2aWEgUFJPRFVDVF9BREJfS0VZUwotaWZkZWYgUFJPRFVDVF9BREJfS0VZUwotICBpZm5lcSAoJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksKQotICAgIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotICAgIExPQ0FMX01PRFVMRSA6PSBhZGJfa2V5cwotICAgIExPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLSAgICBMT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi0gICAgTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotICAgIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX1JPT1RfT1VUKQotICAgIExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoUFJPRFVDVF9BREJfS0VZUykKLSAgICBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0gIGVuZGlmCi1lbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQlVJTEQuYmF6ZWwgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9CVUlMRC5iYXplbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyYmU3OS4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9CVUlMRC5iYXplbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotZmlsZWdyb3VwKAotICAgIG5hbWUgPSAiYW5kcm9pZF9jZXJ0aWZpY2F0ZV9kaXJlY3RvcnkiLAotICAgIHNyY3MgPSBnbG9iKFsKLSAgICAgICAgIioucGs4IiwKLSAgICAgICAgIioucGVtIiwKLSAgICBdKSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC91c2Vyc3BhY2VfcmVib290Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdXNlcnNwYWNlX3JlYm9vdC5tawppbmRleCBmMjM1ZDE0Li41MWZlYjA3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC91c2Vyc3BhY2VfcmVib290Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3VzZXJzcGFjZV9yZWJvb3QubWsKQEAgLTE0LDYgKzE0LDQgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgSW5oZXJpdCB0aGlzIHdoZW4gdGhlIHRhcmdldCBzdXBwb3J0cyB1c2Vyc3BhY2UgcmVib290Ci0KLVBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgOj0gaW5pdC51c2Vyc3BhY2VfcmVib290LmlzX3N1cHBvcnRlZD10cnVlCisjIERFUFJFQ0FURUQhIERvIG5vdCBpbmhlcml0IHRoaXMuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9jb21wcmVzc2lvbi5tayBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uLm1rCmluZGV4IGRjMWVlM2UuLmU3N2MzNmYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uLm1rCkBAIC0xOCw5ICsxOCwxMiBAQAogCiBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24uZW5hYmxlZD10cnVlCiBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIudXNlcnNwYWNlLnNuYXBzaG90cy5lbmFibGVkPXRydWUKLVBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkPXRydWUKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5iYXRjaF93cml0ZXM9dHJ1ZQogCisjIE9wdGlvbmFsIGFzc2lnbm1lbnQuIE9uIGxvdyBtZW1vcnkgZGV2aWNlcywgZGlzYWJsaW5nIGlvX3VyaW5nIGNhbiByZWxpZXZlIGNwdSBhbmQgbWVtb3J5CisjIHByZXNzdXJlIGR1cmluZyBhbiBPVEEuCitQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZD89dHJ1ZQorCiAjIEVuYWJsaW5nIHRoaXMgcHJvcGVydHksIHdpbGwgaW1wcm92ZSBPVEEgaW5zdGFsbCB0aW1lCiAjIGJ1dCB3aWxsIHVzZSBhbiBhZGRpdGlvbmFsIENQVSBjb3JlCiAjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi50aHJlYWRzPXRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL3ZhYmNfZmVhdHVyZXMubWsgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS92YWJjX2ZlYXR1cmVzLm1rCmluZGV4IGUyNzQ1YTEuLmQwOTI2OTkgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL3ZhYmNfZmVhdHVyZXMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5tawpAQCAtMzEsMTQgKzMxLDE1IEBACiAKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi5lbmFibGVkPXRydWUKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi51c2Vyc3BhY2Uuc25hcHNob3RzLmVuYWJsZWQ9dHJ1ZQotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmlvX3VyaW5nLmVuYWJsZWQ9dHJ1ZQotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLnhvci5lbmFibGVkPXRydWUKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5iYXRjaF93cml0ZXM9dHJ1ZQorCisjIE9wdGlvbmFsIGFzc2lnbm1lbnRzLCBsb3cgbWVtb3J5IGRldmljZXMgbWF5IGJlbmVmaXQgZnJvbSBvdmVycmlkaW5nIHRoZXNlLgorUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmlvX3VyaW5nLmVuYWJsZWQ/PXRydWUKK1BST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi54b3IuZW5hYmxlZD89dHJ1ZQorCiAjIExvdyBtZW1vcnkgZGV2aWNlIGNvbmZpZ3VyYXRpb25zLiBJZiBtZW1vcnkgdXNhZ2UgYW5kIGNwdSB1dGlsaXphdGlvbiBpcwogIyBhIGJvdHRsZW5lY2sgZHVyaW5nIE9UQSwgdGhlIGJlbG93IGNvbmZpZ3VyYXRpb25zIGNhbiBiZSBhZGRlZCB0byBhCi0jIGRldmljZSdzIC5tayBmaWxlIGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yIGxvdyBtZW0gZGV2aWNlcy4gRGlzYWJsaW5nCi0jIHJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24ueG9yLmVuYWJsZWQgYW5kIHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZAotIyBpcyBhbHNvIHJlY29tbWVuZGVkCisjIGRldmljZSdzIC5tayBmaWxlIGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yIGxvdyBtZW0gZGV2aWNlcy4KICMKICMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLnJlYWRfYWhlYWRfc2l6ZT0xNgogIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIub19kaXJlY3QuZW5hYmxlZD10cnVlCmRpZmYgLS1naXQgYS90ZWFtcy9BbmRyb2lkLmJwIGIvdGVhbXMvQW5kcm9pZC5icAppbmRleCBhOTY5OWQyLi5hMmIwZDE0IDEwMDY0NAotLS0gYS90ZWFtcy9BbmRyb2lkLmJwCisrKyBiL3RlYW1zL0FuZHJvaWQuYnAKQEAgLTEzLDYgKzEzLDkgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCisvLyBET04nVCBBREQgTkVXIFJVTEVTIEhFUkUuIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8KKy8vIGdvL25ldy1hbmRyb2lkLW93bmVyc2hpcC1tb2RlbAorCiBwYWNrYWdlIHsKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CkBAIC02NywxMyArNzAsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2Nsb3VkX3BsYXRmb3JtIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MTc3NjI1MjYyODE3MjgKLSAgICB0cmVuZHlfdGVhbV9pZDogIjU5MTc3NjI1MjYyODE3MjgiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3NvZnR3YXJlIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NTYwMDUxMjA2MjI1OTIKQEAgLTUxNSwxMyArNTExLDYgQEAKIH0KIAogdGVhbSB7Ci0gICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9ub3RpZmljYXRpb25zX2FsZXJ0c19hdHRlbnRpb25fbWFuYWdlbWVudCIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjY3NjQzNjgxOTk2ODAwCi0gICAgdHJlbmR5X3RlYW1faWQ6ICI2MjY3NjQzNjgxOTk2ODAwIiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2Z3a19uZmMiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk2MjMxMjUxMjg2NDI1NgpAQCAtNTI5LDEzICs1MTgsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9wZXJzb25hbGl6YXRpb25fZGV2ZWxvcGVyX3N1cmZhY2VzIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MTk4OTA5ODg4MTAyNDAKLSAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MTk4OTA5ODg4MTAyNDAiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3Jhamt1bWFyX3RlYW0iLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3MDA1Mzg5NDAxMjkyOApAQCAtNjkwLDEzICs2NzIsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9lbmdfYW5kcm9pZF93ZWFyIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5NzkxNTA0MjI5MzM1MDQKLSAgICB0cmVuZHlfdGVhbV9pZDogIjQ5NzkxNTA0MjI5MzM1MDQiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWVzY2hfdGVhbSIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjA1NDY1ODk5MzY4NDQ4CkBAIC03MTgsMTMgKzY5Myw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZGV2ZWxvcGVyX2RldngiLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg5NDg5MDc2NDY5NzYwMAotICAgIHRyZW5keV90ZWFtX2lkOiAiNDg5NDg5MDc2NDY5NzYwMCIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3J1c3QiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg0NDYwMDU4NjMwNTUzNgpAQCAtOTI4LDEzICs4OTYsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93YWxsZXRfb25fd2VhciIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzI0OTYwNDM3NzMxMzI4Ci0gICAgdHJlbmR5X3RlYW1faWQ6ICI1NzI0OTYwNDM3NzMxMzI4IiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2dsYW5jZWFibGVzIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NTgyMjIwMDQ2MDA4MzIKQEAgLTEwNjgsMTMgKzEwMjksNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl8zeHAiLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY5MjMxNzYxMjUzOTkwNAotICAgIHRyZW5keV90ZWFtX2lkOiAiNTY5MjMxNzYxMjUzOTkwNCIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jbG9ja3dvcmsiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkwODc4MTY3ODc1NTg0MApAQCAtMTIwOCwxMyArMTE2Miw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3NvZnR3YXJlX250aSIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTY0OTczNTU4NzU5NDI0Ci0gICAgdHJlbmR5X3RlYW1faWQ6ICI1MTY0OTczNTU4NzU5NDI0IiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX21hY2hpbmVfbGVhcm5pbmciLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI3NjU2ODMxODI0NjkxMgpAQCAtMTMwNiwxMyArMTI1Myw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfcG93ZXJfZW11bGF0b3IiLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE2MDMzODkzNjcyNTUwNAotICAgIHRyZW5keV90ZWFtX2lkOiAiNTE2MDMzODkzNjcyNTUwNCIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19zdmV0b3NsYXZnYW5vdiIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDA0MTE3NDkyNTMxMjAwCkBAIC0xMzI3LDEzICsxMjY3LDYgQEAKIH0KIAogdGVhbSB7Ci0gICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfb3B1cyIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk4MzUxNjM2Njc2NjA4Ci0gICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk4MzUxNjM2Njc2NjA4IiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX3RleHRfdG9fc3BlZWNoIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzNjg5MzMxMjA0NDIzNjgKQEAgLTE0MzksMTMgKzEzNzIsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9kZXZlbG9wZXJfZm91bmRhdGlvbiIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjM5MTI3MTA4NjQ4OTYwCi0gICAgdHJlbmR5X3RlYW1faWQ6ICI1MjM5MTI3MTA4NjQ4OTYwIiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX3RwbV90dmMiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM5MDY4MzMzMzIzMDU5MgpAQCAtMTQ1MywxMyArMTM3OSw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfdXgiLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc4MjA5NzQxMTA4MDE5MgotICAgIHRyZW5keV90ZWFtX2lkOiAiNTc4MjA5NzQxMTA4MDE5MiIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9sc2VfZGVza3RvcF9vc19leHBlcmllbmNlIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMjUyMzQ5MDA0MzQ5NDQKQEAgLTE2NzAsMTMgKzE1ODksNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2Fzc2lzdGFudCIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODQ4MDc1MzA2MTcyNDE2Ci0gICAgdHJlbmR5X3RlYW1faWQ6ICI1ODQ4MDc1MzA2MTcyNDE2IiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcG93ZXJfYW5kX2NvbW1zX2luZnJhIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzMjU1NDc2NTMzMzI5OTIKQEAgLTM0NTUsNiArMzM2NywxMyBAQAogfQogCiB0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWFvc19kaXNwbGF5X3NhZmV0eV90cmlhZ2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUyMjA5MzY2Mzc4MDg2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUyMjA5MzY2Mzc4MDg2NCIsCit9CisKK3RlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmFfaHRjX2xnX3F1YWxjb21tIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMzIwOTk0ODA5MTE4NzIKQEAgLTQ0MTQsOCArNDMzMyw3NCBAQAogfQogCiB0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9zb2x1dGlvbnNfcGxheWJhY2siLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjc0MjUxNTI1MjU1OTg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjc0MjUxNTI1MjU1OTg3MiIsCit9CisKK3RlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3RlbGVtZXRyeV9jbGllbnRfaW5mcmEiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQwMzI0NTA3NzQzMDI3MgogICAgIHRyZW5keV90ZWFtX2lkOiAiNTQwMzI0NTA3NzQzMDI3MiIsCiB9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wdGVfc3lzdWkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE4NTg5NzQ2MzM4MjAxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE4NTg5NzQ2MzM4MjAxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF90cm91Ymxlc2hvb3RpbmdfYXBwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwOTcwMDM3NDY0MjY4ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwOTcwMDM3NDY0MjY4ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVza3RvcF9maXJtd2FyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Nzg3OTM4NDU0ODYzODcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Nzg3OTM4NDU0ODYzODcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FydF9jbG91ZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTIxNDQwNjQ3NTc3NjAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTIxNDQwNjQ3NTc3NjAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3JhdmVud29vZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDI3MTgxNTAwNDk3OTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDI3MTgxNTAwNDk3OTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2F1dG9tb3RpdmVfY2FzdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjkzNjgzMDI2MjY0MDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjkzNjgzMDI2MjY0MDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfc3RhbmRhbG9uZV9raWRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMDMyOTg3MDM5NDk4MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMDMyOTg3MDM5NDk4MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVza3RvcF9zdGF0cyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDQwNzY0MTE0MjA2NzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDQwNzY0MTE0MjA2NzIwIiwKK30KKworLy8gRE9OJ1QgQUREIE5FVyBSVUxFUyBIRVJFLiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHRvCisvLyBnby9uZXctYW5kcm9pZC1vd25lcnNoaXAtbW9kZWwKZGlmZiAtLWdpdCBhL3Rvb2xzL0FuZHJvaWQuYnAgYi90b29scy9BbmRyb2lkLmJwCmluZGV4IDU5ODMxYTYuLjI0M2NiNTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvQW5kcm9pZC5icApAQCAtMTIzLDMgKzEyMywxMSBAQAogICAgICAgICAibWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkiLAogICAgIF0sCiB9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImphdmEtZXZlbnQtbG9nLXRhZ3MiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImV2ZW50X2xvZ190YWdzLnB5IiwKKyAgICAgICAgImphdmEtZXZlbnQtbG9nLXRhZ3MucHkiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90b29scy9CVUlMRC5iYXplbCBiL3Rvb2xzL0JVSUxELmJhemVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWMwZGNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL0JVSUxELmJhemVsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcHlfbGlicmFyeSgKLSAgICBuYW1lID0gImV2ZW50X2xvZ190YWdzIiwKLSAgICBzcmNzID0gWyJldmVudF9sb2dfdGFncy5weSJdLAotICAgIGltcG9ydHMgPSBbIi4iXSwKLSkKLQotcHlfYmluYXJ5KAotICAgIG5hbWUgPSAiamF2YS1ldmVudC1sb2ctdGFncyIsCi0gICAgc3JjcyA9IFsiamF2YS1ldmVudC1sb2ctdGFncy5weSJdLAotICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgIGRlcHMgPSBbIjpldmVudF9sb2dfdGFncyJdLAotKQotCi1weV9iaW5hcnkoCi0gICAgbmFtZSA9ICJtZXJnZS1ldmVudC1sb2ctdGFncyIsCi0gICAgc3JjcyA9IFsibWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkiXSwKLSAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSAgICBkZXBzID0gWyI6ZXZlbnRfbG9nX3RhZ3MiXSwKLSkKLQotcHlfYmluYXJ5KAotICAgIG5hbWUgPSAiY2hlY2tfZWxmX2ZpbGUiLAotICAgIHNyY3MgPSBbImNoZWNrX2VsZl9maWxlLnB5Il0sCi0gICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCi0KLXB5X2JpbmFyeSgKLSAgICBuYW1lID0gImF1dG9fZ2VuX3Rlc3RfY29uZmlnIiwKLSAgICBzcmNzID0gWyJhdXRvX2dlbl90ZXN0X2NvbmZpZy5weSJdLAotICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9PV05FUlMgYi90b29scy9hY29uZmlnL09XTkVSUwppbmRleCA5YTc2Mjc5Li5jOTJmYzdjIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL09XTkVSUworKysgYi90b29scy9hY29uZmlnL09XTkVSUwpAQCAtMSw3ICsxLDggQEAKLWFtaGtAZ29vZ2xlLmNvbQogZHpzaGVuQGdvb2dsZS5jb20KLWpoYW1AZ29vZ2xlLmNvbQotam9lb0Bnb29nbGUuY29tCiBvcGdAZ29vZ2xlLmNvbQogdGVkYmF1ZXJAZ29vZ2xlLmNvbQogemhpZG91QGdvb2dsZS5jb20KKworYW1oa0Bnb29nbGUuY29tICAje0xBU1RfUkVTT1JUX1NVR0dFU1RJT059CitqaGFtQGdvb2dsZS5jb20gICN7TEFTVF9SRVNPUlRfU1VHR0VTVElPTn0KK2pvZW9AZ29vZ2xlLmNvbSAgI3tMQVNUX1JFU09SVF9TVUdHRVNUSU9OfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9URVNUX01BUFBJTkcgYi90b29scy9hY29uZmlnL1RFU1RfTUFQUElORwppbmRleCAxNWU0MTg3Li5hN2YwYTRmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL1RFU1RfTUFQUElORworKysgYi90b29scy9hY29uZmlnL1RFU1RfTUFQUElORwpAQCAtMTAyLDEyICsxMDIsMTQgQEAKICAgICB7CiAgICAgICAvLyBhY29uZmlnX3N0b3JhZ2UgZmlsZSBqYXZhIGludGVncmF0aW9uIHRlc3RzCiAgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0LmphdmEiCi0gICAgfQotICBdLAotICAicG9zdHN1Ym1pdCI6IFsKKyAgICB9LAogICAgIHsKLSAgICAgIC8vIGFjb25maWdfc3RvcmFnZSByZWFkIGFwaSBqYXZhIGludGVncmF0aW9uIHRlc3RzCi0gICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdC5qYXZhIgorICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHJlYWQgZnVuY3Rpb25hbCB0ZXN0CisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9mdW5jdGlvbmFsIgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHJlYWQgdW5pdCB0ZXN0CisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0IgogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWcvQW5kcm9pZC5icAppbmRleCA2ODUyMWFmLi41ZTNlYjEyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvQW5kcm9pZC5icApAQCAtNjgsNiArNjgsMTQgQEAKICAgICBdLAogfQogCithY29uZmlnX3ZhbHVlcyB7CisgICAgbmFtZTogImFjb25maWcudGVzdC5mbGFnLnNlY29uZF92YWx1ZXMiLAorICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL3RoaXJkLnZhbHVlcyIsCisgICAgXSwKK30KKwogYWNvbmZpZ192YWx1ZV9zZXQgewogICAgIG5hbWU6ICJhY29uZmlnLnRlc3QuZmxhZy52YWx1ZV9zZXQiLAogICAgIHZhbHVlczogWwpAQCAtMjM0LDYgKzI0Miw3IEBACiAgICAgbmFtZTogImxpYmFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAogICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5IiwKICAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiB9CiAKIHJ1c3RfdGVzdCB7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vY3BwLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2NwcC5ycwppbmRleCBlNzQzYjJmLi5kN2Q3N2M1IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vY3BwLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMKQEAgLTI0LDcgKzI0LDcgQEAKIAogdXNlIGNyYXRlOjpjb2RlZ2VuOwogdXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKLXVzZSBjcmF0ZTo6Y29tbWFuZHM6Ok91dHB1dEZpbGU7Cit1c2UgY3JhdGU6OmNvbW1hbmRzOjp7c2hvdWxkX2luY2x1ZGVfZmxhZywgT3V0cHV0RmlsZX07CiAKIHB1YiBmbiBnZW5lcmF0ZV9jcHBfY29kZTxJPigKICAgICBwYWNrYWdlOiAmc3RyLApAQCAtNDUsNiArNDUsOCBAQAogICAgIGxldCBoZWFkZXIgPSBwYWNrYWdlLnJlcGxhY2UoJy4nLCAiXyIpOwogICAgIGxldCBwYWNrYWdlX21hY3JvID0gaGVhZGVyLnRvX3VwcGVyY2FzZSgpOwogICAgIGxldCBjcHBfbmFtZXNwYWNlID0gcGFja2FnZS5yZXBsYWNlKCcuJywgIjo6Iik7CisgICAgZW5zdXJlIShjbGFzc19lbGVtZW50cy5sZW4oKSA+IDApOworICAgIGxldCBjb250YWluZXIgPSBjbGFzc19lbGVtZW50c1swXS5jb250YWluZXIuY2xvbmUoKTsKICAgICBlbnN1cmUhKGNvZGVnZW46OmlzX3ZhbGlkX25hbWVfaWRlbnQoJmhlYWRlcikpOwogICAgIGxldCBjb250ZXh0ID0gQ29udGV4dCB7CiAgICAgICAgIGhlYWRlcjogJmhlYWRlciwKQEAgLTU2LDYgKzU4LDcgQEAKICAgICAgICAgcmVhZHdyaXRlX2NvdW50LAogICAgICAgICBpc190ZXN0X21vZGU6IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6VGVzdCwKICAgICAgICAgY2xhc3NfZWxlbWVudHMsCisgICAgICAgIGNvbnRhaW5lciwKICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAogICAgIH07CiAKQEAgLTEwMCw2ICsxMDMsNyBAQAogICAgIHB1YiByZWFkd3JpdGVfY291bnQ6IGkzMiwKICAgICBwdWIgaXNfdGVzdF9tb2RlOiBib29sLAogICAgIHB1YiBjbGFzc19lbGVtZW50czogVmVjPENsYXNzRWxlbWVudD4sCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAogICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiB9CiAKQEAgLTEyMyw2ICsxMjcsMjMgQEAKICAgICBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCiAgICAgcndfY291bnQ6ICZtdXQgaTMyLAogKSAtPiBDbGFzc0VsZW1lbnQgeworICAgIGxldCBub19hc3NpZ25lZF9vZmZzZXQgPSAhc2hvdWxkX2luY2x1ZGVfZmxhZyhwZik7CisKKyAgICBsZXQgZmxhZ19vZmZzZXQgPSBtYXRjaCBmbGFnX2lkcy5nZXQocGYubmFtZSgpKSB7CisgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBvZmZzZXQsCisgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgLy8gU3lzdGVtL3ZlbmRvci9wcm9kdWN0IFJPK2Rpc2FibGVkIGZsYWdzIGhhdmUgbm8gb2Zmc2V0IGluIHN0b3JhZ2UgZmlsZXMuCisgICAgICAgICAgICAvLyBBc3NpZ24gcGxhY2Vob2xkZXIgdmFsdWUuCisgICAgICAgICAgICBpZiBub19hc3NpZ25lZF9vZmZzZXQgeworICAgICAgICAgICAgICAgICYwCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBbGwgb3RoZXIgZmxhZ3MgX211c3RfIGhhdmUgYW4gb2Zmc2V0LgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGFuaWMhKCJ7fSIsIGZvcm1hdCEoIm1pc3NpbmcgZmxhZyBvZmZzZXQgZm9yIHt9IiwgcGYubmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCiAgICAgQ2xhc3NFbGVtZW50IHsKICAgICAgICAgcmVhZHdyaXRlX2lkeDogaWYgcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUgewogICAgICAgICAgICAgbGV0IGluZGV4ID0gKnJ3X2NvdW50OwpAQCAtMTQwLDcgKzE2MSw3IEBACiAgICAgICAgIH0sCiAgICAgICAgIGZsYWdfbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAogICAgICAgICBmbGFnX21hY3JvOiBwZi5uYW1lKCkudG9fdXBwZXJjYXNlKCksCi0gICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19pZHMuZ2V0KHBmLm5hbWUoKSkuZXhwZWN0KCJ2YWx1ZXMgY2hlY2tlZCBhdCBmbGFnIHBhcnNlIHRpbWUiKSwKKyAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldCwKICAgICAgICAgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IHBmLm5hbWVzcGFjZSgpLnRvX3N0cmluZygpLAogICAgICAgICBkZXZpY2VfY29uZmlnX2ZsYWc6IGNvZGVnZW46OmNyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KHBhY2thZ2UsIHBmLm5hbWUoKSkKICAgICAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpLApAQCAtMjc5LDM5ICszMDAsMjMgQEAKICAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ybygpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9ybyhib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3KGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcndfZXhwb3J0ZWQoYm9vbCB2YWwpID0gMDsKLQogICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX2ZpeGVkX3JvKGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9ybygpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX3JvKGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9yb19leHBvcnRlZCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9ydygpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9ybyhib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9ydyhib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9yd19leHBvcnRlZChib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9ybyhib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcm8oYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9yb19leHBvcnRlZChib29sIHZhbCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX3J3KGJvb2wgdmFsKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXRfZmxhZ3MoKSB7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycwppbmRleCBlYzIyZWJjLi44MTM0MGYyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycwpAQCAtMSwxOCArMSwxOCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KIAogdXNlIGFueWhvdzo6UmVzdWx0OwogdXNlIHNlcmRlOjpTZXJpYWxpemU7CkBAIC0yMiw3ICsyMiw3IEBACiAKIHVzZSBjcmF0ZTo6Y29kZWdlbjsKIHVzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Ci11c2UgY3JhdGU6OmNvbW1hbmRzOjpPdXRwdXRGaWxlOwordXNlIGNyYXRlOjpjb21tYW5kczo6e3Nob3VsZF9pbmNsdWRlX2ZsYWcsIE91dHB1dEZpbGV9OwogdXNlIGFjb25maWdfcHJvdG9zOjp7UHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvUGFyc2VkRmxhZ307CiB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKIApAQCAtMzIsNiArMzIsOCBAQAogICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCiAgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAogICAgIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKKyAgICBwYWNrYWdlX2ZpbmdlcnByaW50OiB1NjQsCisgICAgbmV3X2V4cG9ydGVkOiBib29sLAogKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+Pgogd2hlcmUKICAgICBJOiBJdGVyYXRvcjxJdGVtID0gUHJvdG9QYXJzZWRGbGFnPiwKQEAgLTQ2LDcgKzQ4LDcgQEAKICAgICBsZXQgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgPQogICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5hbnkofGVsZW18IGVsZW0uaXNfcmVhZF93cml0ZSkgfHwgbGlicmFyeV9leHBvcnRlZDsKICAgICBsZXQgY29udGFpbmVyID0gKGZsYWdfZWxlbWVudHMuZmlyc3QoKS5leHBlY3QoInplcm8gdGVtcGxhdGUgZmxhZ3MiKS5jb250YWluZXIpLnRvX3N0cmluZygpOwotCisgICAgbGV0IGlzX3BsYXRmb3JtX2NvbnRhaW5lciA9IG1hdGNoZXMhKGNvbnRhaW5lci5hc19zdHIoKSwgInN5c3RlbSIgfCAicHJvZHVjdCIgfCAidmVuZG9yIik7CiAgICAgbGV0IGNvbnRleHQgPSBDb250ZXh0IHsKICAgICAgICAgZmxhZ19lbGVtZW50cywKICAgICAgICAgbmFtZXNwYWNlX2ZsYWdzLApAQCAtNTcsNiArNTksOSBAQAogICAgICAgICBsaWJyYXJ5X2V4cG9ydGVkLAogICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCiAgICAgICAgIGNvbnRhaW5lciwKKyAgICAgICAgaXNfcGxhdGZvcm1fY29udGFpbmVyLAorICAgICAgICBwYWNrYWdlX2ZpbmdlcnByaW50OiBmb3JtYXQhKCIweHs6WH1MIiwgcGFja2FnZV9maW5nZXJwcmludCksCisgICAgICAgIG5ld19leHBvcnRlZCwKICAgICB9OwogICAgIGxldCBtdXQgdGVtcGxhdGUgPSBUaW55VGVtcGxhdGU6Om5ldygpOwogICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgiRmxhZ3MuamF2YSIsIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUiKSk/OwpAQCAtMTI0LDYgKzEyOSw5IEBACiAgICAgcHViIGxpYnJhcnlfZXhwb3J0ZWQ6IGJvb2wsCiAgICAgcHViIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKICAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCisgICAgcHViIGlzX3BsYXRmb3JtX2NvbnRhaW5lcjogYm9vbCwKKyAgICBwdWIgcGFja2FnZV9maW5nZXJwcmludDogU3RyaW5nLAorICAgIHB1YiBuZXdfZXhwb3J0ZWQ6IGJvb2wsCiB9CiAKICNbZGVyaXZlKFNlcmlhbGl6ZSwgRGVidWcpXQpAQCAtMTM4LDYgKzE0Niw3IEBACiAgICAgcHViIGRlZmF1bHRfdmFsdWU6IGJvb2wsCiAgICAgcHViIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBTdHJpbmcsCiAgICAgcHViIGRldmljZV9jb25maWdfZmxhZzogU3RyaW5nLAorICAgIHB1YiBmbGFnX25hbWU6IFN0cmluZywKICAgICBwdWIgZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeDogU3RyaW5nLAogICAgIHB1YiBmbGFnX29mZnNldDogdTE2LAogICAgIHB1YiBpc19yZWFkX3dyaXRlOiBib29sLApAQCAtMTUyLDEzICsxNjEsMzIgQEAKICkgLT4gRmxhZ0VsZW1lbnQgewogICAgIGxldCBkZXZpY2VfY29uZmlnX2ZsYWcgPSBjb2RlZ2VuOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudChwYWNrYWdlLCBwZi5uYW1lKCkpCiAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpOworCisgICAgbGV0IG5vX2Fzc2lnbmVkX29mZnNldCA9ICFzaG91bGRfaW5jbHVkZV9mbGFnKHBmKTsKKworICAgIGxldCBmbGFnX29mZnNldCA9IG1hdGNoIGZsYWdfb2Zmc2V0cy5nZXQocGYubmFtZSgpKSB7CisgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBvZmZzZXQsCisgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgLy8gU3lzdGVtL3ZlbmRvci9wcm9kdWN0IFJPK2Rpc2FibGVkIGZsYWdzIGhhdmUgbm8gb2Zmc2V0IGluIHN0b3JhZ2UgZmlsZXMuCisgICAgICAgICAgICAvLyBBc3NpZ24gcGxhY2Vob2xkZXIgdmFsdWUuCisgICAgICAgICAgICBpZiBub19hc3NpZ25lZF9vZmZzZXQgeworICAgICAgICAgICAgICAgICYwCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBbGwgb3RoZXIgZmxhZ3MgX211c3RfIGhhdmUgYW4gb2Zmc2V0LgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGFuaWMhKCJ7fSIsIGZvcm1hdCEoIm1pc3NpbmcgZmxhZyBvZmZzZXQgZm9yIHt9IiwgcGYubmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCiAgICAgRmxhZ0VsZW1lbnQgewogICAgICAgICBjb250YWluZXI6IHBmLmNvbnRhaW5lcigpLnRvX3N0cmluZygpLAogICAgICAgICBkZWZhdWx0X3ZhbHVlOiBwZi5zdGF0ZSgpID09IFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVELAogICAgICAgICBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogcGYubmFtZXNwYWNlKCkudG9fc3RyaW5nKCksCiAgICAgICAgIGRldmljZV9jb25maWdfZmxhZywKKyAgICAgICAgZmxhZ19uYW1lOiBwZi5uYW1lKCkudG9fc3RyaW5nKCksCiAgICAgICAgIGZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXg6IHBmLm5hbWUoKS50b19hc2NpaV91cHBlcmNhc2UoKSwKLSAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldHMuZ2V0KHBmLm5hbWUoKSkuZXhwZWN0KCJkaWRudCBmaW5kIHBhY2thZ2Ugb2Zmc2V0IDooIiksCisgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXQsCiAgICAgICAgIGlzX3JlYWRfd3JpdGU6IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAogICAgICAgICBtZXRob2RfbmFtZTogZm9ybWF0X2phdmFfbWV0aG9kX25hbWUocGYubmFtZSgpKSwKICAgICAgICAgcHJvcGVydGllczogZm9ybWF0X3Byb3BlcnR5X25hbWUocGYubmFtZXNwYWNlKCkpLApAQCAtNTAwLDYgKzUyOCw4IEBACiAgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCiAgICAgICAgICAgICBtb2RlLAogICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgNTgwMTE0NDc4NDYxODIyMTY2OCwKICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICApCiAgICAgICAgIC51bndyYXAoKTsKQEAgLTUwOCw2MCArNTM4LDM2IEBACiAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBGZWF0dXJlRmxhZ3MgRkVBVFVSRV9GTEFHUyA9IG5ldyBGZWF0dXJlRmxhZ3NJbXBsKCk7CiAgICAgICAgIH0iIzsKIAotICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCA9IHIjIgorICAgICAgICBsZXQgZXhwZWN0ZWRfZmVhdHVyZWZsYWdzbXBsX2NvbnRlbnQgPSByIyIKICAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CiAgICAgICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgogICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwotICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7Ci0gICAgICAgIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRldmljZUNvbmZpZy5Qcm9wZXJ0aWVzOworICAgICAgICBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsOworICAgICAgICBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKICAgICAgICAgLyoqIEBoaWRlICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvdGhlcl9uYW1lc3BhY2VfaXNfY2FjaGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GZWF0dXJlRmxhZ3NJbXBsIjsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaXNDYWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSdyA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJ3ID0gdHJ1ZTsKLQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCkgeworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoImFjb25maWdfdGVzdCIpOwotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndFeHBvcnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVkUncgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBhY29uZmlnX3Rlc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUKLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIHJlYWRlciA9IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKCJzeXN0ZW0iLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwgMHg1MDgxQ0U3MjIxQzc3MDY0TCk7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoMSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDcpOworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZXBsYWNlcyB0byB2ZXJzaW9uIGNoZWNrLCBhZnRlciB0aGUgdmVyc2lvbiBidW1wLgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfb3RoZXJfbmFtZXNwYWNlKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJvdGhlcl9uYW1lc3BhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSBvdGhlcl9uYW1lc3BhY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3RoZXJfbmFtZXNwYWNlX2lzX2NhY2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaXNDYWNoZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTU3NCw4ICs1ODAsOCBAQAogICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgogICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUncoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSdzsKICAgICAgICAgICAgIH0KQEAgLTU4Myw4ICs1ODksOCBAQAogICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgogICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFjb25maWdfdGVzdF9pc19jYWNoZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3RXhwb3J0ZWQ7CiAgICAgICAgICAgICB9CkBAIC01OTIsOCArNTk4LDggQEAKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKICAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW90aGVyX25hbWVzcGFjZV9pc19jYWNoZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfb3RoZXJfbmFtZXNwYWNlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZTsKICAgICAgICAgICAgIH0KQEAgLTYyNSwxNiArNjMxLDE3IEBACiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCiAgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgewotICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRSdzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiIzsKKwogICAgICAgICBsZXQgbXV0IGZpbGVfc2V0ID0gSGFzaE1hcDo6ZnJvbShbCiAgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GbGFncy5qYXZhIiwgZXhwZWN0X2ZsYWdzX2NvbnRlbnQuYXNfc3RyKCkpLAotICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3NJbXBsLmphdmEiLCBleHBlY3RlZF9mZWF0dXJlZmxhZ3NtcGxfY29udGVudCksCiAgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3MuamF2YSIsIEVYUEVDVEVEX0ZFQVRVUkVGTEFHU19DT01NT05fQ09OVEVOVCksCiAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YSIsCkBAIC02NzcsNiArNjg0LDggQEAKICAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKICAgICAgICAgICAgIG1vZGUsCiAgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAogICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwpAQCAtNzE2LDE3ICs3MjUsMTggQEAKIAogICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50ID0gciMiCiAgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiAgICAgICAgIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRldmljZUNvbmZpZzsKICAgICAgICAgaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7CiAgICAgICAgIC8qKiBAaGlkZSAqLwogICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCA9IGZhbHNlOwogCi0KICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJhY29uZmlnX3Rlc3QiKTsKICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0KQEAgLTc0NCwyNyArNzU0LDIyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZQogICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGlzb2xhdGVkIHByb2Nlc3MgY2FzZSwgc2tpcCBsb2FkaW5nIGZsYWcgdmFsdWUgZnJvbSB0aGUgc3RvcmFnZSwgdXNlIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgewogICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0V4cG9ydGVkOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgewogICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkUm9FeHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSIjOworCisgICAgICAgIGxldCBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGNsYXNzIEN1c3RvbUZlYXR1cmVGbGFncyBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisKKyAgICAgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICAgICAgcHVibGljIEN1c3RvbUZlYXR1cmVGbGFncyhCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBnZXRWYWx1ZUltcGwpIHsKKyAgICAgICAgICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJ3RXhwb3J0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZFJvRXhwb3J0ZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+IGdldHRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtR2V0VmFsdWVJbXBsLnRlc3QoZmxhZ05hbWUsIGdldHRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICIjOworCisgICAgICAgIGxldCBtdXQgZmlsZV9zZXQgPSBIYXNoTWFwOjpmcm9tKFsKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZsYWdzLmphdmEiLCBleHBlY3RfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3MuamF2YSIsIGV4cGVjdF9mZWF0dXJlX2ZsYWdzX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50KSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKKyAgICAgICAgICAgICAgICBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9GQUtFRkVBVFVSRUZMQUdTSU1QTF9DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgXSk7CisKKyAgICAgICAgZm9yIGZpbGUgaW4gZ2VuZXJhdGVkX2ZpbGVzIHsKKyAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlLnBhdGgudG9fc3RyKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmNvbnRhaW5zX2tleShmaWxlX3BhdGgpLCAiQ2Fubm90IGZpbmQge30iLCBmaWxlX3BhdGgpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0LmdldChmaWxlX3BhdGgpLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCkKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICJGaWxlIHt9IGNvbnRlbnQgaXMgbm90IGNvcnJlY3QiLAorICAgICAgICAgICAgICAgIGZpbGVfcGF0aAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGZpbGVfc2V0LnJlbW92ZShmaWxlX3BhdGgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5pc19lbXB0eSgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9qYXZhX2NvZGVfbmV3X2V4cG9ydGVkKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQ7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyB7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICBpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5BY29uZmlnUGFja2FnZTsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GZWF0dXJlRmxhZ3NJbXBsX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaXNDYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdQYWNrYWdlIHJlYWRlciA9IEFjb25maWdQYWNrYWdlLmxvYWQoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgiZGlzYWJsZWRfcndfZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFJvRXhwb3J0ZWQgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgiZW5hYmxlZF9yb19leHBvcnRlZCIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBwYXNzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZXBsYWNlcyB0byB2ZXJzaW9uIGNoZWNrLCBhZnRlciB0aGUgdmVyc2lvbiBidW1wLgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzQ2FjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkUm9FeHBvcnRlZDsKICAgICAgICAgICAgIH0KQEAgLTg3MCw2ICsxMDczLDggQEAKICAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKICAgICAgICAgICAgIG1vZGUsCiAgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAogICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwpAQCAtOTkxLDYgKzExOTYsOCBAQAogICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAogICAgICAgICAgICAgbW9kZSwKICAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIDU4MDExNDQ3ODQ2MTgyMjE2NjgsCiAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgKQogICAgICAgICAudW53cmFwKCk7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9ydXN0LnJzCmluZGV4IDQ1NDg4YjAuLjc0ZGExYmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9ydXN0LnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9ydXN0LnJzCkBAIC0yNCw3ICsyNCw3IEBACiAKIHVzZSBjcmF0ZTo6Y29kZWdlbjsKIHVzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Ci11c2UgY3JhdGU6OmNvbW1hbmRzOjpPdXRwdXRGaWxlOwordXNlIGNyYXRlOjpjb21tYW5kczo6e3Nob3VsZF9pbmNsdWRlX2ZsYWcsIE91dHB1dEZpbGV9OwogCiBwdWIgZm4gZ2VuZXJhdGVfcnVzdF9jb2RlPEk+KAogICAgIHBhY2thZ2U6ICZzdHIsCkBAIC04OCw2ICs4OCwyMSBAQAogaW1wbCBUZW1wbGF0ZVBhcnNlZEZsYWcgewogICAgICNbYWxsb3coY2xpcHB5Ojpub25taW5pbWFsX2Jvb2wpXQogICAgIGZuIG5ldyhwYWNrYWdlOiAmc3RyLCBmbGFnX29mZnNldHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LCBwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gU2VsZiB7CisgICAgICAgIGxldCBmbGFnX29mZnNldCA9IG1hdGNoIGZsYWdfb2Zmc2V0cy5nZXQocGYubmFtZSgpKSB7CisgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gb2Zmc2V0LAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtL3ZlbmRvci9wcm9kdWN0IFJPK2Rpc2FibGVkIGZsYWdzIGhhdmUgbm8gb2Zmc2V0IGluIHN0b3JhZ2UgZmlsZXMuCisgICAgICAgICAgICAgICAgLy8gQXNzaWduIHBsYWNlaG9sZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgIGlmICFzaG91bGRfaW5jbHVkZV9mbGFnKHBmKSB7CisgICAgICAgICAgICAgICAgICAgICYwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFsbCBvdGhlciBmbGFncyBfbXVzdF8gaGF2ZSBhbiBvZmZzZXQuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmljISgie30iLCBmb3JtYXQhKCJtaXNzaW5nIGZsYWcgb2Zmc2V0IGZvciB7fSIsIHBmLm5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKwogICAgICAgICBTZWxmIHsKICAgICAgICAgICAgIHJlYWR3cml0ZTogcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsCiAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBtYXRjaCBwZi5zdGF0ZSgpIHsKQEAgLTk2LDcgKzExMSw3IEBACiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAogICAgICAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKLSAgICAgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXRzLmdldChwZi5uYW1lKCkpLmV4cGVjdCgiZGlkbnQgZmluZCBwYWNrYWdlIG9mZnNldCA6KCIpLAorICAgICAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldCwKICAgICAgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKICAgICAgICAgICAgIGRldmljZV9jb25maWdfZmxhZzogY29kZWdlbjo6Y3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQocGFja2FnZSwgcGYubmFtZSgpKQogICAgICAgICAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpLApAQCAtMTEzLDQxICsxMjgsMzUgQEAKIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07CiB1c2Ugc3RkOjpwYXRoOjpQYXRoOwogdXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7CiB1c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OwogCi1zdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQotICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7Ci1zdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7Ci0KIC8vLyBmbGFnIHByb3ZpZGVyCiBwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKIAotbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljISB7CiAgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3Ci0gICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcnc6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgIHN0YXRpYyBDQUNIRURfZGlzYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAogICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIpOwogCiAgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCi0gICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgIHN0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAogICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIpOwogCiAgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQotICAgIHN0YXRpYyByZWYgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2U6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAogICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKIAogICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3J3Ci0gICAgc3RhdGljIHJlZiBDQUNIRURfZW5hYmxlZF9ydzogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgc3RhdGljIENBQ0hFRF9lbmFibGVkX3J3OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKLSAgICAgICAgInRydWUiKSA9PSAidHJ1ZSI7Ci0KLX0KKyAgICAgICAgInRydWUiKSA9PSAidHJ1ZSIpOwogCiBpbXBsIEZsYWdQcm92aWRlciB7CiAgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcm8KQEAgLTI1OSwyMjMgKzI2OCwxODIgQEAKIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07CiB1c2Ugc3RkOjpwYXRoOjpQYXRoOwogdXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7CiB1c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OwogCi1zdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQotICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7Ci1zdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7Ci0KIC8vLyBmbGFnIHByb3ZpZGVyCiBwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKIAotbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljISB7CitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgeworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CiAKLSAgICBzdGF0aWMgcmVmIFBBQ0tBR0VfT0ZGU0VUOiBSZXN1bHQ8T3B0aW9uPHUzMj4sIEFjb25maWdTdG9yYWdlRXJyb3I+ID0gdW5zYWZlIHsKLSAgICAgICAgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkKLSAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQotICAgICAgICAubWFwKHxjb250ZXh0fCBjb250ZXh0Lm1hcCh8Y3wgYy5ib29sZWFuX3N0YXJ0X2luZGV4KSkKLSAgICB9Oworc3RhdGljIEZMQUdfVkFMX01BUDogTGF6eUxvY2s8UmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+PiA9IExhenlMb2NrOjpuZXcofHwgdW5zYWZlIHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKQorfSk7CiAKLSAgICBzdGF0aWMgcmVmIEZMQUdfVkFMX01BUDogUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+ID0gdW5zYWZlIHsKLSAgICAgICAgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKLSAgICB9OwotICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9ydworLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3CitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgeworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoImFjb25maWdfcnVzdF9jb2RlZ2VuIikKKyAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOwogCi0gICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcnc6IGJvb2wgPSB7Ci0gICAgICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAotICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCisgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7CisgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgewotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgotICAgICAgICAgICAgbG9nZ2VyOjppbml0KAotICAgICAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CisgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgeworICAgICAgICBPayhmbGFnX3ZhbHVlKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgfSwKKyAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9KTsKIAotICAgICAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKLSAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKLSAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgewotICAgICAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAotICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ2NvbS5hbmRyb2lkLmFjb25maWcudGVzdCciLnRvX3N0cmluZygpKQorLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgeworICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCisgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CisKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfcmVzdWx0ID0gRkxBR19WQUxfTUFQCisgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKKyAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgewotICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSBpZiBzdG9yYWdlX3Jlc3VsdCA9PSByZXN1bHQgPT4gewotICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZGlzYWJsZWRfcncnIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7c3RvcmFnZV9yZXN1bHR9Iik7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgPT4gewotICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAnZGlzYWJsZWRfcncnLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7c3RvcmFnZV9yZXN1bHR9Iik7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IHtlcnJ9IikKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKGZsYWdfdmFsdWUpID0+IHsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdfdmFsdWU7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorfSk7CiAKLSAgICAgICAgcmVzdWx0Ci0gICAgICAgIH07CisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOwogCi0gICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCi0KLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogYm9vbCA9IHsKLSAgICAgICAgbGV0IHJlc3VsdCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCi0gICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7Ci0KLSAgICAgICAgaWYgUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCi0gICAgICAgICAgICBsb2dnZXI6OmluaXQoCi0gICAgICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKLQotICAgICAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKLSAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKLSAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgewotICAgICAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAotICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ2NvbS5hbmRyb2lkLmFjb25maWcudGVzdCciLnRvX3N0cmluZygpKQorICAgICAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCisgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKIAotICAgICAgICAgICAgbWF0Y2ggYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCB7Ci0gICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdkaXNhYmxlZF9yd19leHBvcnRlZCcgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IG1pc21hdGNoIGZvciBmbGFnICdkaXNhYmxlZF9yd19leHBvcnRlZCcuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgeworICAgICAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9Cit9KTsKIAotICAgICAgICByZXN1bHQKLSAgICAgICAgfTsKIAotICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3J3CitzdGF0aWMgQ0FDSEVEX2VuYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCB7CisgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICAgICAgbG9nZ2VyOjppbml0KAorICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoImFjb25maWdfcnVzdF9jb2RlZ2VuIikKKyAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKIAotICAgIHN0YXRpYyByZWYgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogYm9vbCA9IHsKLSAgICAgICAgbGV0IHJlc3VsdCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAotICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAotICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOwotCi0gICAgICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgewotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgotICAgICAgICAgICAgbG9nZ2VyOjppbml0KAotICAgICAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7Ci0KLSAgICAgICAgICAgIGxldCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0ID0gRkxBR19WQUxfTUFQCi0gICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCi0gICAgICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKLSAgICAgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICdjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QnIi50b19zdHJpbmcoKSkKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfcmVzdWx0ID0gRkxBR19WQUxfTUFQCisgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKKyAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyA3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgewotICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSBpZiBzdG9yYWdlX3Jlc3VsdCA9PSByZXN1bHQgPT4gewotICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZScuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgeworICAgICAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICByZXN1bHQKLSAgICAgICAgfTsKLQotICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3J3Ci0KLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9lbmFibGVkX3J3OiBib29sID0gewotICAgICAgICBsZXQgcmVzdWx0ID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCi0gICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAotICAgICAgICAgICAgInRydWUiKSA9PSAidHJ1ZSI7Ci0KLSAgICAgICAgaWYgUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCi0gICAgICAgICAgICBsb2dnZXI6OmluaXQoCi0gICAgICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQotICAgICAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKLQotICAgICAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKLSAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKLSAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgewotICAgICAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAotICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyA4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ2NvbS5hbmRyb2lkLmFjb25maWcudGVzdCciLnRvX3N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IHsKLSAgICAgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgaWYgc3RvcmFnZV9yZXN1bHQgPT0gcmVzdWx0ID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6SW5mbywgIkFjb25maWdUZXN0TWlzc2lvbjE6IHN1Y2Nlc3MhIGZsYWcgJ2VuYWJsZWRfcncnIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7c3RvcmFnZV9yZXN1bHR9Iik7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgPT4gewotICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAnZW5hYmxlZF9ydycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdAotICAgICAgICB9OwotCi19Cit9KTsKIAogaW1wbCBGbGFnUHJvdmlkZXIgewogCkBAIC01MzUsNjYgKzUwMyw3IEBACiAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybwogI1tpbmxpbmUoYWx3YXlzKV0KIHB1YiBmbiBkaXNhYmxlZF9ybygpIC0+IGJvb2wgewotCi0KLSAgICBsZXQgcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgLy8gYXJlIG5vb3BzLgotICAgIGxvZ2dlcjo6aW5pdCgKLSAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQotICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbyksCi0gICAgKTsKLQotICAgIHVuc2FmZSB7Ci0gICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIHsKLSAgICAgICAgICAgIE9rKGZpbGUpID0+IGZpbGUsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZGlzYWJsZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKLSAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCi0gICAgICAgICAgICBPayhOb25lKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZGlzYWJsZWRfcm8nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZGlzYWJsZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxldCBmbGFnX3ZhbF9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSB7Ci0gICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDAgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdkaXNhYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiByZXN1bHQgIT0gdmFsdWUgewotICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ2Rpc2FibGVkX3JvJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdkaXNhYmxlZF9ybycgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyB7ZGVmYXVsdF92YWx1ZX0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXN1bHQKLQorICAgZmFsc2UKIH0KIAogLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKQEAgLTYxOCwyNjEgKzUyNywyNSBAQAogLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybwogI1tpbmxpbmUoYWx3YXlzKV0KIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCkgLT4gYm9vbCB7Ci0KLQotICAgIGxldCByZXN1bHQgPSB0cnVlOwotICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAotICAgIC8vIGFyZSBub29wcy4KLSAgICBsb2dnZXI6OmluaXQoCi0gICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCi0gICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAotICAgICk7Ci0KLSAgICB1bnNhZmUgewotICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7Ci0gICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKLSAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCi0gICAgICAgICAgICBPayhOb25lKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9ybyc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgewotICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDQgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7Ci0gICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZW5hYmxlZF9maXhlZF9ybycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtkZWZhdWx0X3ZhbHVlfSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAotCisgICAgdHJ1ZQogfQogCiAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCiAjW2lubGluZShhbHdheXMpXQogcHViIGZuIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKLQotCi0gICAgbGV0IHJlc3VsdCA9IHRydWU7Ci0gICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgLy8gYXJlIG5vb3BzLgotICAgIGxvZ2dlcjo6aW5pdCgKLSAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQotICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbyksCi0gICAgKTsKLQotICAgIHVuc2FmZSB7Ci0gICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIHsKLSAgICAgICAgICAgIE9rKGZpbGUpID0+IGZpbGUsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBsZXQgcGFja2FnZV9yZWFkX2NvbnRleHQgPSBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikgewotICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKLSAgICAgICAgICAgIE9rKE5vbmUpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxldCBmbGFnX3ZhbF9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSB7Ci0gICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgNSArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIHsKLSAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKLSAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgbG9nIShMZXZlbDo6SW5mbywgIkFjb25maWdUZXN0TWlzc2lvbjE6IHN1Y2Nlc3MhIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMge2RlZmF1bHRfdmFsdWV9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzdWx0Ci0KKyAgICB0cnVlCiB9CiAKIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KICNbaW5saW5lKGFsd2F5cyldCiBwdWIgZm4gZW5hYmxlZF9ybygpIC0+IGJvb2wgewotCi0KLSAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAhUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBhcmUgbm9vcHMuCi0gICAgbG9nZ2VyOjppbml0KAotICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKLSAgICApOwotCi0gICAgdW5zYWZlIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkgewotICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7Ci0gICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAotICAgICAgICAgICAgT2soTm9uZSkgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIHsKLSAgICAgICAgICAgIE9rKHZhbF9tYXApID0+IHZhbF9tYXAsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCA2ICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgewotICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiByZXN1bHQgIT0gdmFsdWUgewotICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ2VuYWJsZWRfcm8nLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZW5hYmxlZF9ybycgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyB7ZGVmYXVsdF92YWx1ZX0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXN1bHQKLQorICAgIHRydWUKIH0KIAogLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAogI1tpbmxpbmUoYWx3YXlzKV0KIHB1YiBmbiBlbmFibGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7Ci0KLQotICAgIGxldCByZXN1bHQgPSB0cnVlOwotICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAotICAgIC8vIGFyZSBub29wcy4KLSAgICBsb2dnZXI6OmluaXQoCi0gICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCi0gICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAotICAgICk7Ci0KLSAgICB1bnNhZmUgewotICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7Ci0gICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKLSAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCi0gICAgICAgICAgICBPayhOb25lKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9yb19leHBvcnRlZCc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgewotICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDcgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7Ci0gICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZW5hYmxlZF9yb19leHBvcnRlZCcuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtkZWZhdWx0X3ZhbHVlfSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAotCisgICAgdHJ1ZQogfQogCiAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3J3CkBAIC0xMTQ0LDM1ICs4MTcsMjkgQEAKIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07CiB1c2Ugc3RkOjpwYXRoOjpQYXRoOwogdXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7CiB1c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OwogCi1zdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQotICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7Ci1zdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7Ci0KIC8vLyBmbGFnIHByb3ZpZGVyCiBwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKIAotbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljISB7CiAgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCi0gICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgIHN0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAogICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIpOwogCiAgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKLSAgICBzdGF0aWMgcmVmIENBQ0hFRF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkOiBib29sID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICBzdGF0aWMgQ0FDSEVEX2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQ6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAogICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAogICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAotICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CiAKICAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZW5hYmxlZF9yb19leHBvcnRlZAotICAgIHN0YXRpYyByZWYgQ0FDSEVEX2VuYWJsZWRfcm9fZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgIHN0YXRpYyBDQUNIRURfZW5hYmxlZF9yb19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCiAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKLQotfQorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIpOwogCiBpbXBsIEZsYWdQcm92aWRlciB7CiAgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKQEAgLTEyMTgsMTIgKzg4NSw5IEBACiB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwogdXNlIHN0ZDo6cGF0aDo6UGF0aDsKIHVzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwogdXNlIGxvZzo6e2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKIAotc3RhdGljIFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFOiAmc3RyID0KLSAgICAiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiOwotc3RhdGljIE1JR1JBVElPTl9MT0dfVEFHOiAmc3RyID0gIkFjb25maWdUZXN0TWlzc2lvbjEiOwotCiAvLy8gZmxhZyBwcm92aWRlcgogcHViIHN0cnVjdCBGbGFnUHJvdmlkZXI7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvbW1hbmRzLnJzCmluZGV4IDU5ZjA2NjIuLjJmOTYwMTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpAQCAtMTgsNiArMTgsNyBAQAogdXNlIGl0ZXJ0b29sczo6SXRlcnRvb2xzOwogdXNlIHByb3RvYnVmOjpNZXNzYWdlOwogdXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpoYXNoOjpIYXNoZXI7CiB1c2Ugc3RkOjppbzo6UmVhZDsKIHVzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7CiAKQEAgLTMxLDYgKzMyLDcgQEAKICAgICBQYXJzZWRGbGFnRXh0LCBQcm90b0ZsYWdNZXRhZGF0YSwgUHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvUGFyc2VkRmxhZywKICAgICBQcm90b1BhcnNlZEZsYWdzLCBQcm90b1RyYWNlcG9pbnQsCiB9OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpzaXBfaGFzaGVyMTM6OlNpcEhhc2hlcjEzOwogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpTdG9yYWdlRmlsZVR5cGU7CiAKIHB1YiBzdHJ1Y3QgSW5wdXQgewpAQCAtNjcsNiArNjksNyBAQAogICAgIGRlY2xhcmF0aW9uczogVmVjPElucHV0PiwKICAgICB2YWx1ZXM6IFZlYzxJbnB1dD4sCiAgICAgZGVmYXVsdF9wZXJtaXNzaW9uOiBQcm90b0ZsYWdQZXJtaXNzaW9uLAorICAgIGFsbG93X3JlYWRfd3JpdGU6IGJvb2wsCiApIC0+IFJlc3VsdDxWZWM8dTg+PiB7CiAgICAgbGV0IG11dCBwYXJzZWRfZmxhZ3MgPSBQcm90b1BhcnNlZEZsYWdzOjpuZXcoKTsKIApAQCAtNzcsOCArODAsMTggQEAKICAgICAgICAgICAgIC5yZWFkX3RvX3N0cmluZygmbXV0IGNvbnRlbnRzKQogICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIGlucHV0LnNvdXJjZSkpPzsKIAotICAgICAgICBsZXQgZmxhZ19kZWNsYXJhdGlvbnMgPSBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oJmNvbnRlbnRzKQotICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBpbnB1dC5lcnJvcl9jb250ZXh0KCkpPzsKKyAgICAgICAgbGV0IG11dCBmbGFnX2RlY2xhcmF0aW9ucyA9CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oJmNvbnRlbnRzKQorICAgICAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgaW5wdXQuZXJyb3JfY29udGV4dCgpKT87CisKKyAgICAgICAgLy8gc3lzdGVtX2V4dCBmbGFncyBzaG91bGQgYmUgdHJlYXRlZCBhcyBzeXN0ZW0gZmxhZ3MgYXMgd2UgYXJlIGNvbWJpbmluZyAvc3lzdGVtX2V4dAorICAgICAgICAvLyBhbmQgL3N5c3RlbSBhcyBvbmUgY29udGFpbmVyCisgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGxvZ2ljIHdoZW4gd2Ugc3RhcnQgZW5mb3JjaW5nIHRoYXQgc3lzdGVtX2V4dCBjYW5ub3QgYmUgc2V0IGFzCisgICAgICAgIC8vIGNvbnRhaW5lciBpbiBhY29uZmlnIGRlY2xhcmF0aW9uIGZpbGVzLgorICAgICAgICBpZiBmbGFnX2RlY2xhcmF0aW9ucy5jb250YWluZXIoKSA9PSAic3lzdGVtX2V4dCIgeworICAgICAgICAgICAgZmxhZ19kZWNsYXJhdGlvbnMuc2V0X2NvbnRhaW5lcihTdHJpbmc6OmZyb20oInN5c3RlbSIpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGVuc3VyZSEoCiAgICAgICAgICAgICBwYWNrYWdlID09IGZsYWdfZGVjbGFyYXRpb25zLnBhY2thZ2UoKSwKICAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2Uge306IGV4cGVjdGVkIHBhY2thZ2Uge30sIGdvdCB7fSIsCkBAIC0xODMsNiArMTk2LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAhYWxsb3dfcmVhZF93cml0ZSB7CisgICAgICAgIGlmIGxldCBTb21lKHBmKSA9IHBhcnNlZF9mbGFncworICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAuZmluZCh8cGZ8IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKQorICAgICAgICB7CisgICAgICAgICAgICBiYWlsISgiZmxhZyB7fSBoYXMgcGVybWlzc2lvbiBSRUFEX1dSSVRFLCBidXQgYWxsb3dfcmVhZF93cml0ZSBpcyBmYWxzZSIsIHBmLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBDcmVhdGUgYSBzb3J0ZWQgcGFyc2VkX2ZsYWdzCiAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6c29ydF9wYXJzZWRfZmxhZ3MoJm11dCBwYXJzZWRfZmxhZ3MpOwogICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnZlcmlmeV9maWVsZHMoJnBhcnNlZF9mbGFncyk/OwpAQCAtMTk1LDEzICsyMTgsMTcgQEAKICAgICBtdXQgaW5wdXQ6IElucHV0LAogICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCiAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorICAgIG5ld19leHBvcnRlZDogYm9vbCwKICkgLT4gUmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4gewogICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBpbnB1dC50cnlfcGFyc2VfZmxhZ3MoKT87Ci0gICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9IG1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIGNvZGVnZW5fbW9kZSk/OworICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLmNsb25lKCksIGNvZGVnZW5fbW9kZSk/OwogICAgIGxldCBTb21lKHBhY2thZ2UpID0gZmluZF91bmlxdWVfcGFja2FnZSgmbW9kaWZpZWRfcGFyc2VkX2ZsYWdzKSBlbHNlIHsKICAgICAgICAgYmFpbCEoIm5vIHBhcnNlZCBmbGFncywgb3IgdGhlIHBhcnNlZCBmbGFncyB1c2UgZGlmZmVyZW50IHBhY2thZ2VzIik7CiAgICAgfTsKICAgICBsZXQgcGFja2FnZSA9IHBhY2thZ2UudG9fc3RyaW5nKCk7CisgICAgbGV0IG11dCBmbGFnX25hbWVzID0gZXh0cmFjdF9mbGFnX25hbWVzKHBhcnNlZF9mbGFncyk/OworICAgIGxldCBwYWNrYWdlX2ZpbmdlcnByaW50ID0gY29tcHV0ZV9mbGFnc19maW5nZXJwcmludCgmbXV0IGZsYWdfbmFtZXMpOwogICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcygmcGFja2FnZSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSk/OwogICAgIGdlbmVyYXRlX2phdmFfY29kZSgKICAgICAgICAgJnBhY2thZ2UsCkBAIC0yMDksNiArMjM2LDggQEAKICAgICAgICAgY29kZWdlbl9tb2RlLAogICAgICAgICBmbGFnX2lkcywKICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICBwYWNrYWdlX2ZpbmdlcnByaW50LAorICAgICAgICBuZXdfZXhwb3J0ZWQsCiAgICAgKQogfQogCkBAIC0yNjgsMTAgKzI5NywxMSBAQAogICAgIGNhY2hlczogVmVjPElucHV0PiwKICAgICBjb250YWluZXI6ICZzdHIsCiAgICAgZmlsZTogJlN0b3JhZ2VGaWxlVHlwZSwKKyAgICB2ZXJzaW9uOiB1MzIsCiApIC0+IFJlc3VsdDxWZWM8dTg+PiB7CiAgICAgbGV0IHBhcnNlZF9mbGFnc192ZWM6IFZlYzxQcm90b1BhcnNlZEZsYWdzPiA9CiAgICAgICAgIGNhY2hlcy5pbnRvX2l0ZXIoKS5tYXAofG11dCBpbnB1dHwgaW5wdXQudHJ5X3BhcnNlX2ZsYWdzKCkpLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+Pj4oKT87Ci0gICAgZ2VuZXJhdGVfc3RvcmFnZV9maWxlKGNvbnRhaW5lciwgcGFyc2VkX2ZsYWdzX3ZlYy5pdGVyKCksIGZpbGUpCisgICAgZ2VuZXJhdGVfc3RvcmFnZV9maWxlKGNvbnRhaW5lciwgcGFyc2VkX2ZsYWdzX3ZlYy5pdGVyKCksIGZpbGUsIHZlcnNpb24pCiB9CiAKIHB1YiBmbiBjcmVhdGVfZGV2aWNlX2NvbmZpZ19kZWZhdWx0cyhtdXQgaW5wdXQ6IElucHV0KSAtPiBSZXN1bHQ8VmVjPHU4Pj4gewpAQCAtMzk1LDI3ICs0MjUsMTIxIEBACiB7CiAgICAgYXNzZXJ0IShwYXJzZWRfZmxhZ3NfaXRlci5jbG9uZSgpLnR1cGxlX3dpbmRvd3MoKS5hbGwofChhLCBiKXwgYS5uYW1lKCkgPD0gYi5uYW1lKCkpKTsKICAgICBsZXQgbXV0IGZsYWdfaWRzID0gSGFzaE1hcDo6bmV3KCk7Ci0gICAgZm9yIChpZF90b19hc3NpZ24sIHBmKSBpbiAoMF91MzIuLikuemlwKHBhcnNlZF9mbGFnc19pdGVyKSB7CisgICAgbGV0IG11dCBmbGFnX2lkeCA9IDA7CisgICAgZm9yIHBmIGluIHBhcnNlZF9mbGFnc19pdGVyIHsKICAgICAgICAgaWYgcGFja2FnZSAhPSBwZi5wYWNrYWdlKCkgewogICAgICAgICAgICAgcmV0dXJuIEVycihhbnlob3c6OmFueWhvdyEoImVuY291bnRlcmVkIGEgZmxhZyBub3QgaW4gY3VycmVudCBwYWNrYWdlIikpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcHV0IGEgY2FwIG9uIGhvdyBtYW55IGZsYWdzIGEgcGFja2FnZSBjYW4gY29udGFpbiB0byA2NTUzNQotICAgICAgICBpZiBpZF90b19hc3NpZ24gPiB1MTY6Ok1BWCBhcyB1MzIgeworICAgICAgICBpZiBmbGFnX2lkeCA+IHUxNjo6TUFYIGFzIHUzMiB7CiAgICAgICAgICAgICByZXR1cm4gRXJyKGFueWhvdzo6YW55aG93ISgidGhlIG51bWJlciBvZiBmbGFncyBpbiBhIHBhY2thZ2UgY2Fubm90IGV4Y2VlZCA2NTUzNSIpKTsKICAgICAgICAgfQogCi0gICAgICAgIGZsYWdfaWRzLmluc2VydChwZi5uYW1lKCkudG9fc3RyaW5nKCksIGlkX3RvX2Fzc2lnbiBhcyB1MTYpOworICAgICAgICBpZiBzaG91bGRfaW5jbHVkZV9mbGFnKHBmKSB7CisgICAgICAgICAgICBmbGFnX2lkcy5pbnNlcnQocGYubmFtZSgpLnRvX3N0cmluZygpLCBmbGFnX2lkeCBhcyB1MTYpOworICAgICAgICAgICAgZmxhZ19pZHggKz0gMTsKKyAgICAgICAgfQogICAgIH0KICAgICBPayhmbGFnX2lkcykKIH0KIAorLy8gQ3JlYXRlcyBhIGZpbmdlcnByaW50IG9mIHRoZSBmbGFnIG5hbWVzICh3aGljaCByZXF1aXJlcyBzb3J0aW5nIHRoZSB2ZWN0b3IpLgorLy8gRmluZ2VycHJpbnQgaXMgdXNlZCBieSBib3RoIGNvZGVnZW4gYW5kIHN0b3JhZ2UgZmlsZXMuCitwdWIgZm4gY29tcHV0ZV9mbGFnc19maW5nZXJwcmludChmbGFnX25hbWVzOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiB1NjQgeworICAgIGZsYWdfbmFtZXMuc29ydCgpOworCisgICAgbGV0IG11dCBoYXNoZXIgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgZm9yIGZsYWcgaW4gZmxhZ19uYW1lcyB7CisgICAgICAgIGhhc2hlci53cml0ZShmbGFnLmFzX2J5dGVzKCkpOworICAgIH0KKyAgICBoYXNoZXIuZmluaXNoKCkKK30KKworLy8gQ29udmVydHMgUHJvdG9QYXJzZWRGbGFncyBpbnRvIGEgdmVjdG9yIG9mIHN0cmluZ3MgY29udGFpbmluZyBhbGwgb2YgdGhlIGZsYWcKKy8vIG5hbWVzLiBIZWxwZXIgZm4gZm9yIGNyZWF0aW5nIGZpbmdlcnByaW50IGZvciBjb2RlZ2VuIGZpbGVzLiBGbGFncyBtdXN0IGFsbAorLy8gYmVsb25nIHRvIHRoZSBzYW1lIHBhY2thZ2UuCitmbiBleHRyYWN0X2ZsYWdfbmFtZXMoZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MpIC0+IFJlc3VsdDxWZWM8U3RyaW5nPj4geworICAgIGxldCBzZXBhcmF0ZWRfZmxhZ3M6IFZlYzxQcm90b1BhcnNlZEZsYWc+ID0gZmxhZ3MucGFyc2VkX2ZsYWcuaW50b19pdGVyKCkuY29sbGVjdDo6PFZlYzxfPj4oKTsKKworICAgIC8vIEFsbCBmbGFncyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSBmaW5nZXJwcmludCBpcyBwZXItcGFja2FnZS4KKyAgICBsZXQgU29tZShfcGFja2FnZSkgPSBmaW5kX3VuaXF1ZV9wYWNrYWdlKCZzZXBhcmF0ZWRfZmxhZ3MpIGVsc2UgeworICAgICAgICBiYWlsISgiTm8gcGFyc2VkIGZsYWdzLCBvciB0aGUgcGFyc2VkIGZsYWdzIHVzZSBkaWZmZXJlbnQgcGFja2FnZXMuIik7CisgICAgfTsKKworICAgIE9rKHNlcGFyYXRlZF9mbGFncworICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgLmZpbHRlcihzaG91bGRfaW5jbHVkZV9mbGFnKQorICAgICAgICAubWFwKHxmbGFnfCBmbGFnLm5hbWUudW53cmFwKCkpCisgICAgICAgIC5jb2xsZWN0Ojo8VmVjPF8+PigpKQorfQorCisvLyBFeGNsdWRlIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBmbGFncyB0aGF0IGFyZSBSTytkaXNhYmxlZC4KK3B1YiBmbiBzaG91bGRfaW5jbHVkZV9mbGFnKHBmOiAmUHJvdG9QYXJzZWRGbGFnKSAtPiBib29sIHsKKyAgICBsZXQgc2hvdWxkX2ZpbHRlcl9jb250YWluZXIgPSBwZi5jb250YWluZXIgPT0gU29tZSgidmVuZG9yIi50b19zdHJpbmcoKSkKKyAgICAgICAgfHwgcGYuY29udGFpbmVyID09IFNvbWUoInN5c3RlbSIudG9fc3RyaW5nKCkpCisgICAgICAgIHx8IHBmLmNvbnRhaW5lciA9PSBTb21lKCJwcm9kdWN0Ii50b19zdHJpbmcoKSk7CisKKyAgICBsZXQgZGlzYWJsZWRfcm8gPSBwZi5zdGF0ZSA9PSBTb21lKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRC5pbnRvKCkpCisgICAgICAgICYmIHBmLnBlcm1pc3Npb24gPT0gU29tZShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkuaW50bygpKTsKKworICAgICFzaG91bGRfZmlsdGVyX2NvbnRhaW5lciB8fCAhZGlzYWJsZWRfcm8KK30KKwogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1B1cnBvc2U7CiAKICAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9vZmZzZXRfZmluZ2VycHJpbnQoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZmluZ2VycHJpbnQ6IHU2NCA9IDExNTUxMzc5OTYwMzI0MjQyMzYwOworCisgICAgICAgIGxldCBtdXQgZXh0cmFjdGVkX2ZsYWdzID0gZXh0cmFjdF9mbGFnX25hbWVzKHBhcnNlZF9mbGFncykudW53cmFwKCk7CisgICAgICAgIGxldCBoYXNoX3Jlc3VsdCA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBleHRyYWN0ZWRfZmxhZ3MpOworCisgICAgICAgIGFzc2VydF9lcSEoaGFzaF9yZXN1bHQsIGV4cGVjdGVkX2ZpbmdlcnByaW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9vZmZzZXRfZmluZ2VycHJpbnRfbWF0Y2hlc19mcm9tX3BhY2thZ2UoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworCisgICAgICAgIC8vIEFsbCB0ZXN0IGZsYWdzIGFyZSBpbiB0aGUgc2FtZSBwYWNrYWdlLCBzbyBmaW5nZXJwcmludCBmcm9tIGFsbCBvZiB0aGVtLgorICAgICAgICBsZXQgbXV0IGV4dHJhY3RlZF9mbGFncyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MuY2xvbmUoKSkudW53cmFwKCk7CisgICAgICAgIGxldCByZXN1bHRfZnJvbV9wYXJzZWRfZmxhZ3MgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZXh0cmFjdGVkX2ZsYWdzKTsKKworICAgICAgICBsZXQgbXV0IGZsYWdfbmFtZXNfdmVjID0gcGFyc2VkX2ZsYWdzCisgICAgICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgICAgIC5jbG9uZSgpCisgICAgICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgICAgIC5maWx0ZXIoc2hvdWxkX2luY2x1ZGVfZmxhZykKKyAgICAgICAgICAgIC5tYXAofGZsYWd8IGZsYWcubmFtZS51bndyYXAoKSkKKyAgICAgICAgICAgIC5tYXAoU3RyaW5nOjpmcm9tKQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCk7CisgICAgICAgIGxldCByZXN1bHRfZnJvbV9uYW1lcyA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBmbGFnX25hbWVzX3ZlYyk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoZSBzYW1lIGhhc2ggaXMgZ2VuZXJhdGVkIGZvciBlYWNoIGNhc2UuCisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0X2Zyb21fcGFyc2VkX2ZsYWdzLCByZXN1bHRfZnJvbV9uYW1lcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfb2Zmc2V0X2ZpbmdlcnByaW50X2RpZmZlcmVudF9wYWNrYWdlc19kb2VzX25vdF9tYXRjaCgpIHsKKyAgICAgICAgLy8gUGFyc2UgZmxhZ3MgZnJvbSB0d28gcGFja2FnZXMuCisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgc2Vjb25kX3BhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV9zZWNvbmRfcGFja2FnZV9mbGFncygpOworCisgICAgICAgIGxldCBtdXQgZXh0cmFjdGVkX2ZsYWdzID0gZXh0cmFjdF9mbGFnX25hbWVzKHBhcnNlZF9mbGFncykudW53cmFwKCk7CisgICAgICAgIGxldCByZXN1bHRfZnJvbV9wYXJzZWRfZmxhZ3MgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZXh0cmFjdGVkX2ZsYWdzKTsKKyAgICAgICAgbGV0IG11dCBzZWNvbmRfZXh0cmFjdGVkX2ZsYWdzID0gZXh0cmFjdF9mbGFnX25hbWVzKHNlY29uZF9wYXJzZWRfZmxhZ3MpLnVud3JhcCgpOworICAgICAgICBsZXQgc2Vjb25kX3Jlc3VsdCA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBzZWNvbmRfZXh0cmFjdGVkX2ZsYWdzKTsKKworICAgICAgICAvLyBEaWZmZXJlbnQgZmxhZ3Mgc2hvdWxkIGhhdmUgYSBkaWZmZXJlbnQgZmluZ2VycHJpbnQuCisgICAgICAgIGFzc2VydF9uZSEocmVzdWx0X2Zyb21fcGFyc2VkX2ZsYWdzLCBzZWNvbmRfcmVzdWx0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9wYXJzZV9mbGFncygpIHsKICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7IC8vIGNhbGxzIHBhcnNlX2ZsYWdzCiAgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnZlcmlmeV9maWVsZHMoJnBhcnNlZF9mbGFncykudW53cmFwKCk7CkBAIC00ODYsNiArNjEwLDcgQEAKICAgICAgICAgICAgIGRlY2xhcmF0aW9uLAogICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksCisgICAgICAgICAgICB0cnVlLAogICAgICAgICApCiAgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CkBAIC01MTksNiArNjQ0LDcgQEAKICAgICAgICAgICAgIGRlY2xhcmF0aW9uLAogICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgKQogICAgICAgICAudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKApAQCAtNTUwLDYgKzY3Niw3IEBACiAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKQEAgLTU1Nyw2ICs2ODQsMTIxIEBACiAgICAgICAgICAgICAiZmFpbGVkIHRvIHBhcnNlIG1lbW9yeTogZXhwZWN0ZWQgY29udGFpbmVyIGFyZ3VtZW50LmNvbnRhaW5lciwgZ290IGRlY2xhcmF0aW9uLmNvbnRhaW5lciIKICAgICAgICAgKTsKICAgICB9CisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfbm9fYWxsb3dfcmVhZF93cml0ZV9kZWZhdWx0X2Vycm9yKCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICBjb250YWluZXI6ICJjb20uZmlyc3QuY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCBlcnJvciA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIFNvbWUoImNvbS5maXJzdC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmVjIVtdLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZsYWcgZmlyc3QgaGFzIHBlcm1pc3Npb24gUkVBRF9XUklURSwgYnV0IGFsbG93X3JlYWRfd3JpdGUgaXMgZmFsc2UiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfbm9fYWxsb3dfcmVhZF93cml0ZV92YWx1ZV9lcnJvcigpIHsKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWcgPSByIyIKKyAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgY29udGFpbmVyOiAiY29tLmZpcnN0LmNvbnRhaW5lciIKKyAgICAgICAgZmxhZyB7CisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgICAgICAgICAgYnVnOiAiMTIzIgorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZGVjbGFyYXRpb24gPQorICAgICAgICAgICAgdmVjIVtJbnB1dCB7IHNvdXJjZTogIm1lbW9yeSIudG9fc3RyaW5nKCksIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZy5hc19ieXRlcygpKSB9XTsKKworICAgICAgICBsZXQgZmlyc3RfZmxhZ192YWx1ZSA9IHIjIgorICAgICAgICBmbGFnX3ZhbHVlIHsKKyAgICAgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IHZhbHVlID0gdmVjIVtJbnB1dCB7CisgICAgICAgICAgICBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnX3ZhbHVlLmFzX2J5dGVzKCkpLAorICAgICAgICB9XTsKKyAgICAgICAgbGV0IGVycm9yID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uZmlyc3QiLAorICAgICAgICAgICAgU29tZSgiY29tLmZpcnN0LmNvbnRhaW5lciIpLAorICAgICAgICAgICAgZGVjbGFyYXRpb24sCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZsYWcgZmlyc3QgaGFzIHBlcm1pc3Npb24gUkVBRF9XUklURSwgYnV0IGFsbG93X3JlYWRfd3JpdGUgaXMgZmFsc2UiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfbm9fYWxsb3dfcmVhZF93cml0ZV9zdWNjZXNzKCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICBjb250YWluZXI6ICJjb20uZmlyc3QuY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCBmaXJzdF9mbGFnX3ZhbHVlID0gciMiCisgICAgICAgIGZsYWdfdmFsdWUgeworICAgICAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCB2YWx1ZSA9IHZlYyFbSW5wdXQgeworICAgICAgICAgICAgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZ192YWx1ZS5hc19ieXRlcygpKSwKKyAgICAgICAgfV07CisgICAgICAgIGxldCBmbGFnc19ieXRlcyA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIFNvbWUoImNvbS5maXJzdC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZmbGFnc19ieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoMSwgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmxlbigpKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFnID0gcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmZpcnN0KCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELCBwYXJzZWRfZmxhZy5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIHBhcnNlZF9mbGFnLnBlcm1pc3Npb24oKSk7CisgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfb3ZlcnJpZGVfZml4ZWRfcmVhZF9vbmx5KCkgewpAQCAtNTkyLDYgKzgzNCw3IEBACiAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKQEAgLTYyNiw2ICs4NjksNyBAQAogICAgICAgICAgICAgZGVjbGFyYXRpb24sCiAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0KQEAgLTY2Niw2ICs5MTAsMzAgQEAKICAgICB9CiAKICAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9kdW1wX211bHRpcGxlX2ZpbHRlcnMoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gZHVtcF9wYXJzZWRfZmxhZ3MoCisgICAgICAgICAgICB2ZWMhW2lucHV0XSwKKyAgICAgICAgICAgIER1bXBGb3JtYXQ6OkN1c3RvbSgie2Z1bGx5X3F1YWxpZmllZF9uYW1lfSIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgJlsiY29udGFpbmVyOnN5c3RlbStzdGF0ZTpFTkFCTEVEIiwgImNvbnRhaW5lcjpzeXN0ZW0rcGVybWlzc2lvbjpSRUFEX1dSSVRFIl0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCB0ZXh0ID0gc3RkOjpzdHI6OmZyb21fdXRmOCgmYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ19saXN0ID0gJlsKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgXTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZF9mbGFnX2xpc3QubWFwKHxzfCBmb3JtYXQhKCJ7fVxuIiwgcykpLmpvaW4oIiIpLCB0ZXh0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9kdW1wX3RleHRwcm90b19mb3JtYXRfZGVkdXAoKSB7CiAgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKICAgICAgICAgbGV0IGlucHV0MiA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKQEAgLTcyNywxNSArOTk1LDE0IEBACiAgICAgICAgIGxldCBwYWNrYWdlID0gZmluZF91bmlxdWVfcGFja2FnZSgmcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnKS51bndyYXAoKS50b19zdHJpbmcoKTsKICAgICAgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpKS51bndyYXAoKTsKICAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfaWRzID0gSGFzaE1hcDo6ZnJvbShbCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ybyIpLCAwX3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ydyIpLCAxX3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9yd19leHBvcnRlZCIpLCAyX3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiKSwgM191MTYpLAotICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9maXhlZF9ybyIpLCA0X3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiksIDVfdTE2KSwKLSAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfcm8iKSwgNl91MTYpLAotICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9yb19leHBvcnRlZCIpLCA3X3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX3J3IiksIDhfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3IiksIDBfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3X2V4cG9ydGVkIiksIDFfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIpLCAyX3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX2ZpeGVkX3JvIiksIDNfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiKSwgNF91MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ybyIpLCA1X3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvX2V4cG9ydGVkIiksIDZfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfcnciKSwgN191MTYpLAogICAgICAgICBdKTsKICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2lkcywgZXhwZWN0ZWRfZmxhZ19pZHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycwppbmRleCAxZmI2NGY5Li4yODg3ODZiIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL21haW4ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzCkBAIC0xNiw2ICsxNiw4IEBACiAKIC8vISBgYWNvbmZpZ2AgaXMgYSBidWlsZCB0aW1lIHRvb2wgdG8gbWFuYWdlIGJ1aWxkIHRpbWUgY29uZmlndXJhdGlvbnMsIHN1Y2ggYXMgZmVhdHVyZSBmbGFncy4KIAordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpERUZBVUxUX0ZJTEVfVkVSU0lPTjsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6TUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT047CiB1c2UgYW55aG93Ojp7YW55aG93LCBiYWlsLCBDb250ZXh0LCBSZXN1bHR9OwogdXNlIGNsYXA6OntidWlsZGVyOjpBcmdBY3Rpb24sIGJ1aWxkZXI6OkVudW1WYWx1ZVBhcnNlciwgQXJnLCBBcmdNYXRjaGVzLCBDb21tYW5kfTsKIHVzZSBjb3JlOjphbnk6OkFueTsKQEAgLTQ5LDggKzUxLDcgQEAKICAgICAgICAgLnN1YmNvbW1hbmQoCiAgICAgICAgICAgICBDb21tYW5kOjpuZXcoImNyZWF0ZS1jYWNoZSIpCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygicGFja2FnZSIpLmxvbmcoInBhY2thZ2UiKS5yZXF1aXJlZCh0cnVlKSkKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMzEyNzY5NzEwKTogTWFrZSB0aGlzIGFyZ3VtZW50IHJlcXVpcmVkLgotICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNvbnRhaW5lciIpLmxvbmcoImNvbnRhaW5lciIpKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNvbnRhaW5lciIpLmxvbmcoImNvbnRhaW5lciIpLnJlcXVpcmVkKHRydWUpKQogICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImRlY2xhcmF0aW9ucyIpLmxvbmcoImRlY2xhcmF0aW9ucyIpLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkpCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygidmFsdWVzIikubG9uZygidmFsdWVzIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKSkKICAgICAgICAgICAgICAgICAuYXJnKApAQCAtNjEsNiArNjIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZHM6OkRFRkFVTFRfRkxBR19QRVJNSVNTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgKSksCiAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJhbGxvdy1yZWFkLXdyaXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJhbGxvdy1yZWFkLXdyaXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNhY2hlIikubG9uZygiY2FjaGUiKS5yZXF1aXJlZCh0cnVlKSksCiAgICAgICAgICkKICAgICAgICAgLnN1YmNvbW1hbmQoCkBAIC03OCw2ICs4NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKGNsYXA6OnZhbHVlX3BhcnNlciEoYm9vbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgiZmFsc2UiKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoIm5ldy1leHBvcnRlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibmV3LWV4cG9ydGVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAogICAgICAgICAgICAgICAgICksCiAgICAgICAgICkKICAgICAgICAgLnN1YmNvbW1hbmQoCkBAIC0xNTksNyArMTcyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHMpKSwKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiY2FjaGUiKS5sb25nKCJjYWNoZSIpLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkucmVxdWlyZWQodHJ1ZSkpCi0gICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikucmVxdWlyZWQodHJ1ZSkpLAorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoIm91dCIpLmxvbmcoIm91dCIpLnJlcXVpcmVkKHRydWUpKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJ2ZXJzaW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJ2ZXJzaW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1aXJlZChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IHMucGFyc2U6Ojx1MzI+KCkpLAorICAgICAgICAgICAgICAgICksCiAgICAgICAgICkKIH0KIApAQCAtMjM1LDEyICsyNTQsMTUgQEAKICAgICAgICAgICAgICAgICBzdWJfbWF0Y2hlcywKICAgICAgICAgICAgICAgICAiZGVmYXVsdC1wZXJtaXNzaW9uIiwKICAgICAgICAgICAgICk/OworICAgICAgICAgICAgbGV0IGFsbG93X3JlYWRfd3JpdGUgPSBnZXRfb3B0aW9uYWxfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1yZWFkLXdyaXRlIikKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJmYWlsZWQgdG8gcGFyc2UgYWxsb3ctcmVhZC13cml0ZSIpOwogICAgICAgICAgICAgbGV0IG91dHB1dCA9IGNvbW1hbmRzOjpwYXJzZV9mbGFncygKICAgICAgICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMsCiAgICAgICAgICAgICAgICAgdmFsdWVzLAogICAgICAgICAgICAgICAgICpkZWZhdWx0X3Blcm1pc3Npb24sCisgICAgICAgICAgICAgICAgKmFsbG93X3JlYWRfd3JpdGUsCiAgICAgICAgICAgICApCiAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBjYWNoZSIpPzsKICAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKQEAgLTI1MSw4ICsyNzMsMTAgQEAKICAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87CiAgICAgICAgICAgICBsZXQgYWxsb3dfaW5zdHJ1bWVudGF0aW9uID0KICAgICAgICAgICAgICAgICBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1pbnN0cnVtZW50YXRpb24iKT87Ci0gICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gY29tbWFuZHM6OmNyZWF0ZV9qYXZhX2xpYihjYWNoZSwgKm1vZGUsICphbGxvd19pbnN0cnVtZW50YXRpb24pCi0gICAgICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgamF2YSBsaWIiKT87CisgICAgICAgICAgICBsZXQgbmV3X2V4cG9ydGVkID0gZ2V0X3JlcXVpcmVkX2FyZzo6PGJvb2w+KHN1Yl9tYXRjaGVzLCAibmV3LWV4cG9ydGVkIik/OworICAgICAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9CisgICAgICAgICAgICAgICAgY29tbWFuZHM6OmNyZWF0ZV9qYXZhX2xpYihjYWNoZSwgKm1vZGUsICphbGxvd19pbnN0cnVtZW50YXRpb24sICpuZXdfZXhwb3J0ZWQpCisgICAgICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGphdmEgbGliIik/OwogICAgICAgICAgICAgbGV0IGRpciA9IFBhdGhCdWY6OmZyb20oZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT8pOwogICAgICAgICAgICAgZ2VuZXJhdGVkX2ZpbGVzCiAgICAgICAgICAgICAgICAgLml0ZXIoKQpAQCAtMzA5LDEyICszMzMsMTggQEAKICAgICAgICAgICAgIHdyaXRlX291dHB1dF90b19maWxlX29yX3N0ZG91dChwYXRoLCAmb3V0cHV0KT87CiAgICAgICAgIH0KICAgICAgICAgU29tZSgoImNyZWF0ZS1zdG9yYWdlIiwgc3ViX21hdGNoZXMpKSA9PiB7CisgICAgICAgICAgICBsZXQgdmVyc2lvbiA9CisgICAgICAgICAgICAgICAgZ2V0X29wdGlvbmFsX2FyZzo6PHUzMj4oc3ViX21hdGNoZXMsICJ2ZXJzaW9uIikudW53cmFwX29yKCZERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgICAgICBpZiAqdmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKKyAgICAgICAgICAgICAgICBiYWlsISgiSW52YWxpZCB2ZXJzaW9uIHNlbGVjdGVkICh7fSkiLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxldCBmaWxlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0b3JhZ2VGaWxlVHlwZT4oc3ViX21hdGNoZXMsICJmaWxlIikKICAgICAgICAgICAgICAgICAuY29udGV4dCgiSW52YWxpZCBzdG9yYWdlIGZpbGUgc2VsZWN0aW9uIik/OwogICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl96ZXJvX29yX21vcmVfZmlsZXMoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKICAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgImNvbnRhaW5lciIpPzsKICAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT87Ci0gICAgICAgICAgICBsZXQgb3V0cHV0ID0gY29tbWFuZHM6OmNyZWF0ZV9zdG9yYWdlKGNhY2hlLCBjb250YWluZXIsIGZpbGUpCisKKyAgICAgICAgICAgIGxldCBvdXRwdXQgPSBjb21tYW5kczo6Y3JlYXRlX3N0b3JhZ2UoY2FjaGUsIGNvbnRhaW5lciwgZmlsZSwgKnZlcnNpb24pCiAgICAgICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgc3RvcmFnZSBmaWxlcyIpPzsKICAgICAgICAgICAgIHdyaXRlX291dHB1dF90b19maWxlX29yX3N0ZG91dChwYXRoLCAmb3V0cHV0KT87CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX2luZm8ucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ19pbmZvLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDNkYWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ19pbmZvLnJzCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgY3JhdGU6OmNvbW1hbmRzOjphc3NpZ25fZmxhZ19pZHM7Cit1c2UgY3JhdGU6OnN0b3JhZ2U6OkZsYWdQYWNrYWdlOwordXNlIGFjb25maWdfcHJvdG9zOjp7UHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGV9OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7RmxhZ0luZm9IZWFkZXIsIEZsYWdJbmZvTGlzdCwgRmxhZ0luZm9Ob2RlLCBTdG9yYWdlRmlsZVR5cGV9OwordXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKKworZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9mbGFnczogdTMyLCB2ZXJzaW9uOiB1MzIpIC0+IEZsYWdJbmZvSGVhZGVyIHsKKyAgICBGbGFnSW5mb0hlYWRlciB7CisgICAgICAgIHZlcnNpb24sCisgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKGNvbnRhaW5lciksCisgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyBhcyB1OCwKKyAgICAgICAgZmlsZV9zaXplOiAwLAorICAgICAgICBudW1fZmxhZ3MsCisgICAgICAgIGJvb2xlYW5fZmxhZ19vZmZzZXQ6IDAsCisgICAgfQorfQorCitwdWIgZm4gY3JlYXRlX2ZsYWdfaW5mbygKKyAgICBjb250YWluZXI6ICZzdHIsCisgICAgcGFja2FnZXM6ICZbRmxhZ1BhY2thZ2VdLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PEZsYWdJbmZvTGlzdD4geworICAgIC8vIEV4Y2x1ZGUgc3lzdGVtL3ZlbmRvci9wcm9kdWN0IGZsYWdzIHRoYXQgYXJlIFJPK2Rpc2FibGVkLgorICAgIGxldCBtdXQgZmlsdGVyZWRfcGFja2FnZXMgPSBwYWNrYWdlcy50b192ZWMoKTsKKyAgICBpZiBjb250YWluZXIgPT0gInN5c3RlbSIgfHwgY29udGFpbmVyID09ICJ2ZW5kb3IiIHx8IGNvbnRhaW5lciA9PSAicHJvZHVjdCIgeworICAgICAgICBmb3IgcGFja2FnZSBpbiBmaWx0ZXJlZF9wYWNrYWdlcy5pdGVyX211dCgpIHsKKyAgICAgICAgICAgIHBhY2thZ2UuYm9vbGVhbl9mbGFncy5yZXRhaW4ofGJ8IHsKKyAgICAgICAgICAgICAgICAhKGIuc3RhdGUgPT0gU29tZShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQuaW50bygpKQorICAgICAgICAgICAgICAgICAgICAmJiBiLnBlcm1pc3Npb24gPT0gU29tZShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkuaW50bygpKSkKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgbGV0IG51bV9mbGFncyA9IGZpbHRlcmVkX3BhY2thZ2VzLml0ZXIoKS5tYXAofHBrZ3wgcGtnLmJvb2xlYW5fZmxhZ3MubGVuKCkgYXMgdTMyKS5zdW0oKTsKKworICAgIGxldCBtdXQgaXNfZmxhZ19ydyA9IHZlYyFbZmFsc2U7IG51bV9mbGFncyBhcyB1c2l6ZV07CisgICAgZm9yIHBrZyBpbiBmaWx0ZXJlZF9wYWNrYWdlcyB7CisgICAgICAgIGxldCBzdGFydF9pbmRleCA9IHBrZy5ib29sZWFuX3N0YXJ0X2luZGV4IGFzIHVzaXplOworICAgICAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMocGtnLnBhY2thZ2VfbmFtZSwgcGtnLmJvb2xlYW5fZmxhZ3MuaXRlcigpLmNvcGllZCgpKT87CisgICAgICAgIGZvciBwZiBpbiBwa2cuYm9vbGVhbl9mbGFncyB7CisgICAgICAgICAgICBsZXQgZmlkID0gZmxhZ19pZHMKKyAgICAgICAgICAgICAgICAuZ2V0KHBmLm5hbWUoKSkKKyAgICAgICAgICAgICAgICAub2tfb3IoYW55aG93IShmb3JtYXQhKCJtaXNzaW5nIGZsYWcgaWQgZm9yIHt9IiwgcGYubmFtZSgpKSkpPzsKKyAgICAgICAgICAgIGlzX2ZsYWdfcndbc3RhcnRfaW5kZXggKyAoKmZpZCBhcyB1c2l6ZSldID0KKyAgICAgICAgICAgICAgICBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCBtdXQgbGlzdCA9IEZsYWdJbmZvTGlzdCB7CisgICAgICAgIGhlYWRlcjogbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9mbGFncywgdmVyc2lvbiksCisgICAgICAgIG5vZGVzOiBpc19mbGFnX3J3Lml0ZXIoKS5tYXAofCZyd3wgRmxhZ0luZm9Ob2RlOjpjcmVhdGUocncpKS5jb2xsZWN0KCksCisgICAgfTsKKworICAgIC8vIGluaXRpYWxpemUgYWxsIGhlYWRlciBmaWVsZHMKKyAgICBsaXN0LmhlYWRlci5ib29sZWFuX2ZsYWdfb2Zmc2V0ID0gbGlzdC5oZWFkZXIuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKyAgICBsZXQgYnl0ZXNfcGVyX25vZGUgPSBGbGFnSW5mb05vZGU6OmNyZWF0ZShmYWxzZSkuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKyAgICBsaXN0LmhlYWRlci5maWxlX3NpemUgPSBsaXN0LmhlYWRlci5ib29sZWFuX2ZsYWdfb2Zmc2V0ICsgbnVtX2ZsYWdzICogYnl0ZXNfcGVyX25vZGU7CisKKyAgICBPayhsaXN0KQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6c3RvcmFnZTo6e2dyb3VwX2ZsYWdzX2J5X3BhY2thZ2UsIHRlc3RzOjpwYXJzZV9hbGxfdGVzdF9mbGFnc307CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpERUZBVUxUX0ZJTEVfVkVSU0lPTjsKKworICAgIHB1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdF9mcm9tX3NvdXJjZSgpIC0+IFJlc3VsdDxGbGFnSW5mb0xpc3Q+IHsKKyAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBjcmVhdGVfZmxhZ19pbmZvKCJtb2NrdXAiLCAmcGFja2FnZXMsIERFRkFVTFRfRklMRV9WRVJTSU9OKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgZmxhZyBpbmZvIGNyZWF0aW9uIGFuZCBlYWNoIGZpZWxkCisgICAgZm4gdGVzdF9saXN0X2NvbnRlbnRzKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdF9mcm9tX3NvdXJjZSgpOworICAgICAgICBhc3NlcnQhKGZsYWdfaW5mb19saXN0LmlzX29rKCkpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ19pbmZvX2xpc3QgPQorICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2luZm9fbGlzdC51bndyYXAoKSwgZXhwZWN0ZWRfZmxhZ19pbmZvX2xpc3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdGFibGUucnMKaW5kZXggYTk3MTIxMS4uYTNiNGU4ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdGFibGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdGFibGUucnMKQEAgLTE0LDE4ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotdXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOwordXNlIGNyYXRlOjpjb21tYW5kczo6e2Fzc2lnbl9mbGFnX2lkcywgc2hvdWxkX2luY2x1ZGVfZmxhZ307CiB1c2UgY3JhdGU6OnN0b3JhZ2U6OkZsYWdQYWNrYWdlOwogdXNlIGFjb25maWdfcHJvdG9zOjpQcm90b0ZsYWdQZXJtaXNzaW9uOwogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CiAgICAgZ2V0X3RhYmxlX3NpemUsIEZsYWdUYWJsZSwgRmxhZ1RhYmxlSGVhZGVyLCBGbGFnVGFibGVOb2RlLCBTdG9yYWdlRmlsZVR5cGUsIFN0b3JlZEZsYWdUeXBlLAotICAgIEZJTEVfVkVSU0lPTiwKIH07CiB1c2UgYW55aG93Ojp7YW55aG93LCBSZXN1bHR9OwogCi1mbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX2ZsYWdzOiB1MzIpIC0+IEZsYWdUYWJsZUhlYWRlciB7CitmbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX2ZsYWdzOiB1MzIsIHZlcnNpb246IHUzMikgLT4gRmxhZ1RhYmxlSGVhZGVyIHsKICAgICBGbGFnVGFibGVIZWFkZXIgewotICAgICAgICB2ZXJzaW9uOiBGSUxFX1ZFUlNJT04sCisgICAgICAgIHZlcnNpb24sCiAgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKGNvbnRhaW5lciksCiAgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwIGFzIHU4LAogICAgICAgICBmaWxlX3NpemU6IDAsCkBAIC02Myw5ICs2MiwxMyBAQAogICAgIH0KIAogICAgIGZuIGNyZWF0ZV9ub2RlcyhwYWNrYWdlOiAmRmxhZ1BhY2thZ2UsIG51bV9idWNrZXRzOiB1MzIpIC0+IFJlc3VsdDxWZWM8U2VsZj4+IHsKKyAgICAgICAgLy8gRXhjbHVkZSBzeXN0ZW0vdmVuZG9yL3Byb2R1Y3QgZmxhZ3MgdGhhdCBhcmUgUk8rZGlzYWJsZWQuCisgICAgICAgIGxldCBtdXQgZmlsdGVyZWRfcGFja2FnZSA9IHBhY2thZ2UuY2xvbmUoKTsKKyAgICAgICAgZmlsdGVyZWRfcGFja2FnZS5ib29sZWFuX2ZsYWdzLnJldGFpbih8cGZ8IHNob3VsZF9pbmNsdWRlX2ZsYWcocGYpKTsKKwogICAgICAgICBsZXQgZmxhZ19pZHMgPQotICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKHBhY2thZ2UucGFja2FnZV9uYW1lLCBwYWNrYWdlLmJvb2xlYW5fZmxhZ3MuaXRlcigpLmNvcGllZCgpKT87Ci0gICAgICAgIHBhY2thZ2UKKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhwYWNrYWdlLnBhY2thZ2VfbmFtZSwgZmlsdGVyZWRfcGFja2FnZS5ib29sZWFuX2ZsYWdzLml0ZXIoKS5jb3BpZWQoKSk/OworICAgICAgICBmaWx0ZXJlZF9wYWNrYWdlCiAgICAgICAgICAgICAuYm9vbGVhbl9mbGFncwogICAgICAgICAgICAgLml0ZXIoKQogICAgICAgICAgICAgLm1hcCh8JnBmfCB7CkBAIC04NiwxMiArODksMTYgQEAKICAgICB9CiB9CiAKLXB1YiBmbiBjcmVhdGVfZmxhZ190YWJsZShjb250YWluZXI6ICZzdHIsIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSkgLT4gUmVzdWx0PEZsYWdUYWJsZT4geworcHViIGZuIGNyZWF0ZV9mbGFnX3RhYmxlKAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBwYWNrYWdlczogJltGbGFnUGFja2FnZV0sCisgICAgdmVyc2lvbjogdTMyLAorKSAtPiBSZXN1bHQ8RmxhZ1RhYmxlPiB7CiAgICAgLy8gY3JlYXRlIHRhYmxlCiAgICAgbGV0IG51bV9mbGFncyA9IHBhY2thZ2VzLml0ZXIoKS5tYXAofHBrZ3wgcGtnLmJvb2xlYW5fZmxhZ3MubGVuKCkgYXMgdTMyKS5zdW0oKTsKICAgICBsZXQgbnVtX2J1Y2tldHMgPSBnZXRfdGFibGVfc2l6ZShudW1fZmxhZ3MpPzsKIAotICAgIGxldCBtdXQgaGVhZGVyID0gbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9mbGFncyk7CisgICAgbGV0IG11dCBoZWFkZXIgPSBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX2ZsYWdzLCB2ZXJzaW9uKTsKICAgICBsZXQgbXV0IGJ1Y2tldHMgPSB2ZWMhW05vbmU7IG51bV9idWNrZXRzIGFzIHVzaXplXTsKICAgICBsZXQgbXV0IG5vZGVfd3JhcHBlcnMgPSBwYWNrYWdlcwogICAgICAgICAuaXRlcigpCkBAIC0xMzgsMTMgKzE0NSwxNSBAQAogCiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpERUZBVUxUX0ZJTEVfVkVSU0lPTjsKKwogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OnN0b3JhZ2U6Ontncm91cF9mbGFnc19ieV9wYWNrYWdlLCB0ZXN0czo6cGFyc2VfYWxsX3Rlc3RfZmxhZ3N9OwogCiAgICAgZm4gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZV9mcm9tX3NvdXJjZSgpIC0+IFJlc3VsdDxGbGFnVGFibGU+IHsKICAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7Ci0gICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSk7Ci0gICAgICAgIGNyZWF0ZV9mbGFnX3RhYmxlKCJtb2NrdXAiLCAmcGFja2FnZXMpCisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBjcmVhdGVfZmxhZ190YWJsZSgibW9ja3VwIiwgJnBhY2thZ2VzLCBERUZBVUxUX0ZJTEVfVkVSU0lPTikKICAgICB9CiAKICAgICAjW3Rlc3RdCkBAIC0xNTIsNyArMTYxLDggQEAKICAgICBmbiB0ZXN0X3RhYmxlX2NvbnRlbnRzKCkgewogICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGVfZnJvbV9zb3VyY2UoKTsKICAgICAgICAgYXNzZXJ0IShmbGFnX3RhYmxlLmlzX29rKCkpOwotICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ190YWJsZSA9IGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX3RhYmxlID0KKyAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX3RhYmxlLnVud3JhcCgpLCBleHBlY3RlZF9mbGFnX3RhYmxlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ192YWx1ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3ZhbHVlLnJzCmluZGV4IGMxNWJhNTQuLjNjZmE0NDcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3ZhbHVlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3ZhbHVlLnJzCkBAIC0xNiwxMyArMTYsMTMgQEAKIAogdXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOwogdXNlIGNyYXRlOjpzdG9yYWdlOjpGbGFnUGFja2FnZTsKLXVzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9GbGFnU3RhdGU7Ci11c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3QsIFN0b3JhZ2VGaWxlVHlwZSwgRklMRV9WRVJTSU9OfTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0ZsYWdWYWx1ZUhlYWRlciwgRmxhZ1ZhbHVlTGlzdCwgU3RvcmFnZUZpbGVUeXBlfTsKIHVzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07CiAKLWZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fZmxhZ3M6IHUzMikgLT4gRmxhZ1ZhbHVlSGVhZGVyIHsKK2ZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fZmxhZ3M6IHUzMiwgdmVyc2lvbjogdTMyKSAtPiBGbGFnVmFsdWVIZWFkZXIgewogICAgIEZsYWdWYWx1ZUhlYWRlciB7Ci0gICAgICAgIHZlcnNpb246IEZJTEVfVkVSU0lPTiwKKyAgICAgICAgdmVyc2lvbiwKICAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKICAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgYXMgdTgsCiAgICAgICAgIGZpbGVfc2l6ZTogMCwKQEAgLTMxLDE2ICszMSwyNyBAQAogICAgIH0KIH0KIAotcHViIGZuIGNyZWF0ZV9mbGFnX3ZhbHVlKGNvbnRhaW5lcjogJnN0ciwgcGFja2FnZXM6ICZbRmxhZ1BhY2thZ2VdKSAtPiBSZXN1bHQ8RmxhZ1ZhbHVlTGlzdD4gewotICAgIC8vIGNyZWF0ZSBsaXN0Ci0gICAgbGV0IG51bV9mbGFncyA9IHBhY2thZ2VzLml0ZXIoKS5tYXAofHBrZ3wgcGtnLmJvb2xlYW5fZmxhZ3MubGVuKCkgYXMgdTMyKS5zdW0oKTsKLQorcHViIGZuIGNyZWF0ZV9mbGFnX3ZhbHVlKAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBwYWNrYWdlczogJltGbGFnUGFja2FnZV0sCisgICAgdmVyc2lvbjogdTMyLAorKSAtPiBSZXN1bHQ8RmxhZ1ZhbHVlTGlzdD4geworICAgIC8vIEV4Y2x1ZGUgc3lzdGVtL3ZlbmRvci9wcm9kdWN0IGZsYWdzIHRoYXQgYXJlIFJPK2Rpc2FibGVkLgorICAgIGxldCBtdXQgZmlsdGVyZWRfcGFja2FnZXMgPSBwYWNrYWdlcy50b192ZWMoKTsKKyAgICBpZiBjb250YWluZXIgPT0gInN5c3RlbSIgfHwgY29udGFpbmVyID09ICJ2ZW5kb3IiIHx8IGNvbnRhaW5lciA9PSAicHJvZHVjdCIgeworICAgICAgICBmb3IgcGFja2FnZSBpbiBmaWx0ZXJlZF9wYWNrYWdlcy5pdGVyX211dCgpIHsKKyAgICAgICAgICAgIHBhY2thZ2UuYm9vbGVhbl9mbGFncy5yZXRhaW4ofGJ8IHsKKyAgICAgICAgICAgICAgICAhKGIuc3RhdGUgPT0gU29tZShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQuaW50bygpKQorICAgICAgICAgICAgICAgICAgICAmJiBiLnBlcm1pc3Npb24gPT0gU29tZShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkuaW50bygpKSkKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorICAgIGxldCBudW1fZmxhZ3MgPSBmaWx0ZXJlZF9wYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMikuc3VtKCk7CiAgICAgbGV0IG11dCBsaXN0ID0gRmxhZ1ZhbHVlTGlzdCB7Ci0gICAgICAgIGhlYWRlcjogbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9mbGFncyksCisgICAgICAgIGhlYWRlcjogbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9mbGFncywgdmVyc2lvbiksCiAgICAgICAgIGJvb2xlYW5zOiB2ZWMhW2ZhbHNlOyBudW1fZmxhZ3MgYXMgdXNpemVdLAogICAgIH07Ci0KLSAgICBmb3IgcGtnIGluIHBhY2thZ2VzLml0ZXIoKSB7CisgICAgZm9yIHBrZyBpbiBmaWx0ZXJlZF9wYWNrYWdlcyB7CiAgICAgICAgIGxldCBzdGFydF9pbmRleCA9IHBrZy5ib29sZWFuX3N0YXJ0X2luZGV4IGFzIHVzaXplOwogICAgICAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMocGtnLnBhY2thZ2VfbmFtZSwgcGtnLmJvb2xlYW5fZmxhZ3MuaXRlcigpLmNvcGllZCgpKT87CiAgICAgICAgIGZvciBwZiBpbiBwa2cuYm9vbGVhbl9mbGFncy5pdGVyKCkgewpAQCAtNjEsMTMgKzcyLDE1IEBACiAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkRFRkFVTFRfRklMRV9WRVJTSU9OOworCiAgICAgdXNlIHN1cGVyOjoqOwogICAgIHVzZSBjcmF0ZTo6c3RvcmFnZTo6e2dyb3VwX2ZsYWdzX2J5X3BhY2thZ2UsIHRlc3RzOjpwYXJzZV9hbGxfdGVzdF9mbGFnc307CiAKICAgICBwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0X2Zyb21fc291cmNlKCkgLT4gUmVzdWx0PEZsYWdWYWx1ZUxpc3Q+IHsKICAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7Ci0gICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSk7Ci0gICAgICAgIGNyZWF0ZV9mbGFnX3ZhbHVlKCJtb2NrdXAiLCAmcGFja2FnZXMpCisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBjcmVhdGVfZmxhZ192YWx1ZSgibW9ja3VwIiwgJnBhY2thZ2VzLCBERUZBVUxUX0ZJTEVfVkVSU0lPTikKICAgICB9CiAKICAgICAjW3Rlc3RdCkBAIC03Niw3ICs4OSw3IEBACiAgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3RfZnJvbV9zb3VyY2UoKTsKICAgICAgICAgYXNzZXJ0IShmbGFnX3ZhbHVlX2xpc3QuaXNfb2soKSk7CiAgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX3ZhbHVlX2xpc3QgPQotICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAgICAgICAgIGFzc2VydF9lcSEoZmxhZ192YWx1ZV9saXN0LnVud3JhcCgpLCBleHBlY3RlZF9mbGFnX3ZhbHVlX2xpc3QpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9tb2QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvbW9kLnJzCmluZGV4IDczMzM5ZjIuLjYxZTY1ZDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9tb2QucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL21vZC5ycwpAQCAtMTQsMjMgKzE0LDI3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwdWIgbW9kIGZsYWdfaW5mbzsKIHB1YiBtb2QgZmxhZ190YWJsZTsKIHB1YiBtb2QgZmxhZ192YWx1ZTsKIHB1YiBtb2QgcGFja2FnZV90YWJsZTsKIAotdXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKK3VzZSBhbnlob3c6OlJlc3VsdDsKIHVzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7SGFzaE1hcCwgSGFzaFNldH07CiAKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6OmNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQ7CiB1c2UgY3JhdGU6OnN0b3JhZ2U6OnsKLSAgICBmbGFnX3RhYmxlOjpjcmVhdGVfZmxhZ190YWJsZSwgZmxhZ192YWx1ZTo6Y3JlYXRlX2ZsYWdfdmFsdWUsCisgICAgZmxhZ19pbmZvOjpjcmVhdGVfZmxhZ19pbmZvLCBmbGFnX3RhYmxlOjpjcmVhdGVfZmxhZ190YWJsZSwgZmxhZ192YWx1ZTo6Y3JlYXRlX2ZsYWdfdmFsdWUsCiAgICAgcGFja2FnZV90YWJsZTo6Y3JlYXRlX3BhY2thZ2VfdGFibGUsCiB9OwotdXNlIGFjb25maWdfcHJvdG9zOjp7UHJvdG9QYXJzZWRGbGFnLCBQcm90b1BhcnNlZEZsYWdzfTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlLCBQcm90b1BhcnNlZEZsYWcsIFByb3RvUGFyc2VkRmxhZ3N9OwogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpTdG9yYWdlRmlsZVR5cGU7CiAKKyNbZGVyaXZlKENsb25lKV0KIHB1YiBzdHJ1Y3QgRmxhZ1BhY2thZ2U8J2E+IHsKICAgICBwdWIgcGFja2FnZV9uYW1lOiAmJ2Egc3RyLAogICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgcHViIGZpbmdlcnByaW50OiB1NjQsCiAgICAgcHViIGZsYWdfbmFtZXM6IEhhc2hTZXQ8JidhIHN0cj4sCiAgICAgcHViIGJvb2xlYW5fZmxhZ3M6IFZlYzwmJ2EgUHJvdG9QYXJzZWRGbGFnPiwKICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJvb2xlYW4gZmxhZyBpbiB0aGlzIGFjb25maWcgcGFja2FnZSBhbW9uZyBhbGwgYm9vbGVhbgpAQCAtNDMsNiArNDcsNyBAQAogICAgICAgICBGbGFnUGFja2FnZSB7CiAgICAgICAgICAgICBwYWNrYWdlX25hbWUsCiAgICAgICAgICAgICBwYWNrYWdlX2lkLAorICAgICAgICAgICAgZmluZ2VycHJpbnQ6IDAsCiAgICAgICAgICAgICBmbGFnX25hbWVzOiBIYXNoU2V0OjpuZXcoKSwKICAgICAgICAgICAgIGJvb2xlYW5fZmxhZ3M6IHZlYyFbXSwKICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsCkBAIC01Niw3ICs2MSw3IEBACiAgICAgfQogfQogCi1wdWIgZm4gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZTwnYSwgST4ocGFyc2VkX2ZsYWdzX3ZlY19pdGVyOiBJKSAtPiBWZWM8RmxhZ1BhY2thZ2U8J2E+PgorcHViIGZuIGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2U8J2EsIEk+KHBhcnNlZF9mbGFnc192ZWNfaXRlcjogSSwgdmVyc2lvbjogdTMyKSAtPiBWZWM8RmxhZ1BhY2thZ2U8J2E+Pgogd2hlcmUKICAgICBJOiBJdGVyYXRvcjxJdGVtID0gJidhIFByb3RvUGFyc2VkRmxhZ3M+LAogewpAQCAtNjksMTUgKzc0LDMzIEBACiAgICAgICAgICAgICBpZiBpbmRleCA9PSBwYWNrYWdlcy5sZW4oKSB7CiAgICAgICAgICAgICAgICAgcGFja2FnZXMucHVzaChGbGFnUGFja2FnZTo6bmV3KHBhcnNlZF9mbGFnLnBhY2thZ2UoKSwgaW5kZXggYXMgdTMyKSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc3lzdGVtL3ZlbmRvci9wcm9kdWN0IGZsYWdzIHRoYXQgYXJlIFJPK2Rpc2FibGVkLgorICAgICAgICAgICAgaWYgKHBhcnNlZF9mbGFnLmNvbnRhaW5lciA9PSBTb21lKCJzeXN0ZW0iLnRvX3N0cmluZygpKQorICAgICAgICAgICAgICAgIHx8IHBhcnNlZF9mbGFnLmNvbnRhaW5lciA9PSBTb21lKCJ2ZW5kb3IiLnRvX3N0cmluZygpKQorICAgICAgICAgICAgICAgIHx8IHBhcnNlZF9mbGFnLmNvbnRhaW5lciA9PSBTb21lKCJwcm9kdWN0Ii50b19zdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgJiYgcGFyc2VkX2ZsYWcucGVybWlzc2lvbiA9PSBTb21lKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWS5pbnRvKCkpCisgICAgICAgICAgICAgICAgJiYgcGFyc2VkX2ZsYWcuc3RhdGUgPT0gU29tZShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQuaW50bygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwYWNrYWdlc1tpbmRleF0uaW5zZXJ0KHBhcnNlZF9mbGFnKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGNhY2x1YXRlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleCBmb3IgZWFjaCBwYWNrYWdlCisgICAgLy8gQ2FsY3VsYXRlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleCBmb3IgZWFjaCBwYWNrYWdlCiAgICAgbGV0IG11dCBib29sZWFuX3N0YXJ0X2luZGV4ID0gMDsKICAgICBmb3IgcCBpbiBwYWNrYWdlcy5pdGVyX211dCgpIHsKICAgICAgICAgcC5ib29sZWFuX3N0YXJ0X2luZGV4ID0gYm9vbGVhbl9zdGFydF9pbmRleDsKICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleCArPSBwLmJvb2xlYW5fZmxhZ3MubGVuKCkgYXMgdTMyOworCisgICAgICAgIGlmIHZlcnNpb24gPj0gMiB7CisgICAgICAgICAgICBsZXQgbXV0IGZsYWdfbmFtZXNfdmVjID0KKyAgICAgICAgICAgICAgICBwLmZsYWdfbmFtZXMuY2xvbmUoKS5pbnRvX2l0ZXIoKS5tYXAoU3RyaW5nOjpmcm9tKS5jb2xsZWN0Ojo8VmVjPF8+PigpOworICAgICAgICAgICAgbGV0IGZpbmdlcnByaW50ID0gY29tcHV0ZV9mbGFnc19maW5nZXJwcmludCgmbXV0IGZsYWdfbmFtZXNfdmVjKTsKKyAgICAgICAgICAgIHAuZmluZ2VycHJpbnQgPSBmaW5nZXJwcmludDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHBhY2thZ2VzCkBAIC04NywzMSArMTEwLDM3IEBACiAgICAgY29udGFpbmVyOiAmc3RyLAogICAgIHBhcnNlZF9mbGFnc192ZWNfaXRlcjogSSwKICAgICBmaWxlOiAmU3RvcmFnZUZpbGVUeXBlLAorICAgIHZlcnNpb246IHUzMiwKICkgLT4gUmVzdWx0PFZlYzx1OD4+CiB3aGVyZQogICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSAmJ2EgUHJvdG9QYXJzZWRGbGFncz4sCiB7Ci0gICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShwYXJzZWRfZmxhZ3NfdmVjX2l0ZXIpOworICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UocGFyc2VkX2ZsYWdzX3ZlY19pdGVyLCB2ZXJzaW9uKTsKIAogICAgIG1hdGNoIGZpbGUgewogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4gewotICAgICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfcGFja2FnZV90YWJsZShjb250YWluZXIsICZwYWNrYWdlcyk/OworICAgICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfcGFja2FnZV90YWJsZShjb250YWluZXIsICZwYWNrYWdlcywgdmVyc2lvbik/OwogICAgICAgICAgICAgT2socGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCkpCiAgICAgICAgIH0KICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwID0+IHsKLSAgICAgICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX2ZsYWdfdGFibGUoY29udGFpbmVyLCAmcGFja2FnZXMpPzsKKyAgICAgICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX2ZsYWdfdGFibGUoY29udGFpbmVyLCAmcGFja2FnZXMsIHZlcnNpb24pPzsKICAgICAgICAgICAgIE9rKGZsYWdfdGFibGUuaW50b19ieXRlcygpKQogICAgICAgICB9CiAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCA9PiB7Ci0gICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGNyZWF0ZV9mbGFnX3ZhbHVlKGNvbnRhaW5lciwgJnBhY2thZ2VzKT87CisgICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGNyZWF0ZV9mbGFnX3ZhbHVlKGNvbnRhaW5lciwgJnBhY2thZ2VzLCB2ZXJzaW9uKT87CiAgICAgICAgICAgICBPayhmbGFnX3ZhbHVlLmludG9fYnl0ZXMoKSkKICAgICAgICAgfQotICAgICAgICBfID0+IEVycihhbnlob3chKCJhY29uZmlnIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNyZWF0aW9uIG9mIHRoaXMgc3RvcmFnZSBmaWxlIHR5cGUiKSksCisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gPT4geworICAgICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IGNyZWF0ZV9mbGFnX2luZm8oY29udGFpbmVyLCAmcGFja2FnZXMsIHZlcnNpb24pPzsKKyAgICAgICAgICAgIE9rKGZsYWdfaW5mby5pbnRvX2J5dGVzKCkpCisgICAgICAgIH0KICAgICB9CiB9CiAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkRFRkFVTFRfRklMRV9WRVJTSU9OOworCiAgICAgdXNlIHN1cGVyOjoqOwogICAgIHVzZSBjcmF0ZTo6SW5wdXQ7CiAKQEAgLTE1NCw2ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyh2YWx1ZV9jb250ZW50KSwKICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQpAQCAtMTY0LDcgKzE5NCw3IEBACiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZmxhZ19wYWNrYWdlKCkgewogICAgICAgICBsZXQgY2FjaGVzID0gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKTsKLSAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpKTsKKyAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpLCBERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAKICAgICAgICAgZm9yIHBrZyBpbiBwYWNrYWdlcy5pdGVyKCkgewogICAgICAgICAgICAgbGV0IHBrZ19uYW1lID0gcGtnLnBhY2thZ2VfbmFtZTsKQEAgLTE4NCw2ICsyMTQsNyBAQAogICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImRpc2FibGVkX3J3IikpOwogICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uYm9vbGVhbl9zdGFydF9pbmRleCwgMCk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uZmluZ2VycHJpbnQsIDApOwogCiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLnBhY2thZ2VfaWQsIDEpOwpAQCAtMTkyLDYgKzIyMyw3IEBACiAgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZGlzYWJsZWRfcnciKSk7CiAgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5ib29sZWFuX3N0YXJ0X2luZGV4LCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5maW5nZXJwcmludCwgMCk7CiAKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5wYWNrYWdlX25hbWUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9pZCwgMik7CkBAIC0xOTksNSArMjMxLDQ5IEBACiAgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ydyIpKTsKICAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1syXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX2ZpeGVkX3JvIikpOwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmJvb2xlYW5fc3RhcnRfaW5kZXgsIDYpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmZpbmdlcnByaW50LCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9mbGFnX3BhY2thZ2Vfd2l0aF9maW5nZXJwcmludCgpIHsKKyAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgMik7CisKKyAgICAgICAgZm9yIHBrZyBpbiBwYWNrYWdlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHBrZ19uYW1lID0gcGtnLnBhY2thZ2VfbmFtZTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEocGtnLmZsYWdfbmFtZXMubGVuKCksIHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpKTsKKyAgICAgICAgICAgIGZvciBwZiBpbiBwa2cuYm9vbGVhbl9mbGFncy5pdGVyKCkgeworICAgICAgICAgICAgICAgIGFzc2VydCEocGtnLmZsYWdfbmFtZXMuY29udGFpbnMocGYubmFtZSgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0X2VxIShwZi5wYWNrYWdlKCksIHBrZ19uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXMubGVuKCksIDMpOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLnBhY2thZ2VfaWQsIDApOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMubGVuKCksIDMpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMF0uZmxhZ19uYW1lcy5jb250YWlucygiZGlzYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMF0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5ib29sZWFuX3N0YXJ0X2luZGV4LCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5maW5nZXJwcmludCwgMTUyNDg5NDg1MTA1OTAxNTgwODZ1NjQpOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLnBhY2thZ2VfaWQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMubGVuKCksIDMpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZGlzYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5ib29sZWFuX3N0YXJ0X2luZGV4LCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5maW5nZXJwcmludCwgNDQzMTk0MDUwMjI3NDg1Nzk2NHU2NCk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5wYWNrYWdlX25hbWUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9pZCwgMik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5sZW4oKSwgMik7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ydyIpKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1syXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX2ZpeGVkX3JvIikpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmJvb2xlYW5fc3RhcnRfaW5kZXgsIDYpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmZpbmdlcnByaW50LCAxNjIzMzIyOTkxNzcxMTYyMjM3NXU2NCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL3BhY2thZ2VfdGFibGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvcGFja2FnZV90YWJsZS5ycwppbmRleCBjNTM2MDJmLi41M2RhYTdmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvcGFja2FnZV90YWJsZS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvcGFja2FnZV90YWJsZS5ycwpAQCAtMTgsMTQgKzE4LDEzIEBACiAKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewogICAgIGdldF90YWJsZV9zaXplLCBQYWNrYWdlVGFibGUsIFBhY2thZ2VUYWJsZUhlYWRlciwgUGFja2FnZVRhYmxlTm9kZSwgU3RvcmFnZUZpbGVUeXBlLAotICAgIEZJTEVfVkVSU0lPTiwKIH07CiAKIHVzZSBjcmF0ZTo6c3RvcmFnZTo6RmxhZ1BhY2thZ2U7CiAKLWZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fcGFja2FnZXM6IHUzMikgLT4gUGFja2FnZVRhYmxlSGVhZGVyIHsKK2ZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fcGFja2FnZXM6IHUzMiwgdmVyc2lvbjogdTMyKSAtPiBQYWNrYWdlVGFibGVIZWFkZXIgewogICAgIFBhY2thZ2VUYWJsZUhlYWRlciB7Ci0gICAgICAgIHZlcnNpb246IEZJTEVfVkVSU0lPTiwKKyAgICAgICAgdmVyc2lvbiwKICAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKICAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgYXMgdTgsCiAgICAgICAgIGZpbGVfc2l6ZTogMCwKQEAgLTQ4LDYgKzQ3LDcgQEAKICAgICAgICAgbGV0IG5vZGUgPSBQYWNrYWdlVGFibGVOb2RlIHsKICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKHBhY2thZ2UucGFja2FnZV9uYW1lKSwKICAgICAgICAgICAgIHBhY2thZ2VfaWQ6IHBhY2thZ2UucGFja2FnZV9pZCwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiBwYWNrYWdlLmZpbmdlcnByaW50LAogICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogcGFja2FnZS5ib29sZWFuX3N0YXJ0X2luZGV4LAogICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IE5vbmUsCiAgICAgICAgIH07CkBAIC01NiwyMCArNTYsMjYgQEAKICAgICB9CiB9CiAKLXB1YiBmbiBjcmVhdGVfcGFja2FnZV90YWJsZShjb250YWluZXI6ICZzdHIsIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSkgLT4gUmVzdWx0PFBhY2thZ2VUYWJsZT4geworcHViIGZuIGNyZWF0ZV9wYWNrYWdlX3RhYmxlKAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBwYWNrYWdlczogJltGbGFnUGFja2FnZV0sCisgICAgdmVyc2lvbjogdTMyLAorKSAtPiBSZXN1bHQ8UGFja2FnZVRhYmxlPiB7CiAgICAgLy8gY3JlYXRlIHRhYmxlCiAgICAgbGV0IG51bV9wYWNrYWdlcyA9IHBhY2thZ2VzLmxlbigpIGFzIHUzMjsKICAgICBsZXQgbnVtX2J1Y2tldHMgPSBnZXRfdGFibGVfc2l6ZShudW1fcGFja2FnZXMpPzsKLSAgICBsZXQgbXV0IGhlYWRlciA9IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fcGFja2FnZXMpOworICAgIGxldCBtdXQgaGVhZGVyID0gbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9wYWNrYWdlcywgdmVyc2lvbik7CiAgICAgbGV0IG11dCBidWNrZXRzID0gdmVjIVtOb25lOyBudW1fYnVja2V0cyBhcyB1c2l6ZV07Ci0gICAgbGV0IG11dCBub2RlX3dyYXBwZXJzOiBWZWM8Xz4gPQotICAgICAgICBwYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IFBhY2thZ2VUYWJsZU5vZGVXcmFwcGVyOjpuZXcocGtnLCBudW1fYnVja2V0cykpLmNvbGxlY3QoKTsKKyAgICBsZXQgbXV0IG5vZGVfd3JhcHBlcnM6IFZlYzxfPiA9IHBhY2thZ2VzCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8cGtnOiAmRmxhZ1BhY2thZ2U8J18+fCBQYWNrYWdlVGFibGVOb2RlV3JhcHBlcjo6bmV3KHBrZywgbnVtX2J1Y2tldHMpKQorICAgICAgICAuY29sbGVjdCgpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBhbGwgaGVhZGVyIGZpZWxkcwogICAgIGhlYWRlci5idWNrZXRfb2Zmc2V0ID0gaGVhZGVyLmludG9fYnl0ZXMoKS5sZW4oKSBhcyB1MzI7CiAgICAgaGVhZGVyLm5vZGVfb2Zmc2V0ID0gaGVhZGVyLmJ1Y2tldF9vZmZzZXQgKyBudW1fYnVja2V0cyAqIDQ7CiAgICAgaGVhZGVyLmZpbGVfc2l6ZSA9IGhlYWRlci5ub2RlX29mZnNldAotICAgICAgICArIG5vZGVfd3JhcHBlcnMuaXRlcigpLm1hcCh8eHwgeC5ub2RlLmludG9fYnl0ZXMoKS5sZW4oKSkuc3VtOjo8dXNpemU+KCkgYXMgdTMyOworICAgICAgICArIG5vZGVfd3JhcHBlcnMuaXRlcigpLm1hcCh8eHwgeC5ub2RlLmludG9fYnl0ZXModmVyc2lvbikubGVuKCkpLnN1bTo6PHVzaXplPigpIGFzIHUzMjsKIAogICAgIC8vIHNvcnQgbm9kZV93cmFwcGVycyBieSBidWNrZXQgaW5kZXggZm9yIGVmZmljaWVuY3kKICAgICBub2RlX3dyYXBwZXJzLnNvcnRfYnkofGEsIGJ8IGEuYnVja2V0X2luZGV4LmNtcCgmYi5idWNrZXRfaW5kZXgpKTsKQEAgLTg3LDcgKzkzLDcgQEAKICAgICAgICAgaWYgYnVja2V0c1tub2RlX2J1Y2tldF9pZHggYXMgdXNpemVdLmlzX25vbmUoKSB7CiAgICAgICAgICAgICBidWNrZXRzW25vZGVfYnVja2V0X2lkeCBhcyB1c2l6ZV0gPSBTb21lKG9mZnNldCk7CiAgICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IG5vZGVfd3JhcHBlcnNbaV0ubm9kZS5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOworICAgICAgICBvZmZzZXQgKz0gbm9kZV93cmFwcGVyc1tpXS5ub2RlLmludG9fYnl0ZXModmVyc2lvbikubGVuKCkgYXMgdTMyOwogCiAgICAgICAgIGlmIGxldCBTb21lKGluZGV4KSA9IG5leHRfbm9kZV9idWNrZXRfaWR4IHsKICAgICAgICAgICAgIGlmIGluZGV4ID09IG5vZGVfYnVja2V0X2lkeCB7CkBAIC0xMDYsMjEgKzExMiw1OSBAQAogCiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7REVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OfTsKKwogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OnN0b3JhZ2U6Ontncm91cF9mbGFnc19ieV9wYWNrYWdlLCB0ZXN0czo6cGFyc2VfYWxsX3Rlc3RfZmxhZ3N9OwogCi0gICAgcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGVfZnJvbV9zb3VyY2UoKSAtPiBSZXN1bHQ8UGFja2FnZVRhYmxlPiB7CisgICAgcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGVfZnJvbV9zb3VyY2UodmVyc2lvbjogdTMyKSAtPiBSZXN1bHQ8UGFja2FnZVRhYmxlPiB7CiAgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOwotICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCkpOwotICAgICAgICBjcmVhdGVfcGFja2FnZV90YWJsZSgibW9ja3VwIiwgJnBhY2thZ2VzKQorICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIHZlcnNpb24pOworICAgICAgICBjcmVhdGVfcGFja2FnZV90YWJsZSgibW9ja3VwIiwgJnBhY2thZ2VzLCB2ZXJzaW9uKQogICAgIH0KIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgdGFibGUgY3JlYXRpb24gYW5kIGVhY2ggZmllbGQKLSAgICBmbiB0ZXN0X3RhYmxlX2NvbnRlbnRzKCkgewotICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGVfZnJvbV9zb3VyY2UoKTsKLSAgICAgICAgYXNzZXJ0IShwYWNrYWdlX3RhYmxlLmlzX29rKCkpOwotICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV90YWJsZSA9IGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCk7Ci0gICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZS51bndyYXAoKSwgZXhwZWN0ZWRfcGFja2FnZV90YWJsZSk7CisgICAgZm4gdGVzdF90YWJsZV9jb250ZW50c19kZWZhdWx0X3ZlcnNpb24oKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX3Jlc3VsdCA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGVfZnJvbV9zb3VyY2UoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VfdGFibGVfcmVzdWx0LmlzX29rKCkpOworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IHBhY2thZ2VfdGFibGVfcmVzdWx0LnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX3RhYmxlID0KKyAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfdGFibGUuaGVhZGVyLCBleHBlY3RlZF9wYWNrYWdlX3RhYmxlLmhlYWRlcik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZS5idWNrZXRzLCBleHBlY3RlZF9wYWNrYWdlX3RhYmxlLmJ1Y2tldHMpOworICAgICAgICBmb3IgKG5vZGUsIGV4cGVjdGVkX25vZGUpIGluCisgICAgICAgICAgICBwYWNrYWdlX3RhYmxlLm5vZGVzLml0ZXIoKS56aXAoZXhwZWN0ZWRfcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5wYWNrYWdlX25hbWUsIGV4cGVjdGVkX25vZGUucGFja2FnZV9uYW1lKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5wYWNrYWdlX2lkLCBleHBlY3RlZF9ub2RlLnBhY2thZ2VfaWQpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgsIGV4cGVjdGVkX25vZGUuYm9vbGVhbl9zdGFydF9pbmRleCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUubmV4dF9vZmZzZXQsIGV4cGVjdGVkX25vZGUubmV4dF9vZmZzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBjcmVhdGlvbiBhbmQgZWFjaCBmaWVsZAorICAgIGZuIHRlc3RfdGFibGVfY29udGVudHNfbWF4X3ZlcnNpb24oKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX3Jlc3VsdCA9CisgICAgICAgICAgICBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlX3RhYmxlX3Jlc3VsdC5pc19vaygpKTsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBwYWNrYWdlX3RhYmxlX3Jlc3VsdC51bndyYXAoKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV90YWJsZSA9CisgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX3RhYmxlLmhlYWRlciwgZXhwZWN0ZWRfcGFja2FnZV90YWJsZS5oZWFkZXIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfdGFibGUuYnVja2V0cywgZXhwZWN0ZWRfcGFja2FnZV90YWJsZS5idWNrZXRzKTsKKyAgICAgICAgZm9yIChub2RlLCBleHBlY3RlZF9ub2RlKSBpbgorICAgICAgICAgICAgcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkuemlwKGV4cGVjdGVkX3BhY2thZ2VfdGFibGUubm9kZXMuaXRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUucGFja2FnZV9uYW1lLCBleHBlY3RlZF9ub2RlLnBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUucGFja2FnZV9pZCwgZXhwZWN0ZWRfbm9kZS5wYWNrYWdlX2lkKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4LCBleHBlY3RlZF9ub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLm5leHRfb2Zmc2V0LCBleHBlY3RlZF9ub2RlLm5leHRfb2Zmc2V0KTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvdGVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvdGVzdC5ycwppbmRleCA3NDA5Y2RhLi4xMGRhMjUyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3Rlc3QucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy90ZXN0LnJzCkBAIC0yNjYsNiArMjY2LDcgQEAKICAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9yZWFkX29ubHlfdGVzdC52YWx1ZXMiKS5hc19zbGljZSgpKSwKICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQpAQCAtMjkwLDYgKzI5MSwyNiBAQAogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBdLAogICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQorICAgIH0KKworICAgIHB1YiBmbiBwYXJzZV9zZWNvbmRfcGFja2FnZV9mbGFncygpIC0+IFByb3RvUGFyc2VkRmxhZ3MgeworICAgICAgICBsZXQgYnl0ZXMgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc2Vjb25kX3Rlc3QiLAorICAgICAgICAgICAgU29tZSgic3lzdGVtIiksCisgICAgICAgICAgICB2ZWMhW0lucHV0IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWciLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoaW5jbHVkZV9ieXRlcyEoIi4uL3Rlc3RzL3Rlc3Rfc2Vjb25kX3BhY2thZ2UuYWNvbmZpZyIpLmFzX3NsaWNlKCkpLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgICB2ZWMhW0lucHV0IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6ICJ0ZXN0cy90aGlyZC52YWx1ZXMiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoaW5jbHVkZV9ieXRlcyEoIi4uL3Rlc3RzL3RoaXJkLnZhbHVlcyIpLmFzX3NsaWNlKCkpLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6OkRFRkFVTFRfRkxBR19QRVJNSVNTSU9OLAorICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgKQogICAgICAgICAudW53cmFwKCk7CiAgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYnl0ZXMpLnVud3JhcCgpCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZQppbmRleCAzOGM4ZjEzLi5kMjc5OWIyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUKQEAgLTE5LDQgKzE5LDQgQEAKIHt7IC1lbmRpZiB9fQogICAgIGJvb2xlYW4ge2l0ZW0ubWV0aG9kX25hbWV9KCk7CiB7eyAtZW5kZm9yIH19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQppbmRleCBjZDJlM2RiLi44YjNkM2UxIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpAQCAtMSw3NiArMSwxMzEgQEAKIHBhY2thZ2Uge3BhY2thZ2VfbmFtZX07CiB7eyAtaWYgbm90IGlzX3Rlc3RfbW9kZSB9fQote3sgaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQtIH19Cit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Cit7eyBpZiBub3QgbGlicmFyeV9leHBvcnRlZC0gfX17Iy0gb25seSBuZXcgc3RvcmFnZSBmb3IgcHJvZCBtb2RlICN9CiAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Ci17eyAtZW5kaWYgfX0KLQoge3sgLWlmIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkIH19Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKLQotCi17eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Ci1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK3t7IGlmIGlzX3BsYXRmb3JtX2NvbnRhaW5lciB9fQoraW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsOwore3sgLWVsc2UgfX0KK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLkFjb25maWdQYWNrYWdlSW50ZXJuYWw7CiB7eyAtZW5kaWYgfX0KLQoraW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiB7eyAtZW5kaWYgfX0KIC8qKiBAaGlkZSAqLwogcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKIHt7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQote3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IGZhbHNlOwote3sgLWVuZGZvci0gfX0KLQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAie3BhY2thZ2VfbmFtZX0uRmVhdHVyZUZsYWdzSW1wbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpc0NhY2hlZCA9IGZhbHNlOwoge3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQote3stIGlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07CiB7eyAtZW5kaWYgfX0KIHt7IC1lbmRmb3IgfX0KLXt7IC1pZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KLSAgICBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgcmVhZGVyOwotICAgIGJvb2xlYW4gcmVhZEZyb21OZXdTdG9yYWdlOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJBY29uZmlnSmF2YUNvZGVnZW4iOwotCi0gICAgcHVibGljIEZlYXR1cmVGbGFnc0ltcGwoKSBcewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiKTsKLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIFx7Ci0gICAgICAgICAgICByZWFkRnJvbU5ld1N0b3JhZ2UgPSB0cnVlOwotICAgICAgICAgICAgcmVhZGVyID0gbmV3IFN0b3JhZ2VJbnRlcm5hbFJlYWRlcigie2NvbnRhaW5lcn0iLCAie3BhY2thZ2VfbmFtZX0iKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7CisgICAgICAgIHRyeSBcewore3sgaWYgaXNfcGxhdGZvcm1fY29udGFpbmVyIH19CisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgcmVhZGVyID0gUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoIntjb250YWluZXJ9IiwgIntwYWNrYWdlX25hbWV9Iiwge3BhY2thZ2VfZmluZ2VycHJpbnR9KTsKK3t7IC1lbHNlIH19CisgICAgICAgICAgICBBY29uZmlnUGFja2FnZUludGVybmFsIHJlYWRlciA9IEFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgie2NvbnRhaW5lcn0iLCAie3BhY2thZ2VfbmFtZX0iLCB7cGFja2FnZV9maW5nZXJwcmludH0pOwoge3sgLWVuZGlmIH19CisgICAgICAgIHt7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgICAgIHt7IC1mb3IgZmxhZyBpbiBuYW1lc3BhY2Vfd2l0aF9mbGFncy5mbGFncyB9fQorICAgICAgICB7eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisgICAgICAgICAgICB7ZmxhZy5tZXRob2RfbmFtZX0gPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSh7ZmxhZy5mbGFnX29mZnNldH0pOworICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICB7eyAtZW5kZm9yIH19CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSBceworICAgICAgICAgICAgLy8gZm9yIG1haW5saW5lIG1vZHVsZSBydW5uaW5nIG9uIG9sZGVyIGRldmljZXMuCisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZXBsYWNlcyB0byB2ZXJzaW9uIGNoZWNrLCBhZnRlciB0aGUgdmVyc2lvbiBidW1wLgorICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlzQ2FjaGVkID0gdHJ1ZTsKKyAgICB9Cit7eyAtZW5kaWYgfX17Iy0gZW5kIG9mIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkICN9Cit7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQorICAgIEBPdmVycmlkZQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7Cit7eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisgICAgICAgIGlmICghaXNDYWNoZWQpIFx7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHtmbGFnLm1ldGhvZF9uYW1lfTsKK3t7IC1lbHNlIH19CisgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRpZiB9fQorICAgIH0KK3t7IGVuZGZvciB9fQorfQore3sgLWVsc2UtIH19eyMtIGRldmljZSBjb25maWcgZm9yIGV4cHJvdGVkIG1vZGUgI30KK3t7IC1pZiBuZXdfZXhwb3J0ZWQgfX0KK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLkFjb25maWdQYWNrYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJ7cGFja2FnZV9uYW1lfS5GZWF0dXJlRmxhZ3NJbXBsX2V4cG9ydGVkIjsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGlzQ2FjaGVkID0gZmFsc2U7Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0gPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRmb3IgfX0KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgQWNvbmZpZ1BhY2thZ2UgcmVhZGVyID0gQWNvbmZpZ1BhY2thZ2UubG9hZCgie3BhY2thZ2VfbmFtZX0iKTsKKyAgICAgICAgICAgIHt7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgICAgICAgICB7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJ7ZmxhZy5mbGFnX25hbWV9Iiwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOworICAgICAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgXHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgXHsKKyAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVwbGFjZXMgdG8gdmVyc2lvbiBjaGVjaywgYWZ0ZXIgdGhlIHZlcnNpb24gYnVtcC4KKyAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpc0NhY2hlZCA9IHRydWU7CisgICAgfQore3sgLWZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBceworICAgICAgICBpZiAoIWlzQ2FjaGVkKSBceworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07CisgICAgfQore3sgZW5kZm9yIH19Cit9Cit7eyBlbHNlIH19CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKKy8qKiBAaGlkZSAqLworcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKK3t7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiB7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfV9pc19jYWNoZWQgPSBmYWxzZTsKK3t7IC1lbmRmb3ItIH19Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19Cit7eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0gPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQoge3sgZm9yIG5hbWVzcGFjZV93aXRoX2ZsYWdzIGluIG5hbWVzcGFjZV9mbGFncyB9fQogICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc197bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfSgpIFx7CisgICAgICAgIGZpbmFsIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IFx7Ci17eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Ci0gICAgICAgICAgICBib29sZWFuIHZhbDsKLXt7IC1lbmRpZiB9fQogICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIntuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9Iik7CiB7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KIHt7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KICAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9CiAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfe2ZsYWcuZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0sIHtmbGFnLmRlZmF1bHRfdmFsdWV9KTsKLXt7IC1pZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KLSAgICAgICAgICAgIGlmIChyZWFkRnJvbU5ld1N0b3JhZ2UpIFx7Ci0gICAgICAgICAgICAgICAgdHJ5IFx7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKHtmbGFnLmZsYWdfb2Zmc2V0fSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0ge2ZsYWcubWV0aG9kX25hbWV9KSBcewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic3VjY2Vzczoge2ZsYWcubWV0aG9kX25hbWV9IHZhbHVlIG1hdGNoZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIFx7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiB7ZmxhZy5tZXRob2RfbmFtZX0gdmFsdWUgbWlzbWF0Y2gsIG5ldyBzdG9yYWdlIHZhbHVlIGlzICVzLCBvbGQgc3RvcmFnZSB2YWx1ZSBpcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCB7ZmxhZy5tZXRob2RfbmFtZX0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSBcewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsImVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlIG9mIHtmbGFnLm1ldGhvZF9uYW1lfSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLXt7IC1lbmRpZiB9fQoge3sgLWVuZGlmIH19CiB7eyAtZW5kZm9yIH19CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIFx7CkBAIC04MiwxMCArMTM3LDc1IEBACiAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAogICAgICAgICAgICAgICAgIGUKICAgICAgICAgICAgICk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIFx7CisgICAgICAgICAgICAvLyBmb3IgaXNvbGF0ZWQgcHJvY2VzcyBjYXNlLCBza2lwIGxvYWRpbmcgZmxhZyB2YWx1ZSBmcm9tIHRoZSBzdG9yYWdlLCB1c2UgdGhlIGRlZmF1bHQKKyAgICAgICAgfSBmaW5hbGx5IFx7CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgIH0KICAgICAgICAge25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX1faXNfY2FjaGVkID0gdHJ1ZTsKICAgICB9CiB7eyBlbmRmb3ItIH19Cit7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7CisgICAgICAgIGlmICghe2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9X2lzX2NhY2hlZCkgXHsKKyAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX3tmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07CisgICAgfQore3sgZW5kZm9yIH19Cit9Cit7eyAtZW5kaWYtIH19IHsjLSBlbmQgbmV3X2V4cG9ydGVkIG1vZGUgI30KK3t7IC1lbmRpZi0gfX0geyMtIGVuZCBleHBvcnRlZCBtb2RlICN9Cit7eyBlbHNlIH19IHsjLSBlbHNlIGZvciBhbGxvd19pbnN0cnVtZW50YXRpb24gaXMgbm90IGVuYWJsZWQgI30KK3t7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQorLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwore3sgLWVuZGlmIH19CisKK3t7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQoraW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7Cit7eyAtZW5kaWYgfX0KKy8qKiBAaGlkZSAqLworcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKK3t7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQore3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IGZhbHNlOwore3sgLWVuZGZvci0gfX0KKwore3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQore3stIGlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KK3t7IGZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfe25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0oKSBceworICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIntuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9Iik7Cit7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KK3t7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfe2ZsYWcuZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0sIHtmbGFnLmRlZmF1bHRfdmFsdWV9KTsKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9ICIKKyAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCisgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCisgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZmluYWxseSBceworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICB9CisgICAgICAgIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IHRydWU7Cit9Cit7eyBlbmRmb3ItIH19CiB7eyAtZW5kaWYgfX17Iy0gZW5kIG9mIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkICN9CiB7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQogICAgIEBPdmVycmlkZQpAQCAtMTA1LDggKzIyNSw4IEBACiAgICAgfQoge3sgZW5kZm9yIH19CiB9Ci17eyBlbHNlIH19Ci17Iy0gR2VuZXJhdGUgb25seSBzdHViIGlmIGluIHRlc3QgbW9kZSAjfQore3sgZW5kaWZ9fSB7Iy0gZW5kaWYgZm9yIGFsbG93X2luc3RydW1lbnRhdGlvbiAjfQore3sgZWxzZSB9fSB7Iy0gR2VuZXJhdGUgb25seSBzdHViIGlmIGluIHRlc3QgbW9kZSAjfQogLyoqIEBoaWRlICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyBcewoge3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfZXhwb3J0ZWRfaGVhZGVyLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfZXhwb3J0ZWRfaGVhZGVyLnRlbXBsYXRlCmluZGV4IDBmNzg1M2UuLjQ2NDNjOTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX2V4cG9ydGVkX2hlYWRlci50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUKQEAgLTI3LDEyICsyNywxMyBAQAogICAgIHt7IC1mb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50c319CiAgICAgdmlydHVhbCBib29sIHtpdGVtLmZsYWdfbmFtZX0oKSA9IDA7CiAKLSAgICB7eyAtaWYgaXNfdGVzdF9tb2RlIH19Ci0gICAgdmlydHVhbCB2b2lkIHtpdGVtLmZsYWdfbmFtZX0oYm9vbCB2YWwpID0gMDsKLSAgICB7eyAtZW5kaWYgfX0KICAgICB7eyAtZW5kZm9yIH19CiAKICAgICB7eyAtaWYgaXNfdGVzdF9tb2RlIH19CisgICAge3sgLWZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzfX0KKyAgICB2aXJ0dWFsIHZvaWQge2l0ZW0uZmxhZ19uYW1lfShib29sIHZhbCkgPSAwOworICAgIHt7IC1lbmRmb3IgfX0KKwogICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIFx7fQogICAgIHt7IC1lbmRpZiB9fQogfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX3NvdXJjZV9maWxlLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUKaW5kZXggMzhkZGE3ZC4uMzI1ZGJkYyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUKQEAgLTEsMTMgKzEsMTMgQEAKICNpbmNsdWRlICJ7aGVhZGVyfS5oIgogCiB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgore3sgaWYgcmVhZHdyaXRlLSB9fQorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwIgogI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+Ci0KLSNkZWZpbmUgQUxPR0kobXNnLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIkFjb25maWdUZXN0TWlzc2lvbjEiLCAobXNnKSwgX19WQV9BUkdTX18pCi0KKyNkZWZpbmUgTE9HX1RBRyAiYWNvbmZpZ19jcHBfY29kZWdlbiIKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKK3t7IC1lbmRpZiB9fQoge3sgZW5kaWYgfX0KIAoge3sgaWYgcmVhZHdyaXRlLSB9fQpAQCAtMjksMjUgKzI5LDEwMyBAQAogICAgIHByaXZhdGU6CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgYm9vbD4gb3ZlcnJpZGVzXzsKIAorICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbi0gfX0KKyAgICAgICAgdWludDMyX3QgYm9vbGVhbl9zdGFydF9pbmRleF87CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+IGZsYWdfdmFsdWVfZmlsZV87CisKKyAgICAgICAgYm9vbCBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXzsKKyAgICB7eyAtZW5kaWYgfX0KKwogICAgIHB1YmxpYzoKKyAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgOiBvdmVycmlkZXNfKCkKKyAgICAgICAgICAgICwgYm9vbGVhbl9zdGFydF9pbmRleF8oKQorICAgICAgICAgICAgLCBmbGFnX3ZhbHVlX2ZpbGVfKG51bGxwdHIpCisgICAgICAgICAgICAsIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfKHRydWUpIFx7CisKKyAgICAgICAgICAgIGF1dG8gcGFja2FnZV9tYXBfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICAie2NvbnRhaW5lcn0iLAorICAgICAgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2U6OlN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXApOworCisgICAgICAgICAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gY29udGV4dCA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgIntwYWNrYWdlfSIpOworCisgICAgICAgICAgICBpZiAoIWNvbnRleHQub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIGNvbnRleHQ6ICVzIiwgY29udGV4dC5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShjb250ZXh0LT5wYWNrYWdlX2V4aXN0cykpIFx7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNhY2hlIHBhY2thZ2UgYm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4CisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4XyA9IGNvbnRleHQtPmJvb2xlYW5fc3RhcnRfaW5kZXg7CisKKyAgICAgICAgICAgIC8vIHVubWFwIHBhY2thZ2UgbWFwIGZpbGUgYW5kIGZyZWUgbWVtb3J5CisgICAgICAgICAgICBkZWxldGUgKnBhY2thZ2VfbWFwX2ZpbGU7CisKKyAgICAgICAgICAgIGF1dG8gZmxhZ192YWx1ZV9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICAgICAgICAgIntjb250YWluZXJ9IiwKKyAgICAgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2U6OlN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ192YWwpOworICAgICAgICAgICAgaWYgKCFmbGFnX3ZhbHVlX2ZpbGUub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgZmxhZyB2YWx1ZSBmaWxlOiAlcyIsIGZsYWdfdmFsdWVfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSBmbGFnIHZhbHVlIGZpbGUKKyAgICAgICAgICAgIGZsYWdfdmFsdWVfZmlsZV8gPSBzdGQ6OnVuaXF1ZV9wdHI8YWNvbmZpZ19zdG9yYWdlOjpNYXBwZWRTdG9yYWdlRmlsZT4oCisgICAgICAgICAgICAgICAgKmZsYWdfdmFsdWVfZmlsZSk7CisKKyAgICAgICAgfQorICAgIHt7IC1lbHNlIH19CiAgICAgICAgIGZsYWdfcHJvdmlkZXIoKQogICAgICAgICAgICAgOiBvdmVycmlkZXNfKCkKICAgICAgICAgXHt9CisgICAge3sgLWVuZGlmIH19CiAKIHt7IGZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzIH19CiAgICAgICAgIHZpcnR1YWwgYm9vbCB7aXRlbS5mbGFnX25hbWV9KCkgb3ZlcnJpZGUgXHsKICAgICAgICAgICAgIGF1dG8gaXQgPSBvdmVycmlkZXNfLmZpbmQoIntpdGVtLmZsYWdfbmFtZX0iKTsKLSAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIFx7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSBceworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogICAgICAgICAgICAgfSBlbHNlIFx7Ci0gICAgICAgICAgICAgIHt7IGlmIGl0ZW0ucmVhZHdyaXRlLSB9fQotICAgICAgICAgICAgICByZXR1cm4gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICB7eyBpZiBpdGVtLnJlYWR3cml0ZS0gfX0KKyAgICAgICAgICAgICAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXykgXHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGVfLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4XyArIHtpdGVtLmZsYWdfb2Zmc2V0fSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogJXMiLCB2YWx1ZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICAgICAgfSBlbHNlIFx7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHt7IC1lbHNlIH19CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCiAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy57aXRlbS5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAogICAgICAgICAgICAgICAgICAgIntpdGVtLmRldmljZV9jb25maWdfZmxhZ30iLAogICAgICAgICAgICAgICAgICAgIntpdGVtLmRlZmF1bHRfdmFsdWV9IikgPT0gInRydWUiOwotICAgICAgICAgICAgICB7eyAtZWxzZSB9fQotICAgICAgICAgICAgICAgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OwotICAgICAgICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAgICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAgICAgICAgICB7eyAtZWxzZSB9fQorICAgICAgICAgICAgICAgIHJldHVybiB7aXRlbS5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgICAgICAgICB7eyAtZW5kaWYgfX0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02NiwxNSArMTQ0LDg0IEBACiAgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSBcewogICAgIHB1YmxpYzoKIAotICAgICAgICB7eyAtZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KKyAgICAgICAge3sgaWYgcmVhZHdyaXRlLSB9fQorICAgICAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgOiBjYWNoZV8oe3JlYWR3cml0ZV9jb3VudH0sIC0xKQorICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCisgICAgICAgICAgICAsIGZsYWdfdmFsdWVfZmlsZV8obnVsbHB0cikKKyAgICAgICAgICAgICwgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8odHJ1ZSkgXHsKIAorICAgICAgICAgICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgICAgICAgICAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gY29udGV4dCA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgIntwYWNrYWdlfSIpOworICAgICAgICAgICAgaWYgKCFjb250ZXh0Lm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0OiAlcyIsIGNvbnRleHQuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoY29udGV4dC0+cGFja2FnZV9leGlzdHMpKSBceworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSBwYWNrYWdlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gPSBjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4OworCisgICAgICAgICAgICAvLyB1bm1hcCBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmcmVlIG1lbW9yeQorICAgICAgICAgICAgZGVsZXRlICpwYWNrYWdlX21hcF9maWxlOworCisgICAgICAgICAgICBhdXRvIGZsYWdfdmFsdWVfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICAgICAgICAgIGlmICghZmxhZ192YWx1ZV9maWxlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsdWUgZmlsZTogJXMiLCBmbGFnX3ZhbHVlX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2FjaGUgZmxhZyB2YWx1ZSBmaWxlCisgICAgICAgICAgICBmbGFnX3ZhbHVlX2ZpbGVfID0gc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+KAorICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGUpOworCisgICAgICAgIH0KKyAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgIHt7IC1lbmRpZiB9fQorCisgICAgICAgIHt7IC1mb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50cyB9fQogICAgICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIG92ZXJyaWRlIFx7CiAgICAgICAgICAgICB7eyAtaWYgaXRlbS5yZWFkd3JpdGUgfX0KICAgICAgICAgICAgIGlmIChjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID09IC0xKSBceworICAgICAgICAgICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQorICAgICAgICAgICAgICAgIGlmICghcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8pIFx7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7aXRlbS5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlXywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gKyB7aXRlbS5mbGFnX29mZnNldH0pOworCisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5vaygpKSBceworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6ICVzIiwgdmFsdWUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV0gPSAqdmFsdWU7CisgICAgICAgICAgICB7eyAtZWxzZS0gfX0KICAgICAgICAgICAgICAgICBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mue2l0ZW0uZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKICAgICAgICAgICAgICAgICAgICAgIntpdGVtLmRldmljZV9jb25maWdfZmxhZ30iLAogICAgICAgICAgICAgICAgICAgICAie2l0ZW0uZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICB7eyAtZW5kaWYgfX0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dOwogICAgICAgICAgICAge3sgLWVsc2UgfX0KQEAgLTg2LDEyICsyMzMsMjAgQEAKICAgICAgICAgICAgIHt7IC1lbmRpZiB9fQogICAgICAgICB9CiAgICAgICAgIHt7IC1lbmRmb3IgfX0KKwogICAgIHt7IGlmIHJlYWR3cml0ZS0gfX0KICAgICBwcml2YXRlOgogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGNhY2hlXyA9IHN0ZDo6dmVjdG9yPGludDhfdD4oe3JlYWR3cml0ZV9jb3VudH0sIC0xKTsKLSAgICB7eyAtZW5kaWYgfX0KLSAgICB9OworICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbi0gfX0KKyAgICAgICAgdWludDMyX3QgYm9vbGVhbl9zdGFydF9pbmRleF87CiAKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+IGZsYWdfdmFsdWVfZmlsZV87CisKKyAgICAgICAgYm9vbCBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXzsKKyAgICB7eyAtZW5kaWYgfX0KKyAgICB7eyAtZW5kaWYgfX0KKworICAgIH07CiAKIHt7IC1lbmRpZiB9fQogCkBAIC0xMDcsNjIgKzI2Miw2IEBACiAgICAge3sgLWlmIGl0ZW0ucmVhZHdyaXRlIH19CiAgICAgcmV0dXJuIHtjcHBfbmFtZXNwYWNlfTo6e2l0ZW0uZmxhZ19uYW1lfSgpOwogICAgIHt7IC1lbHNlIH19Ci0gICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Ci0gICAgYXV0byByZXN1bHQgPQotICAgICAgICB7eyBpZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQotCSAgICB7cGFja2FnZV9tYWNyb31fe2l0ZW0uZmxhZ19tYWNyb30KLQl7eyBlbHNlIH19Ci0JICAgIHtpdGVtLmRlZmF1bHRfdmFsdWV9Ci0Je3sgZW5kaWYgfX07Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBidWZmZXI7Ci0gICAgaWYgKHN0YXQoIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIiwgJmJ1ZmZlcikgIT0gMCkgXHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBhdXRvIHBhY2thZ2VfbWFwX2ZpbGUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9tYXBwZWRfZmlsZSgKLSAgICAgICAgIntpdGVtLmNvbnRhaW5lcn0iLAotICAgICAgICBhY29uZmlnX3N0b3JhZ2U6OlN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXApOwotICAgIGlmICghcGFja2FnZV9tYXBfZmlsZS5vaygpKSBcewotICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgYXV0byBwYWNrYWdlX3JlYWRfY29udGV4dCA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAotICAgICAgICAqKnBhY2thZ2VfbWFwX2ZpbGUsICJ7cGFja2FnZX0iKTsKLSAgICBpZiAoIXBhY2thZ2VfcmVhZF9jb250ZXh0Lm9rKCkpIFx7Ci0gICAgICAgIEFMT0dJKCJlcnJvcjogZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dDogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgZGVsZXRlICpwYWNrYWdlX21hcF9maWxlOwotCi0gICAgYXV0byBmbGFnX3ZhbF9tYXAgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9tYXBwZWRfZmlsZSgKLSAgICAgICAgIntpdGVtLmNvbnRhaW5lcn0iLAotICAgICAgICBhY29uZmlnX3N0b3JhZ2U6OlN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ192YWwpOwotICAgIGlmICghZmxhZ192YWxfbWFwLm9rKCkpIFx7Ci0gICAgICAgIEFMT0dJKCJlcnJvcjogZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCi0gICAgICAgICoqZmxhZ192YWxfbWFwLAotICAgICAgICBwYWNrYWdlX3JlYWRfY29udGV4dC0+Ym9vbGVhbl9zdGFydF9pbmRleCArIHtpdGVtLmZsYWdfb2Zmc2V0fSk7Ci0gICAgaWYgKCF2YWx1ZS5vaygpKSBcewotICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgZmxhZyB2YWw6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGRlbGV0ZSAqZmxhZ192YWxfbWFwOwotCi0gICAgaWYgKCp2YWx1ZSAhPSByZXN1bHQpIFx7Ci0gICAgICAgIEFMT0dJKCJlcnJvcjogbmV3IHN0b3JhZ2UgdmFsdWUgJyVkJyBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IHZhbHVlICclZCciLCAqdmFsdWUsIHJlc3VsdCk7Ci0gICAgfSBlbHNlIFx7Ci0gICAgICAgIEFMT0dJKCJzdWNjZXNzOiBuZXcgc3RvcmFnZSB2YWx1ZSB3YXMgJyVkLCBsZWdhY3kgc3RvcmFnZSB3YXMgJyVkJyIsICp2YWx1ZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICAgIHt7IGVsc2UgfX0KICAgICB7eyAtaWYgaXRlbS5pc19maXhlZF9yZWFkX29ubHkgfX0KICAgICByZXR1cm4ge3BhY2thZ2VfbWFjcm99X3tpdGVtLmZsYWdfbWFjcm99OwogICAgIHt7IC1lbHNlIH19CkBAIC0xNzAsNyArMjY5LDYgQEAKICAgICB7eyAtZW5kaWYgfX0KICAgICB7eyAtZW5kaWYgfX0KICAgICB7eyAtZW5kaWYgfX0KLSAgICB7eyAtZW5kaWYgfX0KIH0KIAoge3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQpAQCAtMTg1LDUgKzI4MywzIEBACiAgICAgIHtjcHBfbmFtZXNwYWNlfTo6cmVzZXRfZmxhZ3MoKTsKIH0KIHt7IC1lbmRpZiB9fQotCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZQppbmRleCBjZmQ5ZDZhLi5lOWUxMDMyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0LnRlbXBsYXRlCkBAIC0yLDg4ICsyLDc3IEBACiB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpce01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKIHVzZSBzdGQ6OnBhdGg6OlBhdGg7CiB1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2Ugc3RkOjpzeW5jOjpMYXp5TG9jazsKIHVzZSBsb2c6Olx7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OwogCi1zdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQotICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7Ci1zdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7Ci0KIC8vLyBmbGFnIHByb3ZpZGVyCiBwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKIAoge3sgaWYgaGFzX3JlYWR3cml0ZS0gfX0KLWxhenlfc3RhdGljOjpsYXp5X3N0YXRpYyEgXHsKLSAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KLSAgICBzdGF0aWMgcmVmIFBBQ0tBR0VfT0ZGU0VUOiBSZXN1bHQ8T3B0aW9uPHUzMj4sIEFjb25maWdTdG9yYWdlRXJyb3I+ID0gdW5zYWZlIFx7Ci0gICAgICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7Y29udGFpbmVyfSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkKLSAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpKQotICAgICAgICAubWFwKHxjb250ZXh0fCBjb250ZXh0Lm1hcCh8Y3wgYy5ib29sZWFuX3N0YXJ0X2luZGV4KSkKLSAgICB9Owore3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CiAKLSAgICBzdGF0aWMgcmVmIEZMQUdfVkFMX01BUDogUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+ID0gdW5zYWZlIFx7Ci0gICAgICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7Y29udGFpbmVyfSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKLSAgICB9OwotICAgIHt7IC1lbmRpZiB9fQotCitzdGF0aWMgRkxBR19WQUxfTUFQOiBMYXp5TG9jazxSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpCit9KTsKK3t7IC1lbmRpZiB9fQoge3sgLWZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19Ci0gICAge3sgLWlmIGZsYWcucmVhZHdyaXRlIH19Ci0gICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIHtmbGFnLm5hbWV9Ci0gICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Ci0gICAgc3RhdGljIHJlZiBDQUNIRURfe2ZsYWcubmFtZX06IGJvb2wgPSBcewotICAgICAgICBsZXQgcmVzdWx0ID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLntmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSIsCi0gICAgICAgICAgICAie2ZsYWcuZGV2aWNlX2NvbmZpZ19mbGFnfSIsCi0gICAgICAgICAgICAie2ZsYWcuZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7CiAKLSAgICAgICAgaWYgUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSBcewotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgotICAgICAgICAgICAgbG9nZ2VyOjppbml0KAotICAgICAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7Cit7eyAtaWYgZmxhZy5yZWFkd3JpdGUgfX0KKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciB7ZmxhZy5uYW1lfQore3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CitzdGF0aWMgQ0FDSEVEX3tmbGFnLm5hbWV9OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgXHsKIAotICAgICAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IFx7ZXJyfSIpKQorICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgXHsKKyAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCiAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IFx7ZXJyfSIpKQotICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCBcewotICAgICAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAotICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IFx7ZXJyfSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgXHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCBcewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gXHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsge2ZsYWcuZmxhZ19vZmZzZXR9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzogXHtlcnJ9IikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICd7cGFja2FnZX0nIi50b19zdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IFx7ZXJyfSIpKQorICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IFx7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IFx7CisgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gXHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIHtmbGFnLmZsYWdfb2Zmc2V0fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiBce2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IFx7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIHtwYWNrYWdlfSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihmb3JtYXQhKCJmYWlsZWQgdG8gZmxhZyBwYWNrYWdlIHtwYWNrYWdlfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0pOwogCi0gICAgICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IFx7Ci0gICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiBcewotICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAne2ZsYWcubmFtZX0nIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMgXHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMgXHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiBcewotICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAne2ZsYWcubmFtZX0nLiBMZWdhY3kgc3RvcmFnZSB3YXMgXHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMgXHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IFx7ZXJyfSIpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IFx7CisgICAgICAgIE9rKGZsYWdfdmFsdWUpID0+IFx7CisgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgfSwKKyAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiBce2Vycn0iKTsKKyAgICAgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICByZXN1bHQKLSAgICAgICAgfTsKLSAgICB7eyBlbHNlIH19Ci0gICAgc3RhdGljIHJlZiBDQUNIRURfe2ZsYWcubmFtZX06IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy57ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAotICAgICAgICAie2ZsYWcuZGV2aWNlX2NvbmZpZ19mbGFnfSIsCi0gICAgICAgICJ7ZmxhZy5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIjsKLSAgICB7eyBlbmRpZiB9fQotICAgIHt7IC1lbmRpZiB9fQorfSk7Cit7eyBlbHNlIH19CitzdGF0aWMgQ0FDSEVEX3tmbGFnLm5hbWV9OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAiYWNvbmZpZ19mbGFncy57ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAorICAgICJ7ZmxhZy5kZXZpY2VfY29uZmlnX2ZsYWd9IiwKKyAgICAie2ZsYWcuZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSIpOwore3sgZW5kaWYgfX0KK3t7IC1lbmRpZiB9fQoge3sgLWVuZGZvciB9fQotfQoge3sgLWVuZGlmIH19CiAKIGltcGwgRmxhZ1Byb3ZpZGVyIFx7CkBAIC0xMDcsNzMgKzk2LDExIEBACiB7eyBmb3IgZmxhZyBpbiB0ZW1wbGF0ZV9mbGFncyB9fQogLy8vIHF1ZXJ5IGZsYWcge2ZsYWcubmFtZX0KICNbaW5saW5lKGFsd2F5cyldCi17eyAtaWYgZmxhZy5yZWFkd3JpdGUgfX0KIHB1YiBmbiB7ZmxhZy5uYW1lfSgpIC0+IGJvb2wgXHsKK3t7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQogICAgIFBST1ZJREVSLntmbGFnLm5hbWV9KCkKIHt7IC1lbHNlIH19Ci1wdWIgZm4ge2ZsYWcubmFtZX0oKSAtPiBib29sIFx7Ci0gICAge3sgaWYgbm90IGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQogICAgIHtmbGFnLmRlZmF1bHRfdmFsdWV9Ci0gICAge3sgZWxzZSB9fQotCi0gICAgbGV0IHJlc3VsdCA9IHtmbGFnLmRlZmF1bHRfdmFsdWV9OwotICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIFx7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBhcmUgbm9vcHMuCi0gICAgbG9nZ2VyOjppbml0KAotICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKLSAgICApOwotCi0gICAgdW5zYWZlIFx7Ci0gICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7ZmxhZy5jb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSBcewotICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJ7cGFja2FnZX0iKSBcewotICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKLSAgICAgICAgICAgIE9rKE5vbmUpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiBcewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ3tmbGFnLm5hbWV9JzogXHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7ZmxhZy5jb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSBcewotICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIHtmbGFnLmZsYWdfb2Zmc2V0fSArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIFx7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSBcewotICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ3tmbGFnLm5hbWV9Jy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIFx7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIFx7dmFsdWV9Iik7Ci0gICAgICAgIH0gZWxzZSBcewotICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKLSAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICd7ZmxhZy5uYW1lfScgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyBce2RlZmF1bHRfdmFsdWV9LCBuZXcgc3RvcmFnZSB3YXMgXHt2YWx1ZX0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAotICAgIHt7IGVuZGlmIH19CiB7eyAtZW5kaWYgfX0KIH0KIHt7IGVuZGZvciB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3Rfc2Vjb25kX3BhY2thZ2UuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4YmM5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWcKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc2Vjb25kX3Rlc3QiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJ0ZXN0aW5nX2ZsYWciCisgICAgbmFtZXNwYWNlOiAiYW5vdGhlcl9uYW1lc3BhY2UiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIGEgZmxhZyBmb3IgdGVzdGluZy4iCisgICAgYnVnOiAiMTIzIgorfQorCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGhpcmQudmFsdWVzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3RoaXJkLnZhbHVlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU4MzJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3RoaXJkLnZhbHVlcwpAQCAtMCwwICsxLDYgQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnNlY29uZF90ZXN0IgorICAgIG5hbWU6ICJ0ZXN0aW5nX2ZsYWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwCmluZGV4IDJkOTQzZGUuLmJkZjk2ZWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAKQEAgLTM5LDggKzM5LDggQEAKIAogZ2VucnVsZSB7CiAgICAgbmFtZTogImxpYmFjb25maWdfamF2YV9kZXZpY2VfcGF0aHNfc3JjIiwKLSAgICBzcmNzOiBbInNyYy9EZXZpY2VQYXRoc1RlbXBsYXRlLmphdmEiXSwKLSAgICBvdXQ6IFsiRGV2aWNlUGF0aHMuamF2YSJdLAorICAgIHNyY3M6IFsic3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEiXSwKKyAgICBvdXQ6IFsiRGV2aWNlUHJvdG9zLmphdmEiXSwKICAgICB0b29sX2ZpbGVzOiBbInBhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCJdLAogICAgIGNtZDogInNlZCAtZSAnL1RFTVBMQVRFL3tyJChsb2NhdGlvbiBwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQpJyAtZSAnZH0nICQoaW4pID4gJChvdXQpIiwKIH0KQEAgLTQ4LDUgKzQ4LDI4IEBACiBqYXZhX2xpYnJhcnkgewogICAgIG5hbWU6ICJhY29uZmlnX2RldmljZV9wYXRoc19qYXZhIiwKICAgICBzcmNzOiBbIjpsaWJhY29uZmlnX2phdmFfZGV2aWNlX3BhdGhzX3NyYyJdLAotICAgIHNka192ZXJzaW9uOiAiY29yZV9jdXJyZW50IiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWNvbmZpZ19qYXZhX3Byb3RvX25hbm8iLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX3BsYXRmb3JtIiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImxpYmFjb25maWdfamF2YV9ob3N0X2RldmljZV9wYXRoc19zcmMiLAorICAgIHNyY3M6IFsic3JjL0hvc3REZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhIl0sCisgICAgb3V0OiBbIkhvc3REZXZpY2VQcm90b3MuamF2YSJdLAorICAgIHRvb2xfZmlsZXM6IFsKKyAgICAgICAgInBhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCIsCisgICAgICAgICJtYWlubGluZV9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCIsCisgICAgXSwKKyAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KS50bXAgJiYgIiArCisgICAgInNlZCAtZSAnL01BSU5MSU5FX1Qve3IkKGxvY2F0aW9uIG1haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKG91dCkudG1wID4gJChvdXQpIiwKK30KKworamF2YV9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnX2hvc3RfZGV2aWNlX3BhdGhzX2phdmEiLAorICAgIHNyY3M6IFsiOmxpYmFjb25maWdfamF2YV9ob3N0X2RldmljZV9wYXRoc19zcmMiXSwKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvbWFpbmxpbmVfYWNvbmZpZ19mbGFnc19wYXRocy50eHQgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL21haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzNhODQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL21haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyIvYXBleC9jb20uYW5kcm9pZC5hZHNlcnZpY2VzL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5hcHBzZWFyY2gvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLmFydC9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuYnRzZXJ2aWNlcy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuY2VsbGJyb2FkY2FzdC9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLmNvbnNjcnlwdC9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuZGV2aWNlbG9jay9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuaGVhbHRoZml0bmVzcy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuaXBzZWMvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5vbmRldmljZXBlcnNvbmFsaXphdGlvbi9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQub3Muc3RhdHNkL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5wZXJtaXNzaW9uL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5wcm9maWxpbmcvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnRldGhlcmluZy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQudXdiL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC52aXJ0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC53aWZpL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQKaW5kZXggMTQwY2QyMS4uZTk5N2UzZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQKQEAgLTEsNCArMSwzIEBACiAiL3N5c3RlbS9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCi0iL3N5c3RlbV9leHQvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAogIi9wcm9kdWN0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKICIvdmVuZG9yL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVBhdGhzVGVtcGxhdGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhCmluZGV4IDE2MzU1YTMuLjRkNDExOTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVBhdGhzVGVtcGxhdGUuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhCkBAIC0xNSw3ICsxNSwxMiBAQAogICovCiBwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZzsKIAoraW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZ3M7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0yMywxNCArMjgsMzggQEAKIC8qKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIERldmljZVBhdGhzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSFMgPSB7CitwdWJsaWMgY2xhc3MgRGV2aWNlUHJvdG9zIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBVEhTID0gewogICAgICAgICBURU1QTEFURQogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9ESVIgPSAiL2FwZXgiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEVYX0FDT05GSUdfUEFUSF9TVUZGSVggPSAiL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIjsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MuCisgICAgICoKKyAgICAgKiBNYXkgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBwcm90b3MgY2FuJ3QgYmUgcmVhZCBhdCB0aGUgY2FsbCBzaXRlLiBGb3IKKyAgICAgKiBleGFtcGxlLCBzb21lIG9mIHRoZSBwcm90b3MgYXJlIGluIHRoZSBhcGV4LyBwYXJ0aXRpb24sIHdoaWNoIGlzIG1vdW50ZWQKKyAgICAgKiBzb21ld2hhdCBsYXRlIGluIHRoZSBib290IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHdlIGNhbid0IHJlYWQgb25lIG9mIHRoZSBwcm90b3MgeWV0CisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxwYXJzZWRfZmxhZz4gbG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5TGlzdDxwYXJzZWRfZmxhZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBwYXJzZWRGbGFnc1Byb3RvUGF0aHMoKSkgeworICAgICAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VkX2ZsYWdzIHBhcnNlZEZsYWdzID0gcGFyc2VkX2ZsYWdzLnBhcnNlRnJvbShpbnB1dFN0cmVhbS5yZWFkQWxsQnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogcGFyc2VkRmxhZ3MucGFyc2VkRmxhZykgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZsYWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgb24tZGV2aWNlIGFjb25maWcgcHJvdG9zIHBhdGhzLgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvSG9zdERldmljZVByb3Rvc1RlbXBsYXRlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9Ib3N0RGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QwYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvSG9zdERldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQSBob3N0IGxpYiB0aGF0IGNhbiByZWFkIGFsbCBhY29uZmlnIHByb3RvIGZpbGUgcGF0aHMgb24gYSBnaXZlbiBkZXZpY2UuCisgKiBUaGlzIGxpYiBpcyBvbmx5IGF2YWlsYWJsZSBvbiBkZXZpY2Ugd2l0aCByb290IGFjY2VzcyAodXNlcmRlYnVnL2VuZykuCisgKi8KK3B1YmxpYyBjbGFzcyBIb3N0RGV2aWNlUHJvdG9zIHsKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcmZhY2UgdGhhdCBleGVjdXRlcyBBREIgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQWRiQ29tbWFuZEV4ZWN1dG9yIHsKKyAgICAgICAgLyoqIEV4ZWN1dGVzIHRoZSBBREIgY29tbWFuZC4gKi8KKyAgICAgICAgU3RyaW5nIGV4ZWN1dGVBZGJDb21tYW5kKFN0cmluZyBjb21tYW5kKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSFMgPSB7CisgICAgICAgIFRFTVBMQVRFCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNQUlOTElORV9QQVRIUyA9IHsKKyAgICAgICAgTUFJTkxJTkVfVAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9ESVIgPSAiL2FwZXgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNVUlNJVkVMWV9MSVNUX0FQRVhfRElSX0NPTU1BTkQgPQorICAgICAgICAic2hlbGwgc3UgMCBmaW5kIC9hcGV4IHwgZ3JlcCBhY29uZmlnX2ZsYWdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYID0gIi9ldGMvYWNvbmZpZ19mbGFncy5wYiI7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvIHBhdGhzIGZyb20gaG9zdCBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHBhcnNlZEZsYWdzUHJvdG9QYXRocyhBZGJDb21tYW5kRXhlY3V0b3IgYWRiQ29tbWFuZEV4ZWN1dG9yKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KFBBVEhTKSk7CisKKyAgICAgICAgU3RyaW5nIGFkYkNvbW1hbmRPdXRwdXQgPSBhZGJDb21tYW5kRXhlY3V0b3IuZXhlY3V0ZUFkYkNvbW1hbmQoCisgICAgICAgICAgICBSRUNVUlNJVkVMWV9MSVNUX0FQRVhfRElSX0NPTU1BTkQpOworCisgICAgICAgIGlmIChhZGJDb21tYW5kT3V0cHV0ID09IG51bGwgfHwgYWRiQ29tbWFuZE91dHB1dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHBhdGhzLmFkZEFsbChBcnJheXMuYXNMaXN0KE1BSU5MSU5FX1BBVEhTKSk7CisgICAgICAgICAgICByZXR1cm4gcGF0aHM7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8U3RyaW5nPiBhbGxGaWxlcyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChhZGJDb21tYW5kT3V0cHV0LnNwbGl0KCJcbiIpKSk7CisKKyAgICAgICAgU2V0PFN0cmluZz4gc3ViZGlycyA9IGFsbEZpbGVzLnN0cmVhbSgpLm1hcChmaWxlIC0+IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVQYXRocyA9IGZpbGUuc3BsaXQoIi8iKTsKKyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBlbGVtZW50IGlzICIiLCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgImFwZXgiLgorICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRocy5sZW5ndGggPiAyID8gZmlsZVBhdGhzWzJdIDogIiI7CisgICAgICAgIH0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBzdWJkaXJzKSB7CisgICAgICAgICAgICAvLyBGb3IgZWFjaCBtYWlubGluZSBtb2R1bGVzLCB0aGVyZSBhcmUgdHdvIGRpcmVjdG9yaWVzLCBvbmUgPG1vZHVsZXBhY2thZ2U+LywKKyAgICAgICAgICAgIC8vIGFuZCBvbmUgPG1vZHVsZXBhY2thZ2U+QDx2ZXJzaW9uY29kZT4vLiBKdXN0IHJlYWQgdGhlIGZvcm1lci4KKyAgICAgICAgICAgIGlmIChwcmVmaXguY29udGFpbnMoIkAiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgcHJvdG9QYXRoID0gQVBFWF9ESVIgKyAiLyIgKyBwcmVmaXggKyBBUEVYX0FDT05GSUdfUEFUSF9TVUZGSVg7CisgICAgICAgICAgICBpZiAoYWxsRmlsZXMuY29udGFpbnMocHJvdG9QYXRoKSkgeworICAgICAgICAgICAgICAgIHBhdGhzLmFkZChwcm90b1BhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9saWIucnMKaW5kZXggOWFiOWNlYS4uODg3MWI0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycwpAQCAtNjIsMTMgKzYyLDEyIEBACiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9yZWFkX3BhcnRpdGlvbl9wYXRocygpIHsKLSAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3BhcnRpdGlvbl9wYXRocygpLmxlbigpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3BhcnRpdGlvbl9wYXRocygpLmxlbigpLCAzKTsKIAogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgcmVhZF9wYXJ0aXRpb25fcGF0aHMoKSwKICAgICAgICAgICAgIHZlYyFbCiAgICAgICAgICAgICAgICAgUGF0aEJ1Zjo6ZnJvbSgiL3N5c3RlbS9ldGMvYWNvbmZpZ19mbGFncy5wYiIpLAotICAgICAgICAgICAgICAgIFBhdGhCdWY6OmZyb20oIi9zeXN0ZW1fZXh0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiksCiAgICAgICAgICAgICAgICAgUGF0aEJ1Zjo6ZnJvbSgiL3Byb2R1Y3QvZXRjL2Fjb25maWdfZmxhZ3MucGIiKSwKICAgICAgICAgICAgICAgICBQYXRoQnVmOjpmcm9tKCIvdmVuZG9yL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIikKICAgICAgICAgICAgIF0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxZmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitydXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX2ZsYWdzIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19mbGFncyIsCisgICAgc3JjczogWworICAgICAgICAic3JjL2xpYi5ycyIsCisgICAgXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ19mbGFnc19ydXN0IiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQorCithY29uZmlnX2RlY2xhcmF0aW9ucyB7CisgICAgbmFtZTogImFjb25maWdfZmxhZ3MiLAorICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLmZsYWdzIiwKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iLAorICAgIHNyY3M6IFsiZmxhZ3MuYWNvbmZpZyJdLAorfQorCitydXN0X2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfZmxhZ3NfcnVzdCIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfZmxhZ3NfcnVzdCIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnX2ZsYWdzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KKworY2NfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19mbGFnc19jYyIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnX2ZsYWdzIiwKK30KKworamF2YV9hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX2ZsYWdzX2phdmEiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZ19mbGFncyIsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjlmMTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvQ2FyZ28udG9tbApAQCAtMCwwICsxLDEwIEBACitbcGFja2FnZV0KK25hbWUgPSAiYWNvbmZpZ19mbGFncyIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCisKK1tmZWF0dXJlc10KK2RlZmF1bHQgPSBbImNhcmdvIl0KK2NhcmdvID0gW10KKworW2RlcGVuZGVuY2llc10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvZmxhZ3MuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9mbGFncy5hY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YmI4MWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvZmxhZ3MuYWNvbmZpZwpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5mbGFncyIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgIG5hbWU6ICJlbmFibGVfb25seV9uZXdfc3RvcmFnZSIKKyAgbmFtZXNwYWNlOiAiY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIgorICBidWc6ICIzMTIyMzU1OTYiCisgIGRlc2NyaXB0aW9uOiAiV2hlbiBlbmFibGVkLCBhY29uZmlnIGZsYWdzIGFyZSByZWFkIGZyb20gdGhlIG5ldyBhY29uZmlnIHN0b3JhZ2Ugb25seS4iCit9CisKK2ZsYWcgeworICBuYW1lOiAiZW5hYmxlX2Fjb25maWdkX2Zyb21fbWFpbmxpbmUiCisgIG5hbWVzcGFjZTogImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIKKyAgYnVnOiAiMzY5ODA4ODA1IgorICBkZXNjcmlwdGlvbjogIldoZW4gZW5hYmxlZCwgbGF1bmNoIGFjb25maWdkIGZyb20gY29uZmlnIGluZnJhIG1vZHVsZS4iCit9CisKK2ZsYWcgeworICBuYW1lOiAidG9vbHNfcmVhZF9mcm9tX25ld19zdG9yYWdlIgorICBuYW1lc3BhY2U6ICJjb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiCisgIGJ1ZzogIjM3MDQ5OTY0MCIKKyAgZGVzY3JpcHRpb246ICJXaGVuIGVuYWJsZWQsIHRvb2xzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgbmV3IGFjb25maWcgc3RvcmFnZS4iCit9CisKK2ZsYWcgeworICBuYW1lOiAidG9vbHNfcmVhZF9mcm9tX25ld19zdG9yYWdlX2J1Z2ZpeCIKKyAgbmFtZXNwYWNlOiAiY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIgorICBidWc6ICIzNzA0OTk2NDAiCisgIGRlc2NyaXB0aW9uOiAiV2hlbiBlbmFibGVkLCB0b29scyByZWFkIGRpcmVjdGx5IGZyb20gdGhlIG5ldyBhY29uZmlnIHN0b3JhZ2UuIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9CVUdGSVgKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4OTEyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdfZmxhZ3NgIGlzIGEgY3JhdGUgZm9yIHJlYWRpbmcgYWNvbmZpZyBmbGFncyBmcm9tIFJ1c3QKKy8vIFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluCisvLworLy8gICAtIHRoZSBmbGFnIGZ1bmN0aW9ucyB3aWxsIHJlYWQgZnJvbSBhY29uZmlnX2ZsYWdzX2lubmVyCisvLyAgIC0gdGhlIGZlYXR1cmUgImNhcmdvIiB3aWxsIGJlIGRpc2FibGVkCisvLworLy8gV2hlbiBidWlsZGluZyB3aXRoIGNhcmdvCisvLworLy8gICAtIHRoZSBmbGFnIGZ1bmN0aW9ucyB3aWxsIGFsbCByZXR1cm4gc29tZSB0cml2aWFsIHZhbHVlLCBsaWtlIHRydWUKKy8vICAgLSB0aGUgZmVhdHVyZSAiY2FyZ28iIHdpbGwgYmUgZW5hYmxlZAorLy8KKy8vIFRoaXMgbW9kdWxlIGhpZGVzIHRoZXNlIGRpZmZlcmVuY2VzIGZyb20gdGhlIHJlc3Qgb2YgYWNvbmZpZy4KKworLy8vIE1vZHVsZSB1c2VkIHdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluCisjW2NmZyhub3QoZmVhdHVyZSA9ICJjYXJnbyIpKV0KK3B1YiBtb2QgYXV0b19nZW5lcmF0ZWQgeworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGVuYWJsZV9vbmx5X25ld19zdG9yYWdlIGZsYWcuCisgICAgcHViIGZuIGVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkgLT4gYm9vbCB7CisgICAgICAgIGFjb25maWdfZmxhZ3NfcnVzdDo6ZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UoKQorICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lIGZsYWcuCisgICAgcHViIGZuIGVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lKCkgLT4gYm9vbCB7CisgICAgICAgIGFjb25maWdfZmxhZ3NfcnVzdDo6ZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UoKQorICAgIH0KK30KKworLy8vIE1vZHVsZSB1c2VkIHdoZW4gYnVpbGRpbmcgd2l0aCBjYXJnbworI1tjZmcoZmVhdHVyZSA9ICJjYXJnbyIpXQorcHViIG1vZCBhdXRvX2dlbmVyYXRlZCB7CisgICAgLy8vIFJldHVybnMgYSBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgdGhlIGVuYWJsZV9vbmx5X25ld19zdG9yYWdlIGZsYWcuCisgICAgcHViIGZuIGVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkgLT4gYm9vbCB7CisgICAgICAgIC8vIFVzZWQgb25seSB0byBlbmFibGUgdHlwZWNoZWNraW5nIGFuZCB0ZXN0aW5nIHdpdGggY2FyZ28KKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGEgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIHRoZSBlbmFibGVfYWNvbmZpZ2RfZnJvbV9tYWlubGluZSBmbGFnLgorICAgIHB1YiBmbiBlbmFibGVfYWNvbmZpZ2RfZnJvbV9tYWlubGluZSgpIC0+IGJvb2wgeworICAgICAgICAvLyBVc2VkIG9ubHkgdG8gZW5hYmxlIHR5cGVjaGVja2luZyBhbmQgdGVzdGluZyB3aXRoIGNhcmdvCisgICAgICAgIHRydWUKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAKaW5kZXggMzg1OTE5NC4uZTg3NWM3YiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsNyBAQAogICAgICAgICAibGliY2xhcCIsCiAgICAgICAgICJsaWJjeHgiLAogICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3Byb3RvcyIsCisgICAgICAgICJsaWJzZXJkZSIsCiAgICAgXSwKIH0KIApAQCAtMzYsNyArMzcsMTAgQEAKICAgICBuYW1lOiAiYWNvbmZpZy1zdG9yYWdlIiwKICAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2VfZmlsZS5kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsic3JjL21haW4ucnMiXSwKLSAgICBydXN0bGliczogWyJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCisgICAgICAgICJsaWJzZXJkZV9qc29uIiwKKyAgICBdLAogfQogCiBydXN0X3Rlc3RfaG9zdCB7CkBAIC0xMzgsMTEgKzE0MiwyOCBAQAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIH0KIAotLy8gc3RvcmFnZSBmaWxlIHBhcnNlIGFwaSBqYXZhIGNjX2xpYnJhcnkKKy8vIHN0b3JhZ2UgZmlsZSBwYXJzZSBhcGkgamF2YSBsaWJyYXJ5CiBqYXZhX2xpYnJhcnkgewogICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmNzLyoqLyouamF2YSIsCiAgICAgXSwKICAgICBzZGtfdmVyc2lvbjogImNvcmVfY3VycmVudCIsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgIF0sCit9CisKKy8vIHN0b3JhZ2UgZmlsZSBwYXJzZSBhcGkgamF2YSBsaWJyYXJ5IGZvciBjb3JlIGxpYnJhcnkKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlX2phdmFfbm9uZSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJub25lIiwKKyAgICBzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQ2FyZ28udG9tbAppbmRleCAxOTJkZmFkLi5hNDA1NTc4IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0NhcmdvLnRvbWwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9DYXJnby50b21sCkBAIC0xNCw2ICsxNCw4IEBACiB0aGlzZXJyb3IgPSAiMS4wLjU2IgogY2xhcCA9IHsgdmVyc2lvbiA9ICI0LjEuOCIsIGZlYXR1cmVzID0gWyJkZXJpdmUiXSB9CiBjeHggPSAiMS4wIgorc2VyZGUgPSB7IHZlcnNpb24gPSAiMS4wLjE1MiIsIGZlYXR1cmVzID0gWyJkZXJpdmUiXSB9CitzZXJkZV9qc29uID0gIjEuMC45MyIKIAogW1tiaW5dXQogbmFtZSA9ICJhY29uZmlnLXN0b3JhZ2UiCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX2luZm8ucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX2luZm8ucnMKaW5kZXggYmVhYzM4ZC4uY2YxNjgzNCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ19pbmZvLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfaW5mby5ycwpAQCAtMjAsMTAgKzIwLDExIEBACiB1c2UgY3JhdGU6OntyZWFkX3N0cl9mcm9tX2J5dGVzLCByZWFkX3UzMl9mcm9tX2J5dGVzLCByZWFkX3U4X2Zyb21fYnl0ZXN9OwogdXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlfTsKIHVzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OwogdXNlIHN0ZDo6Zm10OwogCiAvLy8gRmxhZyBpbmZvIGhlYWRlciBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBGbGFnSW5mb0hlYWRlciB7CiAgICAgcHViIHZlcnNpb246IHUzMiwKICAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCkBAIC04OSw3ICs5MCw3IEBACiB9CiAKIC8vLyBiaXQgZmllbGQgZm9yIGZsYWcgaW5mbwotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBQYXJ0aWFsRXEsIEVxKV0KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgUGFydGlhbEVxLCBFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgZW51bSBGbGFnSW5mb0JpdCB7CiAgICAgSGFzU2VydmVyT3ZlcnJpZGUgPSAxIDw8IDAsCiAgICAgSXNSZWFkV3JpdGUgPSAxIDw8IDEsCkBAIC05Nyw3ICs5OCw3IEBACiB9CiAKIC8vLyBGbGFnIGluZm8gbm9kZSBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSwgQ2xvbmUpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBDbG9uZSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IEZsYWdJbmZvTm9kZSB7CiAgICAgcHViIGF0dHJpYnV0ZXM6IHU4LAogfQpAQCAtMTM4LDcgKzEzOSw3IEBACiB9CiAKIC8vLyBGbGFnIGluZm8gbGlzdCBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBGbGFnSW5mb0xpc3QgewogICAgIHB1YiBoZWFkZXI6IEZsYWdJbmZvSGVhZGVyLAogICAgIHB1YiBub2RlczogVmVjPEZsYWdJbmZvTm9kZT4sCkBAIC0xOTMsMTIgKzE5NCwxNSBAQAogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKLSAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0OworICAgIHVzZSBjcmF0ZTo6eworICAgICAgICB0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorICAgIH07CiAKLSAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgotICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbigpIHsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKyAgICAvLyBUT0RPOiBiLzM3NjEwODI2OCAtIFVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogCiAgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnSW5mb0hlYWRlciA9ICZmbGFnX2luZm9fbGlzdC5oZWFkZXI7CiAgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKQEAgLTIxOSwyMCArMjIzLDQyIEBACiAgICAgfQogCiAgICAgI1t0ZXN0XQotICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoYXQgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2Ygc2VyaWFsaXplZAotICAgIC8vIGJ5dGVzCi0gICAgZm4gdGVzdF92ZXJzaW9uX251bWJlcigpIHsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKLSAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKTsKLSAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKLSAgICAgICAgbGV0IHZlcnNpb24gPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpOwotICAgICAgICBhc3NlcnRfZXEhKHZlcnNpb24sIDEpOworICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9tYXgoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OKTsKKworICAgICAgICBsZXQgaGVhZGVyOiAmRmxhZ0luZm9IZWFkZXIgPSAmZmxhZ19pbmZvX2xpc3QuaGVhZGVyOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnSW5mb0hlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBub2RlczogJlZlYzxGbGFnSW5mb05vZGU+ID0gJmZsYWdfaW5mb19saXN0Lm5vZGVzOworICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9IEZsYWdJbmZvTm9kZTo6ZnJvbV9ieXRlcygmbm9kZS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLCAmcmVpbnRlcnByZXRlZF9ub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBmbGFnX2luZm9fYnl0ZXMgPSBmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2luZm9fbGlzdCA9IEZsYWdJbmZvTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ19pbmZvX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2luZm9fbGlzdC5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmZmxhZ19pbmZvX2xpc3QsICZyZWludGVycHJldGVkX2luZm9fbGlzdC51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19pbmZvX2J5dGVzLmxlbigpIGFzIHUzMiwgaGVhZGVyLmZpbGVfc2l6ZSk7CiAgICAgfQogCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCisgICAgLy8gYnl0ZXMKICAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF92ZXJzaW9uX251bWJlcigpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgYnl0ZXMgPSAmZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgdmVyc2lvbl9mcm9tX2ZpbGUgPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHZlcnNpb25fZnJvbV9maWxlLCBERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgfQorCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmlsZSB0eXBlIGNoZWNrCisgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZmlsZV90eXBlX2NoZWNrKCkgewotICAgICAgICBsZXQgbXV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKyAgICAgICAgbGV0IG11dCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgZmxhZ19pbmZvX2xpc3QuaGVhZGVyLmZpbGVfdHlwZSA9IDEyM3U4OwogICAgICAgICBsZXQgZXJyb3IgPSBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJmZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ190YWJsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdGFibGUucnMKaW5kZXggNjRiOTBlYS4uNmZiZWUwMiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ190YWJsZS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzCkBAIC0yMywxMCArMjMsMTEgQEAKIH07CiB1c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFN0b3JlZEZsYWdUeXBlfTsKIHVzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OwogdXNlIHN0ZDo6Zm10OwogCiAvLy8gRmxhZyB0YWJsZSBoZWFkZXIgc3RydWN0Ci0jW2Rlcml2ZShQYXJ0aWFsRXEpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgRmxhZ1RhYmxlSGVhZGVyIHsKICAgICBwdWIgdmVyc2lvbjogdTMyLAogICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKQEAgLTk1LDcgKzk2LDcgQEAKIH0KIAogLy8vIEZsYWcgdGFibGUgbm9kZSBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSwgQ2xvbmUpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBDbG9uZSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IEZsYWdUYWJsZU5vZGUgewogICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCiAgICAgcHViIGZsYWdfbmFtZTogU3RyaW5nLApAQCAtMTUwLDExICsxNTEsMTEgQEAKICAgICAvLy8gQ2FsY3VsYXRlIG5vZGUgYnVja2V0IGluZGV4CiAgICAgcHViIGZuIGZpbmRfYnVja2V0X2luZGV4KHBhY2thZ2VfaWQ6IHUzMiwgZmxhZ19uYW1lOiAmc3RyLCBudW1fYnVja2V0czogdTMyKSAtPiB1MzIgewogICAgICAgICBsZXQgZnVsbF9mbGFnX25hbWUgPSBwYWNrYWdlX2lkLnRvX3N0cmluZygpICsgIi8iICsgZmxhZ19uYW1lOwotICAgICAgICBnZXRfYnVja2V0X2luZGV4KCZmdWxsX2ZsYWdfbmFtZSwgbnVtX2J1Y2tldHMpCisgICAgICAgIGdldF9idWNrZXRfaW5kZXgoZnVsbF9mbGFnX25hbWUuYXNfYnl0ZXMoKSwgbnVtX2J1Y2tldHMpCiAgICAgfQogfQogCi0jW2Rlcml2ZShQYXJ0aWFsRXEpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgRmxhZ1RhYmxlIHsKICAgICBwdWIgaGVhZGVyOiBGbGFnVGFibGVIZWFkZXIsCiAgICAgcHViIGJ1Y2tldHM6IFZlYzxPcHRpb248dTMyPj4sCkBAIC0yMTksMTIgKzIyMCwxNSBAQAogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKLSAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGU7CisgICAgdXNlIGNyYXRlOjp7CisgICAgICAgIHRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUsIERFRkFVTFRfRklMRV9WRVJTSU9OLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKKyAgICB9OwogCi0gICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBzZXJpYWxpemF0aW9uCi0gICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uKCkgewotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKTsKKyAgICAvLyBUT0RPOiBiLzM3NjEwODI2OCAtIFVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKIAogICAgICAgICBsZXQgaGVhZGVyOiAmRmxhZ1RhYmxlSGVhZGVyID0gJmZsYWdfdGFibGUuaGVhZGVyOwogICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOwpAQCAtMjQ1LDIwICsyNDksNDIgQEAKICAgICB9CiAKICAgICAjW3Rlc3RdCi0gICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCi0gICAgLy8gYnl0ZXMKLSAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgewotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKTsKLSAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfdGFibGUuaW50b19ieXRlcygpOwotICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOwotICAgICAgICBsZXQgdmVyc2lvbiA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7Ci0gICAgICAgIGFzc2VydF9lcSEodmVyc2lvbiwgMSk7CisgICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uX21heCgpIHsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OKTsKKworICAgICAgICBsZXQgaGVhZGVyOiAmRmxhZ1RhYmxlSGVhZGVyID0gJmZsYWdfdGFibGUuaGVhZGVyOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaGVhZGVyLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKGhlYWRlciwgJnJlaW50ZXJwcmV0ZWRfaGVhZGVyLnVud3JhcCgpKTsKKworICAgICAgICBsZXQgbm9kZXM6ICZWZWM8RmxhZ1RhYmxlTm9kZT4gPSAmZmxhZ190YWJsZS5ub2RlczsKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPSBGbGFnVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZub2RlLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUsICZyZWludGVycHJldGVkX25vZGUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGZsYWdfdGFibGVfYnl0ZXMgPSBmbGFnX3RhYmxlLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfdGFibGUgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJmZsYWdfdGFibGVfYnl0ZXMpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfdGFibGUuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJmZsYWdfdGFibGUsICZyZWludGVycHJldGVkX3RhYmxlLnVud3JhcCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX3RhYmxlX2J5dGVzLmxlbigpIGFzIHUzMiwgaGVhZGVyLmZpbGVfc2l6ZSk7CiAgICAgfQogCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCisgICAgLy8gYnl0ZXMKICAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF92ZXJzaW9uX251bWJlcigpIHsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgdmVyc2lvbl9mcm9tX2ZpbGUgPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHZlcnNpb25fZnJvbV9maWxlLCBERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgfQorCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmlsZSB0eXBlIGNoZWNrCisgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZmlsZV90eXBlX2NoZWNrKCkgewotICAgICAgICBsZXQgbXV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCk7CisgICAgICAgIGxldCBtdXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBmbGFnX3RhYmxlLmhlYWRlci5maWxlX3R5cGUgPSAxMjN1ODsKICAgICAgICAgbGV0IGVycm9yID0gRmxhZ1RhYmxlOjpmcm9tX2J5dGVzKCZmbGFnX3RhYmxlLmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ192YWx1ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdmFsdWUucnMKaW5kZXggNTA2OTI0Yi4uOWExNGJlYyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ192YWx1ZS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3ZhbHVlLnJzCkBAIC0yMCwxMCArMjAsMTEgQEAKIHVzZSBjcmF0ZTo6e3JlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIHJlYWRfdThfZnJvbV9ieXRlc307CiB1c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGV9OwogdXNlIGFueWhvdzo6YW55aG93OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CiB1c2Ugc3RkOjpmbXQ7CiAKIC8vLyBGbGFnIHZhbHVlIGhlYWRlciBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBGbGFnVmFsdWVIZWFkZXIgewogICAgIHB1YiB2ZXJzaW9uOiB1MzIsCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLApAQCAtODksNyArOTAsNyBAQAogfQogCiAvLy8gRmxhZyB2YWx1ZSBsaXN0IHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxKV0KKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IEZsYWdWYWx1ZUxpc3QgewogICAgIHB1YiBoZWFkZXI6IEZsYWdWYWx1ZUhlYWRlciwKICAgICBwdWIgYm9vbGVhbnM6IFZlYzxib29sPiwKQEAgLTEzMSwxMiArMTMyLDMyIEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBjcmF0ZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0OworICAgIHVzZSBjcmF0ZTo6eworICAgICAgICB0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QsIERFRkFVTFRfRklMRV9WRVJTSU9OLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKKyAgICB9OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB2YWx1ZSBsaXN0IHNlcmlhbGl6YXRpb24KLSAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb24oKSB7Ci0gICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKTsKKyAgICAvLyBUT0RPOiBiLzM3NjEwODI2OCAtIFVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9kZWZhdWx0KCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKworICAgICAgICBsZXQgaGVhZGVyOiAmRmxhZ1ZhbHVlSGVhZGVyID0gJmZsYWdfdmFsdWVfbGlzdC5oZWFkZXI7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2J5dGVzID0gZmxhZ192YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfdmFsdWVfbGlzdCA9IEZsYWdWYWx1ZUxpc3Q6OmZyb21fYnl0ZXMoJmZsYWdfdmFsdWVfYnl0ZXMpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfdmFsdWVfbGlzdC5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmZmxhZ192YWx1ZV9saXN0LCAmcmVpbnRlcnByZXRlZF92YWx1ZV9saXN0LnVud3JhcCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX3ZhbHVlX2J5dGVzLmxlbigpIGFzIHUzMiwgaGVhZGVyLmZpbGVfc2l6ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB2YWx1ZSBsaXN0IHNlcmlhbGl6YXRpb24KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fbWF4KCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OKTsKIAogICAgICAgICBsZXQgaGVhZGVyOiAmRmxhZ1ZhbHVlSGVhZGVyID0gJmZsYWdfdmFsdWVfbGlzdC5oZWFkZXI7CiAgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CkBAIC0xNTQsMTcgKzE3NSwxNyBAQAogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoYXQgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2Ygc2VyaWFsaXplZAogICAgIC8vIGJ5dGVzCiAgICAgZm4gdGVzdF92ZXJzaW9uX251bWJlcigpIHsKLSAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7Ci0gICAgICAgIGxldCB2ZXJzaW9uID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKTsKLSAgICAgICAgYXNzZXJ0X2VxISh2ZXJzaW9uLCAxKTsKKyAgICAgICAgbGV0IHZlcnNpb25fZnJvbV9maWxlID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh2ZXJzaW9uX2Zyb21fZmlsZSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgIH0KIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmaWxlIHR5cGUgY2hlY2sKICAgICBmbiB0ZXN0X2ZpbGVfdHlwZV9jaGVjaygpIHsKLSAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKTsKKyAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBmbGFnX3ZhbHVlX2xpc3QuaGVhZGVyLmZpbGVfdHlwZSA9IDEyM3U4OwogICAgICAgICBsZXQgZXJyb3IgPSBGbGFnVmFsdWVMaXN0Ojpmcm9tX2J5dGVzKCZmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpKS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMKaW5kZXggMjZlOWMxYS4uZTk5MTMyMCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycwpAQCAtMzcsMjYgKzM3LDMzIEBACiBwdWIgbW9kIGZsYWdfdmFsdWU7CiBwdWIgbW9kIHBhY2thZ2VfdGFibGU7CiBwdWIgbW9kIHByb3RvczsKK3B1YiBtb2Qgc2lwX2hhc2hlcjEzOwogcHViIG1vZCB0ZXN0X3V0aWxzOwogCiB1c2UgYW55aG93Ojphbnlob3c7Cit1c2Ugc2VyZGU6OntEZXNlcmlhbGl6ZSwgU2VyaWFsaXplfTsKIHVzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Ci11c2Ugc3RkOjpjb2xsZWN0aW9uczo6aGFzaF9tYXA6OkRlZmF1bHRIYXNoZXI7CiB1c2Ugc3RkOjpmczo6RmlsZTsKLXVzZSBzdGQ6Omhhc2g6OntIYXNoLCBIYXNoZXJ9OwordXNlIHN0ZDo6aGFzaDo6SGFzaGVyOwogdXNlIHN0ZDo6aW86OlJlYWQ7CiAKIHB1YiB1c2UgY3JhdGU6OmZsYWdfaW5mbzo6e0ZsYWdJbmZvQml0LCBGbGFnSW5mb0hlYWRlciwgRmxhZ0luZm9MaXN0LCBGbGFnSW5mb05vZGV9OwogcHViIHVzZSBjcmF0ZTo6ZmxhZ190YWJsZTo6e0ZsYWdUYWJsZSwgRmxhZ1RhYmxlSGVhZGVyLCBGbGFnVGFibGVOb2RlfTsKIHB1YiB1c2UgY3JhdGU6OmZsYWdfdmFsdWU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3R9OwogcHViIHVzZSBjcmF0ZTo6cGFja2FnZV90YWJsZTo6e1BhY2thZ2VUYWJsZSwgUGFja2FnZVRhYmxlSGVhZGVyLCBQYWNrYWdlVGFibGVOb2RlfTsKK3B1YiB1c2UgY3JhdGU6OnNpcF9oYXNoZXIxMzo6U2lwSGFzaGVyMTM7CiAKIHVzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjo6ewogICAgIEJ5dGVzUGFyc2VGYWlsLCBIYXNoVGFibGVTaXplTGltaXQsIEludmFsaWRGbGFnVmFsdWVUeXBlLCBJbnZhbGlkU3RvcmVkRmxhZ1R5cGUsCiB9OwogCi0vLy8gU3RvcmFnZSBmaWxlIHZlcnNpb24KLXB1YiBjb25zdCBGSUxFX1ZFUlNJT046IHUzMiA9IDE7CisvLy8gVGhlIG1heCBzdG9yYWdlIGZpbGUgdmVyc2lvbiBmcm9tIHdoaWNoIHdlIGNhbiBzYWZlbHkgcmVhZC93cml0ZS4gTWF5IGJlCisvLy8gZXhwZXJpbWVudGFsLgorcHViIGNvbnN0IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OOiB1MzIgPSAyOworCisvLy8gVGhlIG5ld2VzdCBmdWxseS1yZWxlYXNlZCB2ZXJzaW9uLiBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgdGhpcyBpcyB0aGUKKy8vLyB2ZXJzaW9uIHdlIHdpbGwgd3JpdGUuCitwdWIgY29uc3QgREVGQVVMVF9GSUxFX1ZFUlNJT046IHUzMiA9IDE7CiAKIC8vLyBHb29kIGhhc2ggdGFibGUgcHJpbWUgbnVtYmVyCiBwdWIoY3JhdGUpIGNvbnN0IEhBU0hfUFJJTUVTOiBbdTMyOyAyOV0gPSBbCkBAIC0xMDYsNyArMTEzLDcgQEAKIAogLy8vIEZsYWcgdHlwZSBlbnVtIGFzIHN0b3JlZCBieSBzdG9yYWdlIGZpbGUKIC8vLyBPTkxZIEFQUEVORCwgTkVWRVIgUkVNT1ZFIEZPUiBCQUNLV0FSRCBDT01QQVRJQklMSVRZLiBUSEUgTUFYIElTIFUxNi4KLSNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgUGFydGlhbEVxLCBFcSldCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIFBhcnRpYWxFcSwgRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIGVudW0gU3RvcmVkRmxhZ1R5cGUgewogICAgIFJlYWRXcml0ZUJvb2xlYW4gPSAwLAogICAgIFJlYWRPbmx5Qm9vbGVhbiA9IDEsCkBAIC0yMTEsMTAgKzIxOCwxMiBAQAogfQogCiAvLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGJ1Y2tldCBpbmRleCBnaXZlbiB0aGUga2V5IGFuZCBudW1iZXIgb2YgYnVja2V0cwotcHViKGNyYXRlKSBmbiBnZXRfYnVja2V0X2luZGV4PFQ6IEhhc2g+KHZhbDogJlQsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7Ci0gICAgbGV0IG11dCBzID0gRGVmYXVsdEhhc2hlcjo6bmV3KCk7Ci0gICAgdmFsLmhhc2goJm11dCBzKTsKLSAgICAocy5maW5pc2goKSAlIG51bV9idWNrZXRzIGFzIHU2NCkgYXMgdTMyCitwdWIoY3JhdGUpIGZuIGdldF9idWNrZXRfaW5kZXgodmFsOiAmW3U4XSwgbnVtX2J1Y2tldHM6IHUzMikgLT4gdTMyIHsKKyAgICBsZXQgbXV0IHMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgcy53cml0ZSh2YWwpOworICAgIHMud3JpdGVfdTgoMHhmZik7CisgICAgbGV0IHJldCA9IChzLmZpbmlzaCgpICUgbnVtX2J1Y2tldHMgYXMgdTY0KSBhcyB1MzI7CisgICAgcmV0CiB9CiAKIC8vLyBSZWFkIGFuZCBwYXJzZSBieXRlcyBhcyB1OApAQCAtMjQwLDYgKzI0OSwxMSBAQAogICAgIE9rKHZhbCkKIH0KIAorLy8vIFJlYWQgYW5kIHBhcnNlIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIGJ1ZiBhcyB1MzIuCitwdWIgZm4gcmVhZF91MzJfZnJvbV9zdGFydF9vZl9ieXRlcyhidWY6ICZbdThdKSAtPiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgcmVhZF91MzJfZnJvbV9ieXRlcyhidWYsICZtdXQgMCkKK30KKwogLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHUzMgogcHViIGZuIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnVmOiAmW3U4XSwgaGVhZDogJm11dCB1c2l6ZSkgLT4gUmVzdWx0PHUzMiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCB2YWwgPQpAQCAtMjUwLDYgKzI2NCwxNiBAQAogICAgIE9rKHZhbCkKIH0KIAorLy8gUmVhZCBhbmQgcGFyc2UgYnl0ZXMgYXMgdTY0CitwdWIgZm4gcmVhZF91NjRfZnJvbV9ieXRlcyhidWY6ICZbdThdLCBoZWFkOiAmbXV0IHVzaXplKSAtPiBSZXN1bHQ8dTY0LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IHZhbCA9CisgICAgICAgIHU2NDo6ZnJvbV9sZV9ieXRlcyhidWZbKmhlYWQuLipoZWFkICsgOF0udHJ5X2ludG8oKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIEJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoImZhaWwgdG8gcGFyc2UgdTY0IGZyb20gYnl0ZXM6IHt9IiwgZXJybXNnKSkKKyAgICAgICAgfSk/KTsKKyAgICAqaGVhZCArPSA4OworICAgIE9rKHZhbCkKK30KKwogLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHN0cmluZwogcHViKGNyYXRlKSBmbiByZWFkX3N0cl9mcm9tX2J5dGVzKAogICAgIGJ1ZjogJlt1OF0sCkBAIC01MTIsMTAgKzUzNiwxNSBAQAogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSBmbGFnIGxpc3QgYXBpCiAgICAgZm4gdGVzdF9saXN0X2ZsYWcoKSB7CiAgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0KLSAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBmbGFnX3RhYmxlID0gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkuaW50b19ieXRlcygpKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9Ci0gICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgKKyAgICAgICAgICAgICZjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CiAKICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcGF0aCA9IHBhY2thZ2VfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKICAgICAgICAgbGV0IGZsYWdfdGFibGVfcGF0aCA9IGZsYWdfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKQEAgLTU4MCwxMiArNjA5LDE5IEBACiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIGZsYWcgbGlzdCB3aXRoIGluZm8gYXBpCiAgICAgZm4gdGVzdF9saXN0X2ZsYWdfd2l0aF9pbmZvKCkgewogICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9Ci0gICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPQotICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPQotICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgKKyAgICAgICAgICAgICZjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgKKyAgICAgICAgICAgICZjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKIAogICAgICAgICBsZXQgcGFja2FnZV90YWJsZV9wYXRoID0gcGFja2FnZV90YWJsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOwogICAgICAgICBsZXQgZmxhZ190YWJsZV9wYXRoID0gZmxhZ190YWJsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL21haW4ucnMKaW5kZXggOGI5ZTM4ZC4uYTljZmQxOSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbWFpbi5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9tYWluLnJzCkBAIC0yMCw5ICsyMCwyOSBAQAogICAgIGxpc3RfZmxhZ3MsIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvLCByZWFkX2ZpbGVfdG9fYnl0ZXMsIEFjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdJbmZvTGlzdCwKICAgICBGbGFnVGFibGUsIEZsYWdWYWx1ZUxpc3QsIFBhY2thZ2VUYWJsZSwgU3RvcmFnZUZpbGVUeXBlLAogfTsKLQogdXNlIGNsYXA6OntidWlsZGVyOjpBcmdBY3Rpb24sIEFyZywgQ29tbWFuZH07Cit1c2Ugc2VyZGU6OlNlcmlhbGl6ZTsKK3VzZSBzZXJkZV9qc29uOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6ZnM7Cit1c2Ugc3RkOjpmczo6RmlsZTsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKIAorLyoqCisgKiBVc2FnZSBFeGFtcGxlcworICoKKyAqIFByaW50IGZpbGU6CisgKiAkIGFjb25maWctc3RvcmFnZSBwcmludCAtLWZpbGU9cGF0aC90by9mbGFnLm1hcCAtLXR5cGU9ZmxhZ19tYXAKKyAqCisgKiBMaXN0IGZsYWdzOgorICogJCBhY29uZmlnLXN0b3JhZ2UgbGlzdCAtLWZsYWctbWFwPXBhdGgvdG8vZmxhZy5tYXAgXAorICogLS1mbGFnLXZhbD1wYXRoL3RvL2ZsYWcudmFsIC0tcGFja2FnZS1tYXA9cGF0aC90by9wYWNrYWdlLm1hcAorICoKKyAqIFdyaXRlIGJpbmFyeSBmaWxlIGZvciB0ZXN0aW5nOgorICogJCBhY29uZmlnLXN0b3JhZ2UgcHJpbnQgLS1maWxlPXBhdGgvdG8vZmxhZy5tYXAgLS10eXBlPWZsYWdfbWFwIC0tZm9ybWF0PWpzb24gPiBmbGFnX21hcC5qc29uCisgKiAkIHZpbSBmbGFnX21hcC5qc29uIC8vIE1hbnVhbGx5IG1ha2UgdXBkYXRlcworICogJCBhY29uZmlnLXN0b3JhZ2Ugd3JpdGUtYnl0ZXMgLS1pbnB1dC1maWxlPWZsYWdfbWFwLmpzb24gLS1vdXRwdXQtZmlsZT1wYXRoL3RvL2ZsYWcubWFwIC0tdHlwZT1mbGFnX21hcAorICovCiBmbiBjbGkoKSAtPiBDb21tYW5kIHsKICAgICBDb21tYW5kOjpuZXcoImFjb25maWctc3RvcmFnZSIpCiAgICAgICAgIC5zdWJjb21tYW5kX3JlcXVpcmVkKHRydWUpCkBAIC0zNCw3ICs1NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygidHlwZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWlyZWQodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20ocykpLAotICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImZvcm1hdCIpLmxvbmcoImZvcm1hdCIpLnJlcXVpcmVkKGZhbHNlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpKSwKICAgICAgICAgKQogICAgICAgICAuc3ViY29tbWFuZCgKICAgICAgICAgICAgIENvbW1hbmQ6Om5ldygibGlzdCIpCkBAIC01MCw0MSArNzEsNzUgQEAKICAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImZsYWctaW5mbyIpLmxvbmcoImZsYWctaW5mbyIpLnJlcXVpcmVkKGZhbHNlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpLAogICAgICAgICAgICAgICAgICksCiAgICAgICAgICkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoIndyaXRlLWJ5dGVzIikKKyAgICAgICAgICAgICAgICAvLyBXaGVyZSB0byB3cml0ZSB0aGUgb3V0cHV0IGJ5dGVzLiBTdWdnZXN0IHRvIHVzZSB0aGUgU3RvcmFnZUZpbGVUeXBlIG5hbWVzIChlLmcuIGZsYWcubWFwKS4KKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygib3V0cHV0LWZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoIm91dHB1dC1maWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1aXJlZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGlvbihBcmdBY3Rpb246OlNldCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC8vIElucHV0IGZpbGUgc2hvdWxkIGJlIGpzb24uCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImlucHV0LWZpbGUiKS5sb25nKCJpbnB1dC1maWxlIikucmVxdWlyZWQodHJ1ZSkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmVkKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHMpKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCiB9CiAKIGZuIHByaW50X3N0b3JhZ2VfZmlsZSgKICAgICBmaWxlX3BhdGg6ICZzdHIsCiAgICAgZmlsZV90eXBlOiAmU3RvcmFnZUZpbGVUeXBlLAorICAgIGFzX2pzb246IGJvb2wsCiApIC0+IFJlc3VsdDwoKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCBieXRlcyA9IHJlYWRfZmlsZV90b19ieXRlcyhmaWxlX3BhdGgpPzsKICAgICBtYXRjaCBmaWxlX3R5cGUgewogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4gewogICAgICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJmJ5dGVzKT87Ci0gICAgICAgICAgICBwcmludGxuISgiezo/fSIsIHBhY2thZ2VfdGFibGUpOworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KHBhY2thZ2VfdGFibGUsIGFzX2pzb24pKTsKICAgICAgICAgfQogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4gewogICAgICAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJmJ5dGVzKT87Ci0gICAgICAgICAgICBwcmludGxuISgiezo/fSIsIGZsYWdfdGFibGUpOworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KGZsYWdfdGFibGUsIGFzX2pzb24pKTsKICAgICAgICAgfQogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgPT4gewogICAgICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBGbGFnVmFsdWVMaXN0Ojpmcm9tX2J5dGVzKCZieXRlcyk/OwotICAgICAgICAgICAgcHJpbnRsbiEoIns6P30iLCBmbGFnX3ZhbHVlKTsKKyAgICAgICAgICAgIHByaW50bG4hKCJ7fSIsIHRvX3ByaW50X2Zvcm1hdChmbGFnX3ZhbHVlLCBhc19qc29uKSk7CiAgICAgICAgIH0KICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyA9PiB7CiAgICAgICAgICAgICBsZXQgZmxhZ19pbmZvID0gRmxhZ0luZm9MaXN0Ojpmcm9tX2J5dGVzKCZieXRlcyk/OwotICAgICAgICAgICAgcHJpbnRsbiEoIns6P30iLCBmbGFnX2luZm8pOworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KGZsYWdfaW5mbywgYXNfanNvbikpOwogICAgICAgICB9CiAgICAgfQogICAgIE9rKCgpKQogfQogCitmbiB0b19wcmludF9mb3JtYXQ8VD4oZmlsZV9jb250ZW50czogVCwgYXNfanNvbjogYm9vbCkgLT4gU3RyaW5nCit3aGVyZQorICAgIFQ6IFNlcmlhbGl6ZSArIGZtdDo6RGVidWcsCit7CisgICAgaWYgYXNfanNvbiB7CisgICAgICAgIHNlcmRlX2pzb246OnRvX3N0cmluZygmZmlsZV9jb250ZW50cykudW53cmFwKCkKKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZmlsZV9jb250ZW50cykKKyAgICB9Cit9CisKIGZuIG1haW4oKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKICAgICBsZXQgbWF0Y2hlcyA9IGNsaSgpLmdldF9tYXRjaGVzKCk7CiAgICAgbWF0Y2ggbWF0Y2hlcy5zdWJjb21tYW5kKCkgewogICAgICAgICBTb21lKCgicHJpbnQiLCBzdWJfbWF0Y2hlcykpID0+IHsKICAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmlsZSIpLnVud3JhcCgpOwogICAgICAgICAgICAgbGV0IGZpbGVfdHlwZSA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdG9yYWdlRmlsZVR5cGU+KCJ0eXBlIikudW53cmFwKCk7Ci0gICAgICAgICAgICBwcmludF9zdG9yYWdlX2ZpbGUoZmlsZV9wYXRoLCBmaWxlX3R5cGUpPworICAgICAgICAgICAgbGV0IGZvcm1hdCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJmb3JtYXQiKTsKKyAgICAgICAgICAgIGxldCBhc19qc29uOiBib29sID0gZm9ybWF0ID09IFNvbWUoJiJqc29uIi50b19zdHJpbmcoKSk7CisgICAgICAgICAgICBwcmludF9zdG9yYWdlX2ZpbGUoZmlsZV9wYXRoLCBmaWxlX3R5cGUsIGFzX2pzb24pPwogICAgICAgICB9CiAgICAgICAgIFNvbWUoKCJsaXN0Iiwgc3ViX21hdGNoZXMpKSA9PiB7CiAgICAgICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigicGFja2FnZS1tYXAiKS51bndyYXAoKTsKQEAgLTk2LDEwICsxNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gbGlzdF9mbGFnc193aXRoX2luZm8ocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCwgaW5mb19maWxlKT87CiAgICAgICAgICAgICAgICAgICAgIGZvciBmbGFnIGluIGZsYWdzLml0ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAie30ge30ge30gezo/fSBJc1JlYWRXcml0ZToge30sIEhhc1NlcnZlck92ZXJyaWRlOiB7fSwgSGFzTG9jYWxPdmVycmlkZToge30iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcucGFja2FnZV9uYW1lLCBmbGFnLmZsYWdfbmFtZSwgZmxhZy5mbGFnX3ZhbHVlLCBmbGFnLnZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5pc19yZWFkd3JpdGUsIGZsYWcuaGFzX3NlcnZlcl9vdmVycmlkZSwgZmxhZy5oYXNfbG9jYWxfb3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAie30ge30ge30gezo/fSBJc1JlYWRXcml0ZToge30sIEhhc1NlcnZlck92ZXJyaWRlOiB7fSwgSGFzTG9jYWxPdmVycmlkZToge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLnBhY2thZ2VfbmFtZSwgZmxhZy5mbGFnX25hbWUsIGZsYWcuZmxhZ192YWx1ZSwgZmxhZy52YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLmlzX3JlYWR3cml0ZSwgZmxhZy5oYXNfc2VydmVyX292ZXJyaWRlLCBmbGFnLmhhc19sb2NhbF9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIE5vbmUgPT4gewpAQCAtMTEzLDYgKzE2OCw0MCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0cyBKU09OIG9mIHRoZSBmaWxlIGludG8gcmF3IGJ5dGVzIChhcyBpcyB1c2VkIG9uLWRldmljZSkuCisgICAgICAgIC8vIEludGVuZGVkIHRvIGdlbmVyYXRlL2Vhc2lseSB1cGRhdGUgdGhlc2UgZmlsZXMgZm9yIHRlc3RpbmcuCisgICAgICAgIFNvbWUoKCJ3cml0ZS1ieXRlcyIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGlucHV0X2ZpbGVfcGF0aCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJpbnB1dC1maWxlIikudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgaW5wdXRfanNvbiA9IGZzOjpyZWFkX3RvX3N0cmluZyhpbnB1dF9maWxlX3BhdGgpLnVud3JhcCgpOworCisgICAgICAgICAgICBsZXQgZmlsZV90eXBlID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0b3JhZ2VGaWxlVHlwZT4oInR5cGUiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBvdXRwdXRfYnl0ZXM6IFZlYzx1OD47CisgICAgICAgICAgICBtYXRjaCBmaWxlX3R5cGUgeworICAgICAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBGbGFnVmFsdWVMaXN0ID0gc2VyZGVfanNvbjo6ZnJvbV9zdHIoJmlucHV0X2pzb24pLnVud3JhcCgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnl0ZXMgPSBsaXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBGbGFnSW5mb0xpc3QgPSBzZXJkZV9qc29uOjpmcm9tX3N0cigmaW5wdXRfanNvbikudW53cmFwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9ieXRlcyA9IGxpc3QuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgdGFibGU6IEZsYWdUYWJsZSA9IHNlcmRlX2pzb246OmZyb21fc3RyKCZpbnB1dF9qc29uKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J5dGVzID0gdGFibGUuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgdGFibGU6IFBhY2thZ2VUYWJsZSA9IHNlcmRlX2pzb246OmZyb21fc3RyKCZpbnB1dF9qc29uKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J5dGVzID0gdGFibGUuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IG91dHB1dF9maWxlX3BhdGggPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigib3V0cHV0LWZpbGUiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBmaWxlID0gRmlsZTo6Y3JlYXRlKG91dHB1dF9maWxlX3BhdGgpOworICAgICAgICAgICAgaWYgZmlsZS5pc19lcnIoKSB7CisgICAgICAgICAgICAgICAgcGFuaWMhKCJjYW4ndCBtYWtlIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBfID0gZmlsZS51bndyYXAoKS53cml0ZV9hbGwoJm91dHB1dF9ieXRlcyk7CisgICAgICAgIH0KICAgICAgICAgXyA9PiB1bnJlYWNoYWJsZSEoKSwKICAgICB9CiAgICAgT2soKCkpCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcGFja2FnZV90YWJsZS5ycwppbmRleCBiNzM0OTcyLi4yMTM1N2M3IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3BhY2thZ2VfdGFibGUucnMKQEAgLTE3LDEzICsxNywxNyBAQAogLy8hIHBhY2thZ2UgdGFibGUgbW9kdWxlIGRlZmluZXMgdGhlIHBhY2thZ2UgdGFibGUgZmlsZSBmb3JtYXQgYW5kIG1ldGhvZHMgZm9yIHNlcmlhbGl6YXRpb24KIC8vISBhbmQgZGVzZXJpYWxpemF0aW9uCiAKLXVzZSBjcmF0ZTo6e2dldF9idWNrZXRfaW5kZXgsIHJlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIHJlYWRfdThfZnJvbV9ieXRlc307Cit1c2UgY3JhdGU6OnsKKyAgICBnZXRfYnVja2V0X2luZGV4LCByZWFkX3N0cl9mcm9tX2J5dGVzLCByZWFkX3UzMl9mcm9tX2J5dGVzLCByZWFkX3U2NF9mcm9tX2J5dGVzLAorICAgIHJlYWRfdThfZnJvbV9ieXRlcywKK307CiB1c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGV9OwogdXNlIGFueWhvdzo6YW55aG93OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CiB1c2Ugc3RkOjpmbXQ7CiAKIC8vLyBQYWNrYWdlIHRhYmxlIGhlYWRlciBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBQYWNrYWdlVGFibGVIZWFkZXIgewogICAgIHB1YiB2ZXJzaW9uOiB1MzIsCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLApAQCAtOTIsMTAgKzk2LDExIEBACiB9CiAKIC8vLyBQYWNrYWdlIHRhYmxlIG5vZGUgc3RydWN0Ci0jW2Rlcml2ZShQYXJ0aWFsRXEpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgUGFja2FnZVRhYmxlTm9kZSB7CiAgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAogICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgcHViIGZpbmdlcnByaW50OiB1NjQsCiAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBib29sZWFuIGZsYWcgaW4gdGhpcyBhY29uZmlnIHBhY2thZ2UgYW1vbmcgYWxsIGJvb2xlYW4KICAgICAvLyBmbGFncyBpbiB0aGlzIGNvbnRhaW5lci4KICAgICBwdWIgYm9vbGVhbl9zdGFydF9pbmRleDogdTMyLApAQCAtMTA3LDggKzExMiwxMiBAQAogICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgewogICAgICAgICB3cml0ZWxuISgKICAgICAgICAgICAgIGYsCi0gICAgICAgICAgICAiUGFja2FnZToge30sIElkOiB7fSwgQm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4OiB7fSwgTmV4dDogezo/fSIsCi0gICAgICAgICAgICBzZWxmLnBhY2thZ2VfbmFtZSwgc2VsZi5wYWNrYWdlX2lkLCBzZWxmLmJvb2xlYW5fc3RhcnRfaW5kZXgsIHNlbGYubmV4dF9vZmZzZXQKKyAgICAgICAgICAgICJQYWNrYWdlOiB7fSwgSWQ6IHt9LCBGaW5nZXJwcmludDoge30sIEJvb2xlYW4gZmxhZyBzdGFydCBpbmRleDoge30sIE5leHQ6IHs6P30iLAorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX25hbWUsCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaWQsCisgICAgICAgICAgICBzZWxmLmZpbmdlcnByaW50LAorICAgICAgICAgICAgc2VsZi5ib29sZWFuX3N0YXJ0X2luZGV4LAorICAgICAgICAgICAgc2VsZi5uZXh0X29mZnNldAogICAgICAgICApPzsKICAgICAgICAgT2soKCkpCiAgICAgfQpAQCAtMTE2LDcgKzEyNSwxNiBAQAogCiBpbXBsIFBhY2thZ2VUYWJsZU5vZGUgewogICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKLSAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYsIHZlcnNpb246IHUzMikgLT4gVmVjPHU4PiB7CisgICAgICAgIG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTZWxmOjppbnRvX2J5dGVzX3YxKHNlbGYpLAorICAgICAgICAgICAgMiA9PiBTZWxmOjppbnRvX2J5dGVzX3YyKHNlbGYpLAorICAgICAgICAgICAgLy8gVE9ETyhiLzMxNjM1NzY4Nik6IGludG9fYnl0ZXMgc2hvdWxkIHJldHVybiBhIFJlc3VsdC4KKyAgICAgICAgICAgIF8gPT4gU2VsZjo6aW50b19ieXRlc192Migmc2VsZiksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBpbnRvX2J5dGVzX3YxKCZzZWxmKSAtPiBWZWM8dTg+IHsKICAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOwogICAgICAgICBsZXQgbmFtZV9ieXRlcyA9IHNlbGYucGFja2FnZV9uYW1lLmFzX2J5dGVzKCk7CiAgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKG5hbWVfYnl0ZXMubGVuKCkgYXMgdTMyKS50b19sZV9ieXRlcygpKTsKQEAgLTEyNywxOCArMTQ1LDYwIEBACiAgICAgICAgIHJlc3VsdAogICAgIH0KIAotICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCi0gICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZuIGludG9fYnl0ZXNfdjIoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGxldCBuYW1lX2J5dGVzID0gc2VsZi5wYWNrYWdlX25hbWUuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYobmFtZV9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UobmFtZV9ieXRlcyk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5wYWNrYWdlX2lkLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmluZ2VycHJpbnQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ib29sZWFuX3N0YXJ0X2luZGV4LnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubmV4dF9vZmZzZXQudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcyBiYXNlZCBvbiBmaWxlIHZlcnNpb24uCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdLCB2ZXJzaW9uOiB1MzIpIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTZWxmOjpmcm9tX2J5dGVzX3YxKGJ5dGVzKSwKKyAgICAgICAgICAgIDIgPT4gU2VsZjo6ZnJvbV9ieXRlc192MihieXRlcyksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgICAgICJCaW5hcnkgZmlsZSBpcyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uOiB7fSIsCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24KKyAgICAgICAgICAgICAgICApKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGZyb21fYnl0ZXNfdjEoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOwotICAgICAgICBsZXQgbm9kZSA9IFNlbGYgewotICAgICAgICAgICAgcGFja2FnZV9uYW1lOiByZWFkX3N0cl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKLSAgICAgICAgICAgIHBhY2thZ2VfaWQ6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAotICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCi0gICAgICAgICAgICBuZXh0X29mZnNldDogbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8gewotICAgICAgICAgICAgICAgIDAgPT4gTm9uZSwKLSAgICAgICAgICAgICAgICB2YWwgPT4gU29tZSh2YWwpLAotICAgICAgICAgICAgfSwKKyAgICAgICAgbGV0IHBhY2thZ2VfbmFtZSA9IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgcGFja2FnZV9pZCA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICAvLyB2MSBkb2VzIG5vdCBoYXZlIGZpbmdlcnByaW50LCBzbyBqdXN0IHNldCB0byAwLgorICAgICAgICBsZXQgZmluZ2VycHJpbnQ6IHU2NCA9IDA7CisgICAgICAgIGxldCBib29sZWFuX3N0YXJ0X2luZGV4ID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT87CisgICAgICAgIGxldCBuZXh0X29mZnNldCA9IG1hdGNoIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/IHsKKyAgICAgICAgICAgIDAgPT4gTm9uZSwKKyAgICAgICAgICAgIHZhbCA9PiBTb21lKHZhbCksCiAgICAgICAgIH07CisKKyAgICAgICAgbGV0IG5vZGUgPSBTZWxmIHsgcGFja2FnZV9uYW1lLCBwYWNrYWdlX2lkLCBmaW5nZXJwcmludCwgYm9vbGVhbl9zdGFydF9pbmRleCwgbmV4dF9vZmZzZXQgfTsKKyAgICAgICAgT2sobm9kZSkKKyAgICB9CisKKyAgICBmbiBmcm9tX2J5dGVzX3YyKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IHBhY2thZ2VfbmFtZSA9IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgcGFja2FnZV9pZCA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgZmluZ2VycHJpbnQgPSByZWFkX3U2NF9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPzsKKyAgICAgICAgbGV0IGJvb2xlYW5fc3RhcnRfaW5kZXggPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPzsKKyAgICAgICAgbGV0IG5leHRfb2Zmc2V0ID0gbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8geworICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgdmFsID0+IFNvbWUodmFsKSwKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgbm9kZSA9IFNlbGYgeyBwYWNrYWdlX25hbWUsIHBhY2thZ2VfaWQsIGZpbmdlcnByaW50LCBib29sZWFuX3N0YXJ0X2luZGV4LCBuZXh0X29mZnNldCB9OwogICAgICAgICBPayhub2RlKQogICAgIH0KIApAQCAtMTQ2LDEyICsyMDYsMTIgQEAKICAgICAvLy8gY29uc3RydWN0aW9uIHNpZGUgKGFjb25maWcgYmluYXJ5KSBhbmQgY29uc3VtcHRpb24gc2lkZSAoZmxhZyByZWFkIGxpYikKICAgICAvLy8gdXNlIHRoZSBzYW1lIG1ldGhvZCBvZiBoYXNoaW5nCiAgICAgcHViIGZuIGZpbmRfYnVja2V0X2luZGV4KHBhY2thZ2U6ICZzdHIsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7Ci0gICAgICAgIGdldF9idWNrZXRfaW5kZXgoJnBhY2thZ2UsIG51bV9idWNrZXRzKQorICAgICAgICBnZXRfYnVja2V0X2luZGV4KHBhY2thZ2UuYXNfYnl0ZXMoKSwgbnVtX2J1Y2tldHMpCiAgICAgfQogfQogCiAvLy8gUGFja2FnZSB0YWJsZSBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBQYWNrYWdlVGFibGUgewogICAgIHB1YiBoZWFkZXI6IFBhY2thZ2VUYWJsZUhlYWRlciwKICAgICBwdWIgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiwKQEAgLTE3OSw3ICsyMzksMTEgQEAKICAgICAgICAgWwogICAgICAgICAgICAgc2VsZi5oZWFkZXIuaW50b19ieXRlcygpLAogICAgICAgICAgICAgc2VsZi5idWNrZXRzLml0ZXIoKS5tYXAofHZ8IHYudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCi0gICAgICAgICAgICBzZWxmLm5vZGVzLml0ZXIoKS5tYXAofHZ8IHYuaW50b19ieXRlcygpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLmNvbmNhdCgpLAorICAgICAgICAgICAgc2VsZi5ub2RlcworICAgICAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgICAgICAubWFwKHx2fCB2LmludG9fYnl0ZXMoc2VsZi5oZWFkZXIudmVyc2lvbikpCisgICAgICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCkKKyAgICAgICAgICAgICAgICAuY29uY2F0KCksCiAgICAgICAgIF0KICAgICAgICAgLmNvbmNhdCgpCiAgICAgfQpAQCAtMTk4LDggKzI2Miw4IEBACiAgICAgICAgICAgICAuY29sbGVjdCgpOwogICAgICAgICBsZXQgbm9kZXMgPSAoMC4ubnVtX3BhY2thZ2VzKQogICAgICAgICAgICAgLm1hcCh8X3wgewotICAgICAgICAgICAgICAgIGxldCBub2RlID0gUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmYnl0ZXNbaGVhZC4uXSk/OwotICAgICAgICAgICAgICAgIGhlYWQgKz0gbm9kZS5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZieXRlc1toZWFkLi5dLCBoZWFkZXIudmVyc2lvbik/OworICAgICAgICAgICAgICAgIGhlYWQgKz0gbm9kZS5pbnRvX2J5dGVzKGhlYWRlci52ZXJzaW9uKS5sZW4oKTsKICAgICAgICAgICAgICAgICBPayhub2RlKQogICAgICAgICAgICAgfSkKICAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+KCkKQEAgLTIxOSwxMSArMjgzLDEzIEBACiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGU7CisgICAgdXNlIGNyYXRlOjp7cmVhZF91MzJfZnJvbV9zdGFydF9vZl9ieXRlcywgREVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OfTsKIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgdGFibGUgc2VyaWFsaXphdGlvbgotICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbigpIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCk7CisgICAgLy8gVE9ETzogYi8zNzYxMDgyNjggLSBVc2UgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgbGV0IGhlYWRlcjogJlBhY2thZ2VUYWJsZUhlYWRlciA9ICZwYWNrYWdlX3RhYmxlLmhlYWRlcjsKICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gUGFja2FnZVRhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKICAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKQEAgLTIzMSw3ICsyOTcsMzIgQEAKIAogICAgICAgICBsZXQgbm9kZXM6ICZWZWM8UGFja2FnZVRhYmxlTm9kZT4gPSAmcGFja2FnZV90YWJsZS5ub2RlczsKICAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXMuaXRlcigpIHsKLSAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPSBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZub2RlLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9ub2RlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZub2RlLmludG9fYnl0ZXMoaGVhZGVyLnZlcnNpb24pLCBoZWFkZXIudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLCAmcmVpbnRlcnByZXRlZF9ub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX2J5dGVzID0gcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCByZWludGVycHJldGVkX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZwYWNrYWdlX3RhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX3RhYmxlLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZwYWNrYWdlX3RhYmxlLCAmcmVpbnRlcnByZXRlZF90YWJsZS51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZV9ieXRlcy5sZW4oKSBhcyB1MzIsIGhlYWRlci5maWxlX3NpemUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fbWF4KCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgaGVhZGVyOiAmUGFja2FnZVRhYmxlSGVhZGVyID0gJnBhY2thZ2VfdGFibGUuaGVhZGVyOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaGVhZGVyLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKGhlYWRlciwgJnJlaW50ZXJwcmV0ZWRfaGVhZGVyLnVud3JhcCgpKTsKKworICAgICAgICBsZXQgbm9kZXM6ICZWZWM8UGFja2FnZVRhYmxlTm9kZT4gPSAmcGFja2FnZV90YWJsZS5ub2RlczsKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcyhoZWFkZXIudmVyc2lvbiksIGhlYWRlci52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAudW53cmFwKCk7CiAgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUsICZyZWludGVycHJldGVkX25vZGUpOwogICAgICAgICB9CiAKQEAgLTI0NiwxNyArMzM3LDM2IEBACiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCiAgICAgLy8gYnl0ZXMKICAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgewotICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgbGV0IGJ5dGVzID0gJnBhY2thZ2VfdGFibGUuaW50b19ieXRlcygpOwotICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOwotICAgICAgICBsZXQgdmVyc2lvbiA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7Ci0gICAgICAgIGFzc2VydF9lcSEodmVyc2lvbiwgMSk7CisgICAgICAgIGxldCB1bnBhY2tlZF92ZXJzaW9uID0gcmVhZF91MzJfZnJvbV9zdGFydF9vZl9ieXRlcyhieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodW5wYWNrZWRfdmVyc2lvbiwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JvdW5kX3RyaXBfZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IHRhYmxlOiBQYWNrYWdlVGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IHRhYmxlX2J5dGVzID0gdGFibGUuaW50b19ieXRlcygpOworCisgICAgICAgIGxldCByZWludGVycHJldGVkX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZ0YWJsZV9ieXRlcykudW53cmFwKCk7CisKKyAgICAgICAgYXNzZXJ0X2VxISh0YWJsZSwgcmVpbnRlcnByZXRlZF90YWJsZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfcm91bmRfdHJpcF9tYXgoKSB7CisgICAgICAgIGxldCB0YWJsZTogUGFja2FnZVRhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGxldCB0YWJsZV9ieXRlcyA9IHRhYmxlLmludG9fYnl0ZXMoKTsKKworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF90YWJsZSA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmdGFibGVfYnl0ZXMpLnVud3JhcCgpOworCisgICAgICAgIGFzc2VydF9lcSEodGFibGUsIHJlaW50ZXJwcmV0ZWRfdGFibGUpOwogICAgIH0KIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmaWxlIHR5cGUgY2hlY2sKICAgICBmbiB0ZXN0X2ZpbGVfdHlwZV9jaGVjaygpIHsKLSAgICAgICAgbGV0IG11dCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOworICAgICAgICBsZXQgbXV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgcGFja2FnZV90YWJsZS5oZWFkZXIuZmlsZV90eXBlID0gMTIzdTg7CiAgICAgICAgIGxldCBlcnJvciA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCkpLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3NpcF9oYXNoZXIxMy5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3NpcF9oYXNoZXIxMy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUzMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvc2lwX2hhc2hlcjEzLnJzCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIEFuIGltcGxlbWVudGF0aW9uIG9mIFNpcEhhc2gxMworCit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjptZW07Cit1c2Ugc3RkOjpwdHI7Cit1c2Ugc3RkOjpzbGljZTsKKwordXNlIHN0ZDo6aGFzaDo6SGFzaGVyOworCisvLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgU2lwSGFzaCAyLTQuCisvLy8KKyNbZGVyaXZlKERlYnVnLCBDbG9uZSwgRGVmYXVsdCldCitwdWIgc3RydWN0IFNpcEhhc2hlcjEzIHsKKyAgICBrMDogdTY0LAorICAgIGsxOiB1NjQsCisgICAgbGVuZ3RoOiB1c2l6ZSwgLy8gaG93IG1hbnkgYnl0ZXMgd2UndmUgcHJvY2Vzc2VkCisgICAgc3RhdGU6IFN0YXRlLCAgLy8gaGFzaCBTdGF0ZQorICAgIHRhaWw6IHU2NCwgICAgIC8vIHVucHJvY2Vzc2VkIGJ5dGVzIGxlCisgICAgbnRhaWw6IHVzaXplLCAgLy8gaG93IG1hbnkgYnl0ZXMgaW4gdGFpbCBhcmUgdmFsaWQKK30KKworI1tkZXJpdmUoRGVidWcsIENsb25lLCBDb3B5LCBEZWZhdWx0KV0KKyNbcmVwcihDKV0KK3N0cnVjdCBTdGF0ZSB7CisgICAgLy8gdjAsIHYyIGFuZCB2MSwgdjMgc2hvdyB1cCBpbiBwYWlycyBpbiB0aGUgYWxnb3JpdGhtLAorICAgIC8vIGFuZCBzaW1kIGltcGxlbWVudGF0aW9ucyBvZiBTaXBIYXNoIHdpbGwgdXNlIHZlY3RvcnMKKyAgICAvLyBvZiB2MDIgYW5kIHYxMy4gQnkgcGxhY2luZyB0aGVtIGluIHRoaXMgb3JkZXIgaW4gdGhlIHN0cnVjdCwKKyAgICAvLyB0aGUgY29tcGlsZXIgY2FuIHBpY2sgdXAgb24ganVzdCBhIGZldyBzaW1kIG9wdGltaXphdGlvbnMgYnkgaXRzZWxmLgorICAgIHYwOiB1NjQsCisgICAgdjI6IHU2NCwKKyAgICB2MTogdTY0LAorICAgIHYzOiB1NjQsCit9CisKK21hY3JvX3J1bGVzISBjb21wcmVzcyB7CisgICAgKCRzdGF0ZTpleHByKSA9PiB7eworICAgICAgICBjb21wcmVzcyEoJHN0YXRlLnYwLCAkc3RhdGUudjEsICRzdGF0ZS52MiwgJHN0YXRlLnYzKQorICAgIH19OworICAgICgkdjA6ZXhwciwgJHYxOmV4cHIsICR2MjpleHByLCAkdjM6ZXhwcikgPT4ge3sKKyAgICAgICAgJHYwID0gJHYwLndyYXBwaW5nX2FkZCgkdjEpOworICAgICAgICAkdjEgPSAkdjEucm90YXRlX2xlZnQoMTMpOworICAgICAgICAkdjEgXj0gJHYwOworICAgICAgICAkdjAgPSAkdjAucm90YXRlX2xlZnQoMzIpOworICAgICAgICAkdjIgPSAkdjIud3JhcHBpbmdfYWRkKCR2Myk7CisgICAgICAgICR2MyA9ICR2My5yb3RhdGVfbGVmdCgxNik7CisgICAgICAgICR2MyBePSAkdjI7CisgICAgICAgICR2MCA9ICR2MC53cmFwcGluZ19hZGQoJHYzKTsKKyAgICAgICAgJHYzID0gJHYzLnJvdGF0ZV9sZWZ0KDIxKTsKKyAgICAgICAgJHYzIF49ICR2MDsKKyAgICAgICAgJHYyID0gJHYyLndyYXBwaW5nX2FkZCgkdjEpOworICAgICAgICAkdjEgPSAkdjEucm90YXRlX2xlZnQoMTcpOworICAgICAgICAkdjEgXj0gJHYyOworICAgICAgICAkdjIgPSAkdjIucm90YXRlX2xlZnQoMzIpOworICAgIH19OworfQorCisvLy8gTG9hZCBhbiBpbnRlZ2VyIG9mIHRoZSBkZXNpcmVkIHR5cGUgZnJvbSBhIGJ5dGUgc3RyZWFtLCBpbiBMRSBvcmRlci4gVXNlcworLy8vIGBjb3B5X25vbm92ZXJsYXBwaW5nYCB0byBsZXQgdGhlIGNvbXBpbGVyIGdlbmVyYXRlIHRoZSBtb3N0IGVmZmljaWVudCB3YXkKKy8vLyB0byBsb2FkIGl0IGZyb20gYSBwb3NzaWJseSB1bmFsaWduZWQgYWRkcmVzcy4KKy8vLworLy8vIFVuc2FmZSBiZWNhdXNlOiB1bmNoZWNrZWQgaW5kZXhpbmcgYXQgaS4uaStzaXplX29mKGludF90eSkKK21hY3JvX3J1bGVzISBsb2FkX2ludF9sZSB7CisgICAgKCRidWY6ZXhwciwgJGk6ZXhwciwgJGludF90eTppZGVudCkgPT4ge3sKKyAgICAgICAgZGVidWdfYXNzZXJ0ISgkaSArIG1lbTo6c2l6ZV9vZjo6PCRpbnRfdHk+KCkgPD0gJGJ1Zi5sZW4oKSk7CisgICAgICAgIGxldCBtdXQgZGF0YSA9IDAgYXMgJGludF90eTsKKyAgICAgICAgcHRyOjpjb3B5X25vbm92ZXJsYXBwaW5nKAorICAgICAgICAgICAgJGJ1Zi5nZXRfdW5jaGVja2VkKCRpKSwKKyAgICAgICAgICAgICZtdXQgZGF0YSBhcyAqbXV0IF8gYXMgKm11dCB1OCwKKyAgICAgICAgICAgIG1lbTo6c2l6ZV9vZjo6PCRpbnRfdHk+KCksCisgICAgICAgICk7CisgICAgICAgIGRhdGEudG9fbGUoKQorICAgIH19OworfQorCisvLy8gTG9hZCBhbiB1NjQgdXNpbmcgdXAgdG8gNyBieXRlcyBvZiBhIGJ5dGUgc2xpY2UuCisvLy8KKy8vLyBVbnNhZmUgYmVjYXVzZTogdW5jaGVja2VkIGluZGV4aW5nIGF0IHN0YXJ0Li5zdGFydCtsZW4KKyNbaW5saW5lXQordW5zYWZlIGZuIHU4dG82NF9sZShidWY6ICZbdThdLCBzdGFydDogdXNpemUsIGxlbjogdXNpemUpIC0+IHU2NCB7CisgICAgZGVidWdfYXNzZXJ0IShsZW4gPCA4KTsKKyAgICBsZXQgbXV0IGkgPSAwOyAvLyBjdXJyZW50IGJ5dGUgaW5kZXggKGZyb20gTFNCKSBpbiB0aGUgb3V0cHV0IHU2NAorICAgIGxldCBtdXQgb3V0ID0gMDsKKyAgICBpZiBpICsgMyA8IGxlbiB7CisgICAgICAgIG91dCA9IGxvYWRfaW50X2xlIShidWYsIHN0YXJ0ICsgaSwgdTMyKSBhcyB1NjQ7CisgICAgICAgIGkgKz0gNDsKKyAgICB9CisgICAgaWYgaSArIDEgPCBsZW4geworICAgICAgICBvdXQgfD0gKGxvYWRfaW50X2xlIShidWYsIHN0YXJ0ICsgaSwgdTE2KSBhcyB1NjQpIDw8IChpICogOCk7CisgICAgICAgIGkgKz0gMgorICAgIH0KKyAgICBpZiBpIDwgbGVuIHsKKyAgICAgICAgb3V0IHw9ICgqYnVmLmdldF91bmNoZWNrZWQoc3RhcnQgKyBpKSBhcyB1NjQpIDw8IChpICogOCk7CisgICAgICAgIGkgKz0gMTsKKyAgICB9CisgICAgZGVidWdfYXNzZXJ0X2VxIShpLCBsZW4pOworICAgIG91dAorfQorCitpbXBsIFNpcEhhc2hlcjEzIHsKKyAgICAvLy8gQ3JlYXRlcyBhIG5ldyBgU2lwSGFzaGVyMTNgIHdpdGggdGhlIHR3byBpbml0aWFsIGtleXMgc2V0IHRvIDAuCisgICAgI1tpbmxpbmVdCisgICAgcHViIGZuIG5ldygpIC0+IFNpcEhhc2hlcjEzIHsKKyAgICAgICAgU2lwSGFzaGVyMTM6Om5ld193aXRoX2tleXMoMCwgMCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlcyBhIGBTaXBIYXNoZXIxM2AgdGhhdCBpcyBrZXllZCBvZmYgdGhlIHByb3ZpZGVkIGtleXMuCisgICAgI1tpbmxpbmVdCisgICAgcHViIGZuIG5ld193aXRoX2tleXMoa2V5MDogdTY0LCBrZXkxOiB1NjQpIC0+IFNpcEhhc2hlcjEzIHsKKyAgICAgICAgbGV0IG11dCBzaXBfaGFzaGVyID0gU2lwSGFzaGVyMTMgeworICAgICAgICAgICAgazA6IGtleTAsCisgICAgICAgICAgICBrMToga2V5MSwKKyAgICAgICAgICAgIGxlbmd0aDogMCwKKyAgICAgICAgICAgIHN0YXRlOiBTdGF0ZSB7IHYwOiAwLCB2MTogMCwgdjI6IDAsIHYzOiAwIH0sCisgICAgICAgICAgICB0YWlsOiAwLAorICAgICAgICAgICAgbnRhaWw6IDAsCisgICAgICAgIH07CisgICAgICAgIHNpcF9oYXNoZXIucmVzZXQoKTsKKyAgICAgICAgc2lwX2hhc2hlcgorICAgIH0KKworICAgICNbaW5saW5lXQorICAgIGZuIGNfcm91bmRzKHN0YXRlOiAmbXV0IFN0YXRlKSB7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgfQorCisgICAgI1tpbmxpbmVdCisgICAgZm4gZF9yb3VuZHMoc3RhdGU6ICZtdXQgU3RhdGUpIHsKKyAgICAgICAgY29tcHJlc3MhKHN0YXRlKTsKKyAgICAgICAgY29tcHJlc3MhKHN0YXRlKTsKKyAgICAgICAgY29tcHJlc3MhKHN0YXRlKTsKKyAgICB9CisKKyAgICAjW2lubGluZV0KKyAgICBmbiByZXNldCgmbXV0IHNlbGYpIHsKKyAgICAgICAgc2VsZi5sZW5ndGggPSAwOworICAgICAgICBzZWxmLnN0YXRlLnYwID0gc2VsZi5rMCBeIDB4NzM2ZjZkNjU3MDczNjU3NTsKKyAgICAgICAgc2VsZi5zdGF0ZS52MSA9IHNlbGYuazEgXiAweDY0NmY3MjYxNmU2NDZmNmQ7CisgICAgICAgIHNlbGYuc3RhdGUudjIgPSBzZWxmLmswIF4gMHg2Yzc5Njc2NTZlNjU3MjYxOworICAgICAgICBzZWxmLnN0YXRlLnYzID0gc2VsZi5rMSBeIDB4NzQ2NTY0NjI3OTc0NjU3MzsKKyAgICAgICAgc2VsZi5udGFpbCA9IDA7CisgICAgfQorCisgICAgLy8gU3BlY2lhbGl6ZWQgd3JpdGUgZnVuY3Rpb24gdGhhdCBpcyBvbmx5IHZhbGlkIGZvciBidWZmZXJzIHdpdGggbGVuIDw9IDguCisgICAgLy8gSXQncyB1c2VkIHRvIGZvcmNlIGlubGluaW5nIG9mIHdyaXRlX3U4IGFuZCB3cml0ZV91c2l6ZSwgdGhvc2Ugd291bGQgbm9ybWFsbHkgYmUgaW5saW5lZAorICAgIC8vIGV4Y2VwdCBmb3IgY29tcG9zaXRlIHR5cGVzICh0aGF0IGluY2x1ZGVzIHNsaWNlcyBhbmQgc3RyIGhhc2hpbmcgYmVjYXVzZSBvZiBkZWxpbWl0ZXIpLgorICAgIC8vIFdpdGhvdXQgdGhpcyBleHRyYSBwdXNoIHRoZSBjb21waWxlciBpcyB2ZXJ5IHJlbHVjdGFudCB0byBpbmxpbmUgZGVsaW1pdGVyIHdyaXRlcywKKyAgICAvLyBkZWdyYWRpbmcgcGVyZm9ybWFuY2Ugc3Vic3RhbnRpYWxseSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlcy4KKyAgICAjW2lubGluZV0KKyAgICBmbiBzaG9ydF93cml0ZSgmbXV0IHNlbGYsIG1zZzogJlt1OF0pIHsKKyAgICAgICAgZGVidWdfYXNzZXJ0IShtc2cubGVuKCkgPD0gOCk7CisgICAgICAgIGxldCBsZW5ndGggPSBtc2cubGVuKCk7CisgICAgICAgIHNlbGYubGVuZ3RoICs9IGxlbmd0aDsKKworICAgICAgICBsZXQgbmVlZGVkID0gOCAtIHNlbGYubnRhaWw7CisgICAgICAgIGxldCBmaWxsID0gY21wOjptaW4obGVuZ3RoLCBuZWVkZWQpOworICAgICAgICBpZiBmaWxsID09IDggeworICAgICAgICAgICAgLy8gc2FmZSB0byBjYWxsIHNpbmNlIG1zZyBoYXNuJ3QgYmVlbiBsb2FkZWQKKyAgICAgICAgICAgIHNlbGYudGFpbCA9IHVuc2FmZSB7IGxvYWRfaW50X2xlIShtc2csIDAsIHU2NCkgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNhZmUgdG8gY2FsbCBzaW5jZSBtc2cgaGFzbid0IGJlZW4gbG9hZGVkLCBhbmQgZmlsbCA8PSBtc2cubGVuKCkKKyAgICAgICAgICAgIHNlbGYudGFpbCB8PSB1bnNhZmUgeyB1OHRvNjRfbGUobXNnLCAwLCBmaWxsKSB9IDw8ICg4ICogc2VsZi5udGFpbCk7CisgICAgICAgICAgICBpZiBsZW5ndGggPCBuZWVkZWQgeworICAgICAgICAgICAgICAgIHNlbGYubnRhaWwgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZWxmLnN0YXRlLnYzIF49IHNlbGYudGFpbDsKKyAgICAgICAgU2VsZjo6Y19yb3VuZHMoJm11dCBzZWxmLnN0YXRlKTsKKyAgICAgICAgc2VsZi5zdGF0ZS52MCBePSBzZWxmLnRhaWw7CisKKyAgICAgICAgLy8gQnVmZmVyZWQgdGFpbCBpcyBub3cgZmx1c2hlZCwgcHJvY2VzcyBuZXcgaW5wdXQuCisgICAgICAgIHNlbGYubnRhaWwgPSBsZW5ndGggLSBuZWVkZWQ7CisgICAgICAgIC8vIHNhZmUgdG8gY2FsbCBzaW5jZSBudW1iZXIgb2YgYG5lZWRlZGAgYnl0ZXMgaGFzIGJlZW4gbG9hZGVkCisgICAgICAgIC8vIGFuZCBzZWxmLm50YWlsICsgbmVlZGVkID09IG1zZy5sZW4oKQorICAgICAgICBzZWxmLnRhaWwgPSB1bnNhZmUgeyB1OHRvNjRfbGUobXNnLCBuZWVkZWQsIHNlbGYubnRhaWwpIH07CisgICAgfQorfQorCitpbXBsIEhhc2hlciBmb3IgU2lwSGFzaGVyMTMgeworICAgIC8vIHNlZSBzaG9ydF93cml0ZSBjb21tZW50IGZvciBleHBsYW5hdGlvbgorICAgICNbaW5saW5lXQorICAgIGZuIHdyaXRlX3VzaXplKCZtdXQgc2VsZiwgaTogdXNpemUpIHsKKyAgICAgICAgLy8gc2FmZSB0byBjYWxsLCBzaW5jZSBjb252ZXJ0IHRoZSBwb2ludGVyIHRvIHU4CisgICAgICAgIGxldCBieXRlcyA9IHVuc2FmZSB7CisgICAgICAgICAgICBzbGljZTo6ZnJvbV9yYXdfcGFydHMoJmkgYXMgKmNvbnN0IHVzaXplIGFzICpjb25zdCB1OCwgbWVtOjpzaXplX29mOjo8dXNpemU+KCkpCisgICAgICAgIH07CisgICAgICAgIHNlbGYuc2hvcnRfd3JpdGUoYnl0ZXMpOworICAgIH0KKworICAgIC8vIHNlZSBzaG9ydF93cml0ZSBjb21tZW50IGZvciBleHBsYW5hdGlvbgorICAgICNbaW5saW5lXQorICAgIGZuIHdyaXRlX3U4KCZtdXQgc2VsZiwgaTogdTgpIHsKKyAgICAgICAgc2VsZi5zaG9ydF93cml0ZSgmW2ldKTsKKyAgICB9CisKKyAgICAjW2lubGluZV0KKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIG1zZzogJlt1OF0pIHsKKyAgICAgICAgbGV0IGxlbmd0aCA9IG1zZy5sZW4oKTsKKyAgICAgICAgc2VsZi5sZW5ndGggKz0gbGVuZ3RoOworCisgICAgICAgIGxldCBtdXQgbmVlZGVkID0gMDsKKworICAgICAgICAvLyBsb2FkaW5nIHVucHJvY2Vzc2VkIGJ5dGUgZnJvbSBsYXN0IHdyaXRlCisgICAgICAgIGlmIHNlbGYubnRhaWwgIT0gMCB7CisgICAgICAgICAgICBuZWVkZWQgPSA4IC0gc2VsZi5udGFpbDsKKyAgICAgICAgICAgIC8vIHNhZmUgdG8gY2FsbCwgc2luY2UgbXNnIGhhc24ndCBiZWVuIHByb2Nlc3NlZAorICAgICAgICAgICAgLy8gYW5kIGNtcDo6bWluKGxlbmd0aCwgbmVlZGVkKSA8IDgKKyAgICAgICAgICAgIHNlbGYudGFpbCB8PSB1bnNhZmUgeyB1OHRvNjRfbGUobXNnLCAwLCBjbXA6Om1pbihsZW5ndGgsIG5lZWRlZCkpIH0gPDwgOCAqIHNlbGYubnRhaWw7CisgICAgICAgICAgICBpZiBsZW5ndGggPCBuZWVkZWQgeworICAgICAgICAgICAgICAgIHNlbGYubnRhaWwgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS52MyBePSBzZWxmLnRhaWw7CisgICAgICAgICAgICAgICAgU2VsZjo6Y19yb3VuZHMoJm11dCBzZWxmLnN0YXRlKTsKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLnYwIF49IHNlbGYudGFpbDsKKyAgICAgICAgICAgICAgICBzZWxmLm50YWlsID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1ZmZlcmVkIHRhaWwgaXMgbm93IGZsdXNoZWQsIHByb2Nlc3MgbmV3IGlucHV0LgorICAgICAgICBsZXQgbGVuID0gbGVuZ3RoIC0gbmVlZGVkOworICAgICAgICBsZXQgbGVmdCA9IGxlbiAmIDB4NzsKKworICAgICAgICBsZXQgbXV0IGkgPSBuZWVkZWQ7CisgICAgICAgIHdoaWxlIGkgPCBsZW4gLSBsZWZ0IHsKKyAgICAgICAgICAgIC8vIHNhZmUgdG8gY2FsbCBzaW5jZSBpZiBpIDwgbGVuIC0gbGVmdCwgaXQgbWVhbnMgbXNnIGhhcyBhdCBsZWFzdCAxIGJ5dGUgdG8gbG9hZAorICAgICAgICAgICAgbGV0IG1pID0gdW5zYWZlIHsgbG9hZF9pbnRfbGUhKG1zZywgaSwgdTY0KSB9OworCisgICAgICAgICAgICBzZWxmLnN0YXRlLnYzIF49IG1pOworICAgICAgICAgICAgU2VsZjo6Y19yb3VuZHMoJm11dCBzZWxmLnN0YXRlKTsKKyAgICAgICAgICAgIHNlbGYuc3RhdGUudjAgXj0gbWk7CisKKyAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhZmUgdG8gY2FsbCBzaW5jZSBpZiBsZWZ0ID09IDAsIHNpbmNlIHRoaXMgY2FsbCB3aWxsIGxvYWQgbm90aGluZworICAgICAgICAvLyBpZiBsZWZ0ID4gMCwgaXQgbWVhbnMgdGhlcmUgYXJlIG51bWJlciBvZiBgbGVmdGAgYnl0ZXMgaW4gbXNnCisgICAgICAgIHNlbGYudGFpbCA9IHVuc2FmZSB7IHU4dG82NF9sZShtc2csIGksIGxlZnQpIH07CisgICAgICAgIHNlbGYubnRhaWwgPSBsZWZ0OworICAgIH0KKworICAgICNbaW5saW5lXQorICAgIGZuIGZpbmlzaCgmc2VsZikgLT4gdTY0IHsKKyAgICAgICAgbGV0IG11dCBzdGF0ZSA9IHNlbGYuc3RhdGU7CisKKyAgICAgICAgbGV0IGI6IHU2NCA9ICgoc2VsZi5sZW5ndGggYXMgdTY0ICYgMHhmZikgPDwgNTYpIHwgc2VsZi50YWlsOworCisgICAgICAgIHN0YXRlLnYzIF49IGI7CisgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc3RhdGUpOworICAgICAgICBzdGF0ZS52MCBePSBiOworCisgICAgICAgIHN0YXRlLnYyIF49IDB4ZmY7CisgICAgICAgIFNlbGY6OmRfcm91bmRzKCZtdXQgc3RhdGUpOworCisgICAgICAgIHN0YXRlLnYwIF4gc3RhdGUudjEgXiBzdGF0ZS52MiBeIHN0YXRlLnYzCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgdXNlIHN0ZDo6aGFzaDo6e0hhc2gsIEhhc2hlcn07CisgICAgdXNlIHN0ZDo6c3RyaW5nOjpTdHJpbmc7CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIGZuIHRlc3Rfc2lwX2hhc2gxM19zdHJpbmdfaGFzaCgpIHsKKyAgICAgICAgbGV0IG11dCBzaXBfaGFzaDEzID0gU2lwSGFzaGVyMTM6Om5ldygpOworICAgICAgICBsZXQgdGVzdF9zdHIxID0gU3RyaW5nOjpmcm9tKCJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdCIpOworICAgICAgICB0ZXN0X3N0cjEuaGFzaCgmbXV0IHNpcF9oYXNoMTMpOworICAgICAgICBhc3NlcnRfZXEhKDE3ODk4ODM4NjY5MDY3MDY3NTg1LCBzaXBfaGFzaDEzLmZpbmlzaCgpKTsKKworICAgICAgICBsZXQgdGVzdF9zdHIyID0gU3RyaW5nOjpmcm9tKCJhZGZhZGZhZGYgYWRmYWZhZGFkZiAxMjMxMjQxMjQxIik7CisgICAgICAgIHRlc3Rfc3RyMi5oYXNoKCZtdXQgc2lwX2hhc2gxMyk7CisgICAgICAgIGFzc2VydF9lcSEoMTM1NDM1MTg5ODc2NzI4ODkzMTAsIHNpcF9oYXNoMTMuZmluaXNoKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NpcF9oYXNoMTNfd3JpdGUoKSB7CisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICAgICAgbGV0IHRlc3Rfc3RyMSA9IFN0cmluZzo6ZnJvbSgiY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QiKTsKKyAgICAgICAgc2lwX2hhc2gxMy53cml0ZSh0ZXN0X3N0cjEuYXNfYnl0ZXMoKSk7CisgICAgICAgIHNpcF9oYXNoMTMud3JpdGVfdTgoMHhmZik7CisgICAgICAgIGFzc2VydF9lcSEoMTc4OTg4Mzg2NjkwNjcwNjc1ODUsIHNpcF9oYXNoMTMuZmluaXNoKCkpOworCisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMzIgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjEgPSBTdHJpbmc6OmZyb20oImNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Iik7CisgICAgICAgIHNpcF9oYXNoMTMyLndyaXRlKHRlc3Rfc3RyMS5hc19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISg5Njg1NDQwOTY5Njg1MjA5MDI1LCBzaXBfaGFzaDEzMi5maW5pc2goKSk7CisgICAgICAgIHNpcF9oYXNoMTMyLndyaXRlKHRlc3Rfc3RyMS5hc19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISg2NzE5Njk0MTc2NjYyNzM2NTY4LCBzaXBfaGFzaDEzMi5maW5pc2goKSk7CisKKyAgICAgICAgbGV0IG11dCBzaXBfaGFzaDEzMyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICAgICAgbGV0IHRlc3Rfc3RyMiA9IFN0cmluZzo6ZnJvbSgiYWJjZGVmZyIpOworICAgICAgICB0ZXN0X3N0cjIuaGFzaCgmbXV0IHNpcF9oYXNoMTMzKTsKKyAgICAgICAgYXNzZXJ0X2VxISgyNDkyMTYxMDQ3MzI3NjQwMjk3LCBzaXBfaGFzaDEzMy5maW5pc2goKSk7CisKKyAgICAgICAgbGV0IG11dCBzaXBfaGFzaDEzNCA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICAgICAgbGV0IHRlc3Rfc3RyMyA9IFN0cmluZzo6ZnJvbSgiYWJjZGVmZ2giKTsKKyAgICAgICAgdGVzdF9zdHIzLmhhc2goJm11dCBzaXBfaGFzaDEzNCk7CisgICAgICAgIGFzc2VydF9lcSEoNjY4OTkyNzM3MDQzNTU1NDMyNiwgc2lwX2hhc2gxMzQuZmluaXNoKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NpcF9oYXNoMTNfd3JpdGVfc2hvcnQoKSB7CisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICAgICAgc2lwX2hhc2gxMy53cml0ZV91OCgweDYxKTsKKyAgICAgICAgYXNzZXJ0X2VxISg0NjQ0NDE3MTg1NjAzMzI4MDE5LCBzaXBfaGFzaDEzLmZpbmlzaCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy90ZXN0X3V0aWxzLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvdGVzdF91dGlscy5ycwppbmRleCAxMDY2NjZjLi43YzYwM2RmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy90ZXN0X3V0aWxzLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Rlc3RfdXRpbHMucnMKQEAgLTI0LDMyICsyNCw1OSBAQAogdXNlIHN0ZDo6aW86OldyaXRlOwogdXNlIHRlbXBmaWxlOjpOYW1lZFRlbXBGaWxlOwogCi1wdWIgZm4gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpIC0+IFBhY2thZ2VUYWJsZSB7CitwdWIgZm4gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSh2ZXJzaW9uOiB1MzIpIC0+IFBhY2thZ2VUYWJsZSB7CiAgICAgbGV0IGhlYWRlciA9IFBhY2thZ2VUYWJsZUhlYWRlciB7Ci0gICAgICAgIHZlcnNpb246IDEsCisgICAgICAgIHZlcnNpb246IHZlcnNpb24sCiAgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKCJtb2NrdXAiKSwKICAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgYXMgdTgsCi0gICAgICAgIGZpbGVfc2l6ZTogMjA5LAorICAgICAgICBmaWxlX3NpemU6IG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiAyMDksCisgICAgICAgICAgICAyID0+IDIzMywKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgICAgICB9LAogICAgICAgICBudW1fcGFja2FnZXM6IDMsCiAgICAgICAgIGJ1Y2tldF9vZmZzZXQ6IDMxLAogICAgICAgICBub2RlX29mZnNldDogNTksCiAgICAgfTsKLSAgICBsZXQgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiA9IHZlYyFbU29tZSg1OSksIE5vbmUsIE5vbmUsIFNvbWUoMTA5KSwgTm9uZSwgTm9uZSwgTm9uZV07CisgICAgbGV0IGJ1Y2tldHM6IFZlYzxPcHRpb248dTMyPj4gPSBtYXRjaCB2ZXJzaW9uIHsKKyAgICAgICAgMSA9PiB2ZWMhW1NvbWUoNTkpLCBOb25lLCBOb25lLCBTb21lKDEwOSksIE5vbmUsIE5vbmUsIE5vbmVdLAorICAgICAgICAyID0+IHZlYyFbU29tZSg1OSksIE5vbmUsIE5vbmUsIFNvbWUoMTE3KSwgTm9uZSwgTm9uZSwgTm9uZV0sCisgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgIH07CiAgICAgbGV0IGZpcnN0X25vZGUgPSBQYWNrYWdlVGFibGVOb2RlIHsKICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSwKICAgICAgICAgcGFja2FnZV9pZDogMSwKKyAgICAgICAgZmluZ2VycHJpbnQ6IG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiAwLAorICAgICAgICAgICAgMiA9PiA0NDMxOTQwNTAyMjc0ODU3OTY0dTY0LAorICAgICAgICAgICAgXyA9PiBwYW5pYyEoIlVuc3VwcG9ydGVkIHZlcnNpb24uIiksCisgICAgICAgIH0sCiAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMsCiAgICAgICAgIG5leHRfb2Zmc2V0OiBOb25lLAogICAgIH07CiAgICAgbGV0IHNlY29uZF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZSB7CiAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCiAgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgIGZpbmdlcnByaW50OiBtYXRjaCB2ZXJzaW9uIHsKKyAgICAgICAgICAgIDEgPT4gMCwKKyAgICAgICAgICAgIDIgPT4gMTUyNDg5NDg1MTA1OTAxNTgwODZ1NjQsCisgICAgICAgICAgICBfID0+IHBhbmljISgiVW5zdXBwb3J0ZWQgdmVyc2lvbi4iKSwKKyAgICAgICAgfSwKICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMCwKLSAgICAgICAgbmV4dF9vZmZzZXQ6IFNvbWUoMTU5KSwKKyAgICAgICAgbmV4dF9vZmZzZXQ6IG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTb21lKDE1OSksCisgICAgICAgICAgICAyID0+IFNvbWUoMTc1KSwKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgICAgICB9LAogICAgIH07CiAgICAgbGV0IHRoaXJkX25vZGUgPSBQYWNrYWdlVGFibGVOb2RlIHsKICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKSwKICAgICAgICAgcGFja2FnZV9pZDogMiwKKyAgICAgICAgZmluZ2VycHJpbnQ6IG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiAwLAorICAgICAgICAgICAgMiA9PiAxNjIzMzIyOTkxNzcxMTYyMjM3NXU2NCwKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgICAgICB9LAogICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiA2LAogICAgICAgICBuZXh0X29mZnNldDogTm9uZSwKICAgICB9OwpAQCAtNzYsOSArMTAzLDkgQEAKICAgICB9CiB9CiAKLXB1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkgLT4gRmxhZ1RhYmxlIHsKK3B1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKHZlcnNpb246IHUzMikgLT4gRmxhZ1RhYmxlIHsKICAgICBsZXQgaGVhZGVyID0gRmxhZ1RhYmxlSGVhZGVyIHsKLSAgICAgICAgdmVyc2lvbjogMSwKKyAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKICAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oIm1vY2t1cCIpLAogICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCBhcyB1OCwKICAgICAgICAgZmlsZV9zaXplOiAzMjEsCkBAIC0xMTgsOSArMTQ1LDkgQEAKICAgICBGbGFnVGFibGUgeyBoZWFkZXIsIGJ1Y2tldHMsIG5vZGVzIH0KIH0KIAotcHViIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpIC0+IEZsYWdWYWx1ZUxpc3QgeworcHViIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCh2ZXJzaW9uOiB1MzIpIC0+IEZsYWdWYWx1ZUxpc3QgewogICAgIGxldCBoZWFkZXIgPSBGbGFnVmFsdWVIZWFkZXIgewotICAgICAgICB2ZXJzaW9uOiAxLAorICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLAogICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbSgibW9ja3VwIiksCiAgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsIGFzIHU4LAogICAgICAgICBmaWxlX3NpemU6IDM1LApAQCAtMTMxLDkgKzE1OCw5IEBACiAgICAgRmxhZ1ZhbHVlTGlzdCB7IGhlYWRlciwgYm9vbGVhbnMgfQogfQogCi1wdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKSAtPiBGbGFnSW5mb0xpc3QgeworcHViIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KHZlcnNpb246IHUzMikgLT4gRmxhZ0luZm9MaXN0IHsKICAgICBsZXQgaGVhZGVyID0gRmxhZ0luZm9IZWFkZXIgewotICAgICAgICB2ZXJzaW9uOiAxLAorICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLAogICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbSgibW9ja3VwIiksCiAgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyBhcyB1OCwKICAgICAgICAgZmlsZV9zaXplOiAzNSwKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKaW5kZXggODZhNzVmMi4uMzI0YzU1ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKQEAgLTE2LDEyICsxNiwxMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKIAorLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBBY29uZmlnIFN0b3JhZ2UuCisgKgorICogPHA+VGhpcyBleGNlcHRpb24gaW5kaWNhdGVzIGEgZ2VuZXJhbCBwcm9ibGVtIHdpdGggQWNvbmZpZyBTdG9yYWdlLCBzdWNoIGFzIGFuIGluYWJpbGl0eSB0byByZWFkCisgKiBvciB3cml0ZSBkYXRhLgorICovCiBwdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIC8qKiBHZW5lcmljIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiB1bnNwZWNpZmllZCBBY29uZmlnIFN0b3JhZ2UgZXJyb3IuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfR0VORVJJQyA9IDA7CisKKyAgICAvKiogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIEFjb25maWcgU3RvcmFnZSBzeXN0ZW0gaXMgbm90IGZvdW5kIG9uIHRoZSBkZXZpY2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfU1RPUkFHRV9TWVNURU1fTk9UX0ZPVU5EID0gMTsKKworICAgIC8qKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gcGFja2FnZSBpcyBub3QgZm91bmQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfUEFDS0FHRV9OT1RfRk9VTkQgPSAyOworCisgICAgLyoqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGlzIG5vdCBmb3VuZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9DT05UQUlORVJfTk9UX0ZPVU5EID0gMzsKKworICAgIC8qKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgQWNvbmZpZyBTdG9yYWdlIGZpbGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFID0gNDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0ggPSA1OworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUVycm9yQ29kZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIGEgZ2VuZXJpYyBlcnJvciBjb2RlIGFuZCB0aGUgc3BlY2lmaWVkCisgICAgICogZGV0YWlsIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICovCiAgICAgcHVibGljIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKICAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgbUVycm9yQ29kZSA9IEVSUk9SX0dFTkVSSUM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb259IHdpdGggYSBnZW5lcmljIGVycm9yIGNvZGUsIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBkZXRhaWwgbWVzc2FnZSwgYW5kIGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCisgICAgICovCiAgICAgcHVibGljIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICAgICAgbUVycm9yQ29kZSA9IEVSUk9SX0dFTkVSSUM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlIGFuZCBkZXRhaWwKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihpbnQgZXJyb3JDb2RlLCBTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIG1FcnJvckNvZGUgPSBlcnJvckNvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb259IHdpdGggdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlLCBkZXRhaWwKKyAgICAgKiBtZXNzYWdlLCBhbmQgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIFRoZSBlcnJvciBjb2RlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gbXNnIFRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgICAgICBtRXJyb3JDb2RlID0gZXJyb3JDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEVycm9yQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FcnJvckNvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24sIGluY2x1ZGluZyB0aGUgZXJyb3IgY29kZSBhbmQgdGhlIG9yaWdpbmFsCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gZXJyb3JTdHJpbmcoKSArICI6ICIgKyBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGVycm9yIGNvZGUgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nKCkgeworICAgICAgICBzd2l0Y2ggKG1FcnJvckNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfR0VORVJJQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SX0dFTkVSSUMiOworICAgICAgICAgICAgY2FzZSBFUlJPUl9TVE9SQUdFX1NZU1RFTV9OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9TVE9SQUdFX1NZU1RFTV9OT1RfRk9VTkQiOworICAgICAgICAgICAgY2FzZSBFUlJPUl9QQUNLQUdFX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SX1BBQ0tBR0VfTk9UX0ZPVU5EIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfQ09OVEFJTkVSX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SX0NPTlRBSU5FUl9OT1RfRk9VTkQiOworICAgICAgICAgICAgY2FzZSBFUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEUiOworICAgICAgICAgICAgY2FzZSBFUlJPUl9GSUxFX0ZJTkdFUlBSSU5UX01JU01BVENIOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1JfRklMRV9GSU5HRVJQUklOVF9NSVNNQVRDSCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiPFVua25vd24gZXJyb3IgY29kZSAiICsgbUVycm9yQ29kZSArICI+IjsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9CeXRlQnVmZmVyUmVhZGVyLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQnl0ZUJ1ZmZlclJlYWRlci5qYXZhCmluZGV4IDFjNzIzNjQuLjFmYmNiODUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9CeXRlQnVmZmVyUmVhZGVyLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpAQCAtNDEsMTQgKzQxLDMwIEBACiAgICAgICAgIHJldHVybiB0aGlzLm1CeXRlQnVmZmVyLmdldEludCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQnl0ZUJ1ZmZlci5nZXRMb25nKCk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgewogICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZEludCgpOworICAgICAgICBpZiAobGVuZ3RoID4gMTAyNCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGxlbmd0aCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplICgxMDI0IGJ5dGVzKTogIiArIGxlbmd0aCk7CisgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKICAgICAgICAgbUJ5dGVCdWZmZXIuZ2V0KGJ5dGVzLCAwLCBsZW5ndGgpOwogICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgfQogCisgICAgcHVibGljIGludCByZWFkQnl0ZShpbnQgaSkgeworICAgICAgICByZXR1cm4gQnl0ZS50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldChpKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgcG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uKSB7CiAgICAgICAgIG1CeXRlQnVmZmVyLnBvc2l0aW9uKG5ld1Bvc2l0aW9uKTsKICAgICB9CisKKyAgICBwdWJsaWMgaW50IHBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUJ5dGVCdWZmZXIucG9zaXRpb24oKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmlsZVR5cGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCmluZGV4IGIwYjFiOWIuLmMzNTQ4NzMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCkBAIC00Miw0ICs0MiwyMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICJQQUNLQUdFX01BUCI7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX01BUCI7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX1ZBTCI7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX0lORk8iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVucmVjb2duaXplZCB0eXBlIjsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YQppbmRleCBlODVmZGVlLi43NTc4NDRhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1RhYmxlLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhCkBAIC0xNiw0MSArMTYsNTcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIHB1YmxpYyBjbGFzcyBGbGFnVGFibGUgewogCiAgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE5vZGU+IG1Ob2RlTWFwOworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlclJlYWRlciBtUmVhZGVyOwogCiAgICAgcHVibGljIHN0YXRpYyBGbGFnVGFibGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXIgYnl0ZXMpIHsKICAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IG5ldyBGbGFnVGFibGUoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7Ci0gICAgICAgIEhlYWRlciBoZWFkZXIgPSBIZWFkZXIuZnJvbUJ5dGVzKHJlYWRlcik7Ci0gICAgICAgIGZsYWdUYWJsZS5tSGVhZGVyID0gaGVhZGVyOwotICAgICAgICBmbGFnVGFibGUubU5vZGVNYXAgPSBuZXcgSGFzaE1hcChUYWJsZVV0aWxzLmdldFRhYmxlU2l6ZShoZWFkZXIubU51bUZsYWdzKSk7Ci0gICAgICAgIHJlYWRlci5wb3NpdGlvbihoZWFkZXIubU5vZGVPZmZzZXQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci5tTnVtRmxhZ3M7IGkrKykgewotICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMocmVhZGVyKTsKLSAgICAgICAgICAgIGZsYWdUYWJsZS5tTm9kZU1hcC5wdXQobWFrZUtleShub2RlLm1QYWNrYWdlSWQsIG5vZGUubUZsYWdOYW1lKSwgbm9kZSk7Ci0gICAgICAgIH0KKyAgICAgICAgZmxhZ1RhYmxlLm1SZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7CisgICAgICAgIGZsYWdUYWJsZS5tSGVhZGVyID0gSGVhZGVyLmZyb21CeXRlcyhmbGFnVGFibGUubVJlYWRlcik7CisKICAgICAgICAgcmV0dXJuIGZsYWdUYWJsZTsKICAgICB9CiAKICAgICBwdWJsaWMgTm9kZSBnZXQoaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB7Ci0gICAgICAgIHJldHVybiBtTm9kZU1hcC5nZXQobWFrZUtleShwYWNrYWdlSWQsIGZsYWdOYW1lKSk7CisgICAgICAgIGludCBudW1CdWNrZXRzID0gKG1IZWFkZXIubU5vZGVPZmZzZXQgLSBtSGVhZGVyLm1CdWNrZXRPZmZzZXQpIC8gNDsKKyAgICAgICAgaW50IGJ1Y2tldEluZGV4ID0gVGFibGVVdGlscy5nZXRCdWNrZXRJbmRleChtYWtlS2V5KHBhY2thZ2VJZCwgZmxhZ05hbWUpLCBudW1CdWNrZXRzKTsKKyAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gbUhlYWRlci5tQnVja2V0T2Zmc2V0ICsgYnVja2V0SW5kZXggKiA0OworICAgICAgICBpZiAobmV3UG9zaXRpb24gPj0gbUhlYWRlci5tTm9kZU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBtUmVhZGVyLnBvc2l0aW9uKG5ld1Bvc2l0aW9uKTsKKyAgICAgICAgaW50IG5vZGVJbmRleCA9IG1SZWFkZXIucmVhZEludCgpOworICAgICAgICBpZiAobm9kZUluZGV4IDwgbUhlYWRlci5tTm9kZU9mZnNldCB8fCBub2RlSW5kZXggPj0gbUhlYWRlci5tRmlsZVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKG5vZGVJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgbVJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMobVJlYWRlcik7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZmxhZ05hbWUsIG5vZGUubUZsYWdOYW1lKSAmJiBwYWNrYWdlSWQgPT0gbm9kZS5tUGFja2FnZUlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlLm1OZXh0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIEhlYWRlciBnZXRIZWFkZXIoKSB7CiAgICAgICAgIHJldHVybiBtSGVhZGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlS2V5KGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgeworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBtYWtlS2V5KGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJldHVybiByZXQuYXBwZW5kKHBhY2thZ2VJZCkuYXBwZW5kKCcvJykuYXBwZW5kKGZsYWdOYW1lKS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gcmV0LmFwcGVuZChwYWNrYWdlSWQpLmFwcGVuZCgnLycpLmFwcGVuZChmbGFnTmFtZSkudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgewpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdWYWx1ZUxpc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVmFsdWVMaXN0LmphdmEKaW5kZXggMGRkYzE0Ny4uNDkzNDM2ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdWYWx1ZUxpc3QuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1ZhbHVlTGlzdC5qYXZhCkBAIC0xNywzMyArMTcsMjEgQEAKIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBGbGFnVmFsdWVMaXN0IHsKIAogICAgIHByaXZhdGUgSGVhZGVyIG1IZWFkZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PEJvb2xlYW4+IG1MaXN0OwotCi0gICAgcHJpdmF0ZSBpbnQgbVNpemU7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyUmVhZGVyIG1SZWFkZXI7CiAKICAgICBwdWJsaWMgc3RhdGljIEZsYWdWYWx1ZUxpc3QgZnJvbUJ5dGVzKEJ5dGVCdWZmZXIgYnl0ZXMpIHsKICAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0gbmV3IEZsYWdWYWx1ZUxpc3QoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7Ci0gICAgICAgIEhlYWRlciBoZWFkZXIgPSBIZWFkZXIuZnJvbUJ5dGVzKHJlYWRlcik7Ci0gICAgICAgIGZsYWdWYWx1ZUxpc3QubUhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tTGlzdCA9IG5ldyBBcnJheUxpc3QoaGVhZGVyLm1OdW1GbGFncyk7Ci0gICAgICAgIHJlYWRlci5wb3NpdGlvbihoZWFkZXIubUJvb2xlYW5WYWx1ZU9mZnNldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLm1OdW1GbGFnczsgaSsrKSB7Ci0gICAgICAgICAgICBib29sZWFuIHZhbCA9IHJlYWRlci5yZWFkQnl0ZSgpID09IDE7Ci0gICAgICAgICAgICBmbGFnVmFsdWVMaXN0Lm1MaXN0LmFkZCh2YWwpOwotICAgICAgICB9Ci0gICAgICAgIGZsYWdWYWx1ZUxpc3QubVNpemUgPSBmbGFnVmFsdWVMaXN0Lm1MaXN0LnNpemUoKTsKKyAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpOworICAgICAgICBmbGFnVmFsdWVMaXN0Lm1IZWFkZXIgPSBIZWFkZXIuZnJvbUJ5dGVzKGZsYWdWYWx1ZUxpc3QubVJlYWRlcik7CiAgICAgICAgIHJldHVybiBmbGFnVmFsdWVMaXN0OwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG1MaXN0LmdldChpbmRleCk7CisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZEJ5dGUobUhlYWRlci5tQm9vbGVhblZhbHVlT2Zmc2V0ICsgaW5kZXgpID09IDE7CiAgICAgfQogCiAgICAgcHVibGljIEhlYWRlciBnZXRIZWFkZXIoKSB7CkBAIC01MSw3ICszOSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbVNpemU7CisgICAgICAgIHJldHVybiBtSGVhZGVyLm1OdW1GbGFnczsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlciB7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEKaW5kZXggZDA0ZTFhYy4uMWU3YzJjYSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VUYWJsZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YQpAQCAtMTYsMzIgKzE2LDY2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIHB1YmxpYyBjbGFzcyBQYWNrYWdlVGFibGUgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkdFUlBSSU5UX0JZVEVTID0gODsKKyAgICAvLyBpbnQ6IG1QYWNrYWdlSWQgKyBpbnQ6IG1Cb29sZWFuU3RhcnRJbmRleCArIGludDogbU5leHRPZmZzZXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9TS0lQX0JZVEVTID0gMTI7CisKICAgICBwcml2YXRlIEhlYWRlciBtSGVhZGVyOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTm9kZT4gbU5vZGVNYXA7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyUmVhZGVyIG1SZWFkZXI7CiAKICAgICBwdWJsaWMgc3RhdGljIFBhY2thZ2VUYWJsZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlciBieXRlcykgewogICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0gbmV3IFBhY2thZ2VUYWJsZSgpOwotICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKLSAgICAgICAgSGVhZGVyIGhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMocmVhZGVyKTsKLSAgICAgICAgcGFja2FnZVRhYmxlLm1IZWFkZXIgPSBoZWFkZXI7Ci0gICAgICAgIHBhY2thZ2VUYWJsZS5tTm9kZU1hcCA9IG5ldyBIYXNoTWFwKFRhYmxlVXRpbHMuZ2V0VGFibGVTaXplKGhlYWRlci5tTnVtUGFja2FnZXMpKTsKLSAgICAgICAgcmVhZGVyLnBvc2l0aW9uKGhlYWRlci5tTm9kZU9mZnNldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLm1OdW1QYWNrYWdlczsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBOb2RlLmZyb21CeXRlcyhyZWFkZXIpOwotICAgICAgICAgICAgcGFja2FnZVRhYmxlLm1Ob2RlTWFwLnB1dChub2RlLm1QYWNrYWdlTmFtZSwgbm9kZSk7Ci0gICAgICAgIH0KKyAgICAgICAgcGFja2FnZVRhYmxlLm1SZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihieXRlcyk7CisgICAgICAgIHBhY2thZ2VUYWJsZS5tSGVhZGVyID0gSGVhZGVyLmZyb21CeXRlcyhwYWNrYWdlVGFibGUubVJlYWRlcik7CisKICAgICAgICAgcmV0dXJuIHBhY2thZ2VUYWJsZTsKICAgICB9CiAKICAgICBwdWJsaWMgTm9kZSBnZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHJldHVybiBtTm9kZU1hcC5nZXQocGFja2FnZU5hbWUpOworICAgICAgICBpbnQgbnVtQnVja2V0cyA9IChtSGVhZGVyLm1Ob2RlT2Zmc2V0IC0gbUhlYWRlci5tQnVja2V0T2Zmc2V0KSAvIDQ7CisgICAgICAgIGludCBidWNrZXRJbmRleCA9IFRhYmxlVXRpbHMuZ2V0QnVja2V0SW5kZXgocGFja2FnZU5hbWUuZ2V0Qnl0ZXMoVVRGXzgpLCBudW1CdWNrZXRzKTsKKyAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gbUhlYWRlci5tQnVja2V0T2Zmc2V0ICsgYnVja2V0SW5kZXggKiA0OworICAgICAgICBpZiAobmV3UG9zaXRpb24gPj0gbUhlYWRlci5tTm9kZU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVJlYWRlci5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgICAgIGludCBub2RlSW5kZXggPSBtUmVhZGVyLnJlYWRJbnQoKTsKKworICAgICAgICBpZiAobm9kZUluZGV4IDwgbUhlYWRlci5tTm9kZU9mZnNldCB8fCBub2RlSW5kZXggPj0gbUhlYWRlci5tRmlsZVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKG5vZGVJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgbVJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMobVJlYWRlciwgbUhlYWRlci5tVmVyc2lvbik7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMocGFja2FnZU5hbWUsIG5vZGUubVBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZUluZGV4ID0gbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFja2FnZUxpc3QoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KG1IZWFkZXIubU51bVBhY2thZ2VzKTsKKyAgICAgICAgbVJlYWRlci5wb3NpdGlvbihtSGVhZGVyLm1Ob2RlT2Zmc2V0KTsKKyAgICAgICAgaW50IGZpbmdlcnByaW50Qnl0ZXMgPSBtSGVhZGVyLm1WZXJzaW9uID09IDEgPyAwIDogRklOR0VSUFJJTlRfQllURVM7CisgICAgICAgIGludCBza2lwQnl0ZXMgPSBmaW5nZXJwcmludEJ5dGVzICsgTk9ERV9TS0lQX0JZVEVTOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1IZWFkZXIubU51bVBhY2thZ2VzOyBpKyspIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKG1SZWFkZXIucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgIG1SZWFkZXIucG9zaXRpb24obVJlYWRlci5wb3NpdGlvbigpICsgc2tpcEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKICAgICB9CiAKICAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKQEAgLTU4LDcgKzkyLDcgQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUJ1Y2tldE9mZnNldDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbU5vZGVPZmZzZXQ7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEhlYWRlciBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKICAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CiAgICAgICAgICAgICBoZWFkZXIubVZlcnNpb24gPSByZWFkZXIucmVhZEludCgpOwogICAgICAgICAgICAgaGVhZGVyLm1Db250YWluZXIgPSByZWFkZXIucmVhZFN0cmluZygpOwpAQCAtMTA4LDEwICsxNDIsMjQgQEAKIAogICAgICAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZU5hbWU7CiAgICAgICAgIHByaXZhdGUgaW50IG1QYWNrYWdlSWQ7CisgICAgICAgIHByaXZhdGUgbG9uZyBtUGFja2FnZUZpbmdlcnByaW50OwogICAgICAgICBwcml2YXRlIGludCBtQm9vbGVhblN0YXJ0SW5kZXg7CiAgICAgICAgIHByaXZhdGUgaW50IG1OZXh0T2Zmc2V0OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1BhY2thZ2VGaW5nZXJwcmludDsKIAotICAgICAgICBwdWJsaWMgc3RhdGljIE5vZGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyLCBpbnQgdmVyc2lvbikgeworICAgICAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUJ5dGVzVjEocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tQnl0ZXNWMihyZWFkZXIpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIERvIHdlIHdhbnQgdG8gdGhyb3cgaGVyZT8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGZyb21CeXRlc1YxKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CiAgICAgICAgICAgICBOb2RlIG5vZGUgPSBuZXcgTm9kZSgpOwogICAgICAgICAgICAgbm9kZS5tUGFja2FnZU5hbWUgPSByZWFkZXIucmVhZFN0cmluZygpOwogICAgICAgICAgICAgbm9kZS5tUGFja2FnZUlkID0gcmVhZGVyLnJlYWRJbnQoKTsKQEAgLTEyMSw2ICsxNjksMTggQEAKICAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBmcm9tQnl0ZXNWMihCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbmV3IE5vZGUoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VOYW1lID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VJZCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlRmluZ2VycHJpbnQgPSByZWFkZXIucmVhZExvbmcoKTsKKyAgICAgICAgICAgIG5vZGUubUJvb2xlYW5TdGFydEluZGV4ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IG5vZGUubU5leHRPZmZzZXQgPT0gMCA/IC0xIDogbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgICAgIG5vZGUubUhhc1BhY2thZ2VGaW5nZXJwcmludCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChtUGFja2FnZU5hbWUsIG1QYWNrYWdlSWQsIG1Cb29sZWFuU3RhcnRJbmRleCwgbU5leHRPZmZzZXQpOwpAQCAtMTUxLDYgKzIxMSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlSWQ7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgbG9uZyBnZXRQYWNrYWdlRmluZ2VycHJpbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VGaW5nZXJwcmludDsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbUJvb2xlYW5TdGFydEluZGV4OwogICAgICAgICB9CkBAIC0xNTgsNSArMjIyLDkgQEAKICAgICAgICAgcHVibGljIGludCBnZXROZXh0T2Zmc2V0KCkgewogICAgICAgICAgICAgcmV0dXJuIG1OZXh0T2Zmc2V0OwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUGFja2FnZUZpbmdlcnByaW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1IYXNQYWNrYWdlRmluZ2VycHJpbnQ7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU2lwSGFzaGVyMTMuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TaXBIYXNoZXIxMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzE0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU2lwSGFzaGVyMTMuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBjbGFzcyBTaXBIYXNoZXIxMyB7CisgICAgc3RhdGljIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHYwOworICAgICAgICBwcml2YXRlIGxvbmcgdjI7CisgICAgICAgIHByaXZhdGUgbG9uZyB2MTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHYzOworCisgICAgICAgIHB1YmxpYyBTdGF0ZShsb25nIGswLCBsb25nIGsxKSB7CisgICAgICAgICAgICB2MCA9IGswIF4gMHg3MzZmNmQ2NTcwNzM2NTc1TDsKKyAgICAgICAgICAgIHYxID0gazEgXiAweDY0NmY3MjYxNmU2NDZmNmRMOworICAgICAgICAgICAgdjIgPSBrMCBeIDB4NmM3OTY3NjU2ZTY1NzI2MUw7CisgICAgICAgICAgICB2MyA9IGsxIF4gMHg3NDY1NjQ2Mjc5NzQ2NTczTDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbXByZXNzKGxvbmcgbSkgeworICAgICAgICAgICAgdjMgXj0gbTsKKyAgICAgICAgICAgIGNSb3VuZHMoKTsKKyAgICAgICAgICAgIHYwIF49IG07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBmaW5pc2goKSB7CisgICAgICAgICAgICB2MiBePSAweGZmOworICAgICAgICAgICAgZFJvdW5kcygpOworICAgICAgICAgICAgcmV0dXJuIHYwIF4gdjEgXiB2MiBeIHYzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNSb3VuZHMoKSB7CisgICAgICAgICAgICB2MCArPSB2MTsKKyAgICAgICAgICAgIHYxID0gTG9uZy5yb3RhdGVMZWZ0KHYxLCAxMyk7CisgICAgICAgICAgICB2MSBePSB2MDsKKyAgICAgICAgICAgIHYwID0gTG9uZy5yb3RhdGVMZWZ0KHYwLCAzMik7CisgICAgICAgICAgICB2MiArPSB2MzsKKyAgICAgICAgICAgIHYzID0gTG9uZy5yb3RhdGVMZWZ0KHYzLCAxNik7CisgICAgICAgICAgICB2MyBePSB2MjsKKyAgICAgICAgICAgIHYwICs9IHYzOworICAgICAgICAgICAgdjMgPSBMb25nLnJvdGF0ZUxlZnQodjMsIDIxKTsKKyAgICAgICAgICAgIHYzIF49IHYwOworICAgICAgICAgICAgdjIgKz0gdjE7CisgICAgICAgICAgICB2MSA9IExvbmcucm90YXRlTGVmdCh2MSwgMTcpOworICAgICAgICAgICAgdjEgXj0gdjI7CisgICAgICAgICAgICB2MiA9IExvbmcucm90YXRlTGVmdCh2MiwgMzIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRSb3VuZHMoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgIHYwICs9IHYxOworICAgICAgICAgICAgICAgIHYxID0gTG9uZy5yb3RhdGVMZWZ0KHYxLCAxMyk7CisgICAgICAgICAgICAgICAgdjEgXj0gdjA7CisgICAgICAgICAgICAgICAgdjAgPSBMb25nLnJvdGF0ZUxlZnQodjAsIDMyKTsKKyAgICAgICAgICAgICAgICB2MiArPSB2MzsKKyAgICAgICAgICAgICAgICB2MyA9IExvbmcucm90YXRlTGVmdCh2MywgMTYpOworICAgICAgICAgICAgICAgIHYzIF49IHYyOworICAgICAgICAgICAgICAgIHYwICs9IHYzOworICAgICAgICAgICAgICAgIHYzID0gTG9uZy5yb3RhdGVMZWZ0KHYzLCAyMSk7CisgICAgICAgICAgICAgICAgdjMgXj0gdjA7CisgICAgICAgICAgICAgICAgdjIgKz0gdjE7CisgICAgICAgICAgICAgICAgdjEgPSBMb25nLnJvdGF0ZUxlZnQodjEsIDE3KTsKKyAgICAgICAgICAgICAgICB2MSBePSB2MjsKKyAgICAgICAgICAgICAgICB2MiA9IExvbmcucm90YXRlTGVmdCh2MiwgMzIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGhhc2goYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXcgU3RhdGUoMCwgMCk7CisgICAgICAgIGludCBsZW4gPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgaW50IGxlZnQgPSBsZW4gJiAweDc7CisgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuIC0gbGVmdCkgeworICAgICAgICAgICAgbG9uZyBtaSA9IGxvYWRMZShkYXRhLCBpbmRleCwgOCk7CisgICAgICAgICAgICBpbmRleCArPSA4OworICAgICAgICAgICAgc3RhdGUuY29tcHJlc3MobWkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGFkZGluZyB0aGUgZW5kIHdpdGggMHhmZiB0byBiZSBjb25zaXN0ZW50IHdpdGggcnVzdAorICAgICAgICBsb25nIG0gPSAoMHhmZkwgPDwgKGxlZnQgKiA4KSkgfCBsb2FkTGUoZGF0YSwgaW5kZXgsIGxlZnQpOworICAgICAgICBpZiAobGVmdCA9PSAweDcpIHsKKyAgICAgICAgICAgIC8vIGNvbXByZXNzIHRoZSBtIHctMgorICAgICAgICAgICAgc3RhdGUuY29tcHJlc3MobSk7CisgICAgICAgICAgICBtID0gMEw7CisgICAgICAgIH0KKyAgICAgICAgLy8gbGVuIGFkZHMgMSBzaW5jZSBwYWRkZWQgMHhmZgorICAgICAgICBtIHw9ICgoKGxlbiArIDEpICYgMHhmZkwpIDw8IDU2KTsKKyAgICAgICAgc3RhdGUuY29tcHJlc3MobSk7CisKKyAgICAgICAgcmV0dXJuIHN0YXRlLmZpbmlzaCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbG9hZExlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgeworICAgICAgICBsb25nIG0gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbSB8PSAoZGF0YVtpICsgb2Zmc2V0XSAmIDB4ZmZMKSA8PCAoaSAqIDgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlRmlsZVByb3ZpZGVyLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU3RvcmFnZUZpbGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NWFjMzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU3RvcmFnZUZpbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5EaXJlY3RvcnlTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKiBAaGlkZSAqLworcHVibGljIGNsYXNzIFN0b3JhZ2VGaWxlUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUFQX1BBVEggPSAiL21ldGFkYXRhL2Fjb25maWcvbWFwcy8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JPT1RfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9ib290LyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBNQVBfRklMRV9FWFQgPSAiLnBhY2thZ2UubWFwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk1BUF9GSUxFX0VYVCA9ICIuZmxhZy5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfRklMRV9FWFQgPSAiLnZhbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RvcmFnZUZpbGVQcm92aWRlciBERUZBVUxUX0lOU1RBTkNFID0KKyAgICAgICAgICAgIG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKERFRkFVTFRfTUFQX1BBVEgsIERFRkFVTFRfQk9PVF9QQVRIKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NYXBQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Cb290UGF0aDsKKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RvcmFnZUZpbGVQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBERUZBVUxUX0lOU1RBTkNFOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBTdG9yYWdlRmlsZVByb3ZpZGVyKFN0cmluZyBtYXBQYXRoLCBTdHJpbmcgYm9vdFBhdGgpIHsKKyAgICAgICAgbU1hcFBhdGggPSBtYXBQYXRoOworICAgICAgICBtQm9vdFBhdGggPSBib290UGF0aDsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3RDb250YWluZXJzKFN0cmluZ1tdIGV4Y2x1ZGVzKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KGV4Y2x1ZGVzKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERpcmVjdG9yeVN0cmVhbTxQYXRoPiBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBGaWxlcy5uZXdEaXJlY3RvcnlTdHJlYW0oUGF0aHMuZ2V0KG1NYXBQYXRoKSwgIioiICsgUE1BUF9GSUxFX0VYVCk7CisgICAgICAgICAgICBmb3IgKFBhdGggZW50cnkgOiBzdHJlYW0pIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBlbnRyeS5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciA9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSBQTUFQX0ZJTEVfRVhULmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNldC5jb250YWlucyhjb250YWluZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbCB0byBsaXN0IG1hcCBmaWxlcyBpbiBwYXRoICVzIiwgbU1hcFBhdGgpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIFBhY2thZ2VUYWJsZSBnZXRQYWNrYWdlVGFibGUoU3RyaW5nIGNvbnRhaW5lcikgeworICAgICAgICByZXR1cm4gUGFja2FnZVRhYmxlLmZyb21CeXRlcygKKyAgICAgICAgICAgICAgICBtYXBTdG9yYWdlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChtTWFwUGF0aCwgY29udGFpbmVyICsgUE1BUF9GSUxFX0VYVCksIEZpbGVUeXBlLlBBQ0tBR0VfTUFQKSk7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIEZsYWdUYWJsZSBnZXRGbGFnVGFibGUoU3RyaW5nIGNvbnRhaW5lcikgeworICAgICAgICByZXR1cm4gRmxhZ1RhYmxlLmZyb21CeXRlcygKKyAgICAgICAgICAgICAgICBtYXBTdG9yYWdlRmlsZShQYXRocy5nZXQobU1hcFBhdGgsIGNvbnRhaW5lciArIEZNQVBfRklMRV9FWFQpLCBGaWxlVHlwZS5GTEFHX01BUCkpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBGbGFnVmFsdWVMaXN0IGdldEZsYWdWYWx1ZUxpc3QoU3RyaW5nIGNvbnRhaW5lcikgeworICAgICAgICByZXR1cm4gRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoCisgICAgICAgICAgICAgICAgbWFwU3RvcmFnZUZpbGUoUGF0aHMuZ2V0KG1Cb290UGF0aCwgY29udGFpbmVyICsgVkFMX0ZJTEVfRVhUKSwgRmlsZVR5cGUuRkxBR19WQUwpKTsKKyAgICB9CisKKyAgICAvLyBNYXAgYSBzdG9yYWdlIGZpbGUgZ2l2ZW4gZmlsZSBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBTdG9yYWdlRmlsZShQYXRoIGZpbGUsIEZpbGVUeXBlIHR5cGUpIHsKKyAgICAgICAgRmlsZUNoYW5uZWwgY2hhbm5lbCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsID0gRmlsZUNoYW5uZWwub3BlbihmaWxlLCBTdGFuZGFyZE9wZW5PcHRpb24uUkVBRCk7CisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbC5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGNoYW5uZWwuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsIHRvIG1tYXAgc3RvcmFnZSAlcyBmaWxlICVzIiwgdHlwZS50b1N0cmluZygpLCBmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBxdWlldGx5RGlzcG9zZShjaGFubmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcXVpZXRseURpc3Bvc2UoQ2xvc2VhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY2xvc2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsb3NhYmxlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNhcmUsIGF0IGxlYXN0IGFzIG9mIG5vdworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEKaW5kZXggNzE0YjUzYi4uODExNjhmNSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvVGFibGVVdGlscy5qYXZhCkBAIC01OCw0ICs1OCw5IEBACiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJOdW1iZXIgb2YgaXRlbXMgaW4gYSBoYXNoIHRhYmxlIGV4Y2VlZHMgbGltaXQiKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRCdWNrZXRJbmRleChieXRlW10gdmFsLCBpbnQgbnVtQnVja2V0cykgeworICAgICAgICBsb25nIGhhc2hWYWwgPSBTaXBIYXNoZXIxMy5oYXNoKHZhbCk7CisgICAgICAgIHJldHVybiAoaW50KSBMb25nLnJlbWFpbmRlclVuc2lnbmVkKGhhc2hWYWwsIG51bUJ1Y2tldHMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icAppbmRleCBjMzMxMjdmLi5iZDQ2ZDVmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMCwxMCArMTAsMTQgQEAKICAgICAgICAgImxpYmJhc2UiLAogICAgIF0sCiAgICAgZGF0YTogWwotICAgICAgICAicGFja2FnZS5tYXAiLAotICAgICAgICAiZmxhZy5tYXAiLAotICAgICAgICAiZmxhZy52YWwiLAotICAgICAgICAiZmxhZy5pbmZvIiwKKyAgICAgICAgImRhdGEvdjEvcGFja2FnZV92MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLm1hcCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEudmFsIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5pbmZvIiwKKyAgICAgICAgImRhdGEvdjIvcGFja2FnZV92Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLm1hcCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIudmFsIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5pbmZvIiwKICAgICBdLAogICAgIHRlc3Rfc3VpdGVzOiBbCiAgICAgICAgICJkZXZpY2UtdGVzdHMiLApAQCAtMjgsMTkgKzMyLDI0IEBACiAgICAgICAgICJzcmNzLyoqLyouamF2YSIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCiAgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bm5lciIsCiAgICAgICAgICJqdW5pdCIsCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKICAgICBdLAotICAgIHNka192ZXJzaW9uOiAidGVzdF9jdXJyZW50IiwKICAgICB0ZXN0X2NvbmZpZzogIkFuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sIiwKKyAgICBzZGtfdmVyc2lvbjogInRlc3RfY3VycmVudCIsCiAgICAgZGF0YTogWwotICAgICAgICAicGFja2FnZS5tYXAiLAotICAgICAgICAiZmxhZy5tYXAiLAotICAgICAgICAiZmxhZy52YWwiLAotICAgICAgICAiZmxhZy5pbmZvIiwKKyAgICAgICAgImRhdGEvdjEvcGFja2FnZV92MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLm1hcCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEudmFsIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5pbmZvIiwKKyAgICAgICAgImRhdGEvdjIvcGFja2FnZV92Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLm1hcCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIudmFsIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5pbmZvIiwKICAgICBdLAogICAgIHRlc3Rfc3VpdGVzOiBbCiAgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKICAgICBdLAorICAgIGphcmphcl9ydWxlczogImphcmphci50eHQiLAogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwKaW5kZXggMmQ1MmQ0NC4uYmZjMjM4ZSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sCkBAIC0yMSwxMyArMjEsMTggQEAKICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwYWNrYWdlLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9wYWNrYWdlLm1hcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZy5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvZmxhZy5tYXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWcudmFsLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcudmFsIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnLmluZm8tPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvZmxhZy5pbmZvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwYWNrYWdlX3YxLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYxLnBhY2thZ2UubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YxLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYxLmZsYWcubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YxLnZhbC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYxLnZhbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192MS5pbmZvLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjEuaW5mbyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0icGFja2FnZV92Mi5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52Mi5wYWNrYWdlLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192Mi5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52Mi5mbGFnLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192Mi52YWwtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52Mi52YWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjIuaW5mby0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYyLmluZm8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icG9zdC1wdXNoIiB2YWx1ZT0iY2htb2QgK3IgL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxbSIgLz4KICAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLmluZm8gYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcuaW5mbwpyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcubWFwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcubWFwCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLnZhbApyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvcGFja2FnZS5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvcGFja2FnZS5tYXAKcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI3ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIuaW5mbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0Njg1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLm1hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNDc1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLnZhbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5Zjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9wYWNrYWdlX3YyLm1hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2phcmphci50eHQgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2phcmphci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5NTJlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvamFyamFyLnR4dApAQCAtMCwwICsxLDE3IEBACitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24KK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1RhYmxlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlBhY2thZ2VUYWJsZQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5CeXRlQnVmZmVyUmVhZGVyIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQnl0ZUJ1ZmZlclJlYWRlcgorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVHlwZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdUeXBlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU2lwSGFzaGVyMTMKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GaWxlVHlwZQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1ZhbHVlTGlzdAorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5UYWJsZVV0aWxzIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuVGFibGVVdGlscworcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5BY29uZmlnUGFja2FnZUltcGwgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5BY29uZmlnUGFja2FnZUltcGwKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlciBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlN0b3JhZ2VGaWxlUHJvdmlkZXIKKworCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZSQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1RhYmxlJEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZSQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGFja2FnZVRhYmxlJEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3QkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdWYWx1ZUxpc3RAMQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TaXBIYXNoZXIxMyQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU2lwSGFzaGVyMTNAMQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdUYWJsZVRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEKaW5kZXggZmQ0MGQ0Yy4uZGM0NjViNiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdUYWJsZVRlc3QuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1RhYmxlVGVzdC5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKDEpKTsKICAgICAgICAgRmxhZ1RhYmxlLkhlYWRlciBoZWFkZXIgPSBmbGFnVGFibGUuZ2V0SGVhZGVyKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOwpAQCAtNDQsNyArNDQsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1RhYmxlX3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoMSkpOwogCiAgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGUxID0gZmxhZ1RhYmxlLmdldCgwLCAiZW5hYmxlZF9ybyIpOwogICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlMiA9IGZsYWdUYWJsZS5nZXQoMCwgImVuYWJsZWRfcnciKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVmFsdWVMaXN0VGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKaW5kZXggYzE4NTkwYS4uMzA2ZGY3ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9Ci0gICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoMSkpOwogICAgICAgICBGbGFnVmFsdWVMaXN0LkhlYWRlciBoZWFkZXIgPSBmbGFnVmFsdWVMaXN0LmdldEhlYWRlcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKQEAgLTQ3LDMxICs0NywzMSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZsYWdWYWx1ZUxpc3RfcmlnaHROb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9Ci0gICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoMSkpOwogCiAgICAgICAgIGJvb2xlYW5bXSBleHBlY3RlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX07CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGZsYWdWYWx1ZUxpc3Quc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZsYWdWYWx1ZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtpXSwgZmxhZ1ZhbHVlTGlzdC5nZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCBmbGFnVmFsdWVMaXN0LmdldEJvb2xlYW4oaSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1ZhbHVlTGlzdF9nZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KLSAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkpOwotICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDEpKTsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoMSkpOwogCiAgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9Ci0gICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoMSkpOwogCiAgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOwogICAgICAgICBGbGFnVGFibGUuTm9kZSBmTm9kZSA9IGZsYWdUYWJsZS5nZXQocE5vZGUuZ2V0UGFja2FnZUlkKCksICJlbmFibGVkX3J3Iik7Ci0gICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXQocE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSArIGZOb2RlLmdldEZsYWdJbmRleCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCkgKyBmTm9kZS5nZXRGbGFnSW5kZXgoKSkpOwogCiAgICAgICAgIHBOb2RlID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOwogICAgICAgICBmTm9kZSA9IGZsYWdUYWJsZS5nZXQocE5vZGUuZ2V0UGFja2FnZUlkKCksICJlbmFibGVkX2ZpeGVkX3JvIik7Ci0gICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXQocE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSArIGZOb2RlLmdldEZsYWdJbmRleCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCkgKyBmTm9kZS5nZXRGbGFnSW5kZXgoKSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhCmluZGV4IGU3ZTE5ZDguLjgxMmNlMzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1BhY2thZ2VUYWJsZVRlc3QuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZTsKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CkBAIC0yNSwxMyArMjcsMTYgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQogcHVibGljIGNsYXNzIFBhY2thZ2VUYWJsZVRlc3QgewogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQotICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigxKSk7CiAgICAgICAgIFBhY2thZ2VUYWJsZS5IZWFkZXIgaGVhZGVyID0gcGFja2FnZVRhYmxlLmdldEhlYWRlcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKQEAgLTQzLDkgKzQ4LDIzIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0SGVhZGVyX3YyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMikpOworICAgICAgICBQYWNrYWdlVGFibGUuSGVhZGVyIGhlYWRlciA9IHBhY2thZ2VUYWJsZS5nZXRIZWFkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGhlYWRlci5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vY2t1cCIsIGhlYWRlci5nZXRDb250YWluZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlVHlwZS5QQUNLQUdFX01BUCwgaGVhZGVyLmdldEZpbGVUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjMzLCBoZWFkZXIuZ2V0RmlsZVNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBoZWFkZXIuZ2V0TnVtUGFja2FnZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMSwgaGVhZGVyLmdldEJ1Y2tldE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDU5LCBoZWFkZXIuZ2V0Tm9kZU9mZnNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHROb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQotICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigxKSk7CiAKICAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTEgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CiAgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUyID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOwpAQCAtNjYsNSArODUsNjEgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE1OSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMi5nZXROZXh0T2Zmc2V0KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2Uobm9kZTEuaGFzUGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRGYWxzZShub2RlMi5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5vZGU0Lmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHROb2RlX3YyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMikpOworCisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUxID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMiA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTQgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgbm9kZTEuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsIG5vZGUyLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCBub2RlNC5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTIuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTQuZ2V0UGFja2FnZUlkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlMS5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5vZGUyLmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgbm9kZTQuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE3NSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMi5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlMS5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZTIuaGFzUGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGU0Lmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoLTMxOTc3OTU1NjMxMTkzOTM1MzBMLCBub2RlMS5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NDMxOTQwNTAyMjc0ODU3OTY0TCwgbm9kZTIuZ2V0UGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIyMTM1MTQxNTU5OTc5MjkyNDFMLCBub2RlNC5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX2dldFBhY2thZ2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMikpOworICAgICAgICBTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG5ldyBIYXNoU2V0PD4ocGFja2FnZVRhYmxlLmdldFBhY2thZ2VMaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcGFja2FnZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlcy5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlcy5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlcy5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpKTsKKworICAgICAgICBwYWNrYWdlVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDEpKTsKKyAgICAgICAgcGFja2FnZXMgPSBuZXcgSGFzaFNldDw+KHBhY2thZ2VUYWJsZS5nZXRQYWNrYWdlTGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHBhY2thZ2VzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1NpcEhhc2hlcjEzVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1NpcEhhc2hlcjEzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjIwZDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvU2lwSGFzaGVyMTNUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2lwSGFzaGVyMTNUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaXBIYXNoX2hhc2hTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRlc3RTdHIgPSAiY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QiOworICAgICAgICBsb25nIHJlc3VsdCA9IFNpcEhhc2hlcjEzLmhhc2godGVzdFN0ci5nZXRCeXRlcyhVVEZfOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHhGODY1NzJFRkY5QzRBMEMxTCwgcmVzdWx0KTsKKworICAgICAgICB0ZXN0U3RyID0gImFiY2RlZmciOworICAgICAgICByZXN1bHQgPSBTaXBIYXNoZXIxMy5oYXNoKHRlc3RTdHIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MjI5NUVGNDRCRDA3OEFFOUwsIHJlc3VsdCk7CisKKyAgICAgICAgdGVzdFN0ciA9ICJhYmNkZWZnaCI7CisgICAgICAgIHJlc3VsdCA9IFNpcEhhc2hlcjEzLmhhc2godGVzdFN0ci5nZXRCeXRlcyhVVEZfOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHg1Q0Q3NjU3RkE3Rjk2QzE2TCwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvU3RvcmFnZUZpbGVQcm92aWRlclRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9TdG9yYWdlRmlsZVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzIwZjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvU3RvcmFnZUZpbGVQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlRmlsZVByb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdG9yYWdlRmlsZVByb3ZpZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RsaXN0Q29udGFpbmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yYWdlRmlsZVByb3ZpZGVyIHAgPQorICAgICAgICAgICAgICAgIG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKFRlc3REYXRhVXRpbHMuVEVTVERBVEFfUEFUSCwgVGVzdERhdGFVdGlscy5URVNUREFUQV9QQVRIKTsKKyAgICAgICAgU3RyaW5nW10gZXhjbHVkZXMgPSB7fTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvbnRhaW5lcnMgPSBwLmxpc3RDb250YWluZXJzKGV4Y2x1ZGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbnRhaW5lcnMuc2l6ZSgpKTsKKworICAgICAgICBleGNsdWRlcyA9IG5ldyBTdHJpbmdbXSB7Im1vY2sudjEifTsKKyAgICAgICAgY29udGFpbmVycyA9IHAubGlzdENvbnRhaW5lcnMoZXhjbHVkZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29udGFpbmVycy5zaXplKCkpOworCisgICAgICAgIHAgPSBuZXcgU3RvcmFnZUZpbGVQcm92aWRlcigiZmFrZS9wYXRoLyIsICJmYWtlL3BhdGgvIik7CisgICAgICAgIGNvbnRhaW5lcnMgPSBwLmxpc3RDb250YWluZXJzKGV4Y2x1ZGVzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluZXJzLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2VGaWxlUHJvdmlkZXIgcCA9CisgICAgICAgICAgICAgICAgbmV3IFN0b3JhZ2VGaWxlUHJvdmlkZXIoVGVzdERhdGFVdGlscy5URVNUREFUQV9QQVRILCBUZXN0RGF0YVV0aWxzLlRFU1REQVRBX1BBVEgpOworICAgICAgICBQYWNrYWdlVGFibGUgcHQgPSBwLmdldFBhY2thZ2VUYWJsZSgibW9jay52MSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHB0KTsKKyAgICAgICAgRmxhZ1RhYmxlIGYgPSBwLmdldEZsYWdUYWJsZSgibW9jay52MSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGYpOworICAgICAgICBGbGFnVmFsdWVMaXN0IHYgPSBwLmdldEZsYWdWYWx1ZUxpc3QoIm1vY2sudjEiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvVGVzdERhdGFVdGlscy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1Rlc3REYXRhVXRpbHMuamF2YQppbmRleCBmMzU5NTJkLi4zODg5NzFlIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvVGVzdERhdGFVdGlscy5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEKQEAgLTIxLDI4ICsyMSwyNyBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0RGF0YVV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQUNLQUdFX01BUF9QQVRIID0gInBhY2thZ2UubWFwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX01BUF9QQVRIID0gImZsYWcubWFwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX1ZBTF9QQVRIID0gImZsYWcudmFsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX0lORk9fUEFUSCA9ICJmbGFnLmluZm8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0VfTUFQX1BBVEggPSAibW9jay52JWQucGFja2FnZS5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfTUFQX1BBVEggPSAibW9jay52JWQuZmxhZy5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfVkFMX1BBVEggPSAibW9jay52JWQudmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX0lORk9fUEFUSCA9ICJtb2NrLnYlZC5pbmZvIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUREFUQV9QQVRIID0KLSAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhLyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVERBVEFfUEFUSCA9ICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhLyI7CiAKLSAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9QQUNLQUdFX01BUF9QQVRIKTsKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKGludCB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBTdHJpbmcuZm9ybWF0KFRFU1RfUEFDS0FHRV9NQVBfUEFUSCwgdmVyc2lvbikpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBURVNUX0ZMQUdfTUFQX1BBVEgpOworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoaW50IHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFN0cmluZy5mb3JtYXQoVEVTVF9GTEFHX01BUF9QQVRILCB2ZXJzaW9uKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfRkxBR19WQUxfUEFUSCk7CisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcihpbnQgdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgU3RyaW5nLmZvcm1hdChURVNUX0ZMQUdfVkFMX1BBVEgsIHZlcnNpb24pKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdJbmZvQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfRkxBR19JTkZPX1BBVEgpOworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ0luZm9CeXRlQnVmZmVyKGludCB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBTdHJpbmcuZm9ybWF0KFRFU1RfRkxBR19JTkZPX1BBVEgsIHZlcnNpb24pKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIHJlYWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3N0b3JhZ2VfZmlsZV90ZXN0LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3RvcmFnZV9maWxlX3Rlc3QuY3BwCmluZGV4IGViZDFkZDguLjVjMDA4YWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3RvcmFnZV9maWxlX3Rlc3QuY3BwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3RvcmFnZV9maWxlX3Rlc3QuY3BwCkBAIC0yNCwxMCArMjQsOCBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CiB1c2luZyBuYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlOwogCi12b2lkIHZlcmlmeV92YWx1ZShjb25zdCBGbGFnVmFsdWVTdW1tYXJ5JiBmbGFnLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX25hbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCit2b2lkIHZlcmlmeV92YWx1ZShjb25zdCBGbGFnVmFsdWVTdW1tYXJ5JiBmbGFnLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfdmFsLAogICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlX3R5cGUpIHsKICAgQVNTRVJUX0VRKGZsYWcucGFja2FnZV9uYW1lLCBwYWNrYWdlX25hbWUpOwogICBBU1NFUlRfRVEoZmxhZy5mbGFnX25hbWUsIGZsYWdfbmFtZSk7CkBAIC0zOSwxMCArMzcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlYWR3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfc2VydmVyX292ZXJyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19sb2NhbF9vdmVycmlkZSkgeworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWVfdHlwZSwgYm9vbCBpc19yZWFkd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX3NlcnZlcl9vdmVycmlkZSwgYm9vbCBoYXNfbG9jYWxfb3ZlcnJpZGUpIHsKICAgQVNTRVJUX0VRKGZsYWcucGFja2FnZV9uYW1lLCBwYWNrYWdlX25hbWUpOwogICBBU1NFUlRfRVEoZmxhZy5mbGFnX25hbWUsIGZsYWdfbmFtZSk7CiAgIEFTU0VSVF9FUShmbGFnLmZsYWdfdmFsdWUsIGZsYWdfdmFsKTsKQEAgLTUyLDYxICs0OCwxMzcgQEAKICAgQVNTRVJUX0VRKGZsYWcuaGFzX2xvY2FsX292ZXJyaWRlLCBoYXNfbG9jYWxfb3ZlcnJpZGUpOwogfQogCitSZXN1bHQ8c3RkOjp2ZWN0b3I8RmxhZ1ZhbHVlU3VtbWFyeT4+IGdldF9mbGFnX2xpc3RfcmVzdWx0KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHZlcnNpb24pIHsKKyAgYXV0byBjb25zdCB0ZXN0X2Jhc2VfZGlyID0gR2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOworICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gdGVzdF9iYXNlX2RpciArICIvZGF0YS92IiArIHZlcnNpb247CisgIGF1dG8gY29uc3QgcGFja2FnZV9tYXAgPSB0ZXN0X2RpciArICIvcGFja2FnZV92IiArIHZlcnNpb24gKyAiLm1hcCI7CisgIGF1dG8gY29uc3QgZmxhZ19tYXAgPSB0ZXN0X2RpciArICIvZmxhZ192IiArIHZlcnNpb24gKyAiLm1hcCI7CisgIGF1dG8gY29uc3QgZmxhZ192YWwgPSB0ZXN0X2RpciArICIvZmxhZ192IiArIHZlcnNpb24gKyAiLnZhbCI7CisgIHJldHVybiBhY29uZmlnX3N0b3JhZ2U6Omxpc3RfZmxhZ3MocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCk7Cit9CisKK1Jlc3VsdDxzdGQ6OnZlY3RvcjxGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeT4+IGdldF9mbGFnX2xpc3RfcmVzdWx0X3dpdGhfaW5mbygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB2ZXJzaW9uKSB7CisgIGF1dG8gY29uc3QgdGVzdF9iYXNlX2RpciA9IEdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKKyAgYXV0byBjb25zdCB0ZXN0X2RpciA9IHRlc3RfYmFzZV9kaXIgKyAiL2RhdGEvdiIgKyB2ZXJzaW9uOworICBhdXRvIGNvbnN0IHBhY2thZ2VfbWFwID0gdGVzdF9kaXIgKyAiL3BhY2thZ2VfdiIgKyB2ZXJzaW9uICsgIi5tYXAiOworICBhdXRvIGNvbnN0IGZsYWdfbWFwID0gdGVzdF9kaXIgKyAiL2ZsYWdfdiIgKyB2ZXJzaW9uICsgIi5tYXAiOworICBhdXRvIGNvbnN0IGZsYWdfdmFsID0gdGVzdF9kaXIgKyAiL2ZsYWdfdiIgKyB2ZXJzaW9uICsgIi52YWwiOworICBhdXRvIGNvbnN0IGZsYWdfaW5mbyA9IHRlc3RfZGlyICsgIi9mbGFnX3YiICsgdmVyc2lvbiArICIuaW5mbyI7CisgIHJldHVybiBhY29uZmlnX3N0b3JhZ2U6Omxpc3RfZmxhZ3Nfd2l0aF9pbmZvKHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfaW5mbyk7Cit9CisKIFRFU1QoQWNvbmZpZ1N0b3JhZ2VGaWxlVGVzdCwgdGVzdF9saXN0X2ZsYWcpIHsKLSAgYXV0byBjb25zdCB0ZXN0X2RpciA9IEdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgYXV0byBjb25zdCBwYWNrYWdlX21hcCA9IHRlc3RfZGlyICsgIi9wYWNrYWdlLm1hcCI7Ci0gIGF1dG8gY29uc3QgZmxhZ19tYXAgPSB0ZXN0X2RpciArICIvZmxhZy5tYXAiOwotICBhdXRvIGNvbnN0IGZsYWdfdmFsID0gdGVzdF9kaXIgKyAiL2ZsYWcudmFsIjsKLSAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gYWNvbmZpZ19zdG9yYWdlOjpsaXN0X2ZsYWdzKAotICAgICAgcGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCk7CisgIGF1dG8gZmxhZ19saXN0X3Jlc3VsdCA9IGdldF9mbGFnX2xpc3RfcmVzdWx0KCIxIik7CiAgIEFTU0VSVF9UUlVFKGZsYWdfbGlzdF9yZXN1bHQub2soKSk7CiAKICAgYXV0byBjb25zdCYgZmxhZ19saXN0ID0gKmZsYWdfbGlzdF9yZXN1bHQ7CiAgIEFTU0VSVF9FUShmbGFnX2xpc3Quc2l6ZSgpLCA4KTsKLSAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZGlzYWJsZWRfcnciLAotICAgICAgICAgICAgICAgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKICAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFsxXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ybyIsCiAgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iKTsKICAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFsyXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ydyIsCiAgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIik7Ci0gIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbM10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImRpc2FibGVkX3J3IiwKLSAgICAgICAgICAgICAgICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIik7Ci0gIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImVuYWJsZWRfZml4ZWRfcm8iLAotICAgICAgICAgICAgICAgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIpOwogICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX3JvIiwKICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIpOwotICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzZdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsICJlbmFibGVkX2ZpeGVkX3JvIiwKLSAgICAgICAgICAgICAgICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICJlbmFibGVkX2ZpeGVkX3JvIiwgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9ydyIsCisgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIik7Cit9CisKKy8vIFRPRE86IGIvMzc2MjU2NDcyIC0gVXNlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCitURVNUKEFjb25maWdTdG9yYWdlRmlsZVRlc3QsIHRlc3RfbGlzdF9mbGFnX3YyKSB7CisgIGF1dG8gZmxhZ19saXN0X3Jlc3VsdCA9IGdldF9mbGFnX2xpc3RfcmVzdWx0KCIyIik7CisgIEFTU0VSVF9UUlVFKGZsYWdfbGlzdF9yZXN1bHQub2soKSk7CisKKyAgYXV0byBjb25zdCYgZmxhZ19saXN0ID0gKmZsYWdfbGlzdF9yZXN1bHQ7CisgIEFTU0VSVF9FUShmbGFnX2xpc3Quc2l6ZSgpLCA4KTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFsxXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFsyXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ydyIsCisgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbM10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwKKyAgICAgICAgICAgICAgICJkaXNhYmxlZF9ydyIsICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwKKyAgICAgICAgICAgICAgICJlbmFibGVkX2ZpeGVkX3JvIiwgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs1XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLCAiZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs2XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIpOwogICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzddLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsICJlbmFibGVkX3J3IiwKICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKIH0KIAogVEVTVChBY29uZmlnU3RvcmFnZUZpbGVUZXN0LCB0ZXN0X2xpc3RfZmxhZ193aXRoX2luZm8pIHsKLSAgYXV0byBjb25zdCB0ZXN0X2RpciA9IEdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgYXV0byBjb25zdCBwYWNrYWdlX21hcCA9IHRlc3RfZGlyICsgIi9wYWNrYWdlLm1hcCI7Ci0gIGF1dG8gY29uc3QgZmxhZ19tYXAgPSB0ZXN0X2RpciArICIvZmxhZy5tYXAiOwotICBhdXRvIGNvbnN0IGZsYWdfdmFsID0gdGVzdF9kaXIgKyAiL2ZsYWcudmFsIjsKLSAgYXV0byBjb25zdCBmbGFnX2luZm8gPSB0ZXN0X2RpciArICIvZmxhZy5pbmZvIjsKLSAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gYWNvbmZpZ19zdG9yYWdlOjpsaXN0X2ZsYWdzX3dpdGhfaW5mbygKLSAgICAgIHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwsIGZsYWdfaW5mbyk7CisgIGF1dG8gZmxhZ19saXN0X3Jlc3VsdCA9IGdldF9mbGFnX2xpc3RfcmVzdWx0X3dpdGhfaW5mbygiMSIpOwogICBBU1NFUlRfVFJVRShmbGFnX2xpc3RfcmVzdWx0Lm9rKCkpOwogCiAgIGF1dG8gY29uc3QmIGZsYWdfbGlzdCA9ICpmbGFnX2xpc3RfcmVzdWx0OwogICBBU1NFUlRfRVEoZmxhZ19saXN0LnNpemUoKSwgOCk7Ci0gIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZGlzYWJsZWRfcnciLAotICAgICAgICAgICAgICAgICAgICAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFsxXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ybyIsCi0gICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImVuYWJsZWRfcnciLAotICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJkaXNhYmxlZF9ydyIsCi0gICAgICAgICAgICAgICAgICAgICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX2ZpeGVkX3JvIiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX3JvIiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs2XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9maXhlZF9ybyIsCi0gICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9ydyIsCi0gICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcm8iLCAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzJdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3J3IiwgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs1XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ybyIsICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbN10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcnciLCAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworVEVTVChBY29uZmlnU3RvcmFnZUZpbGVUZXN0LCB0ZXN0X2xpc3RfZmxhZ193aXRoX2luZm9fdjIpIHsKKyAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gZ2V0X2ZsYWdfbGlzdF9yZXN1bHRfd2l0aF9pbmZvKCIyIik7CisgIEFTU0VSVF9UUlVFKGZsYWdfbGlzdF9yZXN1bHQub2soKSk7CisKKyAgYXV0byBjb25zdCYgZmxhZ19saXN0ID0gKmZsYWdfbGlzdF9yZXN1bHQ7CisgIEFTU0VSVF9FUShmbGFnX2xpc3Quc2l6ZSgpLCA4KTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzBdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZF9ydyIsICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzFdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3JvIiwgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFsyXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ydyIsICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbM10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwKKyAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcm8iLCAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzZdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX2ZpeGVkX3JvIiwgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzddLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3J3IiwgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvQW5kcm9pZC5icAppbmRleCBjMmY0YzE4Li4xNjM0MWI5IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAKQEAgLTM2LDEwICszNiwxMCBAQAogICAgICAgICAibGlicmFuZCIsCiAgICAgXSwKICAgICBkYXRhOiBbCi0gICAgICAgICJ0ZXN0cy9wYWNrYWdlLm1hcCIsCi0gICAgICAgICJ0ZXN0cy9mbGFnLm1hcCIsCi0gICAgICAgICJ0ZXN0cy9mbGFnLnZhbCIsCi0gICAgICAgICJ0ZXN0cy9mbGFnLmluZm8iLAorICAgICAgICAidGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIsCisgICAgICAgICJ0ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwIiwKKyAgICAgICAgInRlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwiLAorICAgICAgICAidGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8iLAogICAgIF0sCiB9CiAKQEAgLTg3LDYgKzg3LDkgQEAKICAgICBnZW5lcmF0ZWRfc291cmNlczogWyJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2JyaWRnZV9jb2RlIl0sCiAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2N4eF9icmlkZ2UiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgXSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLApAQCAtMTA0LDMxICsxMDcsMTIgQEAKICAgICBhZmRvOiB0cnVlLAogfQogCi1zb29uZ19jb25maWdfbW9kdWxlX3R5cGUgewotICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGlua19kZWZhdWx0cyIsCi0gICAgbW9kdWxlX3R5cGU6ICJjY19kZWZhdWx0cyIsCi0gICAgY29uZmlnX25hbWVzcGFjZTogIkFjb25maWciLAotICAgIGJvb2xfdmFyaWFibGVzOiBbCi0gICAgICAgICJyZWFkX2Zyb21fbmV3X3N0b3JhZ2UiLAotICAgIF0sCi0gICAgcHJvcGVydGllczogWwotICAgICAgICAic2hhcmVkX2xpYnMiLAotICAgIF0sCi19Ci0KLXNvb25nX2NvbmZpZ19ib29sX3ZhcmlhYmxlIHsKLSAgICBuYW1lOiAicmVhZF9mcm9tX25ld19zdG9yYWdlIiwKLX0KLQotYWNvbmZpZ19saWJfY2Nfc2hhcmVkX2xpbmtfZGVmYXVsdHMgeworY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGluay5kZWZhdWx0cyIsCi0gICAgc29vbmdfY29uZmlnX3ZhcmlhYmxlczogewotICAgICAgICByZWFkX2Zyb21fbmV3X3N0b3JhZ2U6IHsKLSAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYyIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCisgICAgc2hhcmVkX2xpYnM6IHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfUkVBRF9GUk9NX05FV19TVE9SQUdFIiksIHsKKyAgICAgICAgdHJ1ZTogWyJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSksCiB9CiAKIGNjX2RlZmF1bHRzIHsKQEAgLTE0NCw2ICsxMjgsNyBAQAogICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiLAogICAgIHNyY3M6IFsic3Jjcy9saWIucnMiXSwKICAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAogICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKICAgICAgICAgImxpYmFueWhvdyIsCiAgICAgICAgICJsaWJqbmkiLApAQCAtMTY5LDEwICsxNTQsMTcgQEAKIGphdmFfbGlicmFyeSB7CiAgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkZXJfamF2YSIsCiAgICAgc3JjczogWwotICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YSIsCisgICAgICAgICJzcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvKi5qYXZhIiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgInVuc3VwcG9ydGVkYXBwdXNhZ2UiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAogICAgIF0sCi0gICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAorICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCisgICAgdmlzaWJpbGl0eTogWworICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UiLAorICAgICAgICAiLy9idWlsZC9tYWtlL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAKaW5kZXggOTdhZGEzYS4uOGUwYzRlMSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmNwcAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuY3BwCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KQEAgLTU5LDIyICs2MCwyMiBAQAogCiAvLy8gTWFwIGEgc3RvcmFnZSBmaWxlCiBSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPiBtYXBfc3RvcmFnZV9maWxlKHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlKSB7Ci0gIGludCBmZCA9IG9wZW4oZmlsZS5jX3N0cigpLCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XIHwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpIHsKKyAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHVmZChvcGVuKGZpbGUuY19zdHIoKSwgT19DTE9FWEVDIHwgT19OT0ZPTExPVyB8IE9fUkRPTkxZKSk7CisgIGlmICh1ZmQuZ2V0KCkgPT0gLTEpIHsKICAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+KCk7CiAgICAgcmVzdWx0LmVycm1zZyA9IHN0ZDo6c3RyaW5nKCJmYWlsZWQgdG8gb3BlbiAiKSArIGZpbGUgKyAiOiAiICsgc3RyZXJyb3IoZXJybm8pOwogICAgIHJldHVybiByZXN1bHQ7CiAgIH07CiAKICAgc3RydWN0IHN0YXQgZmRfc3RhdDsKLSAgaWYgKGZzdGF0KGZkLCAmZmRfc3RhdCkgPCAwKSB7CisgIGlmIChmc3RhdCh1ZmQuZ2V0KCksICZmZF9zdGF0KSA8IDApIHsKICAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+KCk7CiAgICAgcmVzdWx0LmVycm1zZyA9IHN0ZDo6c3RyaW5nKCJmc3RhdCBmYWlsZWQ6ICIpICsgc3RyZXJyb3IoZXJybm8pOwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KICAgc2l6ZV90IGZpbGVfc2l6ZSA9IGZkX3N0YXQuc3Rfc2l6ZTsKIAotICB2b2lkKiBjb25zdCBtYXBfcmVzdWx0ID0gbW1hcChudWxscHRyLCBmaWxlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApOworICB2b2lkKiBjb25zdCBtYXBfcmVzdWx0ID0gbW1hcChudWxscHRyLCBmaWxlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgdWZkLmdldCgpLCAwKTsKICAgaWYgKG1hcF9yZXN1bHQgPT0gTUFQX0ZBSUxFRCkgewogICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4oKTsKICAgICByZXN1bHQuZXJybXNnID0gc3RkOjpzdHJpbmcoIm1tYXAgZmFpbGVkOiAiKSArIHN0cmVycm9yKGVycm5vKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX2luZm9fcXVlcnkucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ19pbmZvX3F1ZXJ5LnJzCmluZGV4IDZkMDMzNzcuLjY4YjYxOTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX2luZm9fcXVlcnkucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfaW5mb19xdWVyeS5ycwpAQCAtMTYsOCArMTYsMTAgQEAKIAogLy8hIGZsYWcgdmFsdWUgcXVlcnkgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdmFsdWUgZmlsZSByZWFkIGZyb20gbWFwcGVkIGJ5dGVzCiAKLXVzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZJTEVfVkVSU0lPTn07Ci11c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntmbGFnX2luZm86OkZsYWdJbmZvSGVhZGVyLCByZWFkX3U4X2Zyb21fYnl0ZXMsIEZsYWdWYWx1ZVR5cGV9OwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CisgICAgZmxhZ19pbmZvOjpGbGFnSW5mb0hlYWRlciwgcmVhZF91OF9mcm9tX2J5dGVzLCBGbGFnVmFsdWVUeXBlLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKK307CiB1c2UgYW55aG93Ojphbnlob3c7CiAKIC8vLyBHZXQgZmxhZyBhdHRyaWJ1dGUgYml0ZmllbGQKQEAgLTI3LDExICsyOSwxMSBAQAogICAgIGZsYWdfaW5kZXg6IHUzMiwKICkgLT4gUmVzdWx0PHU4LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OwotICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gY3JhdGU6OkZJTEVfVkVSU0lPTiB7CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCiAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKICAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAotICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICApKSk7CiAgICAgfQogCkBAIC01MywxMiArNTUsMTQgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QsIEZsYWdJbmZvQml0fTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICAgICAgdGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QsIEZsYWdJbmZvQml0LCBERUZBVUxUX0ZJTEVfVkVSU0lPTiwKKyAgICB9OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGlmIGZsYWcgaGFzIHNlcnZlciBvdmVycmlkZQogICAgIGZuIHRlc3RfaXNfZmxhZ19zdGlja3koKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBmb3Igb2Zmc2V0IGluIDAuLjggewogICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CiAgICAgICAgICAgICAgICAgZmluZF9mbGFnX2F0dHJpYnV0ZSgmZmxhZ19pbmZvX2xpc3RbLi5dLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpLnVud3JhcCgpOwpAQCAtNjksNyArNzMsNyBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBpZiBmbGFnIGlzIHJlYWR3cml0ZQogICAgIGZuIHRlc3RfaXNfZmxhZ19yZWFkd3JpdGUoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgYmFzZWxpbmU6IFZlYzxib29sPiA9IHZlYyFbdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWVdOwogICAgICAgICBmb3Igb2Zmc2V0IGluIDAuLjggewogICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CkBAIC04NCw3ICs4OCw3IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGlmIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlCiAgICAgZm4gdGVzdF9mbGFnX2hhc19vdmVycmlkZSgpIHsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGZvciBvZmZzZXQgaW4gMC4uOCB7CiAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KICAgICAgICAgICAgICAgICBmaW5kX2ZsYWdfYXR0cmlidXRlKCZmbGFnX2luZm9fbGlzdFsuLl0sIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCkudW53cmFwKCk7CkBAIC05NSw3ICs5OSw3IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGJleW9uZCB0aGUgZW5kIG9mIGJvb2xlYW4gc2VjdGlvbgogICAgIGZuIHRlc3RfYm9vbGVhbl9vdXRfb2ZfcmFuZ2UoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgZXJyb3IgPQogICAgICAgICAgICAgZmluZF9mbGFnX2F0dHJpYnV0ZSgmZmxhZ19pbmZvX2xpc3RbLi5dLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCA4KS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCkBAIC0xMDcsMTYgKzExMSwxNiBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KICAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKLSAgICAgICAgbGV0IG11dCBpbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpOwotICAgICAgICBpbmZvX2xpc3QuaGVhZGVyLnZlcnNpb24gPSBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IG11dCBpbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGluZm9fbGlzdC5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IGluZm9fbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBlcnJvciA9IGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb1suLl0sIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIDQpLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKICAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCiAgICAgICAgICAgICBmb3JtYXQhKAogICAgICAgICAgICAgICAgICJIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCi0gICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTiArIDEsCi0gICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTgorICAgICAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMSwKKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICAgICAgKQogICAgICAgICApOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3RhYmxlX3F1ZXJ5LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdGFibGVfcXVlcnkucnMKaW5kZXggYTFhNDc5My4uM2U4N2FjYyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdGFibGVfcXVlcnkucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdGFibGVfcXVlcnkucnMKQEAgLTE2LDkgKzE2LDEwIEBACiAKIC8vISBmbGFnIHRhYmxlIHF1ZXJ5IG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIHRhYmxlIGZpbGUgcmVhZCBmcm9tIG1hcHBlZCBieXRlcwogCi11c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBGSUxFX1ZFUlNJT059OwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOwogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CiAgICAgZmxhZ190YWJsZTo6RmxhZ1RhYmxlSGVhZGVyLCBmbGFnX3RhYmxlOjpGbGFnVGFibGVOb2RlLCByZWFkX3UzMl9mcm9tX2J5dGVzLCBTdG9yZWRGbGFnVHlwZSwKKyAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKIH07CiB1c2UgYW55aG93Ojphbnlob3c7CiAKQEAgLTM2LDExICszNywxMSBAQAogICAgIGZsYWc6ICZzdHIsCiApIC0+IFJlc3VsdDxPcHRpb248RmxhZ1JlYWRDb250ZXh0PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCBpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoYnVmKT87Ci0gICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBjcmF0ZTo6RklMRV9WRVJTSU9OIHsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKICAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAogICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCi0gICAgICAgICAgICBGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OCiAgICAgICAgICkpKTsKICAgICB9CiAKQEAgLTczLDEyICs3NCwxMiBAQAogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKLSAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGU7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ190YWJsZSwgREVGQVVMVF9GSUxFX1ZFUlNJT059OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRhYmxlIHF1ZXJ5CiAgICAgZm4gdGVzdF9mbGFnX3F1ZXJ5KCkgewotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgYmFzZWxpbmUgPSB2ZWMhWwogICAgICAgICAgICAgKDAsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMXUxNiksCiAgICAgICAgICAgICAoMCwgImVuYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMnUxNiksCkBAIC0xMDAsNyArMTAxLDcgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGFibGUgcXVlcnkgb2YgYSBub24gZXhpc3QgZmxhZwogICAgIGZuIHRlc3Rfbm90X2V4aXN0ZWRfZmxhZ19xdWVyeSgpIHsKLSAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9IGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfdGFibGVbLi5dLCAxLCAiZGlzYWJsZWRfZml4ZWRfcm8iKS51bndyYXAoKTsKICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQsIE5vbmUpOwogICAgICAgICBsZXQgZmxhZ19jb250ZXh0ID0gZmluZF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ190YWJsZVsuLl0sIDIsICJkaXNhYmxlZF9ydyIpLnVud3JhcCgpOwpAQCAtMTEwLDE2ICsxMTEsMTYgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCiAgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7Ci0gICAgICAgIGxldCBtdXQgdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCk7Ci0gICAgICAgIHRhYmxlLmhlYWRlci52ZXJzaW9uID0gY3JhdGU6OkZJTEVfVkVSU0lPTiArIDE7CisgICAgICAgIGxldCBtdXQgdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdGFibGUuaGVhZGVyLnZlcnNpb24gPSBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDE7CiAgICAgICAgIGxldCBmbGFnX3RhYmxlID0gdGFibGUuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgZXJyb3IgPSBmaW5kX2ZsYWdfcmVhZF9jb250ZXh0KCZmbGFnX3RhYmxlWy4uXSwgMCwgImVuYWJsZWRfcm8iKS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCiAgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAogICAgICAgICAgICAgZm9ybWF0ISgKICAgICAgICAgICAgICAgICAiSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKENhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSkiLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgICAgICkKICAgICAgICAgKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ192YWx1ZV9xdWVyeS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3ZhbHVlX3F1ZXJ5LnJzCmluZGV4IDlkMzJhMTYuLjM1ZjU2OTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3ZhbHVlX3F1ZXJ5LnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3ZhbHVlX3F1ZXJ5LnJzCkBAIC0xNiwxOCArMTYsMjAgQEAKIAogLy8hIGZsYWcgdmFsdWUgcXVlcnkgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdmFsdWUgZmlsZSByZWFkIGZyb20gbWFwcGVkIGJ5dGVzCiAKLXVzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZJTEVfVkVSU0lPTn07Ci11c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntmbGFnX3ZhbHVlOjpGbGFnVmFsdWVIZWFkZXIsIHJlYWRfdThfZnJvbV9ieXRlc307Cit1c2UgY3JhdGU6OkFjb25maWdTdG9yYWdlRXJyb3I7Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICBmbGFnX3ZhbHVlOjpGbGFnVmFsdWVIZWFkZXIsIHJlYWRfdThfZnJvbV9ieXRlcywgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04sCit9OwogdXNlIGFueWhvdzo6YW55aG93OwogCiAvLy8gUXVlcnkgZmxhZyB2YWx1ZQogcHViIGZuIGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKGJ1ZjogJlt1OF0sIGZsYWdfaW5kZXg6IHUzMikgLT4gUmVzdWx0PGJvb2wsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKICAgICBsZXQgaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OwotICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gY3JhdGU6OkZJTEVfVkVSU0lPTiB7CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCiAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKICAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAotICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICApKSk7CiAgICAgfQogCkBAIC00NiwxMiArNDgsMTIgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3Q7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0LCBERUZBVUxUX0ZJTEVfVkVSU0lPTn07CiAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyB2YWx1ZSBxdWVyeQogICAgIGZuIHRlc3RfZmxhZ192YWx1ZV9xdWVyeSgpIHsKLSAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgYmFzZWxpbmU6IFZlYzxib29sPiA9IHZlYyFbZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTsKICAgICAgICAgZm9yIChvZmZzZXQsIGV4cGVjdGVkX3ZhbHVlKSBpbiBiYXNlbGluZS5pbnRvX2l0ZXIoKS5lbnVtZXJhdGUoKSB7CiAgICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbHVlX2xpc3RbLi5dLCBvZmZzZXQgYXMgdTMyKS51bndyYXAoKTsKQEAgLTYyLDcgKzY0LDcgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgYmV5b25kIHRoZSBlbmQgb2YgYm9vbGVhbiBzZWN0aW9uCiAgICAgZm4gdGVzdF9ib29sZWFuX291dF9vZl9yYW5nZSgpIHsKLSAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgZXJyb3IgPSBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWx1ZV9saXN0Wy4uXSwgOCkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKQEAgLTczLDE2ICs3NSwxNiBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KICAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKLSAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCk7Ci0gICAgICAgIHZhbHVlX2xpc3QuaGVhZGVyLnZlcnNpb24gPSBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdmFsdWVfbGlzdC5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSB2YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVbLi5dLCA0KS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCiAgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAogICAgICAgICAgICAgZm9ybWF0ISgKICAgICAgICAgICAgICAgICAiSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKENhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSkiLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgICAgICkKICAgICAgICAgKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2xpYi5ycwppbmRleCBkNzZjZjNmLi5kM2NjOWQ0IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9saWIucnMKQEAgLTQ0LDkgKzQ0LDEwIEBACiAKIHB1YiB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBGbGFnVmFsdWVUeXBlLCBTdG9yYWdlRmlsZVR5cGV9OwogcHViIHVzZSBmbGFnX3RhYmxlX3F1ZXJ5OjpGbGFnUmVhZENvbnRleHQ7CitwdWIgdXNlIG1hcHBlZF9maWxlOjptYXBfZmlsZTsKIHB1YiB1c2UgcGFja2FnZV90YWJsZV9xdWVyeTo6UGFja2FnZVJlYWRDb250ZXh0OwogCi11c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntyZWFkX3UzMl9mcm9tX2J5dGVzLCBGSUxFX1ZFUlNJT059OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpyZWFkX3UzMl9mcm9tX2J5dGVzOwogdXNlIGZsYWdfaW5mb19xdWVyeTo6ZmluZF9mbGFnX2F0dHJpYnV0ZTsKIHVzZSBmbGFnX3RhYmxlX3F1ZXJ5OjpmaW5kX2ZsYWdfcmVhZF9jb250ZXh0OwogdXNlIGZsYWdfdmFsdWVfcXVlcnk6OmZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlOwpAQCAtMTE0LDEzICsxMTUsMTMgQEAKIAogLy8vIEdldCB0aGUgYm9vbGVhbiBmbGFnIHZhbHVlLgogLy8vCi0vLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBmbGFnIGZpbGUKKy8vLyBcaW5wdXQgZmlsZTogYSBieXRlIHNsaWNlLCBjYW4gYmUgZWl0aGVyICZNbWFwIG9yICZNYXBNdXQKIC8vLyBcaW5wdXQgaW5kZXg6IGJvb2xlYW4gZmxhZyBvZmZzZXQKIC8vLwogLy8vIFxyZXR1cm4KIC8vLyBJZiB0aGUgcHJvdmlkZSBvZmZzZXQgaXMgdmFsaWQsIGl0IHJldHVybnMgdGhlIGJvb2xlYW4gZmxhZyB2YWx1ZSwgb3RoZXJ3aXNlIGl0CiAvLy8gcmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS4KLXB1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGU6ICZNbWFwLCBpbmRleDogdTMyKSAtPiBSZXN1bHQ8Ym9vbCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworcHViIGZuIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoZmlsZTogJlt1OF0sIGluZGV4OiB1MzIpIC0+IFJlc3VsdDxib29sLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoZmlsZSwgaW5kZXgpCiB9CiAKQEAgLTE0OCw3ICsxNDksNyBAQAogCiAvLy8gR2V0IHRoZSBmbGFnIGF0dHJpYnV0ZS4KIC8vLwotLy8vIFxpbnB1dCBmaWxlOiBtYXBwZWQgZmxhZyBpbmZvIGZpbGUKKy8vLyBcaW5wdXQgZmlsZTogYSBieXRlIHNsaWNlLCBjYW4gYmUgZWl0aGVyICZNbWFwIG9yICZNYXBNdXQKIC8vLyBcaW5wdXQgZmxhZ190eXBlOiBmbGFnIHZhbHVlIHR5cGUKIC8vLyBcaW5wdXQgZmxhZ19pbmRleDogZmxhZyBpbmRleAogLy8vCkBAIC0xNTYsNyArMTU3LDcgQEAKIC8vLyBJZiB0aGUgcHJvdmlkZSBvZmZzZXQgaXMgdmFsaWQsIGl0IHJldHVybnMgdGhlIGZsYWcgYXR0cmlidXRlIGJpdGZpbGVkLCBvdGhlcndpc2UgaXQKIC8vLyByZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLgogcHViIGZuIGdldF9mbGFnX2F0dHJpYnV0ZSgKLSAgICBmaWxlOiAmTW1hcCwKKyAgICBmaWxlOiAmW3U4XSwKICAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCiAgICAgZmxhZ19pbmRleDogdTMyLAogKSAtPiBSZXN1bHQ8dTgsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKQEAgLTQxMiwxMCArNDEzLDEwIEBACiAgICAgICAgIGxldCBmbGFnX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIjsKICAgICAgICAgbGV0IGZsYWdfdmFsID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAudmFsIjsKICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLmluZm8iOwotICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9wYWNrYWdlLm1hcCIsICZwYWNrYWdlX21hcCkudW53cmFwKCk7Ci0gICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2ZsYWcubWFwIiwgJmZsYWdfbWFwKS51bndyYXAoKTsKLSAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZmxhZy52YWwiLCAmZmxhZ192YWwpLnVud3JhcCgpOwotICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9mbGFnLmluZm8iLCAmZmxhZ19pbmZvKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIsICZwYWNrYWdlX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAiLCAmZmxhZ19tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsIiwgJmZsYWdfdmFsKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8iLCAmZmxhZ19pbmZvKS51bndyYXAoKTsKIAogICAgICAgICByZXR1cm4gc3RvcmFnZV9kaXI7CiAgICAgfQpAQCAtNDMyLDIxICs0MzMsMjQgQEAKICAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDAsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAgfTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAwLCBib29sZWFuX3N0YXJ0X2luZGV4OiAwLCBmaW5nZXJwcmludDogMCB9OwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKIAogICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KICAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDEsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMgfTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAxLCBib29sZWFuX3N0YXJ0X2luZGV4OiAzLCBmaW5nZXJwcmludDogMCB9OwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKIAogICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KICAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDIsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYgfTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2LCBmaW5nZXJwcmludDogMCB9OwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKICAgICB9CiAKQEAgLTUwNyw5ICs1MTEsOSBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmbGFnIHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIG51bWJlciBxdWVyeSBhcGkKICAgICBmbiB0ZXN0X3N0b3JhZ2VfdmVyc2lvbl9xdWVyeSgpIHsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvcGFja2FnZS5tYXAiKS51bndyYXAoKSwgMSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2ZsYWcubWFwIikudW53cmFwKCksIDEpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9mbGFnLnZhbCIpLnVud3JhcCgpLCAxKTsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZmxhZy5pbmZvIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIpLnVud3JhcCgpLCAxKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMKaW5kZXggNWExNjY0NS4uZjRlMjY5ZSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL21hcHBlZF9maWxlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycwpAQCAtMjgsNyArMjgsNyBAQAogLy8vIFRoZSBtZW1vcnkgbWFwcGVkIGZpbGUgbWF5IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZXJlIGFyZSB3cml0ZXMgdG8gdGhpcwogLy8vIGZpbGUgYWZ0ZXIgYmVpbmcgbWFwcGVkLiBFbnN1cmUgbm8gd3JpdGVzIGNhbiBoYXBwZW4gdG8gdGhpcyBmaWxlIHdoaWxlIHRoaXMKIC8vLyBtYXBwaW5nIHN0YXlzIGFsaXZlLgotdW5zYWZlIGZuIG1hcF9maWxlKGZpbGVfcGF0aDogJnN0cikgLT4gUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKK3B1YiB1bnNhZmUgZm4gbWFwX2ZpbGUoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCBmaWxlID0gRmlsZTo6b3BlbihmaWxlX3BhdGgpCiAgICAgICAgIC5tYXBfZXJyKHxlcnJtc2d8IEZpbGVSZWFkRmFpbChhbnlob3chKCJGYWlsZWQgdG8gb3BlbiBmaWxlIHt9OiB7fSIsIGZpbGVfcGF0aCwgZXJybXNnKSkpPzsKICAgICB1bnNhZmUgewpAQCAtOTcsMTAgKzk3LDEwIEBACiAgICAgICAgIGxldCBmbGFnX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIjsKICAgICAgICAgbGV0IGZsYWdfdmFsID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAudmFsIjsKICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLmluZm8iOwotICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9wYWNrYWdlLm1hcCIsICZwYWNrYWdlX21hcCkudW53cmFwKCk7Ci0gICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2ZsYWcubWFwIiwgJmZsYWdfbWFwKS51bndyYXAoKTsKLSAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZmxhZy52YWwiLCAmZmxhZ192YWwpLnVud3JhcCgpOwotICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9mbGFnLmluZm8iLCAmZmxhZ19pbmZvKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIsICZwYWNrYWdlX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAiLCAmZmxhZ19tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsIiwgJmZsYWdfdmFsKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8iLCAmZmxhZ19pbmZvKS51bndyYXAoKTsKIAogICAgICAgICByZXR1cm4gc3RvcmFnZV9kaXI7CiAgICAgfQpAQCAtMTA4LDkgKzEwOCw5IEBACiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfbWFwcGVkX2ZpbGVfY29udGVudHMoKSB7CiAgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKLSAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAsICIuL3Rlc3RzL3BhY2thZ2UubWFwIik7Ci0gICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwLCAiLi90ZXN0cy9mbGFnLm1hcCIpOwotICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCwgIi4vdGVzdHMvZmxhZy52YWwiKTsKLSAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvLCAiLi90ZXN0cy9mbGFnLmluZm8iKTsKKyAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAsICIuL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAiKTsKKyAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAsICIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAiKTsKKyAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwsICIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwiKTsKKyAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvLCAiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9wYWNrYWdlX3RhYmxlX3F1ZXJ5LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL3BhY2thZ2VfdGFibGVfcXVlcnkucnMKaW5kZXggMmNiODU0Yi4uYjIwNjY4ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL3BhY2thZ2VfdGFibGVfcXVlcnkucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL3BhY2thZ2VfdGFibGVfcXVlcnkucnMKQEAgLTE2LDkgKzE2LDEwIEBACiAKIC8vISBwYWNrYWdlIHRhYmxlIHF1ZXJ5IG1vZHVsZSBkZWZpbmVzIHRoZSBwYWNrYWdlIHRhYmxlIGZpbGUgcmVhZCBmcm9tIG1hcHBlZCBieXRlcwogCi11c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBGSUxFX1ZFUlNJT059OwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOwogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CiAgICAgcGFja2FnZV90YWJsZTo6UGFja2FnZVRhYmxlSGVhZGVyLCBwYWNrYWdlX3RhYmxlOjpQYWNrYWdlVGFibGVOb2RlLCByZWFkX3UzMl9mcm9tX2J5dGVzLAorICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAogfTsKIHVzZSBhbnlob3c6OmFueWhvdzsKIApAQCAtMjcsNiArMjgsNyBAQAogcHViIHN0cnVjdCBQYWNrYWdlUmVhZENvbnRleHQgewogICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCiAgICAgcHViIGJvb2xlYW5fc3RhcnRfaW5kZXg6IHUzMiwKKyAgICBwdWIgZmluZ2VycHJpbnQ6IHU2NCwKIH0KIAogLy8vIFF1ZXJ5IHBhY2thZ2UgcmVhZCBjb250ZXh0OiBwYWNrYWdlIGlkIGFuZCBzdGFydCBpbmRleApAQCAtMzUsMTEgKzM3LDExIEBACiAgICAgcGFja2FnZTogJnN0ciwKICkgLT4gUmVzdWx0PE9wdGlvbjxQYWNrYWdlUmVhZENvbnRleHQ+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IFBhY2thZ2VUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKLSAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IEZJTEVfVkVSU0lPTiB7CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCiAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKICAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAotICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICApKSk7CiAgICAgfQogCkBAIC01NSwxMSArNTcsMTMgQEAKICAgICB9CiAKICAgICBsb29wIHsKLSAgICAgICAgbGV0IGludGVycHJldGVkX25vZGUgPSBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZidWZbcGFja2FnZV9ub2RlX29mZnNldC4uXSk/OworICAgICAgICBsZXQgaW50ZXJwcmV0ZWRfbm9kZSA9CisgICAgICAgICAgICBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZidWZbcGFja2FnZV9ub2RlX29mZnNldC4uXSwgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24pPzsKICAgICAgICAgaWYgaW50ZXJwcmV0ZWRfbm9kZS5wYWNrYWdlX25hbWUgPT0gcGFja2FnZSB7CiAgICAgICAgICAgICByZXR1cm4gT2soU29tZShQYWNrYWdlUmVhZENvbnRleHQgewogICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQ6IGludGVycHJldGVkX25vZGUucGFja2FnZV9pZCwKICAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiBpbnRlcnByZXRlZF9ub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQ6IGludGVycHJldGVkX25vZGUuZmluZ2VycHJpbnQsCiAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KICAgICAgICAgbWF0Y2ggaW50ZXJwcmV0ZWRfbm9kZS5uZXh0X29mZnNldCB7CkBAIC03MiwyOSArNzYsNjggQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUsIERFRkFVTFRfRklMRV9WRVJTSU9OfTsKIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeQogICAgIGZuIHRlc3RfcGFja2FnZV9xdWVyeSgpIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDAsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAgfTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAwLCBib29sZWFuX3N0YXJ0X2luZGV4OiAwLCBmaW5nZXJwcmludDogMCB9OwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDEsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMgfTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAxLCBib29sZWFuX3N0YXJ0X2luZGV4OiAzLCBmaW5nZXJwcmludDogMCB9OwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDIsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYgfTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2LCBmaW5nZXJwcmludDogMCB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGFibGUgcXVlcnkKKyAgICBmbiB0ZXN0X3BhY2thZ2VfcXVlcnlfdjIoKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgyKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeworICAgICAgICAgICAgcGFja2FnZV9pZDogMCwKKyAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsCisgICAgICAgICAgICBmaW5nZXJwcmludDogMTUyNDg5NDg1MTA1OTAxNTgwODZ1NjQsCisgICAgICAgIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDEsCisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAzLAorICAgICAgICAgICAgZmluZ2VycHJpbnQ6IDQ0MzE5NDA1MDIyNzQ4NTc5NjR1NjQsCisgICAgICAgIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDIsCisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiA2LAorICAgICAgICAgICAgZmluZ2VycHJpbnQ6IDE2MjMzMjI5OTE3NzExNjIyMzc1dTY0LAorICAgICAgICB9OwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKICAgICB9CiAKQEAgLTEwMiw3ICsxNDUsNyBAQAogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRhYmxlIHF1ZXJ5IG9mIGEgbm9uIGV4aXN0IHBhY2thZ2UKICAgICBmbiB0ZXN0X25vdF9leGlzdGVkX3BhY2thZ2VfcXVlcnkoKSB7CiAgICAgICAgIC8vIHRoaXMgd2lsbCBsYW5kIGF0IGFuIGVtcHR5IGJ1Y2tldAotICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KICAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMyIpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpOwpAQCAtMTE3LDggKzE2MCw4IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGVycm9yIHdoZW4gZmlsZSBoYXMgYSBoaWdoZXIgdmVyc2lvbgogICAgIGZuIHRlc3RfaGlnaGVyX3ZlcnNpb25fc3RvcmFnZV9maWxlKCkgewotICAgICAgICBsZXQgbXV0IHRhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOwotICAgICAgICB0YWJsZS5oZWFkZXIudmVyc2lvbiA9IGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgbXV0IHRhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIHRhYmxlLmhlYWRlci52ZXJzaW9uID0gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxOwogICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IHRhYmxlLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0KICAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCkBAIC0xMjcsOCArMTcwLDggQEAKICAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCiAgICAgICAgICAgICBmb3JtYXQhKAogICAgICAgICAgICAgICAgICJIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCi0gICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTiArIDEsCi0gICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTgorICAgICAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMSwKKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICAgICAgKQogICAgICAgICApOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlUmVhZEFQSS5qYXZhCmluZGV4IDQwNmZmMjQuLjg1MGMyYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZVJlYWRBUEkuamF2YQpAQCAtMTYsMTggKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CiAKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5vcHRpbWl6YXRpb24uRmFzdE5hdGl2ZTsKKwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiBpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlOwotCi1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVJlYWRDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dDsKLQotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLm9wdGltaXphdGlvbi5GYXN0TmF0aXZlOwogCiBwdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJIHsKIApAQCAtNTAsOSArNDYsOCBAQAogICAgIH0KIAogICAgIC8vIE1hcCBhIHN0b3JhZ2UgZmlsZSBnaXZlbiBjb250YWluZXIgYW5kIGZpbGUgdHlwZQotICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBnZXRNYXBwZWRGaWxlKAotICAgICAgICBTdHJpbmcgY29udGFpbmVyLAotICAgICAgICBTdG9yYWdlRmlsZVR5cGUgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBnZXRNYXBwZWRGaWxlKFN0cmluZyBjb250YWluZXIsIFN0b3JhZ2VGaWxlVHlwZSB0eXBlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgICBjYXNlIFBBQ0tBR0VfTUFQOgogICAgICAgICAgICAgICAgIHJldHVybiBtYXBTdG9yYWdlRmlsZShTVE9SQUdFRElSICsgIi9tYXBzLyIgKyBjb250YWluZXIgKyAiLnBhY2thZ2UubWFwIik7CkBAIC03MywxNCArNjgsMTQgQEAKICAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG1hcCBmaWxlCiAgICAgQEZhc3ROYXRpdmUKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQnl0ZUJ1ZmZlciBnZXRQYWNrYWdlUmVhZENvbnRleHRJbXBsKAotICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8vIEFQSSB0byBnZXQgcGFja2FnZSByZWFkIGNvbnRleHQKICAgICAvLyBAcGFyYW0gbWFwcGVkRmlsZTogbWVtb3J5IG1hcHBlZCBwYWNrYWdlIG1hcCBmaWxlCiAgICAgLy8gQHBhcmFtIHBhY2thZ2VOYW1lOiBwYWNrYWdlIG5hbWUKICAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG1hcCBmaWxlCi0gICAgc3RhdGljIHB1YmxpYyBQYWNrYWdlUmVhZENvbnRleHQgZ2V0UGFja2FnZVJlYWRDb250ZXh0ICgKLSAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBQYWNrYWdlUmVhZENvbnRleHQgZ2V0UGFja2FnZVJlYWRDb250ZXh0KAorICAgICAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gZ2V0UGFja2FnZVJlYWRDb250ZXh0SW1wbChtYXBwZWRGaWxlLCBwYWNrYWdlTmFtZSk7CiAgICAgICAgIGJ1ZmZlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CiAgICAgICAgIHJldHVybiBuZXcgUGFja2FnZVJlYWRDb250ZXh0KGJ1ZmZlci5nZXRJbnQoKSwgYnVmZmVyLmdldEludCg0KSk7CkBAIC05NCw3ICs4OSw3IEBACiAgICAgLy8gQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgcGFzc2VkIGluIGZpbGUgaXMgbm90IGEgdmFsaWQgZmxhZyBtYXAgZmlsZQogICAgIEBGYXN0TmF0aXZlCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEJ5dGVCdWZmZXIgZ2V0RmxhZ1JlYWRDb250ZXh0SW1wbCgKLSAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgbWFwcGVkRmlsZSwgaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvLyBBUEkgdG8gZ2V0IGZsYWcgcmVhZCBjb250ZXh0CiAgICAgLy8gQHBhcmFtIG1hcHBlZEZpbGU6IG1lbW9yeSBtYXBwZWQgZmxhZyBtYXAgZmlsZQpAQCAtMTAzLDcgKzk4LDcgQEAKICAgICAvLyBAcGFyYW0gZmxhZ05hbWU6IGZsYWcgbmFtZQogICAgIC8vIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmaWxlIGlzIG5vdCBhIHZhbGlkIGZsYWcgbWFwIGZpbGUKICAgICBwdWJsaWMgc3RhdGljIEZsYWdSZWFkQ29udGV4dCBnZXRGbGFnUmVhZENvbnRleHQoCi0gICAgICAgIEJ5dGVCdWZmZXIgbWFwcGVkRmlsZSwgaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gZ2V0RmxhZ1JlYWRDb250ZXh0SW1wbChtYXBwZWRGaWxlLCBwYWNrYWdlSWQsIGZsYWdOYW1lKTsKICAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKICAgICAgICAgcmV0dXJuIG5ldyBGbGFnUmVhZENvbnRleHQoYnVmZmVyLmdldEludCgpLCBidWZmZXIuZ2V0SW50KDQpKTsKQEAgLTExNSw4ICsxMTAsMTEgQEAKICAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBmbGFnIHZhbHVlIGZpbGUgb3IgdGhlCiAgICAgLy8gZmxhZyBpbmRleCB3ZW50IG92ZXIgdGhlIGZpbGUgYm91bmRhcnkuCiAgICAgQEZhc3ROYXRpdmUKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoCi0gICAgICAgIEJ5dGVCdWZmZXIgbWFwcGVkRmlsZSwgaW50IGZsYWdJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBmbGFnSW5kZXgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBARmFzdE5hdGl2ZQorICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgaGFzaChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIik7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzMTAxNy4uMDAwMDAwMAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotCi1wdWJsaWMgY2xhc3MgU3RvcmFnZUludGVybmFsUmVhZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9tYXBzLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1RfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9ib290LyI7Ci0KLSAgICBwcml2YXRlIFBhY2thZ2VUYWJsZSBtUGFja2FnZVRhYmxlOwotICAgIHByaXZhdGUgRmxhZ1ZhbHVlTGlzdCBtRmxhZ1ZhbHVlTGlzdDsKLQotICAgIHByaXZhdGUgaW50IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0OwotCi0gICAgcHVibGljIFN0b3JhZ2VJbnRlcm5hbFJlYWRlcihTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgdGhpcyhwYWNrYWdlTmFtZSwgTUFQX1BBVEggKyBjb250YWluZXIgKyAiLnBhY2thZ2UubWFwIiwgQk9PVF9QQVRIICsgY29udGFpbmVyICsgIi52YWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RvcmFnZUludGVybmFsUmVhZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHBhY2thZ2VNYXBGaWxlLCBTdHJpbmcgZmxhZ1ZhbHVlRmlsZSkgewotICAgICAgICBtUGFja2FnZVRhYmxlID0gUGFja2FnZVRhYmxlLmZyb21CeXRlcyhtYXBTdG9yYWdlRmlsZShwYWNrYWdlTWFwRmlsZSkpOwotICAgICAgICBtRmxhZ1ZhbHVlTGlzdCA9IEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKGZsYWdWYWx1ZUZpbGUpKTsKLSAgICAgICAgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQgPSBnZXRQYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKGludCBpbmRleCkgewotICAgICAgICBpbmRleCArPSBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldDsKLSAgICAgICAgaWYgKGluZGV4ID49IG1GbGFnVmFsdWVMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJGYWlsIHRvIGdldCBib29sZWFuIGZsYWcgdmFsdWUiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUZsYWdWYWx1ZUxpc3QuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IG1QYWNrYWdlVGFibGUuZ2V0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgaWYgKHBOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5IZWFkZXIgaGVhZGVyID0gbVBhY2thZ2VUYWJsZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBnZXQgcGFja2FnZSAlcyBmcm9tIGNvbnRhaW5lciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIGhlYWRlci5nZXRDb250YWluZXIoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpOwotICAgIH0KLQotICAgIC8vIE1hcCBhIHN0b3JhZ2UgZmlsZSBnaXZlbiBmaWxlIHBhdGgKLSAgICBwcml2YXRlIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcFN0b3JhZ2VGaWxlKFN0cmluZyBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBzdHJlYW0uZ2V0Q2hhbm5lbCgpOwotICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBjaGFubmVsLnNpemUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWwgdG8gbW1hcCBzdG9yYWdlIGZpbGUgJXMiLCBmaWxlKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJlNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQW4ge0Bjb2RlIGFjb25maWd9IHBhY2thZ2UgY29udGFpbmluZyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiBpdHMgZmxhZ3MuCisgKgorICogPHA+PHN0cm9uZz5Ob3RlOiB0aGlzIGlzIGludGVuZGVkIG9ubHkgdG8gYmUgdXNlZCBieSBnZW5lcmF0ZWQgY29kZS4gVG8gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gZmxhZworICogaXMgZW5hYmxlZCBpbiBhcHAgY29kZSwgdGhlIGdlbmVyYXRlZCBhbmRyb2lkIGZsYWdzIHNob3VsZCBiZSB1c2VkLjwvc3Ryb25nPgorICoKKyAqIDxwPlRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIHRoZSBmbGFnIGZyb20gcGxhdGZvcm0gQWNvbmZpZyBQYWNrYWdlLkVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcworICogd2lsbCBjYWNoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIG9uZSBwYWNrYWdlLiBUbyByZWFkIGZsYWdzIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZSwgYSBuZXcKKyAqIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHtAbGluayAjbG9hZCBsb2FkZWR9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9tYXBzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1RfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9ib290LyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBQYWNrYWdlVGFibGU+IHNQYWNrYWdlVGFibGVDYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHByaXZhdGUgRmxhZ1RhYmxlIG1GbGFnVGFibGU7CisgICAgcHJpdmF0ZSBGbGFnVmFsdWVMaXN0IG1GbGFnVmFsdWVMaXN0OworCisgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtUGFja2FnZUlkID0gLTE7CisKKyAgICBwcml2YXRlIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UoKSB7fQorCisgICAgLyoqIEBoaWRlICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFBMQVRGT1JNX1BBQ0tBR0VfTUFQX0ZJTEVTID0KKyAgICAgICAgICAgIFNldC5vZigic3lzdGVtLnBhY2thZ2UubWFwIiwgInZlbmRvci5wYWNrYWdlLm1hcCIsICJwcm9kdWN0LnBhY2thZ2UubWFwIik7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKFN0cmluZyBwZiA6IFBMQVRGT1JNX1BBQ0tBR0VfTUFQX0ZJTEVTKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZSBwVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKE1BUF9QQVRIICsgcGYpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSA6IHBUYWJsZS5nZXRQYWNrYWdlTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNQYWNrYWdlVGFibGVDYWNoZS5wdXQocGFja2FnZU5hbWUsIHBUYWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBwYXNzCisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYSBwbGF0Zm9ybSBBY29uZmlnIFBhY2thZ2UgZnJvbSBBY29uZmlnIFN0b3JhZ2UuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBsb2FkIHRoZSBzcGVjaWZpZWQgcGxhdGZvcm0gQWNvbmZpZyBwYWNrYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBBY29uZmlnIHBhY2thZ2UgdG8gbG9hZC4KKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHtAbGluayBQbGF0Zm9ybUFjb25maWdQYWNrYWdlfSwgd2hpY2ggbWF5IGJlIGVtcHR5IGlmIHRoZSBwYWNrYWdlIGlzCisgICAgICogICAgIG5vdCBmb3VuZCBpbiB0aGUgY29udGFpbmVyLiBOdWxsIGlmIHRoZSBwYWNrYWdlIGlzIG5vdCBmb3VuZCBpbiBwbGF0Zm9ybSBwYXJ0aXRpb25zLgorICAgICAqIEB0aHJvd3MgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSBBY29uZmlnIFN0b3JhZ2UsIHN1Y2gKKyAgICAgKiAgICAgYXMgaWYgdGhlIHN0b3JhZ2Ugc3lzdGVtIGlzIG5vdCBmb3VuZCwgb3IgdGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgc3RvcmFnZSBmaWxlLiBUaGUKKyAgICAgKiAgICAgc3BlY2lmaWMgZXJyb3IgY29kZSBjYW4gYmUgZ290IHVzaW5nIHtAbGluayBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24jZ2V0RXJyb3JDb2RlKCl9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UgbG9hZChTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UgYWNvbmZpZ1BhY2thZ2UgPSBuZXcgUGxhdGZvcm1BY29uZmlnUGFja2FnZSgpOworICAgICAgICAgICAgUGFja2FnZVRhYmxlIHBUYWJsZSA9IHNQYWNrYWdlVGFibGVDYWNoZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBUYWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciA9IHBUYWJsZS5nZXRIZWFkZXIoKS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIGFjb25maWdQYWNrYWdlLm1GbGFnVGFibGUgPQorICAgICAgICAgICAgICAgICAgICBGbGFnVGFibGUuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKE1BUF9QQVRIICsgY29udGFpbmVyICsgIi5mbGFnLm1hcCIpKTsKKyAgICAgICAgICAgIGFjb25maWdQYWNrYWdlLm1GbGFnVmFsdWVMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMobWFwU3RvcmFnZUZpbGUoQk9PVF9QQVRIICsgY29udGFpbmVyICsgIi52YWwiKSk7CisgICAgICAgICAgICBhY29uZmlnUGFja2FnZS5tUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCA9IHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCk7CisgICAgICAgICAgICBhY29uZmlnUGFja2FnZS5tUGFja2FnZUlkID0gcE5vZGUuZ2V0UGFja2FnZUlkKCk7CisgICAgICAgICAgICByZXR1cm4gYWNvbmZpZ1BhY2thZ2U7CisgICAgICAgIH0gY2F0Y2ggKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0RXJyb3JDb2RlKCksICJGYWlsIHRvIGNyZWF0ZSBBY29uZmlnUGFja2FnZSIsIGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlUmVhZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uLkVSUk9SX0dFTkVSSUMsCisgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIGNyZWF0ZSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiBmbGFnLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZsYWcuIElmIHRoZSBmbGFnIGV4aXN0cyB3aXRoaW4gdGhlCisgICAgICogbG9hZGVkIEFjb25maWcgUGFja2FnZSwgaXRzIHZhbHVlIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBwcm92aWRlZCBgZGVmYXVsdFZhbHVlYCBpcworICAgICAqIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZsYWdOYW1lIFRoZSBuYW1lIG9mIHRoZSBmbGFnIChleGNsdWRpbmcgYW55IHBhY2thZ2UgbmFtZSBwcmVmaXgpLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgZmxhZyBpcyBub3QgZm91bmQuCisgICAgICogQHJldHVybiBUaGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZmxhZywgb3IgYGRlZmF1bHRWYWx1ZWAgaWYgdGhlIGZsYWcgaXMgbm90IGZvdW5kLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKFN0cmluZyBmbGFnTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgZk5vZGUgPSBtRmxhZ1RhYmxlLmdldChtUGFja2FnZUlkLCBmbGFnTmFtZSk7CisgICAgICAgIGlmIChmTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKGZOb2RlLmdldEZsYWdJbmRleCgpICsgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQpOworICAgIH0KKworICAgIC8vIE1hcCBhIHN0b3JhZ2UgZmlsZSBnaXZlbiBmaWxlIHBhdGgKKyAgICBwcml2YXRlIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcFN0b3JhZ2VGaWxlKFN0cmluZyBmaWxlKSB7CisgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbCA9IEZpbGVDaGFubmVsLm9wZW4oUGF0aHMuZ2V0KGZpbGUpLCBTdGFuZGFyZE9wZW5PcHRpb24uUkVBRCk7CisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbC5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGNoYW5uZWwuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEV4Y2VwdGlvbi5FUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIG1tYXAgc3RvcmFnZSIsCisgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcXVpZXRseURpc3Bvc2UoY2hhbm5lbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWV0bHlEaXNwb3NlKENsb3NlYWJsZSBjbG9zYWJsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNsb3NhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbG9zYWJsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjYXJlLCBhdCBsZWFzdCBhcyBvZiBub3cKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTRlNjhiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlOworCisvKioKKyAqIEFuIHtAY29kZSBhY29uZmlnfSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVuYWJsZWQgc3RhdGUgb2YgaXRzIGZsYWdzLgorICoKKyAqIDxwPjxzdHJvbmc+Tm90ZTogdGhpcyBpcyBpbnRlbmRlZCBvbmx5IHRvIGJlIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUuIFRvIGRldGVybWluZSBpZiBhIGdpdmVuIGZsYWcKKyAqIGlzIGVuYWJsZWQgaW4gYXBwIGNvZGUsIHRoZSBnZW5lcmF0ZWQgYW5kcm9pZCBmbGFncyBzaG91bGQgYmUgdXNlZC48L3N0cm9uZz4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBzaG91bGQgYmUgdXNlZCBieSBBY25vZmlnIEZsYWcgaW50ZXJuYWxseSA8L2I+IEl0CisgKiBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYW5kIHdpbGwgYmUgY2hhbmdlZCBvciByZW1vdmVkIHdpdGhvdXQgbm90aWNlLgorICoKKyAqIDxwPlRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIHRoZSBmbGFnIGZyb20gQWNvbmZpZyBQYWNrYWdlLkVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsCisgKiBjYWNoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIG9uZSBwYWNrYWdlLiBUbyByZWFkIGZsYWdzIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZSwgYSBuZXcgaW5zdGFuY2UKKyAqIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHtAbGluayAjbG9hZCBsb2FkZWR9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBGbGFnVmFsdWVMaXN0IG1GbGFnVmFsdWVMaXN0OworICAgIHByaXZhdGUgZmluYWwgaW50IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0OworCisgICAgcHJpdmF0ZSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwoCisgICAgICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QsIGludCBwYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KSB7CisgICAgICAgIHRoaXMubUZsYWdWYWx1ZUxpc3QgPSBmbGFnVmFsdWVMaXN0OworICAgICAgICB0aGlzLm1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0ID0gcGFja2FnZUJvb2xlYW5TdGFydE9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiBBY29uZmlnIHBhY2thZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBhbmQgdmVyaWZpZXMgaXRzIGZpbmdlcnByaW50LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5IGFuZCBtYXkgYmUgY2hhbmdlZCBvciByZW1vdmVkIHdpdGhvdXQKKyAgICAgKiBub3RpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBBY29uZmlnIHBhY2thZ2UuCisgICAgICogQHBhcmFtIHBhY2thZ2VGaW5nZXJwcmludCBUaGUgZXhwZWN0ZWQgZmluZ2VycHJpbnQgb2YgdGhlIHBhY2thZ2UuCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsfSByZXByZXNlbnRpbmcgdGhlIGxvYWRlZAorICAgICAqICAgICBwYWNrYWdlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBsb2FkKAorICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIHBhY2thZ2VOYW1lLCBsb25nIHBhY2thZ2VGaW5nZXJwcmludCkgeworICAgICAgICByZXR1cm4gbG9hZCgKKyAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgcGFja2FnZUZpbmdlcnByaW50LAorICAgICAgICAgICAgICAgIFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIGxvYWQoCisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyLAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgbG9uZyBwYWNrYWdlRmluZ2VycHJpbnQsCisgICAgICAgICAgICBTdG9yYWdlRmlsZVByb3ZpZGVyIGZpbGVQcm92aWRlcikgeworICAgICAgICBTdHJpY3RNb2RlLlRocmVhZFBvbGljeSBvbGRQb2xpY3kgPSBTdHJpY3RNb2RlLmFsbG93VGhyZWFkRGlza1JlYWRzKCk7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gbnVsbDsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCB2TGlzdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwTm9kZSA9IGZpbGVQcm92aWRlci5nZXRQYWNrYWdlVGFibGUoY29udGFpbmVyKS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgdkxpc3QgPSBmaWxlUHJvdmlkZXIuZ2V0RmxhZ1ZhbHVlTGlzdChjb250YWluZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3RyaWN0TW9kZS5zZXRUaHJlYWRQb2xpY3kob2xkUG9saWN5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwTm9kZSA9PSBudWxsIHx8IHZMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfUEFDS0FHRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIGNvbnRhaW5lciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSBmb3VuZCBvbiB0aGUgZGV2aWNlIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBOb2RlLmhhc1BhY2thZ2VGaW5nZXJwcmludCgpICYmIHBhY2thZ2VGaW5nZXJwcmludCAhPSBwTm9kZS5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9GSUxFX0ZJTkdFUlBSSU5UX01JU01BVENILAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBjb250YWluZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250YWluZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgYmUgZm91bmQgb24gdGhlIGRldmljZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsKHZMaXN0LCBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiBmbGFnIHVzaW5nIGl0cyBpbmRleC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seSBhbmQgbWF5IGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCB3aXRob3V0CisgICAgICogbm90aWNlLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIGZsYWcgd2l0aGluIHRoZSBsb2FkZWQgQWNvbmZpZyBwYWNrYWdlIHVzaW5nIGl0cworICAgICAqIGluZGV4LiBUaGUgaW5kZXggaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYW5kIG1heSB2YXJ5IGJldHdlZW4gYnVpbGRzLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmxhZyB3aXRoaW4gdGhlIHBhY2thZ2UuCisgICAgICogQHJldHVybiBUaGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1GbGFnVmFsdWVMaXN0LmdldEJvb2xlYW4oaW5kZXggKyBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2xpYi5ycwppbmRleCAzMDRhMDU5Li5mNWYxMmJiIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2xpYi5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2xpYi5ycwpAQCAtMSw1ICsxLDYgQEAKIC8vISBhY29uZmlnIHN0b3JhZ2UgcmVhZCBhcGkgamF2YSBydXN0IGludGVybG9wCiAKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6U2lwSGFzaGVyMTM7CiB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX3RhYmxlX3F1ZXJ5OjpmaW5kX2ZsYWdfcmVhZF9jb250ZXh0OwogdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ192YWx1ZV9xdWVyeTo6ZmluZF9ib29sZWFuX2ZsYWdfdmFsdWU7CiB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpwYWNrYWdlX3RhYmxlX3F1ZXJ5OjpmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0OwpAQCAtNyw4ICs4LDkgQEAKIAogdXNlIGFueWhvdzo6UmVzdWx0OwogdXNlIGpuaTo6b2JqZWN0czo6e0pCeXRlQnVmZmVyLCBKQ2xhc3MsIEpTdHJpbmd9OwotdXNlIGpuaTo6c3lzOjp7amJvb2xlYW4sIGppbnR9OwordXNlIGpuaTo6c3lzOjp7amJvb2xlYW4sIGppbnQsIGpsb25nfTsKIHVzZSBqbmk6OkpOSUVudjsKK3VzZSBzdGQ6Omhhc2g6Okhhc2hlcjsKIAogLy8vIENhbGwgcnVzdCBmaW5kIHBhY2thZ2UgcmVhZCBjb250ZXh0CiBmbiBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHRfamF2YSgKQEAgLTE1OCwzICsxNjAsMzAgQEAKICAgICAgICAgfQogICAgIH0KIH0KKworLy8vIEdldCBmbGFnIHZhbHVlIEpOSQorI1tub19tYW5nbGVdCisjW2FsbG93KHVudXNlZCldCitwdWIgZXh0ZXJuICJzeXN0ZW0iIGZuIEphdmFfYW5kcm9pZF9hY29uZmlnX3N0b3JhZ2VfQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJX2hhc2g8J2xvY2FsPigKKyAgICBtdXQgZW52OiBKTklFbnY8J2xvY2FsPiwKKyAgICBjbGFzczogSkNsYXNzPCdsb2NhbD4sCisgICAgcGFja2FnZV9uYW1lOiBKU3RyaW5nPCdsb2NhbD4sCispIC0+IGpsb25nIHsKKyAgICBtYXRjaCBzaXBoYXNoZXIxM19oYXNoKCZtdXQgZW52LCBwYWNrYWdlX25hbWUpIHsKKyAgICAgICAgT2sodmFsdWUpID0+IHZhbHVlIGFzIGpsb25nLAorICAgICAgICBFcnIoZXJybXNnKSA9PiB7CisgICAgICAgICAgICBlbnYudGhyb3coKCJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZXJybXNnLnRvX3N0cmluZygpKSkuZXhwZWN0KCJmYWlsZWQgdG8gdGhyb3ciKTsKKyAgICAgICAgICAgIDBpNjQKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gc2lwaGFzaGVyMTNfaGFzaChlbnY6ICZtdXQgSk5JRW52LCBwYWNrYWdlX25hbWU6IEpTdHJpbmcpIC0+IFJlc3VsdDx1NjQ+IHsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIGZsYWcgbmFtZSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgamF2YSBzdHJpbmcKKyAgICBsZXQgZmxhZ19uYW1lOiBTdHJpbmcgPSB1bnNhZmUgeyBlbnYuZ2V0X3N0cmluZ191bmNoZWNrZWQoJnBhY2thZ2VfbmFtZSk/LmludG8oKSB9OworICAgIGxldCBtdXQgcyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICBzLndyaXRlKGZsYWdfbmFtZS5hc19ieXRlcygpKTsKKyAgICBzLndyaXRlX3U4KDB4ZmYpOworICAgIE9rKHMuZmluaXNoKCkpCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWRUZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0Fjb25maWdTdG9yYWdlUmVhZEZ1bmN0aW9uYWxUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWRUZXN0LnhtbApyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sCmluZGV4IDk5YzllMjUuLmVlNTAwNjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZFRlc3QueG1sCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0Fjb25maWdTdG9yYWdlUmVhZEZ1bmN0aW9uYWxUZXN0LnhtbApAQCAtMjYsNyArMjYsNyBAQAogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UZXN0QXBwSW5zdGFsbFNldHVwIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9ImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LmphdmEuYXBrIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iYWNvbmZpZ19zdG9yYWdlX3JlYWRfZnVuY3Rpb25hbC5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLkRpc2FibGVTRUxpbnV4VGFyZ2V0UHJlcGFyZXIiIC8+CkBAIC0zNSwxNyArMzUsMTcgQEAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImFib3J0LW9uLXB1c2gtZmFpbHVyZSIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9InBhY2thZ2UubWFwIgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJwYWNrYWdlX3YxLm1hcCIKICAgICAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGlfdGVzdC9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0iZmxhZy5tYXAiCisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9ImZsYWdfdjEubWFwIgogICAgICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0L21hcHMvbW9ja3VwLmZsYWcubWFwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJmbGFnLnZhbCIKKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0iZmxhZ192MS52YWwiCiAgICAgICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QvYm9vdC9tb2NrdXAudmFsIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWNvbmZpZ19zdG9yYWdlLnRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0iIC8+CiAgICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0Fjb25maWdTdG9yYWdlUmVhZFVuaXRUZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0Fjb25maWdTdG9yYWdlUmVhZFVuaXRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTI4ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQWNvbmZpZ1N0b3JhZ2VSZWFkVW5pdFRlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgYWNvbmZpZyBzdG9yYWdlIGphdmEgdGVzdHMiPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJhY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0LmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwYWNrYWdlX3YyLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9yZWFkX3VuaXQvdGVzdGRhdGEvbW9ja3VwLnBhY2thZ2UubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YyLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9yZWFkX3VuaXQvdGVzdGRhdGEvbW9ja3VwLmZsYWcubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YyLnZhbC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9yZWFkX3VuaXQvdGVzdGRhdGEvbW9ja3VwLnZhbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192Mi5pbmZvLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX3JlYWRfdW5pdC90ZXN0ZGF0YS9tb2NrdXAuaW5mbyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwb3N0LXB1c2giIHZhbHVlPSJjaG1vZCArciAvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX3JlYWRfdW5pdC90ZXN0ZGF0YS8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxbSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlZDBjNzI4Li43MDIzMjVkIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsOSArMSwxNCBAQAogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAicmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKLSAgICBzcmNzOiBbInBhY2thZ2UubWFwIiwKLSAgICAgICAgImZsYWcubWFwIiwKLSAgICAgICAgImZsYWcudmFsIiwKLSAgICAgICAgImZsYWcuaW5mbyIKKyAgICBzcmNzOiBbCisgICAgICAgICJkYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLnZhbCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEuaW5mbyIsCisgICAgICAgICJkYXRhL3YyL3BhY2thZ2VfdjIubWFwIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLnZhbCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIuaW5mbyIsCiAgICAgXSwKIH0KIApAQCAtNDMsMyArNDgsNTIgQEAKICAgICAgICAgImdlbmVyYWwtdGVzdHMiLAogICAgIF0sCiB9CisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2Z1bmN0aW9uYWwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImZ1bmN0aW9uYWwvc3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmEiLAorICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bGVzIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9qYXZhIiwKKyAgICAgICAgImp1bml0IiwKKyAgICBdLAorICAgIGpuaV9saWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiLAorICAgIF0sCisgICAgZGF0YTogWworICAgICAgICAiOnJlYWRfYXBpX3Rlc3Rfc3RvcmFnZV9maWxlcyIsCisgICAgXSwKKyAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAorICAgIGNlcnRpZmljYXRlOiAicGxhdGZvcm0iLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIHRlc3RfY29uZmlnOiAiQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sIiwKKyAgICB0ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2V4cGVyaW1lbnRzIiwKK30KKworYW5kcm9pZF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfdW5pdCIsCisgICAgdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisgICAgc3JjczogWworICAgICAgICAidW5pdC9zcmNzLyoqLyouamF2YSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIiLAorICAgICAgICAianVuaXQiLAorICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX3JlYWRlcl9qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAidGVzdF9jdXJyZW50IiwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIHRlc3RfY29uZmlnOiAiQWNvbmZpZ1N0b3JhZ2VSZWFkVW5pdFRlc3QueG1sIiwKKyAgICBqYXJqYXJfcnVsZXM6ICJqYXJqYXIudHh0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc4YmZiMzcuLjVlMDE4NzkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSwxMiArMTUsMTMgQEAKICAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgLS0+CiAKLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImFuZHJvaWQuYWNvbmZpZ19zdG9yYWdlLnRlc3QiPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0Ij4KICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjb25maWdfc3RvcmFnZS50ZXN0IiAvPgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2ZsYWcuaW5mbwpyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLm1hcApyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2ZsYWcudmFsCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3BhY2thZ2UubWFwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvcGFja2FnZS5tYXAKcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8gYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI3ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0Njg1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNDc1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9wYWNrYWdlX3YyLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5Zjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCmluZGV4IGEyNmIyNTcuLjI1NTcwNDggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEKQEAgLTE2LDI4ICsxNiwyOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuRGV2aWNlUHJvdG9zOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnUmVhZENvbnRleHQuU3RvcmVkRmxhZ1R5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVJlYWRDb250ZXh0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzOworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKIAotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlUmVhZEFQSTsKLWltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlUmVhZENvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1JlYWRDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dC5TdG9yZWRGbGFnVHlwZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIEFjb25maWdTdG9yYWdlUmVhZEFQSVRlc3R7CitwdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdCB7CiAKICAgICBwcml2YXRlIFN0cmluZyBtU3RvcmFnZURpciA9ICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0IjsKIApAQCAtNDUsMjYgKzQ1LDI5IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VDb250ZXh0UXVlcnkoKSB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcGFja2FnZU1hcCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYWNrYWdlTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAotICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIHBhY2thZ2VNYXAgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRUcnVlKHBhY2thZ2VNYXAgIT0gbnVsbCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dCgKLSAgICAgICAgICAgICAgICBwYWNrYWdlTWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAwKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgMCk7CiAKLSAgICAgICAgICAgIGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAotICAgICAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgICAgICAgICAgICBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubVBhY2thZ2VJZCwgMSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXgsIDMpOwogCi0gICAgICAgICAgICBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dCgKLSAgICAgICAgICAgICAgICBwYWNrYWdlTWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworICAgICAgICAgICAgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU1hcCwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDIpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUJvb2xlYW5TdGFydEluZGV4LCA2KTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKQEAgLTc2LDE5ICs3OSwxOSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdFBhY2thZ2VDb250ZXh0UXVlcnkoKSB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcGFja2FnZU1hcCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYWNrYWdlTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAotICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIHBhY2thZ2VNYXAgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnRUcnVlKHBhY2thZ2VNYXAgIT0gbnVsbCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dCgKLSAgICAgICAgICAgICAgICBwYWNrYWdlTWFwLCAidW5rbm93biIpOworICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KHBhY2thZ2VNYXAsICJ1bmtub3duIik7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAtMSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXgsIC0xKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCl7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTk3LDEyICsxMDAsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ0NvbnRleHRRdWVyeSgpIHsKICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBmbGFnTWFwID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZsYWdNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUoCi0gICAgICAgICAgICAgICAgbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIik7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgZmxhZ01hcCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZShtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAuZmxhZy5tYXAiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZmxhZ01hcCE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKGZsYWdNYXAgIT0gbnVsbCk7CiAKICAgICAgICAgY2xhc3MgQmFzZWxpbmUgewogICAgICAgICAgICAgcHVibGljIGludCBtUGFja2FnZUlkOwpAQCAtMTEwLDEwICsxMTIsOCBAQAogICAgICAgICAgICAgcHVibGljIFN0b3JlZEZsYWdUeXBlIG1GbGFnVHlwZTsKICAgICAgICAgICAgIHB1YmxpYyBpbnQgbUZsYWdJbmRleDsKIAotICAgICAgICAgICAgcHVibGljIEJhc2VsaW5lKGludCBwYWNrYWdlSWQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbGFnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgU3RvcmVkRmxhZ1R5cGUgZmxhZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBmbGFnSW5kZXgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBCYXNlbGluZSgKKyAgICAgICAgICAgICAgICAgICAgaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lLCBTdG9yZWRGbGFnVHlwZSBmbGFnVHlwZSwgaW50IGZsYWdJbmRleCkgewogICAgICAgICAgICAgICAgIG1QYWNrYWdlSWQgPSBwYWNrYWdlSWQ7CiAgICAgICAgICAgICAgICAgbUZsYWdOYW1lID0gZmxhZ05hbWU7CiAgICAgICAgICAgICAgICAgbUZsYWdUeXBlID0gZmxhZ1R5cGU7CkBAIC0xMzMsOCArMTMzLDkgQEAKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgZm9yIChCYXNlbGluZSBiYXNlbGluZSA6IGJhc2VsaW5lcykgewotICAgICAgICAgICAgICAgIEZsYWdSZWFkQ29udGV4dCBjb250ZXh0ID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgZmxhZ01hcCwgYmFzZWxpbmUubVBhY2thZ2VJZCwgIGJhc2VsaW5lLm1GbGFnTmFtZSk7CisgICAgICAgICAgICAgICAgRmxhZ1JlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01hcCwgYmFzZWxpbmUubVBhY2thZ2VJZCwgYmFzZWxpbmUubUZsYWdOYW1lKTsKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ1R5cGUsIGJhc2VsaW5lLm1GbGFnVHlwZSk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgYmFzZWxpbmUubUZsYWdJbmRleCk7CiAgICAgICAgICAgICB9CkBAIC0xNDcsMjEgKzE0OCwxOSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdEZsYWdDb250ZXh0UXVlcnkoKSB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgZmxhZ01hcCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmbGFnTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAotICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCIpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIGZsYWdNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZsYWdNYXAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnTWFwICE9IG51bGwpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGbGFnUmVhZENvbnRleHQgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCi0gICAgICAgICAgICAgICAgZmxhZ01hcCwgMCwgICJ1bmtub3duIik7CisgICAgICAgICAgICBGbGFnUmVhZENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoZmxhZ01hcCwgMCwgInVua25vd24iKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnVHlwZSwgbnVsbCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ0luZGV4LCAtMSk7CiAKLSAgICAgICAgICAgIGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0RmxhZ1JlYWRDb250ZXh0KAotICAgICAgICAgICAgICAgIGZsYWdNYXAsIDMsICAiZW5hYmxlZF9ybyIpOworICAgICAgICAgICAgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoZmxhZ01hcCwgMywgImVuYWJsZWRfcm8iKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnVHlwZSwgbnVsbCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ0luZGV4LCAtMSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CkBAIC0xNzMsMTIgKzE3MiwxMSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFuRmxhZ1ZhbHVlUXVlcnkoKSB7CiAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgZmxhZ1ZhbCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmbGFnVmFsID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAotICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiKTsKKyAgICAgICAgICAgIGZsYWdWYWwgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL2Jvb3QvbW9ja3VwLnZhbCIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbCAhPSBudWxsKTsKIAogICAgICAgICBib29sZWFuW10gYmFzZWxpbmVzID0ge2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX07CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CkBAIC0xOTUsMTIgKzE5MywxMSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQm9vbGVhbkZsYWdWYWx1ZVF1ZXJ5KCkgewogICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdWYWwgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmxhZ1ZhbCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZSgKLSAgICAgICAgICAgICAgICBtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIik7CisgICAgICAgICAgICBmbGFnVmFsID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbCE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKGZsYWdWYWwgIT0gbnVsbCk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEJvb2xlYW4gdmFsdWUgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmbGFnVmFsLCA5KTsKQEAgLTIxMCw0ICsyMDcsMjEgQEAKICAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZXgudG9TdHJpbmcoKS5jb250YWlucyhleHBlY3RlZEVycm1zZykpOwogICAgICAgICB9CiAgICAgfQotIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1c3RKYXZhRXF1YWxIYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxwYXJzZWRfZmxhZz4gZmxhZ3MgPSBEZXZpY2VQcm90b3MubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBmb3IgKHBhcnNlZF9mbGFnIGZsYWcgOiBmbGFncykgeworICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZmxhZy5wYWNrYWdlXzsKKyAgICAgICAgICAgIFN0cmluZyBmbGFnTmFtZSA9IGZsYWcubmFtZTsKKyAgICAgICAgICAgIGxvbmcgckhhc2ggPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuaGFzaChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBsb25nIGpIYXNoID0gU2lwSGFzaGVyMTMuaGFzaChwYWNrYWdlTmFtZS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhySGFzaCwgakhhc2gpOworCisgICAgICAgICAgICBTdHJpbmcgZnVsbEZsYWdOYW1lID0gcGFja2FnZU5hbWUgKyAiLyIgKyBmbGFnTmFtZTsKKyAgICAgICAgICAgIHJIYXNoID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmhhc2goZnVsbEZsYWdOYW1lKTsKKyAgICAgICAgICAgIGpIYXNoID0gU2lwSGFzaGVyMTMuaGFzaChmdWxsRmxhZ05hbWUuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMockhhc2gsIGpIYXNoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzJmZjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5EZXZpY2VQcm90b3M7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnLnBhcnNlZF9mbGFnOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlRmlsZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuaW50ZXJuYWwuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBQTEFURk9STV9DT05UQUlORVJTID0gU2V0Lm9mKCJzeXN0ZW0iLCAidmVuZG9yIiwgInByb2R1Y3QiKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbF9sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxwYXJzZWRfZmxhZz4gZmxhZ3MgPSBEZXZpY2VQcm90b3MubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBNYXA8U3RyaW5nLCBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWw+IHJlYWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmcCA9IFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCk7CisKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLnBlcm1pc3Npb24gPT0gQWNvbmZpZy5SRUFEX09OTFkgJiYgZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZy5uYW1lOworICAgICAgICAgICAgaWYgKCFQTEFURk9STV9DT05UQUlORVJTLmNvbnRhaW5zKGNvbnRhaW5lcikpIGNvbnRpbnVlOworCisgICAgICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gZnAuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgRmxhZ1RhYmxlIGZUYWJsZSA9IGZwLmdldEZsYWdUYWJsZShjb250YWluZXIpOworICAgICAgICAgICAgRmxhZ1RhYmxlLk5vZGUgZk5vZGUgPSBmVGFibGUuZ2V0KHBOb2RlLmdldFBhY2thZ2VJZCgpLCBmbGFnTmFtZSk7CisgICAgICAgICAgICBGbGFnVmFsdWVMaXN0IGZMaXN0ID0gZnAuZ2V0RmxhZ1ZhbHVlTGlzdChjb250YWluZXIpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCk7CisgICAgICAgICAgICBib29sZWFuIHJWYWwgPSBmTGlzdC5nZXRCb29sZWFuKGluZGV4KTsKKworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworCisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgcmVhZGVyID0gcmVhZGVyTWFwLmdldChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZChjb250YWluZXIsIHBhY2thZ2VOYW1lLCBmaW5nZXJwcmludCk7CisgICAgICAgICAgICAgICAgcmVhZGVyTWFwLnB1dChwYWNrYWdlTmFtZSwgcmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4galZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZOb2RlLmdldEZsYWdJbmRleCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJWYWwsIGpWYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1BY29uZmlnUGFja2FnZV9sb2FkX3dpdGhFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbnRhaW5lciBub3QgZm91bmQgZmFrZV9jb250YWluZXIKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFrZV9jb250YWluZXIiLCAiZmFrZV9wYWNrYWdlIiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFLCBlLmdldEVycm9yQ29kZSgpKTsKKworICAgICAgICAvLyBwYWNrYWdlIG5vdCBmb3VuZAorICAgICAgICBlID0KKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKCJzeXN0ZW0iLCAiZmFrZV9jb250YWluZXIiLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9QQUNLQUdFX05PVF9GT1VORCwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gZmluZ2VycHJpbnQgZG9lc24ndCBtYXRjaAorICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvcy5sb2FkQW5kUGFyc2VGbGFnUHJvdG9zKCk7CisgICAgICAgIFN0b3JhZ2VGaWxlUHJvdmlkZXIgZnAgPSBTdG9yYWdlRmlsZVByb3ZpZGVyLmdldERlZmF1bHRQcm92aWRlcigpOworCisgICAgICAgIHBhcnNlZF9mbGFnIGZsYWcgPSBmbGFncy5nZXQoMCk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRhaW5lciA9IGZsYWcuY29udGFpbmVyOworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICBib29sZWFuIHZhbHVlID0gZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkVOQUJMRUQ7CisKKyAgICAgICAgUGFja2FnZVRhYmxlIHBUYWJsZSA9IGZwLmdldFBhY2thZ2VUYWJsZShjb250YWluZXIpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworCisgICAgICAgIGlmIChwTm9kZS5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSkgeworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworICAgICAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgcGFja2FnZU5hbWUsIGZpbmdlcnByaW50ICsgMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0gsIGUuZ2V0RXJyb3JDb2RlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJjMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkRldmljZVByb3RvczsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VGaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5QbGF0Zm9ybUFjb25maWdQYWNrYWdlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUExBVEZPUk1fQ09OVEFJTkVSUyA9IFNldC5vZigic3lzdGVtIiwgInZlbmRvciIsICJwcm9kdWN0Iik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybUFjb25maWdQYWNrYWdlX2xvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvcy5sb2FkQW5kUGFyc2VGbGFnUHJvdG9zKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2U+IHJlYWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmcCA9IFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCk7CisKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLnBlcm1pc3Npb24gPT0gQWNvbmZpZy5SRUFEX09OTFkgJiYgZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZy5uYW1lOworICAgICAgICAgICAgaWYgKCFQTEFURk9STV9DT05UQUlORVJTLmNvbnRhaW5zKGNvbnRhaW5lcikpIGNvbnRpbnVlOworCisgICAgICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gZnAuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgRmxhZ1RhYmxlIGZUYWJsZSA9IGZwLmdldEZsYWdUYWJsZShjb250YWluZXIpOworICAgICAgICAgICAgRmxhZ1RhYmxlLk5vZGUgZk5vZGUgPSBmVGFibGUuZ2V0KHBOb2RlLmdldFBhY2thZ2VJZCgpLCBmbGFnTmFtZSk7CisgICAgICAgICAgICBGbGFnVmFsdWVMaXN0IGZMaXN0ID0gZnAuZ2V0RmxhZ1ZhbHVlTGlzdChjb250YWluZXIpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCk7CisgICAgICAgICAgICBib29sZWFuIHJWYWwgPSBmTGlzdC5nZXRCb29sZWFuKGluZGV4KTsKKworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworCisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIHJlYWRlciA9IHJlYWRlck1hcC5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gUGxhdGZvcm1BY29uZmlnUGFja2FnZS5sb2FkKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICByZWFkZXJNYXAucHV0KHBhY2thZ2VOYW1lLCByZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBqVmFsID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoZmxhZ05hbWUsICFyVmFsKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJWYWwsIGpWYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1BY29uZmlnUGFja2FnZV9sb2FkX3dpdGhFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBhY2thZ2Ugbm90IGZvdW5kCisgICAgICAgIGFzc2VydE51bGwoUGxhdGZvcm1BY29uZmlnUGFja2FnZS5sb2FkKCJmYWtlX2NvbnRhaW5lciIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXJqYXIudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamFyamFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTI1MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamFyamFyLnR4dApAQCAtMCwwICsxLDE5IEBACitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24KK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1RhYmxlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlBhY2thZ2VUYWJsZQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5CeXRlQnVmZmVyUmVhZGVyIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQnl0ZUJ1ZmZlclJlYWRlcgorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVHlwZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdUeXBlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU2lwSGFzaGVyMTMKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GaWxlVHlwZQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1ZhbHVlTGlzdAorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5UYWJsZVV0aWxzIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuVGFibGVVdGlscworcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5BY29uZmlnUGFja2FnZUltcGwgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5BY29uZmlnUGFja2FnZUltcGwKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlciBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlN0b3JhZ2VGaWxlUHJvdmlkZXIKKworCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZSQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1RhYmxlJEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZSQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGFja2FnZVRhYmxlJEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3QkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdWYWx1ZUxpc3RAMQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TaXBIYXNoZXIxMyQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU2lwSGFzaGVyMTNAMQorCitydWxlIGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjM4MjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotYW5kcm9pZF90ZXN0IHsKLSAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QuamF2YSIsCi0gICAgc3JjczogWyIuLyoqLyouamF2YSJdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhY29uZmlnX3N0b3JhZ2VfcmVhZGVyX2phdmEiLAotICAgICAgICAiYW5kcm9pZHgudGVzdC5ydWxlcyIsCi0gICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfamF2YSIsCi0gICAgICAgICJqdW5pdCIsCi0gICAgXSwKLSAgICBqbmlfbGliczogWwotICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIiwKLSAgICBdLAotICAgIGRhdGE6IFsKLSAgICAgICAgIjpyZWFkX2FwaV90ZXN0X3N0b3JhZ2VfZmlsZXMiLAotICAgIF0sCi0gICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKLSAgICBjZXJ0aWZpY2F0ZTogInBsYXRmb3JtIiwKLSAgICB0ZXN0X3N1aXRlczogWwotICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCi0gICAgXSwKLSAgICB0ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2V4cGVyaW1lbnRzIiwKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvU3RvcmFnZUludGVybmFsUmVhZGVyVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9TdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWJiYTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9TdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VJbnRlcm5hbFJlYWRlcjsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7Ci0KLUBSdW5XaXRoKEpVbml0NC5jbGFzcykKLXB1YmxpYyBjbGFzcyBTdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1TdG9yYWdlRGlyID0gIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QiOwotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmFnZUludGVybmFsUmVhZGVyX2dldEZsYWcoKSB7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VNYXBGaWxlID0gbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIjsKLSAgICAgICAgU3RyaW5nIGZsYWdWYWx1ZUZpbGUgPSBtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIjsKLQotICAgICAgICBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCBwYWNrYWdlTWFwRmlsZSwgZmxhZ1ZhbHVlRmlsZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgxKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5jcHAKaW5kZXggNmQyOTA0NS4uNTI4OWZhYSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QuY3BwCkBAIC00NSw3ICs0NSw4IEBACiAgIH0KIAogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgICAgYXV0byBjb25zdCB0ZXN0X2Jhc2VfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOworICAgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSB0ZXN0X2Jhc2VfZGlyICsgIi9kYXRhL3YxIjsKICAgICBzdG9yYWdlX2RpciA9IHN0ZDo6c3RyaW5nKHJvb3RfZGlyLnBhdGgpOwogICAgIGF1dG8gbWFwc19kaXIgPSBzdG9yYWdlX2RpciArICIvbWFwcyI7CiAgICAgYXV0byBib290X2RpciA9IHN0b3JhZ2VfZGlyICsgIi9ib290IjsKQEAgLTU1LDEwICs1NiwxMCBAQAogICAgIGZsYWdfbWFwID0gc3RkOjpzdHJpbmcobWFwc19kaXIpICsgIi9tb2NrdXAuZmxhZy5tYXAiOwogICAgIGZsYWdfdmFsID0gc3RkOjpzdHJpbmcoYm9vdF9kaXIpICsgIi9tb2NrdXAudmFsIjsKICAgICBmbGFnX2luZm8gPSBzdGQ6OnN0cmluZyhib290X2RpcikgKyAiL21vY2t1cC5pbmZvIjsKLSAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL3BhY2thZ2UubWFwIiwgcGFja2FnZV9tYXApOwotICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvZmxhZy5tYXAiLCBmbGFnX21hcCk7Ci0gICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9mbGFnLnZhbCIsIGZsYWdfdmFsKTsKLSAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWcuaW5mbyIsIGZsYWdfaW5mbyk7CisgICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9wYWNrYWdlX3YxLm1hcCIsIHBhY2thZ2VfbWFwKTsKKyAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWdfdjEubWFwIiwgZmxhZ19tYXApOworICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvZmxhZ192MS52YWwiLCBmbGFnX3ZhbCk7CisgICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9mbGFnX3YxLmluZm8iLCBmbGFnX2luZm8pOwogICB9CiAKICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5ycwppbmRleCBhZmM0NGQ0Li4yYThlZGYzIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LnJzCkBAIC05LDcgKzksNyBAQAogICAgIHVzZSByYW5kOjpSbmc7CiAgICAgdXNlIHN0ZDo6ZnM7CiAKLSAgICBmbiBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCkgLT4gU3RyaW5nIHsKKyAgICBmbiBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKHZlcnNpb246IHUzMikgLT4gU3RyaW5nIHsKICAgICAgICAgbGV0IG11dCBybmcgPSByYW5kOjp0aHJlYWRfcm5nKCk7CiAgICAgICAgIGxldCBudW1iZXI6IHUzMiA9IHJuZy5nZW4oKTsKICAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gU3RyaW5nOjpmcm9tKCIvdG1wLyIpICsgJm51bWJlci50b19zdHJpbmcoKTsKQEAgLTI2LDE3ICsyNiwxNyBAQAogICAgICAgICBsZXQgZmxhZ19tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCI7CiAgICAgICAgIGxldCBmbGFnX3ZhbCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLnZhbCI7CiAgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC5pbmZvIjsKLSAgICAgICAgZnM6OmNvcHkoIi4vcGFja2FnZS5tYXAiLCBwYWNrYWdlX21hcCkudW53cmFwKCk7Ci0gICAgICAgIGZzOjpjb3B5KCIuL2ZsYWcubWFwIiwgZmxhZ19tYXApLnVud3JhcCgpOwotICAgICAgICBmczo6Y29weSgiLi9mbGFnLnZhbCIsIGZsYWdfdmFsKS51bndyYXAoKTsKLSAgICAgICAgZnM6OmNvcHkoIi4vZmxhZy5pbmZvIiwgZmxhZ19pbmZvKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoZm9ybWF0ISgiLi9kYXRhL3Z7MH0vcGFja2FnZV92ezB9Lm1hcCIsIHZlcnNpb24pLCBwYWNrYWdlX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KGZvcm1hdCEoIi4vZGF0YS92ezB9L2ZsYWdfdnswfS5tYXAiLCB2ZXJzaW9uKSwgZmxhZ19tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShmb3JtYXQhKCIuL2RhdGEvdnt9L2ZsYWdfdnswfS52YWwiLCB2ZXJzaW9uKSwgZmxhZ192YWwpLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShmb3JtYXQhKCIuL2RhdGEvdnt9L2ZsYWdfdnswfS5pbmZvIiwgdmVyc2lvbiksIGZsYWdfaW5mbykudW53cmFwKCk7CiAKICAgICAgICAgc3RvcmFnZV9kaXIKICAgICB9CiAKICAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF91bmF2YWlsYWJsZV9zdG9hcmdlKCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgZm4gdGVzdF91bmF2YWlsYWJsZV9zdG9yYWdlKCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDEpOwogICAgICAgICAvLyBTQUZFVFk6CiAgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKICAgICAgICAgbGV0IGVyciA9IHVuc2FmZSB7CkBAIC01Myw3ICs1Myw3IEBACiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9wYWNrYWdlX2NvbnRleHRfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBwYWNrYWdlX21hcHBlZF9maWxlID0gdW5zYWZlIHsKQEAgLTY0LDI3ICs2NCw3MyBAQAogICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpOwotICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCB9OworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDAsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsIGZpbmdlcnByaW50OiAwIH07CiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOwogCiAgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQogICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpOwotICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMSwgYm9vbGVhbl9zdGFydF9pbmRleDogMyB9OworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDEsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMsIGZpbmdlcnByaW50OiAwIH07CiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOwogCiAgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQogICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpCiAgICAgICAgICAgICAgICAgLnVud3JhcCgpOwotICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiB9OworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDIsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYsIGZpbmdlcnByaW50OiAwIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhY2thZ2VfY29udGV4dF9xdWVyeV93aXRoX2ZpbmdlcnByaW50KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDIpOworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwcGVkX2ZpbGUgPSB1bnNhZmUgeworICAgICAgICAgICAgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkudW53cmFwKCkKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAwLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMCwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiAxNTI0ODk0ODUxMDU5MDE1ODA4NnU2NCwKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeworICAgICAgICAgICAgcGFja2FnZV9pZDogMSwKKyAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMsCisgICAgICAgICAgICBmaW5nZXJwcmludDogNDQzMTk0MDUwMjI3NDg1Nzk2NHU2NCwKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeworICAgICAgICAgICAgcGFja2FnZV9pZDogMiwKKyAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYsCisgICAgICAgICAgICBmaW5nZXJwcmludDogMTYyMzMyMjk5MTc3MTE2MjIzNzV1NjQsCisgICAgICAgIH07CiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOwogICAgIH0KIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X25vbmVfZXhpc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgcGFja2FnZV9tYXBwZWRfZmlsZSA9IHVuc2FmZSB7CkBAIC05OSw3ICsxNDUsNyBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZmxhZ19jb250ZXh0X3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZmxhZ19tYXBwZWRfZmlsZSA9CkBAIC0xMjUsNyArMTcxLDcgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X25vbmVfZXhpc3RfZmxhZ19jb250ZXh0X3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZmxhZ19tYXBwZWRfZmlsZSA9CkBAIC0xNDEsNyArMTg3LDcgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X2Jvb2xlYW5fZmxhZ192YWx1ZV9xdWVyeSgpIHsKLSAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDEpOwogICAgICAgICAvLyBTQUZFVFk6CiAgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKICAgICAgICAgbGV0IGZsYWdfdmFsdWVfZmlsZSA9CkBAIC0xNTUsNyArMjAxLDcgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZmxhZ192YWx1ZV9maWxlID0KQEAgLTE2OSw3ICsyMTUsNyBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZmxhZ19pbmZvX3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPQpAQCAtMTg2LDcgKzIzMiw3IEBACiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9pbnZhbGlkX2Jvb2xlYW5fZmxhZ19pbmZvX3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPQpAQCAtMTk5LDEwICsyNDUsMTggQEAKICAgICB9CiAKICAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9zdG9yYWdlX3ZlcnNpb25fcXVlcnkoKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3BhY2thZ2UubWFwIikudW53cmFwKCksIDEpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9mbGFnLm1hcCIpLnVud3JhcCgpLCAxKTsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZmxhZy52YWwiKS51bndyYXAoKSwgMSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2ZsYWcuaW5mbyIpLnVud3JhcCgpLCAxKTsKKyAgICBmbiB0ZXN0X3N0b3JhZ2VfdmVyc2lvbl9xdWVyeV92MSgpIHsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZGF0YS92MS9mbGFnX3YxLm1hcCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZGF0YS92MS9mbGFnX3YxLnZhbCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZGF0YS92MS9mbGFnX3YxLmluZm8iKS51bndyYXAoKSwgMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc3RvcmFnZV92ZXJzaW9uX3F1ZXJ5X3YyKCkgeworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YyL3BhY2thZ2VfdjIubWFwIikudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YyL2ZsYWdfdjIubWFwIikudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YyL2ZsYWdfdjIudmFsIikudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YyL2ZsYWdfdjIuaW5mbyIpLnVud3JhcCgpLCAyKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy91bml0L3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvdW5pdC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWMzZGUyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvdW5pdC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbFRlc3QuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlRmlsZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUREFUQV9QQVRIID0KKyAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX3JlYWRfdW5pdC90ZXN0ZGF0YS8iOworCisgICAgcHJpdmF0ZSBTdG9yYWdlRmlsZVByb3ZpZGVyIHByOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBwciA9IG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKFRFU1REQVRBX1BBVEgsIFRFU1REQVRBX1BBVEgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRfY29udGFpbmVyX3BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9IHByLmdldFBhY2thZ2VUYWJsZSgibW9ja3VwIik7CisKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTEgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisKKyAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IG5vZGUxLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgcCA9CisgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAibW9ja3VwIiwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCBmaW5nZXJwcmludCwgcHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRfY29udGFpbmVyX3BhY2thZ2VfZXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9IHByLmdldFBhY2thZ2VUYWJsZSgibW9ja3VwIik7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUxID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBsb25nIGZpbmdlcnByaW50ID0gbm9kZTEuZ2V0UGFja2FnZUZpbmdlcnByaW50KCk7CisgICAgICAgIC8vIGNhbm5vdCBmaW5kIHBhY2thZ2UKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9ja3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMTAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmdlcnByaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9QQUNLQUdFX05PVF9GT1VORCwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gY2Fubm90IGZpbmQgY29udGFpbmVyCisgICAgICAgIGUgPQorICAgICAgICAgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmdlcnByaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOworCisgICAgICAgIC8vIGZpbmdlcnByaW50IGRvZXNuJ3QgbWF0Y2gKKyAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9ja3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAvLyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9GSUxFX0ZJTkdFUlBSSU5UX01JU01BVENILAorICAgICAgICAgICAgICAgIDUsIGUuZ2V0RXJyb3JDb2RlKCkpOworCisgICAgICAgIC8vIG5ldyBzdG9yYWdlIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgcHIgPSBuZXcgU3RvcmFnZUZpbGVQcm92aWRlcigiZmFrZS9wYXRoLyIsICJmYWtlL3BhdGgvIik7CisgICAgICAgIGUgPQorICAgICAgICAgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vY2t1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmdlcnByaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOworCisgICAgICAgIC8vIGZpbGUgcmVhZCBpc3N1ZQorICAgICAgICBwciA9IG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKFRFU1REQVRBX1BBVEgsICJmYWtlL3BhdGgvIik7CisgICAgICAgIGUgPQorICAgICAgICAgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vY2t1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmdlcnByaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEUsIGUuZ2V0RXJyb3JDb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5GbGFnVmFsdWVfaW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9IHByLmdldFBhY2thZ2VUYWJsZSgibW9ja3VwIik7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUxID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBsb25nIGZpbmdlcnByaW50ID0gbm9kZTEuZ2V0UGFja2FnZUZpbmdlcnByaW50KCk7CisgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBwID0KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2NrdXAiLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIGZpbmdlcnByaW50LCBwcik7CisgICAgICAgIGFzc2VydEZhbHNlKHAuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgwKSk7CisgICAgICAgIGFzc2VydFRydWUocC5nZXRCb29sZWFuRmxhZ1ZhbHVlKDEpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmdldEJvb2xlYW5GbGFnVmFsdWUoMikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKaW5kZXggMGYxOTYyYy4uNGM4ODJiNCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDExIEBACiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAogICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKIH0KIAogcnVzdF9saWJyYXJ5IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcAppbmRleCA3YjQzNTc0Li4wM2E4ZmEyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5jcHAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwCkBAIC0xMDAsMTggKzEwMCw0IEBACiAgIHJldHVybiB7fTsKIH0KIAotYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IGNyZWF0ZV9mbGFnX2luZm8oCi0gICAgc3RkOjpzdHJpbmcgY29uc3QmIHBhY2thZ2VfbWFwLAotICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmbGFnX21hcCwKLSAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmxhZ19pbmZvX291dCkgewotICBhdXRvIGNyZWF0aW9uX2N4eCA9IGNyZWF0ZV9mbGFnX2luZm9fY3h4KAotICAgICAgcnVzdDo6U3RyKHBhY2thZ2VfbWFwLmNfc3RyKCkpLAotICAgICAgcnVzdDo6U3RyKGZsYWdfbWFwLmNfc3RyKCkpLAotICAgICAgcnVzdDo6U3RyKGZsYWdfaW5mb19vdXQuY19zdHIoKSkpOwotICBpZiAoY3JlYXRpb25fY3h4LnN1Y2Nlc3MpIHsKLSAgICByZXR1cm4ge307Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm9yKCkgPDwgY3JlYXRpb25fY3h4LmVycm9yX21lc3NhZ2U7Ci0gIH0KLX0KIH0gLy8gbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwCmluZGV4IDBiYmE3ZmYuLjUwYTUxODggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmhwcAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5ocHAKQEAgLTM2LDEzICszNiw0IEBACiAgICAgdWludDMyX3Qgb2Zmc2V0LAogICAgIGJvb2wgdmFsdWUpOwogCi0vLy8gQ3JlYXRlIGZsYWcgaW5mbyBmaWxlIGJhc2VkIG9uIHBhY2thZ2UgYW5kIGZsYWcgbWFwCi0vLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCi0vLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCi0vLy8gXGlucHV0IGZsYWdfaW5mb19vdXQ6IGZsYWcgaW5mbyBmaWxlIHRvIGJlIGNyZWF0ZWQKLWFuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBjcmVhdGVfZmxhZ19pbmZvKAotICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYWNrYWdlX21hcCwKLSAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmxhZ19tYXAsCi0gICAgc3RkOjpzdHJpbmcgY29uc3QmIGZsYWdfaW5mb19vdXQpOwotCiB9IC8vIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ19pbmZvX3VwZGF0ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ19pbmZvX3VwZGF0ZS5ycwppbmRleCA3ZTYwNzEzLi41NzIxMTA1IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX2luZm9fdXBkYXRlLnJzCkBAIC0xOCw3ICsxOCw3IEBACiAKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewogICAgIHJlYWRfdThfZnJvbV9ieXRlcywgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ0luZm9CaXQsIEZsYWdJbmZvSGVhZGVyLCBGbGFnVmFsdWVUeXBlLAotICAgIEZJTEVfVkVSU0lPTiwKKyAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKIH07CiB1c2UgYW55aG93Ojphbnlob3c7CiAKQEAgLTI4LDExICsyOCwxMSBAQAogICAgIGZsYWdfaW5kZXg6IHUzMiwKICkgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OwotICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gRklMRV9WRVJTSU9OIHsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKICAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKICAgICAgICAgICAgICJDYW5ub3Qgd3JpdGUgdG8gc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKICAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAotICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICApKSk7CiAgICAgfQogCkBAIC05NCwxMyArOTQsMTMgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdDsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Ont0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT059OwogICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfaW5mb19xdWVyeTo6ZmluZF9mbGFnX2F0dHJpYnV0ZTsKIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBoYXMgc2VydmVyIG92ZXJyaWRlIHVwZGF0ZQogICAgIGZuIHRlc3RfdXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgpIHsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgbXV0IGJ1ZiA9IGZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKTsKICAgICAgICAgZm9yIGkgaW4gMC4uZmxhZ19pbmZvX2xpc3QuaGVhZGVyLm51bV9mbGFncyB7CiAgICAgICAgICAgICB1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlCiAgICAgZm4gdGVzdF91cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgbGV0IG11dCBidWYgPSBmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGZvciBpIGluIDAuLmZsYWdfaW5mb19saXN0LmhlYWRlci5udW1fZmxhZ3MgewogICAgICAgICAgICAgdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfdmFsdWVfdXBkYXRlLnJzCmluZGV4IGRkMTVjOTkuLjk3NzJkYjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX3ZhbHVlX3VwZGF0ZS5ycwpAQCAtMTYsNyArMTYsNyBAQAogCiAvLyEgZmxhZyB2YWx1ZSB1cGRhdGUgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdmFsdWUgZmlsZSB3cml0ZSB0byBtYXBwZWQgYnl0ZXMKIAotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ1ZhbHVlSGVhZGVyLCBGSUxFX1ZFUlNJT059OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ1ZhbHVlSGVhZGVyLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTn07CiB1c2UgYW55aG93Ojphbnlob3c7CiAKIC8vLyBTZXQgZmxhZyB2YWx1ZQpAQCAtMjYsMTEgKzI2LDExIEBACiAgICAgZmxhZ192YWx1ZTogYm9vbCwKICkgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKLSAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IEZJTEVfVkVSU0lPTiB7CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCiAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSIsCiAgICAgICAgICAgICBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiwKLSAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgKSkpOwogICAgIH0KIApAQCAtNDksMTIgKzQ5LDEyIEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT059OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZsYWcgdmFsdWUgdXBkYXRlCiAgICAgZm4gdGVzdF9ib29sZWFuX2ZsYWdfdmFsdWVfdXBkYXRlKCkgewotICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgdmFsdWVfb2Zmc2V0ID0gZmxhZ192YWx1ZV9saXN0LmhlYWRlci5ib29sZWFuX3ZhbHVlX29mZnNldDsKICAgICAgICAgbGV0IG11dCBjb250ZW50ID0gZmxhZ192YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IHRydWVfYnl0ZSA9IHU4Ojpmcm9tKHRydWUpLnRvX2xlX2J5dGVzKClbMF07CkBAIC03Miw3ICs3Miw3IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHVwZGF0ZSBiZXlvbmQgdGhlIGVuZCBvZiBib29sZWFuIHNlY3Rpb24KICAgICBmbiB0ZXN0X2Jvb2xlYW5fb3V0X29mX3JhbmdlKCkgewotICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0gdXBkYXRlX2Jvb2xlYW5fZmxhZ192YWx1ZSgmbXV0IGZsYWdfdmFsdWVfbGlzdFsuLl0sIDgsIHRydWUpLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKICAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCkBAIC04MywxNiArODMsMTYgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCiAgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7Ci0gICAgICAgIGxldCBtdXQgdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOwotICAgICAgICB2YWx1ZV9saXN0LmhlYWRlci52ZXJzaW9uID0gRklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdmFsdWVfbGlzdC5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKICAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlID0gdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBlcnJvciA9IHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWUoJm11dCBmbGFnX3ZhbHVlWy4uXSwgNCwgdHJ1ZSkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKICAgICAgICAgICAgIGZvcm1hdCEoCiAgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3Qgd3JpdGUgdG8gc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCi0gICAgICAgICAgICAgICAgRklMRV9WRVJTSU9OICsgMSwKLSAgICAgICAgICAgICAgICBGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgICAgICkKICAgICAgICAgKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCmluZGV4IDAzOTZhNjMuLjA5YmI0MWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCkBAIC0yNCwxNSArMjQsMTAgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RfdXRpbHM7CiAKLXVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewotICAgIEFjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdJbmZvSGVhZGVyLCBGbGFnSW5mb0xpc3QsIEZsYWdJbmZvTm9kZSwgRmxhZ1RhYmxlLCBGbGFnVmFsdWVUeXBlLAotICAgIFBhY2thZ2VUYWJsZSwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZSwgRklMRV9WRVJTSU9OLAotfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdWYWx1ZVR5cGV9OwogCiB1c2UgYW55aG93Ojphbnlob3c7CiB1c2UgbWVtbWFwMjo6TW1hcE11dDsKLXVzZSBzdGQ6OmZzOjpGaWxlOwotdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CiAKIC8vLyBHZXQgcmVhZCB3cml0ZSBtYXBwZWQgc3RvcmFnZSBmaWxlcy4KIC8vLwpAQCAtMTA0LDg2ICs5OSw2IEBACiAgICAgfSkKIH0KIAotLy8vIFJlYWQgaW4gc3RvcmFnZSBmaWxlIGFzIGJ5dGVzCi1mbiByZWFkX2ZpbGVfdG9fYnl0ZXMoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8VmVjPHU4PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewotICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6Om9wZW4oZmlsZV9wYXRoKS5tYXBfZXJyKHxlcnJtc2d8IHsKLSAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZVJlYWRGYWlsKGFueWhvdyEoIkZhaWxlZCB0byBvcGVuIGZpbGUge306IHt9IiwgZmlsZV9wYXRoLCBlcnJtc2cpKQotICAgIH0pPzsKLSAgICBsZXQgbXV0IGJ1ZmZlciA9IFZlYzo6bmV3KCk7Ci0gICAgZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGJ1ZmZlcikubWFwX2Vycih8ZXJybXNnfCB7Ci0gICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKAotICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGJ5dGVzIGZyb20gZmlsZSB7fToge30iLAotICAgICAgICAgICAgZmlsZV9wYXRoLAotICAgICAgICAgICAgZXJybXNnCi0gICAgICAgICkpCi0gICAgfSk/OwotICAgIE9rKGJ1ZmZlcikKLX0KLQotLy8vIENyZWF0ZSBmbGFnIGluZm8gZmlsZSBnaXZlbiBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmbGFnIG1hcCBmaWxlCi0vLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCi0vLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCi0vLy8gXG91dHB1dCBmbGFnX2luZm9fb3V0OiBjcmVhdGVkIGZsYWcgaW5mbyBmaWxlCi1wdWIgZm4gY3JlYXRlX2ZsYWdfaW5mbygKLSAgICBwYWNrYWdlX21hcDogJnN0ciwKLSAgICBmbGFnX21hcDogJnN0ciwKLSAgICBmbGFnX2luZm9fb3V0OiAmc3RyLAotKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKLSAgICBsZXQgcGFja2FnZV90YWJsZSA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKHBhY2thZ2VfbWFwKT8pPzsKLSAgICBsZXQgZmxhZ190YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKGZsYWdfbWFwKT8pPzsKLQotICAgIGlmIHBhY2thZ2VfdGFibGUuaGVhZGVyLmNvbnRhaW5lciAhPSBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIgewotICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVDcmVhdGlvbkZhaWwoYW55aG93ISgKLSAgICAgICAgICAgICJjb250YWluZXIgZm9yIHBhY2thZ2UgbWFwIHt9IGFuZCBmbGFnIG1hcCB7fSBkb2VzIG5vdCBtYXRjaCIsCi0gICAgICAgICAgICBwYWNrYWdlX3RhYmxlLmhlYWRlci5jb250YWluZXIsCi0gICAgICAgICAgICBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIsCi0gICAgICAgICkpKTsKLSAgICB9Ci0KLSAgICBsZXQgbXV0IHBhY2thZ2Vfc3RhcnRfaW5kZXggPSB2ZWMhWzA7IHBhY2thZ2VfdGFibGUuaGVhZGVyLm51bV9wYWNrYWdlcyBhcyB1c2l6ZV07Ci0gICAgZm9yIG5vZGUgaW4gcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkgewotICAgICAgICBwYWNrYWdlX3N0YXJ0X2luZGV4W25vZGUucGFja2FnZV9pZCBhcyB1c2l6ZV0gPSBub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXg7Ci0gICAgfQotCi0gICAgbGV0IG11dCBpc19mbGFnX3J3ID0gdmVjIVtmYWxzZTsgZmxhZ190YWJsZS5oZWFkZXIubnVtX2ZsYWdzIGFzIHVzaXplXTsKLSAgICBmb3Igbm9kZSBpbiBmbGFnX3RhYmxlLm5vZGVzLml0ZXIoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZGV4ID0gcGFja2FnZV9zdGFydF9pbmRleFtub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdICsgbm9kZS5mbGFnX2luZGV4IGFzIHUzMjsKLSAgICAgICAgaXNfZmxhZ19yd1tmbGFnX2luZGV4IGFzIHVzaXplXSA9IG5vZGUuZmxhZ190eXBlID09IFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuOwotICAgIH0KLQotICAgIGxldCBtdXQgbGlzdCA9IEZsYWdJbmZvTGlzdCB7Ci0gICAgICAgIGhlYWRlcjogRmxhZ0luZm9IZWFkZXIgewotICAgICAgICAgICAgdmVyc2lvbjogRklMRV9WRVJTSU9OLAotICAgICAgICAgICAgY29udGFpbmVyOiBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIsCi0gICAgICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTgsCi0gICAgICAgICAgICBmaWxlX3NpemU6IDAsCi0gICAgICAgICAgICBudW1fZmxhZ3M6IGZsYWdfdGFibGUuaGVhZGVyLm51bV9mbGFncywKLSAgICAgICAgICAgIGJvb2xlYW5fZmxhZ19vZmZzZXQ6IDAsCi0gICAgICAgIH0sCi0gICAgICAgIG5vZGVzOiBpc19mbGFnX3J3Lml0ZXIoKS5tYXAofCZyd3wgRmxhZ0luZm9Ob2RlOjpjcmVhdGUocncpKS5jb2xsZWN0KCksCi0gICAgfTsKLQotICAgIGxpc3QuaGVhZGVyLmJvb2xlYW5fZmxhZ19vZmZzZXQgPSBsaXN0LmhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOwotICAgIGxpc3QuaGVhZGVyLmZpbGVfc2l6ZSA9IGxpc3QuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKLQotICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6OmNyZWF0ZShmbGFnX2luZm9fb3V0KS5tYXBfZXJyKHxlcnJtc2d8IHsKLSAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKAotICAgICAgICAgICAgImZhaWwgdG8gY3JlYXRlIGZpbGUge306IHt9IiwKLSAgICAgICAgICAgIGZsYWdfaW5mb19vdXQsCi0gICAgICAgICAgICBlcnJtc2cKLSAgICAgICAgKSkKLSAgICB9KT87Ci0gICAgZmlsZS53cml0ZV9hbGwoJmxpc3QuaW50b19ieXRlcygpKS5tYXBfZXJyKHxlcnJtc2d8IHsKLSAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKAotICAgICAgICAgICAgImZhaWwgdG8gd3JpdGUgdG8gZmlsZSB7fToge30iLAotICAgICAgICAgICAgZmxhZ19pbmZvX291dCwKLSAgICAgICAgICAgIGVycm1zZwotICAgICAgICApKQotICAgIH0pPzsKLQotICAgIE9rKCgpKQotfQotCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KIC8vIENDIElOVEVSTE9QCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KQEAgLTIxMiwxMiArMTI3LDYgQEAKICAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKICAgICB9CiAKLSAgICAvLyBGbGFnIGluZm8gZmlsZSBjcmVhdGlvbiByZXR1cm4gZm9yIGNjIGludGVybG9wCi0gICAgcHViIHN0cnVjdCBGbGFnSW5mb0NyZWF0aW9uQ1hYIHsKLSAgICAgICAgcHViIHN1Y2Nlc3M6IGJvb2wsCi0gICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCi0gICAgfQotCiAgICAgLy8gUnVzdCBleHBvcnQgdG8gYysrCiAgICAgZXh0ZXJuICJSdXN0IiB7CiAgICAgICAgIHB1YiBmbiB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eCgKQEAgLTIzOSwxMiArMTQ4LDYgQEAKICAgICAgICAgICAgIG9mZnNldDogdTMyLAogICAgICAgICAgICAgdmFsdWU6IGJvb2wsCiAgICAgICAgICkgLT4gRmxhZ0hhc0xvY2FsT3ZlcnJpZGVVcGRhdGVDWFg7Ci0KLSAgICAgICAgcHViIGZuIGNyZWF0ZV9mbGFnX2luZm9fY3h4KAotICAgICAgICAgICAgcGFja2FnZV9tYXA6ICZzdHIsCi0gICAgICAgICAgICBmbGFnX21hcDogJnN0ciwKLSAgICAgICAgICAgIGZsYWdfaW5mb19vdXQ6ICZzdHIsCi0gICAgICAgICkgLT4gRmxhZ0luZm9DcmVhdGlvbkNYWDsKICAgICB9CiB9CiAKQEAgLTMyOSwzNCArMjMyLDE1IEBACiAgICAgfQogfQogCi0vLy8gQ3JlYXRlIGZsYWcgaW5mbyBmaWxlIGNjIGludGVybG9wCi1wdWIoY3JhdGUpIGZuIGNyZWF0ZV9mbGFnX2luZm9fY3h4KAotICAgIHBhY2thZ2VfbWFwOiAmc3RyLAotICAgIGZsYWdfbWFwOiAmc3RyLAotICAgIGZsYWdfaW5mb19vdXQ6ICZzdHIsCi0pIC0+IGZmaTo6RmxhZ0luZm9DcmVhdGlvbkNYWCB7Ci0gICAgbWF0Y2ggY3JlYXRlX2ZsYWdfaW5mbyhwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfaW5mb19vdXQpIHsKLSAgICAgICAgT2soKCkpID0+IGZmaTo6RmxhZ0luZm9DcmVhdGlvbkNYWCB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIikgfSwKLSAgICAgICAgRXJyKGVycm1zZykgPT4gewotICAgICAgICAgICAgZmZpOjpGbGFnSW5mb0NyZWF0aW9uQ1hYIHsgc3VjY2VzczogZmFsc2UsIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNvcHlfdG9fdGVtcF9maWxlOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6ewotICAgICAgICBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCwgY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSwgY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSwKLSAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlLAotICAgIH07CiAgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpGbGFnSW5mb0JpdDsKICAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX2luZm9fcXVlcnk6OmZpbmRfZmxhZ19hdHRyaWJ1dGU7CiAgICAgdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ192YWx1ZV9xdWVyeTo6ZmluZF9ib29sZWFuX2ZsYWdfdmFsdWU7CiAgICAgdXNlIHN0ZDo6ZnM6OkZpbGU7CiAgICAgdXNlIHN0ZDo6aW86OlJlYWQ7Ci0gICAgdXNlIHRlbXBmaWxlOjpOYW1lZFRlbXBGaWxlOwogCiAgICAgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9hdF9vZmZzZXQoZmlsZTogJnN0ciwgb2Zmc2V0OiB1MzIpIC0+IGJvb2wgewogICAgICAgICBsZXQgbXV0IGYgPSBGaWxlOjpvcGVuKCZmaWxlKS51bndyYXAoKTsKQEAgLTQzOSwzMSArMzIzLDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGZuIGNyZWF0ZV9lbXB0eV90ZW1wX2ZpbGUoKSAtPiBSZXN1bHQ8TmFtZWRUZW1wRmlsZSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewotICAgICAgICBsZXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpLm1hcF9lcnIofF98IHsKLSAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVDcmVhdGlvbkZhaWwoYW55aG93ISgiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGZpbGUiKSkKLSAgICAgICAgfSk/OwotICAgICAgICBPayhmaWxlKQotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgZmxhZyBpbmZvIGNyZWF0aW9uCi0gICAgZm4gdGVzdF9jcmVhdGVfZmxhZ19pbmZvKCkgewotICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9Ci0gICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBmbGFnX2luZm8gPSBjcmVhdGVfZW1wdHlfdGVtcF9maWxlKCkudW53cmFwKCk7Ci0KLSAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcGF0aCA9IHBhY2thZ2VfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKLSAgICAgICAgbGV0IGZsYWdfdGFibGVfcGF0aCA9IGZsYWdfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7Ci0KLSAgICAgICAgYXNzZXJ0IShjcmVhdGVfZmxhZ19pbmZvKCZwYWNrYWdlX3RhYmxlX3BhdGgsICZmbGFnX3RhYmxlX3BhdGgsICZmbGFnX2luZm9fcGF0aCkuaXNfb2soKSk7Ci0KLSAgICAgICAgbGV0IGZsYWdfaW5mbyA9Ci0gICAgICAgICAgICBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcygmZmxhZ19pbmZvX3BhdGgpLnVud3JhcCgpKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfaW5mbyA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7Ci0gICAgICAgIGFzc2VydF9lcSEoZmxhZ19pbmZvLCBleHBlY3RlZF9mbGFnX2luZm8pOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2FmbGFncy9BbmRyb2lkLmJwCmluZGV4IDJhMDIzNzkuLmE3YWNlZWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQW5kcm9pZC5icApAQCAtMTAsNyArMTAsOSBAQAogICAgIHNyY3M6IFsic3JjL21haW4ucnMiXSwKICAgICBydXN0bGliczogWwogICAgICAgICAibGliYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAorICAgICAgICAibGliYWNvbmZpZ19mbGFncyIsCiAgICAgICAgICJsaWJhY29uZmlnX3Byb3RvcyIsCisgICAgICAgICJsaWJhY29uZmlnZF9wcm90b3NfcnVzdCIsCiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAogICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAogICAgICAgICAibGliYW55aG93IiwKQEAgLTE4LDExICsyMCwxNiBAQAogICAgICAgICAibGlibml4IiwKICAgICAgICAgImxpYnByb3RvYnVmIiwKICAgICAgICAgImxpYnJlZ2V4IiwKKyAgICAgICAgLy8gVE9ETzogYi8zNzEwMjExNzQgcmVtb3ZlIHRoaXMgZmFrZSBkZXBlbmRlbmN5IG9uY2Ugd2UgZmluZCBhIHByb3BlciBzdHJhdGVneSB0bworICAgICAgICAvLyBkZWFsIHdpdGggdGVzdCBhY29uZmlnIGxpYnMgYXJlIG5vdCBwcmVzZW50IGluIHN0b3JhZ2UgYmVjYXVzZSB0aGV5IGFyZSBuZXZlciB1c2VkCisgICAgICAgIC8vIGJ5IHRoZSBhY3R1YWwgYnVpbGQKKyAgICAgICAgImxpYmFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAogICAgIF0sCiB9CiAKIHJ1c3RfYmluYXJ5IHsKICAgICBuYW1lOiAiYWZsYWdzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBkZWZhdWx0czogWyJhZmxhZ3MuZGVmYXVsdHMiXSwKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0NhcmdvLnRvbWwKaW5kZXggZWVhZTI5NS4uZDMxZTIzMiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9DYXJnby50b21sCkBAIC05LDggKzksMTAgQEAKIHByb3RvYnVmID0gIjMuMi4wIgogcmVnZXggPSAiMS4xMC4zIgogYWNvbmZpZ19wcm90b3MgPSB7IHBhdGggPSAiLi4vYWNvbmZpZ19wcm90b3MiIH0KK2Fjb25maWdkX3Byb3RvcyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbW9kdWxlcy9Db25maWdJbmZyYXN0cnVjdHVyZS9hY29uZmlnZC9wcm90byJ9CiBuaXggPSB7IHZlcnNpb24gPSAiMC4yOC4wIiwgZmVhdHVyZXMgPSBbInVzZXIiXSB9CiBhY29uZmlnX3N0b3JhZ2VfZmlsZSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX2ZpbGUiIH0KIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiB9CiBjbGFwID0ge3ZlcnNpb24gPSAiNC41LjIiIH0KIGFjb25maWdfZGV2aWNlX3BhdGhzID0geyB2ZXJzaW9uID0gIjAuMS4wIiwgcGF0aCA9ICIuLi9hY29uZmlnX2RldmljZV9wYXRocyIgfQorYWNvbmZpZ19mbGFncyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19mbGFncyIgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvYWNvbmZpZ19zdG9yYWdlX3NvdXJjZS5ycwppbmRleCAwNDE0MGM3Li43NjY4MDdhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvYWNvbmZpZ19zdG9yYWdlX3NvdXJjZS5ycworKysgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvYWNvbmZpZ19zdG9yYWdlX3NvdXJjZS5ycwpAQCAtMSw1MiArMSwxNjQgQEAKLXVzZSBjcmF0ZTo6e0ZsYWcsIEZsYWdQZXJtaXNzaW9uLCBGbGFnU291cmNlLCBGbGFnVmFsdWUsIFZhbHVlUGlja2VkRnJvbX07Ci11c2UgYW55aG93Ojp7YW55aG93LCBSZXN1bHR9OwotCi11c2Ugc3RkOjpmczo6RmlsZTsKLXVzZSBzdGQ6OmlvOjpSZWFkOwordXNlIGNyYXRlOjpsb2FkX3Byb3RvczsKK3VzZSBjcmF0ZTo6e0ZsYWcsIEZsYWdTb3VyY2V9OwordXNlIGNyYXRlOjp7RmxhZ1Blcm1pc3Npb24sIEZsYWdWYWx1ZSwgVmFsdWVQaWNrZWRGcm9tfTsKK3VzZSBhY29uZmlnZF9wcm90b3M6OnsKKyAgICBQcm90b0ZsYWdRdWVyeVJldHVybk1lc3NhZ2UsIFByb3RvTGlzdFN0b3JhZ2VNZXNzYWdlLCBQcm90b0xpc3RTdG9yYWdlTWVzc2FnZU1zZywKKyAgICBQcm90b1N0b3JhZ2VSZXF1ZXN0TWVzc2FnZSwgUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2VNc2csIFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlcywKKyAgICBQcm90b1N0b3JhZ2VSZXR1cm5NZXNzYWdlLCBQcm90b1N0b3JhZ2VSZXR1cm5NZXNzYWdlTXNnLCBQcm90b1N0b3JhZ2VSZXR1cm5NZXNzYWdlcywKK307Cit1c2UgYW55aG93Ojphbnlob3c7Cit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2UgcHJvdG9idWY6Ok1lc3NhZ2U7Cit1c2UgcHJvdG9idWY6OlNwZWNpYWxGaWVsZHM7Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OwordXNlIHN0ZDo6bmV0OjpTaHV0ZG93bjsKK3VzZSBzdGQ6Om9zOjp1bml4OjpuZXQ6OlVuaXhTdHJlYW07CiAKIHB1YiBzdHJ1Y3QgQWNvbmZpZ1N0b3JhZ2VTb3VyY2Uge30KIAotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpwcm90b3M6OlByb3RvU3RvcmFnZUZpbGVzOworc3RhdGljIEFDT05GSUdEX1NZU1RFTV9TT0NLRVRfTkFNRTogJnN0ciA9ICIvZGV2L3NvY2tldC9hY29uZmlnZF9zeXN0ZW0iOworc3RhdGljIEFDT05GSUdEX01BSU5MSU5FX1NPQ0tFVF9OQU1FOiAmc3RyID0gIi9kZXYvc29ja2V0L2Fjb25maWdkX21haW5saW5lIjsKIAotc3RhdGljIFNUT1JBR0VfSU5GT19GSUxFX1BBVEg6ICZzdHIgPSAiL21ldGFkYXRhL2Fjb25maWcvcGVyc2lzdGVudF9zdG9yYWdlX2ZpbGVfcmVjb3Jkcy5wYiI7CitlbnVtIEFjb25maWdkU29ja2V0IHsKKyAgICBTeXN0ZW0sCisgICAgTWFpbmxpbmUsCit9CisKK2ltcGwgQWNvbmZpZ2RTb2NrZXQgeworICAgIHB1YiBmbiBuYW1lKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZiB7CisgICAgICAgICAgICBBY29uZmlnZFNvY2tldDo6U3lzdGVtID0+IEFDT05GSUdEX1NZU1RFTV9TT0NLRVRfTkFNRSwKKyAgICAgICAgICAgIEFjb25maWdkU29ja2V0OjpNYWlubGluZSA9PiBBQ09ORklHRF9NQUlOTElORV9TT0NLRVRfTkFNRSwKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gbG9hZF9mbGFnX3RvX2NvbnRhaW5lcigpIC0+IFJlc3VsdDxIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4geworICAgIE9rKGxvYWRfcHJvdG9zOjpsb2FkKCk/LmludG9faXRlcigpLm1hcCh8cHwgKHAucXVhbGlmaWVkX25hbWUoKSwgcC5jb250YWluZXIpKS5jb2xsZWN0KCkpCit9CisKK2ZuIGNvbnZlcnQobXNnOiBQcm90b0ZsYWdRdWVyeVJldHVybk1lc3NhZ2UsIGNvbnRhaW5lcnM6ICZIYXNoTWFwPFN0cmluZywgU3RyaW5nPikgLT4gUmVzdWx0PEZsYWc+IHsKKyAgICBsZXQgKHZhbHVlLCB2YWx1ZV9waWNrZWRfZnJvbSkgPSBtYXRjaCAoCisgICAgICAgICZtc2cuYm9vdF9mbGFnX3ZhbHVlLAorICAgICAgICBtc2cuZGVmYXVsdF9mbGFnX3ZhbHVlLAorICAgICAgICBtc2cubG9jYWxfZmxhZ192YWx1ZSwKKyAgICAgICAgbXNnLmhhc19sb2NhbF9vdmVycmlkZSwKKyAgICApIHsKKyAgICAgICAgKF8sIF8sIFNvbWUobG9jYWwpLCBTb21lKGhhc19sb2NhbCkpIGlmIGhhc19sb2NhbCA9PiB7CisgICAgICAgICAgICAoRmxhZ1ZhbHVlOjp0cnlfZnJvbShsb2NhbC5hc19zdHIoKSk/LCBWYWx1ZVBpY2tlZEZyb206OkxvY2FsKQorICAgICAgICB9CisgICAgICAgIChTb21lKGJvb3QpLCBTb21lKGRlZmF1bHQpLCBfLCBfKSA9PiB7CisgICAgICAgICAgICBsZXQgdmFsdWUgPSBGbGFnVmFsdWU6OnRyeV9mcm9tKGJvb3QuYXNfc3RyKCkpPzsKKyAgICAgICAgICAgIGlmICpib290ID09IGRlZmF1bHQgeworICAgICAgICAgICAgICAgICh2YWx1ZSwgVmFsdWVQaWNrZWRGcm9tOjpEZWZhdWx0KQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAodmFsdWUsIFZhbHVlUGlja2VkRnJvbTo6U2VydmVyKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF8gPT4gcmV0dXJuIEVycihhbnlob3chKCJtaXNzaW5nIG92ZXJyaWRlIikpLAorICAgIH07CisKKyAgICBsZXQgc3RhZ2VkX3ZhbHVlID0gbWF0Y2ggKG1zZy5ib290X2ZsYWdfdmFsdWUsIG1zZy5zZXJ2ZXJfZmxhZ192YWx1ZSwgbXNnLmhhc19zZXJ2ZXJfb3ZlcnJpZGUpIHsKKyAgICAgICAgKFNvbWUoYm9vdCksIFNvbWUoc2VydmVyKSwgXykgaWYgYm9vdCA9PSBzZXJ2ZXIgPT4gTm9uZSwKKyAgICAgICAgKFNvbWUoYm9vdCksIFNvbWUoc2VydmVyKSwgU29tZShoYXNfc2VydmVyKSkgaWYgYm9vdCAhPSBzZXJ2ZXIgJiYgaGFzX3NlcnZlciA9PiB7CisgICAgICAgICAgICBTb21lKEZsYWdWYWx1ZTo6dHJ5X2Zyb20oc2VydmVyLmFzX3N0cigpKT8pCisgICAgICAgIH0KKyAgICAgICAgXyA9PiBOb25lLAorICAgIH07CisKKyAgICBsZXQgcGVybWlzc2lvbiA9IG1hdGNoIG1zZy5pc19yZWFkd3JpdGUgeworICAgICAgICBTb21lKGlzX3JlYWR3cml0ZSkgPT4geworICAgICAgICAgICAgaWYgaXNfcmVhZHdyaXRlIHsKKyAgICAgICAgICAgICAgICBGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZsYWdQZXJtaXNzaW9uOjpSZWFkT25seQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE5vbmUgPT4gcmV0dXJuIEVycihhbnlob3chKCJtaXNzaW5nIHBlcm1pc3Npb24iKSksCisgICAgfTsKKworICAgIGxldCBuYW1lID0gbXNnLmZsYWdfbmFtZS5va19vcihhbnlob3chKCJtaXNzaW5nIGZsYWcgbmFtZSIpKT87CisgICAgbGV0IHBhY2thZ2UgPSBtc2cucGFja2FnZV9uYW1lLm9rX29yKGFueWhvdyEoIm1pc3NpbmcgcGFja2FnZSBuYW1lIikpPzsKKyAgICBsZXQgcXVhbGlmaWVkX25hbWUgPSBmb3JtYXQhKCJ7cGFja2FnZX0ue25hbWV9Iik7CisgICAgT2soRmxhZyB7CisgICAgICAgIG5hbWUsCisgICAgICAgIHBhY2thZ2UsCisgICAgICAgIHZhbHVlLAorICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbSwKKyAgICAgICAgc3RhZ2VkX3ZhbHVlLAorICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcnMKKyAgICAgICAgICAgIC5nZXQoJnF1YWxpZmllZF9uYW1lKQorICAgICAgICAgICAgLmNsb25lZCgpCisgICAgICAgICAgICAudW53cmFwX29yX2Vsc2UofHwgIjxubyBjb250YWluZXI+Ii50b19zdHJpbmcoKSkKKyAgICAgICAgICAgIC50b19zdHJpbmcoKSwKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgRGV2aWNlQ29uZmlnIGlzIG5vdCBpbiB0aGUgQ0xJLgorICAgICAgICBuYW1lc3BhY2U6ICItIi50b19zdHJpbmcoKSwKKyAgICB9KQorfQorCitmbiByZWFkX2Zyb21fc29ja2V0KHNvY2tldDogQWNvbmZpZ2RTb2NrZXQpIC0+IFJlc3VsdDxWZWM8UHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlPj4geworICAgIGxldCBtZXNzYWdlcyA9IFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlcyB7CisgICAgICAgIG1zZ3M6IHZlYyFbUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2UgeworICAgICAgICAgICAgbXNnOiBTb21lKFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlTXNnOjpMaXN0U3RvcmFnZU1lc3NhZ2UoUHJvdG9MaXN0U3RvcmFnZU1lc3NhZ2UgeworICAgICAgICAgICAgICAgIG1zZzogU29tZShQcm90b0xpc3RTdG9yYWdlTWVzc2FnZU1zZzo6QWxsKHRydWUpKSwKKyAgICAgICAgICAgICAgICBzcGVjaWFsX2ZpZWxkczogU3BlY2lhbEZpZWxkczo6bmV3KCksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICBzcGVjaWFsX2ZpZWxkczogU3BlY2lhbEZpZWxkczo6bmV3KCksCisgICAgICAgIH1dLAorICAgICAgICBzcGVjaWFsX2ZpZWxkczogU3BlY2lhbEZpZWxkczo6bmV3KCksCisgICAgfTsKKworICAgIGxldCBtdXQgc29ja2V0ID0gVW5peFN0cmVhbTo6Y29ubmVjdChzb2NrZXQubmFtZSgpKT87CisKKyAgICBsZXQgbWVzc2FnZV9idWZmZXIgPSBtZXNzYWdlcy53cml0ZV90b19ieXRlcygpPzsKKyAgICBsZXQgbXV0IG1lc3NhZ2VfbGVuZ3RoX2J1ZmZlcjogW3U4OyA0XSA9IFswOyA0XTsKKyAgICBsZXQgbWVzc2FnZV9zaXplID0gJm1lc3NhZ2VfYnVmZmVyLmxlbigpOworICAgIG1lc3NhZ2VfbGVuZ3RoX2J1ZmZlclswXSA9IChtZXNzYWdlX3NpemUgPj4gMjQpIGFzIHU4OworICAgIG1lc3NhZ2VfbGVuZ3RoX2J1ZmZlclsxXSA9IChtZXNzYWdlX3NpemUgPj4gMTYpIGFzIHU4OworICAgIG1lc3NhZ2VfbGVuZ3RoX2J1ZmZlclsyXSA9IChtZXNzYWdlX3NpemUgPj4gOCkgYXMgdTg7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzNdID0gKm1lc3NhZ2Vfc2l6ZSBhcyB1ODsKKyAgICBzb2NrZXQud3JpdGVfYWxsKCZtZXNzYWdlX2xlbmd0aF9idWZmZXIpPzsKKyAgICBzb2NrZXQud3JpdGVfYWxsKCZtZXNzYWdlX2J1ZmZlcik/OworICAgIHNvY2tldC5zaHV0ZG93bihTaHV0ZG93bjo6V3JpdGUpPzsKKworICAgIGxldCBtdXQgcmVzcG9uc2VfbGVuZ3RoX2J1ZmZlcjogW3U4OyA0XSA9IFswOyA0XTsKKyAgICBzb2NrZXQucmVhZF9leGFjdCgmbXV0IHJlc3BvbnNlX2xlbmd0aF9idWZmZXIpPzsKKyAgICBsZXQgcmVzcG9uc2VfbGVuZ3RoID0gdTMyOjpmcm9tX2JlX2J5dGVzKHJlc3BvbnNlX2xlbmd0aF9idWZmZXIpIGFzIHVzaXplOworICAgIGxldCBtdXQgcmVzcG9uc2VfYnVmZmVyID0gdmVjIVswOyByZXNwb25zZV9sZW5ndGhdOworICAgIHNvY2tldC5yZWFkX2V4YWN0KCZtdXQgcmVzcG9uc2VfYnVmZmVyKT87CisKKyAgICBsZXQgcmVzcG9uc2U6IFByb3RvU3RvcmFnZVJldHVybk1lc3NhZ2VzID0KKyAgICAgICAgcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoJnJlc3BvbnNlX2J1ZmZlcik/OworCisgICAgbWF0Y2ggcmVzcG9uc2UubXNncy5hc19zbGljZSgpIHsKKyAgICAgICAgW1Byb3RvU3RvcmFnZVJldHVybk1lc3NhZ2UgeworICAgICAgICAgICAgbXNnOiBTb21lKFByb3RvU3RvcmFnZVJldHVybk1lc3NhZ2VNc2c6Okxpc3RTdG9yYWdlTWVzc2FnZShsaXN0X3N0b3JhZ2VfbWVzc2FnZSkpLAorICAgICAgICAgICAgLi4KKyAgICAgICAgfV0gPT4gT2sobGlzdF9zdG9yYWdlX21lc3NhZ2UuZmxhZ3MuY2xvbmUoKSksCisgICAgICAgIF8gPT4gRXJyKGFueWhvdyEoInVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBhY29uZmlnZCIpKSwKKyAgICB9Cit9CiAKIGltcGwgRmxhZ1NvdXJjZSBmb3IgQWNvbmZpZ1N0b3JhZ2VTb3VyY2UgewogICAgIGZuIGxpc3RfZmxhZ3MoKSAtPiBSZXN1bHQ8VmVjPEZsYWc+PiB7Ci0gICAgICAgIGxldCBtdXQgcmVzdWx0ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgbGV0IGNvbnRhaW5lcnMgPSBsb2FkX2ZsYWdfdG9fY29udGFpbmVyKCk/OworICAgICAgICBsZXQgc3lzdGVtX21lc3NhZ2VzID0gcmVhZF9mcm9tX3NvY2tldChBY29uZmlnZFNvY2tldDo6U3lzdGVtKTsKKyAgICAgICAgbGV0IG1haW5saW5lX21lc3NhZ2VzID0gcmVhZF9mcm9tX3NvY2tldChBY29uZmlnZFNvY2tldDo6TWFpbmxpbmUpOwogCi0gICAgICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6Om9wZW4oU1RPUkFHRV9JTkZPX0ZJTEVfUEFUSCk/OwotICAgICAgICBsZXQgbXV0IGJ5dGVzID0gVmVjOjpuZXcoKTsKLSAgICAgICAgZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGJ5dGVzKT87Ci0gICAgICAgIGxldCBzdG9yYWdlX2ZpbGVfaW5mbzogUHJvdG9TdG9yYWdlRmlsZXMgPSBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcygmYnl0ZXMpPzsKLQotICAgICAgICBmb3IgZmlsZV9pbmZvIGluIHN0b3JhZ2VfZmlsZV9pbmZvLmZpbGVzIHsKLSAgICAgICAgICAgIGxldCBwYWNrYWdlX21hcCA9Ci0gICAgICAgICAgICAgICAgZmlsZV9pbmZvLnBhY2thZ2VfbWFwLm9rX29yKGFueWhvdyEoInN0b3JhZ2UgZmlsZSBpcyBtaXNzaW5nIHBhY2thZ2UgbWFwIikpPzsKLSAgICAgICAgICAgIGxldCBmbGFnX21hcCA9IGZpbGVfaW5mby5mbGFnX21hcC5va19vcihhbnlob3chKCJzdG9yYWdlIGZpbGUgaXMgbWlzc2luZyBmbGFnIG1hcCIpKT87Ci0gICAgICAgICAgICBsZXQgZmxhZ192YWwgPSBmaWxlX2luZm8uZmxhZ192YWwub2tfb3IoYW55aG93ISgic3RvcmFnZSBmaWxlIGlzIG1pc3NpbmcgZmxhZyB2YWwiKSk/OwotICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9Ci0gICAgICAgICAgICAgICAgZmlsZV9pbmZvLmNvbnRhaW5lci5va19vcihhbnlob3chKCJzdG9yYWdlIGZpbGUgaXMgbWlzc2luZyBjb250YWluZXIiKSk/OwotCi0gICAgICAgICAgICBmb3IgbGlzdGVkX2ZsYWcgaW4gYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Omxpc3RfZmxhZ3MoJnBhY2thZ2VfbWFwLCAmZmxhZ19tYXAsICZmbGFnX3ZhbCk/Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goRmxhZyB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWU6IGxpc3RlZF9mbGFnLmZsYWdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogbGlzdGVkX2ZsYWcucGFja2FnZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjp0cnlfZnJvbShsaXN0ZWRfZmxhZy5mbGFnX3ZhbHVlLmFzX3N0cigpKT8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLnRvX3N0cmluZygpLAotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8zMjQ0MzYxNDUpOiBkZWxldGUgbmFtZXNwYWNlIGZpZWxkIG9uY2UgRGV2aWNlQ29uZmlnIGlzbid0IGluIENMSS4KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAiLSIudG9fc3RyaW5nKCksCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzMyNDQzNjE0NSk6IFBvcHVsYXRlIHdpdGggcmVhbCB2YWx1ZXMgb25jZSBBUEkgaXMgYXZhaWxhYmxlLgotICAgICAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCi0gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uOjpSZWFkT25seSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbGV0IG11dCBhbGxfbWVzc2FnZXMgPSB2ZWMhW107CisgICAgICAgIGlmIGxldCBPayhzeXN0ZW1fbWVzc2FnZXMpID0gc3lzdGVtX21lc3NhZ2VzIHsKKyAgICAgICAgICAgIGFsbF9tZXNzYWdlcy5leHRlbmRfZnJvbV9zbGljZSgmc3lzdGVtX21lc3NhZ2VzKTsKKyAgICAgICAgfQorICAgICAgICBpZiBsZXQgT2sobWFpbmxpbmVfbWVzc2FnZXMpID0gbWFpbmxpbmVfbWVzc2FnZXMgeworICAgICAgICAgICAgYWxsX21lc3NhZ2VzLmV4dGVuZF9mcm9tX3NsaWNlKCZtYWlubGluZV9tZXNzYWdlcyk7CiAgICAgICAgIH0KIAotICAgICAgICBPayhyZXN1bHQpCisgICAgICAgIGFsbF9tZXNzYWdlcworICAgICAgICAgICAgLmludG9faXRlcigpCisgICAgICAgICAgICAubWFwKHxxdWVyeV9tZXNzYWdlfCBjb252ZXJ0KHF1ZXJ5X21lc3NhZ2UuY2xvbmUoKSwgJmNvbnRhaW5lcnMpKQorICAgICAgICAgICAgLmNvbGxlY3QoKQogICAgIH0KIAogICAgIGZuIG92ZXJyaWRlX2ZsYWcoX25hbWVzcGFjZTogJnN0ciwgX3F1YWxpZmllZF9uYW1lOiAmc3RyLCBfdmFsdWU6ICZzdHIpIC0+IFJlc3VsdDwoKT4gewpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzCmluZGV4IDkwZDg1OTkuLmM1YWM4ZmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9sb2FkX3Byb3Rvcy5ycworKysgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbG9hZF9wcm90b3MucnMKQEAgLTUxLDcgKzUxLDEwIEBACiAKICAgICBsZXQgcGF0aHMgPSBhY29uZmlnX2RldmljZV9wYXRoczo6cGFyc2VkX2ZsYWdzX3Byb3RvX3BhdGhzKCk/OwogICAgIGZvciBwYXRoIGluIHBhdGhzIHsKLSAgICAgICAgbGV0IGJ5dGVzID0gZnM6OnJlYWQocGF0aC5jbG9uZSgpKT87CisgICAgICAgIGxldCBPayhieXRlcykgPSBmczo6cmVhZCgmcGF0aCkgZWxzZSB7CisgICAgICAgICAgICBlcHJpbnRsbiEoIndhcm5pbmc6IGZhaWxlZCB0byByZWFkIHs6P30iLCBwYXRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9OwogICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzOiBQcm90b1BhcnNlZEZsYWdzID0gcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoJmJ5dGVzKT87CiAgICAgICAgIGZvciBmbGFnIGluIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZyB7CiAgICAgICAgICAgICAvLyBUT0RPKGIvMzM0OTU0NzQ4KTogZW5mb3JjZSBvbmUtY29udGFpbmVyLXBlci1mbGFnIGludmFyaWFudC4KQEAgLTYwLDMgKzYzLDEwIEBACiAgICAgfQogICAgIE9rKHJlc3VsdCkKIH0KKworcHViKGNyYXRlKSBmbiBsaXN0X2NvbnRhaW5lcnMoKSAtPiBSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICBPayhhY29uZmlnX2RldmljZV9wYXRoczo6cGFyc2VkX2ZsYWdzX3Byb3RvX3BhdGhzKCk/CisgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAubWFwKHxwfCBpbmZlcl9jb250YWluZXIoJnApKQorICAgICAgICAuY29sbGVjdCgpKQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbWFpbi5ycwppbmRleCA4MTBmMmUzLi44MTczYmMyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbWFpbi5ycworKysgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbWFpbi5ycwpAQCAtNTAsNiArNTAsNyBAQAogZW51bSBWYWx1ZVBpY2tlZEZyb20gewogICAgIERlZmF1bHQsCiAgICAgU2VydmVyLAorICAgIExvY2FsLAogfQogCiBpbXBsIHN0ZDo6Zm10OjpEaXNwbGF5IGZvciBWYWx1ZVBpY2tlZEZyb20gewpAQCAtNjAsNiArNjEsNyBAQAogICAgICAgICAgICAgbWF0Y2ggJnNlbGYgewogICAgICAgICAgICAgICAgIFNlbGY6OkRlZmF1bHQgPT4gImRlZmF1bHQiLAogICAgICAgICAgICAgICAgIFNlbGY6OlNlcnZlciA9PiAic2VydmVyIiwKKyAgICAgICAgICAgICAgICBTZWxmOjpMb2NhbCA9PiAibG9jYWwiLAogICAgICAgICAgICAgfQogICAgICAgICApCiAgICAgfQpAQCAtMTE0LDkgKzExNiwxMCBAQAogICAgIH0KIAogICAgIGZuIGRpc3BsYXlfc3RhZ2VkX3ZhbHVlKCZzZWxmKSAtPiBTdHJpbmcgewotICAgICAgICBtYXRjaCBzZWxmLnN0YWdlZF92YWx1ZSB7Ci0gICAgICAgICAgICBTb21lKHYpID0+IGZvcm1hdCEoIigtPnt9KSIsIHYpLAotICAgICAgICAgICAgTm9uZSA9PiAiLSIudG9fc3RyaW5nKCksCisgICAgICAgIG1hdGNoICgmc2VsZi5wZXJtaXNzaW9uLCBzZWxmLnN0YWdlZF92YWx1ZSkgeworICAgICAgICAgICAgKEZsYWdQZXJtaXNzaW9uOjpSZWFkT25seSwgXykgPT4gIi0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgKEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsIE5vbmUpID0+ICItIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIChGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLCBTb21lKHYpKSA9PiBmb3JtYXQhKCIoLT57fSkiLCB2KSwKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE2MiwxMCArMTY1LDYgQEAKIGVudW0gQ29tbWFuZCB7CiAgICAgLy8vIExpc3QgYWxsIGFjb25maWcgZmxhZ3Mgb24gdGhpcyBkZXZpY2UuCiAgICAgTGlzdCB7Ci0gICAgICAgIC8vLyBSZWFkIGZyb20gdGhlIG5ldyBmbGFnIHN0b3JhZ2UuCi0gICAgICAgICNbY2xhcChsb25nKV0KLSAgICAgICAgdXNlX25ld19zdG9yYWdlOiBib29sLAotCiAgICAgICAgIC8vLyBPcHRpb25hbGx5IGZpbHRlciBieSBjb250YWluZXIgbmFtZS4KICAgICAgICAgI1tjbGFwKHNob3J0ID0gJ2MnLCBsb25nID0gImNvbnRhaW5lciIpXQogICAgICAgICBjb250YWluZXI6IE9wdGlvbjxTdHJpbmc+LApAQCAtMTgyLDYgKzE4MSw5IEBACiAgICAgICAgIC8vLyA8cGFja2FnZT4uPGZsYWdfbmFtZT4KICAgICAgICAgcXVhbGlmaWVkX25hbWU6IFN0cmluZywKICAgICB9LAorCisgICAgLy8vIERpc3BsYXkgd2hpY2ggZmxhZyBzdG9yYWdlIGJhY2tzIGFjb25maWcgZmxhZ3MuCisgICAgV2hpY2hCYWNraW5nLAogfQogCiBzdHJ1Y3QgUGFkZGluZ0luZm8gewpAQCAtMjUxLDYgKzI1MywxNCBAQAogICAgICAgICBGbGFnU291cmNlVHlwZTo6RGV2aWNlQ29uZmlnID0+IERldmljZUNvbmZpZ1NvdXJjZTo6bGlzdF9mbGFncygpPywKICAgICAgICAgRmxhZ1NvdXJjZVR5cGU6OkFjb25maWdTdG9yYWdlID0+IEFjb25maWdTdG9yYWdlU291cmNlOjpsaXN0X2ZsYWdzKCk/LAogICAgIH07CisKKyAgICBpZiBsZXQgU29tZShyZWYgYykgPSBjb250YWluZXIgeworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgbG9hZF9wcm90b3M6Omxpc3RfY29udGFpbmVycygpPy5jb250YWlucyhjKSwKKyAgICAgICAgICAgIGZvcm1hdCEoImNvbnRhaW5lciAne30nIG5vdCBmb3VuZCIsICZjKQorICAgICAgICApOworICAgIH0KKwogICAgIGxldCBmbGFncyA9IChGaWx0ZXIgeyBjb250YWluZXIgfSkuYXBwbHkoJmZsYWdzX3VuZmlsdGVyZWQpOwogICAgIGxldCBwYWRkaW5nX2luZm8gPSBQYWRkaW5nSW5mbyB7CiAgICAgICAgIGxvbmdlc3RfZmxhZ19jb2w6IGZsYWdzLml0ZXIoKS5tYXAofGZ8IGYucXVhbGlmaWVkX25hbWUoKS5sZW4oKSkubWF4KCkudW53cmFwX29yKDApLApAQCAtMjgwLDE5ICsyOTAsMzEgQEAKICAgICBPayhyZXN1bHQpCiB9CiAKK2ZuIGRpc3BsYXlfd2hpY2hfYmFja2luZygpIC0+IFN0cmluZyB7CisgICAgaWYgYWNvbmZpZ19mbGFnczo6YXV0b19nZW5lcmF0ZWQ6OmVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkgeworICAgICAgICAiYWNvbmZpZ19zdG9yYWdlIi50b19zdHJpbmcoKQorICAgIH0gZWxzZSB7CisgICAgICAgICJkZXZpY2VfY29uZmlnIi50b19zdHJpbmcoKQorICAgIH0KK30KKwogZm4gbWFpbigpIC0+IFJlc3VsdDwoKT4gewogICAgIGVuc3VyZSEobml4Ojp1bmlzdGQ6OlVpZDo6Y3VycmVudCgpLmlzX3Jvb3QoKSwgIm11c3QgYmUgcm9vdCIpOwogCiAgICAgbGV0IGNsaSA9IENsaTo6cGFyc2UoKTsKICAgICBsZXQgb3V0cHV0ID0gbWF0Y2ggY2xpLmNvbW1hbmQgewotICAgICAgICBDb21tYW5kOjpMaXN0IHsgdXNlX25ld19zdG9yYWdlOiB0cnVlLCBjb250YWluZXIgfSA9PiB7Ci0gICAgICAgICAgICBsaXN0KEZsYWdTb3VyY2VUeXBlOjpBY29uZmlnU3RvcmFnZSwgY29udGFpbmVyKS5tYXAoU29tZSkKLSAgICAgICAgfQotICAgICAgICBDb21tYW5kOjpMaXN0IHsgdXNlX25ld19zdG9yYWdlOiBmYWxzZSwgY29udGFpbmVyIH0gPT4gewotICAgICAgICAgICAgbGlzdChGbGFnU291cmNlVHlwZTo6RGV2aWNlQ29uZmlnLCBjb250YWluZXIpLm1hcChTb21lKQorICAgICAgICBDb21tYW5kOjpMaXN0IHsgY29udGFpbmVyIH0gPT4geworICAgICAgICAgICAgaWYgYWNvbmZpZ19mbGFnczo6YXV0b19nZW5lcmF0ZWQ6OmVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkgeworICAgICAgICAgICAgICAgIGxpc3QoRmxhZ1NvdXJjZVR5cGU6OkFjb25maWdTdG9yYWdlLCBjb250YWluZXIpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGFueWhvdyEoImNvdWxkIG5vdCBsaXN0IGZsYWdzOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAubWFwKFNvbWUpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxpc3QoRmxhZ1NvdXJjZVR5cGU6OkRldmljZUNvbmZpZywgY29udGFpbmVyKS5tYXAoU29tZSkKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBDb21tYW5kOjpFbmFibGUgeyBxdWFsaWZpZWRfbmFtZSB9ID0+IHNldF9mbGFnKCZxdWFsaWZpZWRfbmFtZSwgInRydWUiKS5tYXAofF98IE5vbmUpLAogICAgICAgICBDb21tYW5kOjpEaXNhYmxlIHsgcXVhbGlmaWVkX25hbWUgfSA9PiBzZXRfZmxhZygmcXVhbGlmaWVkX25hbWUsICJmYWxzZSIpLm1hcCh8X3wgTm9uZSksCisgICAgICAgIENvbW1hbmQ6OldoaWNoQmFja2luZyA9PiBPayhTb21lKGRpc3BsYXlfd2hpY2hfYmFja2luZygpKSksCiAgICAgfTsKICAgICBtYXRjaCBvdXRwdXQgewogICAgICAgICBPayhTb21lKHRleHQpKSA9PiBwcmludGxuISgie3RleHR9IiksCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icAppbmRleCA0NTY2YmY5Li4xYzViN2M1IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL0FuZHJvaWQuYnAKQEAgLTEzLDEwICsxMyw0MyBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGphdmFfbGlicmFyeSB7Ci0JbmFtZTogImZha2VfZGV2aWNlX2NvbmZpZyIsCi0Jc3JjczogWyJzcmMvKiovKi5qYXZhIl0sCi0Jc2RrX3ZlcnNpb246ICJub25lIiwKLQlzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKLQlob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBuYW1lOiAiZmFrZV9kZXZpY2VfY29uZmlnIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAibm9uZSIsCisgICAgc3lzdGVtX21vZHVsZXM6ICJjb3JlLWFsbC1zeXN0ZW0tbW9kdWxlcyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgaXNfc3R1YnNfbW9kdWxlOiB0cnVlLAogfQogCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJzdHJpY3RfbW9kZV9zdHViIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGlzX3N0dWJzX21vZHVsZTogdHJ1ZSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3N0dWIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9hbmRyb2lkL29zL2ZsYWdnaW5nLyoqLyouamF2YSIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogImNvcmVfY3VycmVudCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgaXNfc3R1YnNfbW9kdWxlOiB0cnVlLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2Vfc3R1Yl9ub25lIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJub25lIiwKKyAgICBzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBpc19zdHVic19tb2R1bGU6IHRydWUsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9CaW5kZXIuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL0JpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjMxM2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9CaW5kZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zOworCitwdWJsaWMgY2xhc3MgQmluZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgY2xlYXJDYWxsaW5nSWRlbnRpdHkoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkobG9uZyB0b2tlbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvQnVpbGQuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL0J1aWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjNzJmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL0J1aWxkLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vczsKKworcHVibGljIGNsYXNzIEJ1aWxkIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZFUlNJT04geworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTREtfSU5UID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNjI1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zOworCitwdWJsaWMgY2xhc3MgU3RyaWN0TW9kZSB7CisgICAgcHVibGljIHN0YXRpYyBUaHJlYWRQb2xpY3kgYWxsb3dUaHJlYWREaXNrUmVhZHMoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkUG9saWN5KGZpbmFsIFRocmVhZFBvbGljeSBwb2xpY3kpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGhyZWFkUG9saWN5IHt9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9BY29uZmlnUGFja2FnZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvQWNvbmZpZ1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FjNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvQWNvbmZpZ1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOworCisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIEFjb25maWdQYWNrYWdlIHsKKyAgICBwdWJsaWMgc3RhdGljIEFjb25maWdQYWNrYWdlIGxvYWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKFN0cmluZyBmbGFnTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg0MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3MuZmxhZ2dpbmc7CisKKy8qCisgKiBUaGlzIGNsYXNzIGFsbG93cyBnZW5lcmF0ZWQgYWNvbmZpZyBjb2RlIHRvIGNvbXBpbGUgaW5kZXBlbmRlbnRseSBvZiB0aGUgZnJhbWV3b3JrLgorICovCitwdWJsaWMgY2xhc3MgQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCB7CisKKyAgICBwdWJsaWMgc3RhdGljIEFjb25maWdQYWNrYWdlSW50ZXJuYWwgbG9hZCgKKyAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgbG9uZyBwYWNrYWdlRmluZ2VycHJpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3OWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGdlbmVyYXRlZCBhY29uZmlnIGNvZGUgdG8gY29tcGlsZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBmcmFtZXdvcmsuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUExBVEZPUk1fUEFDS0FHRV9NQVBfRklMRVMgPQorICAgICAgICAgICAgU2V0Lm9mKCJzeXN0ZW0ucGFja2FnZS5tYXAiLCAidmVuZG9yLnBhY2thZ2UubWFwIiwgInByb2R1Y3QucGFja2FnZS5tYXAiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgUGxhdGZvcm1BY29uZmlnUGFja2FnZSBsb2FkKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4M2IyNTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOworCisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCB7CisKKyAgICBwdWJsaWMgc3RhdGljIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBsb2FkKAorICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIHBhY2thZ2VOYW1lLCBsb25nIHBhY2thZ2VGaW5nZXJwcmludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3V0aWwvTG9nLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC91dGlsL0xvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZGU2ODAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC91dGlsL0xvZy5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitwdWJsaWMgZmluYWwgY2xhc3MgTG9nIHsKKyAgICBwdWJsaWMgc3RhdGljIGludCBpKFN0cmluZyB0YWcsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgdyhTdHJpbmcgdGFnLCBTdHJpbmcgbXNnKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGUoU3RyaW5nIHRhZywgU3RyaW5nIG1zZykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBlKFN0cmluZyB0YWcsIFN0cmluZyBtc2csIFRocm93YWJsZSB0cikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weSBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5CmluZGV4IDhlZTU5OWEuLmQ1NGM0MTIgMTAwNzU1Ci0tLSBhL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5CisrKyBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5CkBAIC0zNCw2ICszNCw3IEBACiBQTEFDRUhPTERFUl9QQUNLQUdFID0gJ3tQQUNLQUdFfScKIFBMQUNFSE9MREVSX1JVTk5FUiA9ICd7UlVOTkVSfScKIFBMQUNFSE9MREVSX1RFU1RfVFlQRSA9ICd7VEVTVF9UWVBFfScKK1BMQUNFSE9MREVSX0VYVFJBX1RFU1RfUlVOTkVSX0NPTkZJR1MgPSAne0VYVFJBX1RFU1RfUlVOTkVSX0NPTkZJR1N9JwogCiAKIGRlZiBtYWluKGFyZ3YpOgpAQCAtNTksNiArNjAsNyBAQAogICAgICAgImluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZSIsCiAgICAgICBoZWxwPSJQYXRoIHRvIHRoZSBpbnN0cnVtZW50YXRpb24gdGVzdCBjb25maWcgdGVtcGxhdGUuIikKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1leHRyYS1jb25maWdzIiwgZGVmYXVsdD0iIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1leHRyYS10ZXN0LXJ1bm5lci1jb25maWdzIiwgZGVmYXVsdD0iIikKICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCiAKICAgdGFyZ2V0X2NvbmZpZyA9IGFyZ3MudGFyZ2V0X2NvbmZpZwpAQCAtNjYsNiArNjgsNyBAQAogICBlbXB0eV9jb25maWcgPSBhcmdzLmVtcHR5X2NvbmZpZwogICBpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUgPSBhcmdzLmluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZQogICBleHRyYV9jb25maWdzID0gJ1xuJy5qb2luKGFyZ3MuZXh0cmFfY29uZmlncy5zcGxpdCgnXFxuJykpCisgIGV4dHJhX3Rlc3RfcnVubmVyX2NvbmZpZ3MgPSAnXG4nLmpvaW4oYXJncy5leHRyYV90ZXN0X3J1bm5lcl9jb25maWdzLnNwbGl0KCdcXG4nKSkKIAogICBtb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2NvbmZpZykpWzBdCiAKQEAgLTEzMSw2ICsxMzQsNyBAQAogICAgIGNvbmZpZyA9IGNvbmZpZy5yZXBsYWNlKFBMQUNFSE9MREVSX1BBQ0tBR0UsIHBhY2thZ2UpCiAgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfVEVTVF9UWVBFLCB0ZXN0X3R5cGUpCiAgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfRVhUUkFfQ09ORklHUywgZXh0cmFfY29uZmlncykKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9FWFRSQV9URVNUX1JVTk5FUl9DT05GSUdTLCBleHRyYV90ZXN0X3J1bm5lcl9jb25maWdzKQogICAgIGNvbmZpZyA9IGNvbmZpZy5yZXBsYWNlKFBMQUNFSE9MREVSX1JVTk5FUiwgcnVubmVyKQogICAgIHdpdGggb3Blbih0YXJnZXRfY29uZmlnLCAndycpIGFzIGNvbmZpZ19maWxlOgogICAgICAgY29uZmlnX2ZpbGUud3JpdGUoY29uZmlnKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2tfZWxmX2ZpbGUucHkgYi90b29scy9jaGVja19lbGZfZmlsZS5weQppbmRleCAxZmQ3OTUwLi4wNjQwMDQxIDEwMDc1NQotLS0gYS90b29scy9jaGVja19lbGZfZmlsZS5weQorKysgYi90b29scy9jaGVja19lbGZfZmlsZS5weQpAQCAtNDIsOCArNDIsOSBAQAogX0VNX1g4Nl82NCA9IDYyCiBfRU1fQUFSQ0g2NCA9IDE4MwogCi1fS05PV05fTUFDSElORVMgPSB7X0VNXzM4NiwgX0VNX0FSTSwgX0VNX1g4Nl82NCwgX0VNX0FBUkNINjR9Ci0KK18zMl9CSVRfTUFDSElORVMgPSB7X0VNXzM4NiwgX0VNX0FSTX0KK182NF9CSVRfTUFDSElORVMgPSB7X0VNX1g4Nl82NCwgX0VNX0FBUkNINjR9CitfS05PV05fTUFDSElORVMgPSBfMzJfQklUX01BQ0hJTkVTIHwgXzY0X0JJVF9NQUNISU5FUwogCiAjIEVMRiBoZWFkZXIgc3RydWN0CiBfRUxGX0hFQURFUl9TVFJVQ1QgPSAoCkBAIC00ODMsNiArNDg0LDExIEBACiAgICAgICBzeXMuZXhpdCgyKQogCiAgIGRlZiBjaGVja19tYXhfcGFnZV9zaXplKHNlbGYsIG1heF9wYWdlX3NpemUpOgorICAgIGlmIHNlbGYuX2ZpbGVfdW5kZXJfdGVzdC5oZWFkZXIuZV9tYWNoaW5lIGluIF8zMl9CSVRfTUFDSElORVM6CisgICAgICAjIFNraXAgdGVzdCBvbiAzMi1iaXQgbWFjaGluZXMuIDE2IEtCIHBhZ2VzIGlzIGFuIGFybTY0IGZlYXR1cmUKKyAgICAgICMgYW5kIG5vIDMyLWJpdCBzeXN0ZW1zIGluIEFuZHJvaWQgdXNlIGl0LgorICAgICAgcmV0dXJuCisKICAgICBmb3IgYWxpZ25tZW50IGluIHNlbGYuX2ZpbGVfdW5kZXJfdGVzdC5hbGlnbm1lbnRzOgogICAgICAgaWYgYWxpZ25tZW50ICUgbWF4X3BhZ2Vfc2l6ZSAhPSAwOgogICAgICAgICBzZWxmLl9lcnJvcihmJ0xvYWQgc2VnbWVudCBoYXMgYWxpZ25tZW50IHthbGlnbm1lbnR9IGJ1dCAnCmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2dvLndvcmsgYi90b29scy9jb21wbGlhbmNlL2dvLndvcmsKaW5kZXggYTI0ZDJlYS4uNTA2ZTYxOSAxMDA2NDQKLS0tIGEvdG9vbHMvY29tcGxpYW5jZS9nby53b3JrCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvZ28ud29yawpAQCAtMSw0ICsxLDQgQEAKLWdvIDEuMjIKK2dvIDEuMjMKIAogdXNlICgKIAkuCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvQW5kcm9pZC5icCBiL3Rvb2xzL2VkaXRfbW9uaXRvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWM1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDExOCBAQAorLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gU2V0IG9mIGVycm9yIHByb25lIHJ1bGVzIHRvIGVuc3VyZSBjb2RlIHF1YWxpdHkKKy8vIFBhY2thZ2VMb2NhdGlvbiBjaGVjayByZXF1aXJlcyB0aGUgYW5kcm9pZENvbXBhdGlibGU9ZmFsc2Ugb3RoZXJ3aXNlIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYWR0ZSIsCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJlZGl0X2V2ZW50X3Byb3RvIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJwcm90by9lZGl0X2V2ZW50LnByb3RvIiwKKyAgICBdLAorICAgIHByb3RvOiB7CisgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCisgICAgfSwKK30KKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImVkaXRfbW9uaXRvcl9saWIiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYWVtb25fbWFuYWdlci5weSIsCisgICAgICAgICJlZGl0X21vbml0b3IucHkiLAorICAgICAgICAidXRpbHMucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYXN1aXRlX2NjX2NsaWVudCIsCisgICAgICAgICJlZGl0X2V2ZW50X3Byb3RvIiwKKyAgICAgICAgIndhdGNoZG9nIiwKKyAgICBdLAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZGFlbW9uX21hbmFnZXJfdGVzdCIsCisgICAgbWFpbjogImRhZW1vbl9tYW5hZ2VyX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYWVtb25fbWFuYWdlcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZWRpdF9tb25pdG9yX3Rlc3QiLAorICAgIG1haW46ICJlZGl0X21vbml0b3JfdGVzdC5weSIsCisgICAgcGtnX3BhdGg6ICJlZGl0X21vbml0b3IiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZWRpdF9tb25pdG9yX3V0aWxzX3Rlc3QiLAorICAgIG1haW46ICJ1dGlsc190ZXN0LnB5IiwKKyAgICBwa2dfcGF0aDogImVkaXRfbW9uaXRvciIsCisgICAgc3JjczogWworICAgICAgICAidXRpbHNfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJlZGl0X21vbml0b3JfbGliIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKK30KKworcHl0aG9uX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImVkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0IiwKKyAgICBtYWluOiAiZWRpdF9tb25pdG9yX2ludGVncmF0aW9uX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5IiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6ZWRpdF9tb25pdG9yIiwKKyAgICBdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJlZGl0X21vbml0b3IiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtYWluLnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgbWFpbjogIm1haW4ucHkiLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL09XTkVSUyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9PV05FUlMKQEAgLTAsMCArMSBAQAoraW5jbHVkZSBwbGF0Zm9ybS90b29scy9hc3VpdGU6L09XTkVSU19BRFRFX1RFQU0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXIucHkgYi90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NjZmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9kYWVtb25fbWFuYWdlci5weQpAQCAtMCwwICsxLDQ2MyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2ltcG9ydCBlcnJubworaW1wb3J0IGZjbnRsCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCisKK2Zyb20gYXRlc3QubWV0cmljcyBpbXBvcnQgY2xlYXJjdXRfY2xpZW50Citmcm9tIGF0ZXN0LnByb3RvIGltcG9ydCBjbGllbnRhbmFseXRpY3NfcGIyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgdXRpbHMKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKK0RFRkFVTFRfUFJPQ0VTU19URVJNSU5BVElPTl9USU1FT1VUX1NFQ09ORFMgPSA1CitERUZBVUxUX01PTklUT1JfSU5URVJWQUxfU0VDT05EUyA9IDUKK0RFRkFVTFRfTUVNT1JZX1VTQUdFX1RIUkVTSE9MRCA9IDAuMDIgICMgMiUgb2YgdG90YWwgbWVtb3J5CitERUZBVUxUX0NQVV9VU0FHRV9USFJFU0hPTEQgPSAyMDAKK0RFRkFVTFRfUkVCT09UX1RJTUVPVVRfU0VDT05EUyA9IDYwICogNjAgKiAyNAorQkxPQ0tfU0lHTl9GSUxFID0gImVkaXRfbW9uaXRvcl9ibG9ja19zaWduIgorIyBFbnVtIG9mIHRoZSBDbGVhcmN1dCBsb2cgc291cmNlIGRlZmluZWQgdW5kZXIKKyMgL2dvb2dsZTMvd2lyZWxlc3MvYW5kcm9pZC9wbGF5L3BsYXlsb2cvcHJvdG8vbG9nX3NvdXJjZV9lbnVtLnByb3RvCitMT0dfU09VUkNFID0gMjUyNAorCisKK2RlZiBkZWZhdWx0X2RhZW1vbl90YXJnZXQoKToKKyAgIiIiUGxhY2UgaG9sZGVyIGZvciB0aGUgZGVmYXVsdCBkYWVtb24gdGFyZ2V0LiIiIgorICBwcmludCgiZGVmYXVsdCBkYWVtb24gdGFyZ2V0IikKKworCitjbGFzcyBEYWVtb25NYW5hZ2VyOgorICAiIiJDbGFzcyB0byBtYW5hZ2UgYW5kIG1vbml0b3IgdGhlIGRhZW1vbiBydW4gYXMgYSBzdWJwcm9jZXNzLiIiIgorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICBiaW5hcnlfcGF0aDogc3RyLAorICAgICAgZGFlbW9uX3RhcmdldDogY2FsbGFibGUgPSBkZWZhdWx0X2RhZW1vbl90YXJnZXQsCisgICAgICBkYWVtb25fYXJnczogdHVwbGUgPSAoKSwKKyAgICAgIGNjbGllbnQ6IGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dCB8IE5vbmUgPSBOb25lLAorICApOgorICAgIHNlbGYuYmluYXJ5X3BhdGggPSBiaW5hcnlfcGF0aAorICAgIHNlbGYuZGFlbW9uX3RhcmdldCA9IGRhZW1vbl90YXJnZXQKKyAgICBzZWxmLmRhZW1vbl9hcmdzID0gZGFlbW9uX2FyZ3MKKyAgICBzZWxmLmNjbGllbnQgPSBjY2xpZW50IG9yIGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dChMT0dfU09VUkNFKQorCisgICAgc2VsZi51c2VyX25hbWUgPSBnZXRwYXNzLmdldHVzZXIoKQorICAgIHNlbGYuaG9zdF9uYW1lID0gcGxhdGZvcm0ubm9kZSgpCisgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IG9zLmVudmlyb24uZ2V0KCJBTkRST0lEX0JVSUxEX1RPUCIsICIiKQorICAgIHNlbGYucGlkID0gb3MuZ2V0cGlkKCkKKyAgICBzZWxmLmRhZW1vbl9wcm9jZXNzID0gTm9uZQorCisgICAgc2VsZi5tYXhfbWVtb3J5X3VzYWdlID0gMAorICAgIHNlbGYubWF4X2NwdV91c2FnZSA9IDAKKyAgICBzZWxmLnRvdGFsX21lbW9yeV9zaXplID0gb3Muc3lzY29uZigiU0NfUEFHRV9TSVpFIikgKiBvcy5zeXNjb25mKAorICAgICAgICAiU0NfUEhZU19QQUdFUyIKKyAgICApCisKKyAgICBwaWRfZmlsZV9kaXIgPSBwYXRobGliLlBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKS5qb2lucGF0aCgiZWRpdF9tb25pdG9yIikKKyAgICBwaWRfZmlsZV9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorICAgIHNlbGYucGlkX2ZpbGVfcGF0aCA9IHNlbGYuX2dldF9waWRfZmlsZV9wYXRoKHBpZF9maWxlX2RpcikKKyAgICBzZWxmLmJsb2NrX3NpZ24gPSBwYXRobGliLlBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKS5qb2lucGF0aCgKKyAgICAgICAgQkxPQ0tfU0lHTl9GSUxFCisgICAgKQorCisgIGRlZiBzdGFydChzZWxmKToKKyAgICAiIiJXcml0ZXMgdGhlIHBpZGZpbGUgYW5kIHN0YXJ0cyB0aGUgZGFlbW9uIHByb2Nlcy4iIiIKKyAgICBpZiBub3QgdXRpbHMuaXNfZmVhdHVyZV9lbmFibGVkKAorICAgICAgICAiZWRpdF9tb25pdG9yIiwKKyAgICAgICAgc2VsZi51c2VyX25hbWUsCisgICAgICAgICJFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1IiLAorICAgICAgICAxMDAsCisgICAgKToKKyAgICAgIGxvZ2dpbmcud2FybmluZygiRWRpdCBtb25pdG9yIGlzIGRpc2FibGVkLCBleGl0aW5nLi4uIikKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5ibG9ja19zaWduLmV4aXN0cygpOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJCbG9jayBzaWduIGZvdW5kLCBleGl0aW5nLi4uIikKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5iaW5hcnlfcGF0aC5zdGFydHN3aXRoKCIvZ29vZ2xlL2NvZy8iKToKKyAgICAgIGxvZ2dpbmcud2FybmluZygiRWRpdCBtb25pdG9yIGZvciBjb2cgaXMgbm90IHN1cHBvcnRlZCwgZXhpdGluZy4uLiIpCisgICAgICByZXR1cm4KKworICAgIHNldHVwX2xvY2tfZmlsZSA9IHBhdGhsaWIuUGF0aCh0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkpLmpvaW5wYXRoKAorICAgICAgICBzZWxmLnBpZF9maWxlX3BhdGgubmFtZSArICIuc2V0dXAiCisgICAgKQorICAgIGxvZ2dpbmcuaW5mbygic2V0dXAgbG9jayBmaWxlOiAlcyIsIHNldHVwX2xvY2tfZmlsZSkKKyAgICB3aXRoIG9wZW4oc2V0dXBfbG9ja19maWxlLCAidyIpIGFzIGY6CisgICAgICB0cnk6CisgICAgICAgICMgQWNxdWlyZSBhbiBleGNsdXNpdmUgbG9jaworICAgICAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKyAgICAgICAgc2VsZi5fc3RvcF9hbnlfZXhpc3RpbmdfaW5zdGFuY2UoKQorICAgICAgICBzZWxmLl93cml0ZV9waWRfdG9fcGlkZmlsZSgpCisgICAgICAgIHNlbGYuX3N0YXJ0X2RhZW1vbl9wcm9jZXNzKCkKKyAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShlLCBJT0Vycm9yKSBhbmQgZS5lcnJubyA9PSBlcnJuby5FQUdBSU4KKyAgICAgICAgKTogICMgRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGZpbGUgbG9jay4KKyAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIkFub3RoZXIgZWRpdCBtb25pdG9yIGlzIHN0YXJ0aW5nLCBleGl0aW5uZy4uLiIpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBzdGFydCBkYWVtb24gbWFuYWdlciB3aXRoIGVycm9yICVzIiwgZSkKKyAgICAgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICAgICAgICkKKyAgICAgICAgICByYWlzZSBlCisgICAgICBmaW5hbGx5OgorICAgICAgICAjIFJlbGVhc2UgdGhlIGxvY2sKKyAgICAgICAgZmNudGwuZmxvY2soZiwgZmNudGwuTE9DS19VTikKKworICBkZWYgbW9uaXRvcl9kYWVtb24oCisgICAgICBzZWxmLAorICAgICAgaW50ZXJ2YWw6IGludCA9IERFRkFVTFRfTU9OSVRPUl9JTlRFUlZBTF9TRUNPTkRTLAorICAgICAgbWVtb3J5X3RocmVzaG9sZDogZmxvYXQgPSBERUZBVUxUX01FTU9SWV9VU0FHRV9USFJFU0hPTEQsCisgICAgICBjcHVfdGhyZXNob2xkOiBmbG9hdCA9IERFRkFVTFRfQ1BVX1VTQUdFX1RIUkVTSE9MRCwKKyAgICAgIHJlYm9vdF90aW1lb3V0OiBpbnQgPSBERUZBVUxUX1JFQk9PVF9USU1FT1VUX1NFQ09ORFMsCisgICk6CisgICAgIiIiTW9uaXRzIHRoZSBkYWVtb24gcHJvY2VzcyBzdGF0dXMuCisKKyAgICBQZXJpb2RpY2FsbHkgY2hlY2sgdGhlIENQVS9NZW1vcnkgdXNhZ2Ugb2YgdGhlIGRhZW1vbiBwcm9jZXNzIGFzIGxvbmcgYXMgdGhlCisgICAgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nIGFuZCBraWxsIHRoZSBwcm9jZXNzIGlmIHRoZSByZXNvdXJjZSB1c2FnZSBpcyBhYm92ZQorICAgIGdpdmVuIHRocmVzaG9sZHMuCisgICAgIiIiCisgICAgaWYgbm90IHNlbGYuZGFlbW9uX3Byb2Nlc3M6CisgICAgICByZXR1cm4KKworICAgIGxvZ2dpbmcuaW5mbygic3RhcnQgbW9uaXRvcmluZyBkYWVtb24gcHJvY2VzcyAlZC4iLCBzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCkKKyAgICByZWJvb3RfdGltZSA9IHRpbWUudGltZSgpICsgcmVib290X3RpbWVvdXQKKyAgICB3aGlsZSBzZWxmLmRhZW1vbl9wcm9jZXNzLmlzX2FsaXZlKCk6CisgICAgICBpZiB0aW1lLnRpbWUoKSA+IHJlYm9vdF90aW1lOgorICAgICAgICBzZWxmLnJlYm9vdCgpCisgICAgICB0cnk6CisgICAgICAgIG1lbW9yeV91c2FnZSA9IHNlbGYuX2dldF9wcm9jZXNzX21lbW9yeV9wZXJjZW50KHNlbGYuZGFlbW9uX3Byb2Nlc3MucGlkKQorICAgICAgICBzZWxmLm1heF9tZW1vcnlfdXNhZ2UgPSBtYXgoc2VsZi5tYXhfbWVtb3J5X3VzYWdlLCBtZW1vcnlfdXNhZ2UpCisKKyAgICAgICAgY3B1X3VzYWdlID0gc2VsZi5fZ2V0X3Byb2Nlc3NfY3B1X3BlcmNlbnQoc2VsZi5kYWVtb25fcHJvY2Vzcy5waWQpCisgICAgICAgIHNlbGYubWF4X2NwdV91c2FnZSA9IG1heChzZWxmLm1heF9jcHVfdXNhZ2UsIGNwdV91c2FnZSkKKworICAgICAgICB0aW1lLnNsZWVwKGludGVydmFsKQorICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAjIExvZ2dpbmcgdGhlIGVycm9yIGFuZCBjb250aW51ZS4KKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJGYWlsZWQgdG8gbW9uaXRvciBkYWVtb24gcHJvY2VzcyB3aXRoIGVycm9yOiAlcyIsIGUpCisKKyAgICAgIGlmIHNlbGYubWF4X21lbW9yeV91c2FnZSA+PSBtZW1vcnlfdGhyZXNob2xkOgorICAgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LktJTExFRF9EVUVfVE9fRVhDRUVERURfTUVNT1JZX1VTQUdFCisgICAgICAgICkKKyAgICAgICAgbG9nZ2luZy5lcnJvcigKKyAgICAgICAgICAgICJEYWVtb24gcHJvY2VzcyBpcyBjb25zdW1pbmcgdG9vIG11Y2ggbWVtb3J5LCByZWJvb3RpbmcuLi4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5yZWJvb3QoKQorCisgICAgICBpZiBzZWxmLm1heF9jcHVfdXNhZ2UgPj0gY3B1X3RocmVzaG9sZDoKKyAgICAgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dCgKKyAgICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5LSUxMRURfRFVFX1RPX0VYQ0VFREVEX0NQVV9VU0FHRQorICAgICAgICApCisgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkRhZW1vbiBwcm9jZXNzIGlzIGNvbnN1bWluZyB0b28gbXVjaCBjcHUsIGtpbGxpbmcuLi4iKQorICAgICAgICBzZWxmLl90ZXJtaW5hdGVfcHJvY2VzcyhzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCkKKworICAgIGxvZ2dpbmcuaW5mbygKKyAgICAgICAgIkRhZW1vbiBwcm9jZXNzICVkIHRlcm1pbmF0ZWQuIE1heCBtZW1vcnkgdXNhZ2U6ICVmLCBNYXggY3B1IgorICAgICAgICAiIHVzYWdlOiAlZi4iLAorICAgICAgICBzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCwKKyAgICAgICAgc2VsZi5tYXhfbWVtb3J5X3VzYWdlLAorICAgICAgICBzZWxmLm1heF9jcHVfdXNhZ2UsCisgICAgKQorCisgIGRlZiBzdG9wKHNlbGYpOgorICAgICIiIlN0b3BzIHRoZSBkYWVtb24gcHJvY2VzcyBhbmQgcmVtb3ZlcyB0aGUgcGlkZmlsZS4iIiIKKworICAgIGxvZ2dpbmcuaW5mbygiaW4gZGFlbW9uIG1hbmFnZXIgY2xlYW51cC4iKQorICAgIHRyeToKKyAgICAgIGlmIHNlbGYuZGFlbW9uX3Byb2Nlc3M6CisgICAgICAgICMgVGhlIGRhZW1vbiBwcm9jZXNzIG1pZ2h0IGFscmVhZHkgaW4gdGVybWluYXRpb24gcHJvY2VzcywKKyAgICAgICAgIyB3YWl0IHNvbWUgdGltZSBiZWZvcmUga2lsbCBpdCBleHBsaWNpdGx5LgorICAgICAgICBzZWxmLl93YWl0X2Zvcl9wcm9jZXNzX3Rlcm1pbmF0ZShzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCwgMSkKKyAgICAgICAgaWYgc2VsZi5kYWVtb25fcHJvY2Vzcy5pc19hbGl2ZSgpOgorICAgICAgICAgIHNlbGYuX3Rlcm1pbmF0ZV9wcm9jZXNzKHNlbGYuZGFlbW9uX3Byb2Nlc3MucGlkKQorICAgICAgc2VsZi5fcmVtb3ZlX3BpZGZpbGUoc2VsZi5waWQpCisgICAgICBsb2dnaW5nLmluZm8oIlN1Y2Nlc3NmdWxseSBzdG9wcGVkIGRhZW1vbiBtYW5hZ2VyLiIpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBzdG9wIGRhZW1vbiBtYW5hZ2VyIHdpdGggZXJyb3IgJXMiLCBlKQorICAgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dCgKKyAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUT1BfRURJVF9NT05JVE9SCisgICAgICApCisgICAgICBzeXMuZXhpdCgxKQorICAgIGZpbmFsbHk6CisgICAgICBzZWxmLmNjbGllbnQuZmx1c2hfZXZlbnRzKCkKKworICBkZWYgcmVib290KHNlbGYpOgorICAgICIiIlJlYm9vdHMgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKworICAgIFN0b3BzIHRoZSBjdXJyZW50IGRhZW1vbiBtYW5hZ2VyIGFuZCByZWJvb3RzIHRoZSBlbnRpcmUgcHJvY2VzcyBiYXNlZCBvbgorICAgIHRoZSBiaW5hcnkgZmlsZS4gRXhpdHMgZGlyZWN0bHkgSWYgdGhlIGJpbmFyeSBmaWxlIG5vIGxvbmdlciBleGlzdHMuCisgICAgIiIiCisgICAgbG9nZ2luZy5pbmZvKCJSZWJvb3RpbmcgcHJvY2VzcyBiYXNlZCBvbiBiaW5hcnkgJXMuIiwgc2VsZi5iaW5hcnlfcGF0aCkKKworICAgICMgU3RvcCB0aGUgY3VycmVudCBkYWVtb24gbWFuYWdlciBmaXJzdC4KKyAgICBzZWxmLnN0b3AoKQorCisgICAgIyBJZiB0aGUgYmluYXJ5IG5vIGxvbmdlciBleGlzdHMsIGV4aXQgZGlyZWN0bHkuCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYmluYXJ5X3BhdGgpOgorICAgICAgbG9nZ2luZy5pbmZvKCJiaW5hcnkgJXMgbm8gbG9uZ2VyIGV4aXN0cywgZXhpdGluZy4iLCBzZWxmLmJpbmFyeV9wYXRoKQorICAgICAgc3lzLmV4aXQoMCkKKworICAgIHRyeToKKyAgICAgIG9zLmV4ZWN2KHNlbGYuYmluYXJ5X3BhdGgsIHN5cy5hcmd2KQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYm9vdCBwcm9jZXNzIHdpdGggZXJyb3I6ICVzLiIsIGUpCisgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5GQUlMRURfVE9fUkVCT09UX0VESVRfTU9OSVRPUgorICAgICAgKQorICAgICAgc3lzLmV4aXQoMSkgICMgSW5kaWNhdGUgYW4gZXJyb3Igb2NjdXJyZWQKKworICBkZWYgY2xlYW51cChzZWxmKToKKyAgICAiIiJXaXBlcyBvdXQgYWxsIGVkaXQgbW9uaXRvciBpbnN0YW5jZXMgaW4gdGhlIHN5c3RlbS4KKworICAgIFN0b3BzIGFsbCB0aGUgZXhpc3RpbmcgZWRpdCBtb25pdG9yIGluc3RhbmNlcyBhbmQgcGxhY2UgYSBibG9jayBzaWduCisgICAgdG8gcHJldmVudCBhbnkgZWRpdCBtb25pdG9yIHByb2Nlc3MgdG8gc3RhcnQuIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZAorICAgIGluIGVtZXJnZW5jeSBjYXNlIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBlZGl0IG1vbml0b3IKKyAgICB0aGF0IHJlcXVpcmVzIGltbWVkaWF0ZSBjbGVhbnVwIHRvIHByZXZlbnQgZGFtYW5nZXIgdG8gdGhlIHN5c3RlbS4KKyAgICAiIiIKKyAgICBsb2dnaW5nLmRlYnVnKCJTdGFydCBjbGVhbmluZyB1cCBhbGwgZXhpc3RpbmcgaW5zdGFuY2VzLiIpCisgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dChlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRk9SQ0VfQ0xFQU5VUCkKKworICAgIHRyeToKKyAgICAgICMgRmlyc3QgcGxhY2VzIGEgYmxvY2sgc2lnbiB0byBwcmV2ZW50IGFueSBlZGl0IG1vbml0b3IgcHJvY2VzcyB0byBzdGFydC4KKyAgICAgIHNlbGYuYmxvY2tfc2lnbi50b3VjaCgpCisgICAgZXhjZXB0IChGaWxlTm90Rm91bmRFcnJvciwgUGVybWlzc2lvbkVycm9yLCBPU0Vycm9yKToKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJGYWlsZWQgdG8gcGxhY2UgdGhlIGJsb2NrIHNpZ24iKQorCisgICAgIyBGaW5kcyBhbmQga2lsbHMgYWxsIHRoZSBleGlzdGluZyBpbnN0YW5jZXMgb2YgZWRpdCBtb25pdG9yLgorICAgIGV4aXN0aW5nX2luc3RhbmNlc19waWRzID0gc2VsZi5fZmluZF9hbGxfaW5zdGFuY2VzX3BpZHMoKQorICAgIGZvciBwaWQgaW4gZXhpc3RpbmdfaW5zdGFuY2VzX3BpZHM6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgIkZvdW5kIGV4aXN0aW5nIGVkaXQgbW9uaXRvciBpbnN0YW5jZSB3aXRoIHBpZCAlZCwga2lsbGluZy4uLiIsIHBpZAorICAgICAgKQorICAgICAgdHJ5OgorICAgICAgICBzZWxmLl90ZXJtaW5hdGVfcHJvY2VzcyhwaWQpCisgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRmFpbGVkIHRvIHRlcm1pbmF0ZSBwcm9jZXNzICVkIiwgcGlkKQorCisgIGRlZiBfc3RvcF9hbnlfZXhpc3RpbmdfaW5zdGFuY2Uoc2VsZik6CisgICAgaWYgbm90IHNlbGYucGlkX2ZpbGVfcGF0aC5leGlzdHMoKToKKyAgICAgIGxvZ2dpbmcuZGVidWcoIk5vIGV4aXN0aW5nIGluc3RhbmNlcy4iKQorICAgICAgcmV0dXJuCisKKyAgICBleF9waWQgPSBzZWxmLl9yZWFkX3BpZF9mcm9tX3BpZGZpbGUoKQorCisgICAgaWYgZXhfcGlkOgorICAgICAgbG9nZ2luZy5pbmZvKCJGb3VuZCBhbm90aGVyIGluc3RhbmNlIHdpdGggcGlkICVkLiIsIGV4X3BpZCkKKyAgICAgIHNlbGYuX3Rlcm1pbmF0ZV9wcm9jZXNzKGV4X3BpZCkKKyAgICAgIHNlbGYuX3JlbW92ZV9waWRmaWxlKGV4X3BpZCkKKworICBkZWYgX3JlYWRfcGlkX2Zyb21fcGlkZmlsZShzZWxmKSAtPiBpbnQgfCBOb25lOgorICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihzZWxmLnBpZF9maWxlX3BhdGgsICJyIikgYXMgZjoKKyAgICAgICAgcmV0dXJuIGludChmLnJlYWQoKS5zdHJpcCgpKQorICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvciBhcyBlOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJwaWRmaWxlICVzIGRvZXMgbm90IGV4aXN0LiIsIHNlbGYucGlkX2ZpbGVfcGF0aCkKKyAgICAgIHJldHVybiBOb25lCisKKyAgZGVmIF93cml0ZV9waWRfdG9fcGlkZmlsZShzZWxmKToKKyAgICAiIiJDcmVhdGVzIGEgcGlkZmlsZSBhbmQgd3JpdGVzIHRoZSBjdXJyZW50IHBpZCB0byB0aGUgZmlsZS4KKworICAgIFJhaXNlIEZpbGVFeGlzdHNFcnJvciBpZiB0aGUgcGlkZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAjIFVzZSB0aGUgJ3gnIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBmb3IgZXhjbHVzaXZlIGNyZWF0aW9uCisgICAgICB3aXRoIG9wZW4oc2VsZi5waWRfZmlsZV9wYXRoLCAieCIpIGFzIGY6CisgICAgICAgIGYud3JpdGUoZiJ7c2VsZi5waWR9IikKKyAgICBleGNlcHQgRmlsZUV4aXN0c0Vycm9yIGFzIGU6CisgICAgICAjIFRoaXMgY291bGQgYmUgY2F1c2VkIGR1ZSB0byByYWNlIGNvbmRpdGlvbiB0aGF0IGEgdXNlciBpcyB0cnlpbmcKKyAgICAgICMgdG8gc3RhcnQgdHdvIGVkaXQgbW9uaXRvcnMgYXQgdGhlIHNhbWUgdGltZS4gT3IgYmVjYXVzZSB0aGVyZSBpcworICAgICAgIyBhbHJlYWR5IGFuIGV4aXN0aW5nIGVkaXQgbW9uaXRvciBydW5uaW5nIGFuZCB3ZSBjYW4gbm90IGtpbGwgaXQKKyAgICAgICMgZm9yIHNvbWUgcmVhc29uLgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oInBpZGZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIiwgc2VsZi5waWRfZmlsZV9wYXRoKQorICAgICAgcmFpc2UgZQorCisgIGRlZiBfc3RhcnRfZGFlbW9uX3Byb2Nlc3Moc2VsZik6CisgICAgIiIiU3RhcnRzIGEgc3VicHJvY2VzcyB0byBydW4gdGhlIGRhZW1vbi4iIiIKKyAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MoCisgICAgICAgIHRhcmdldD1zZWxmLmRhZW1vbl90YXJnZXQsIGFyZ3M9c2VsZi5kYWVtb25fYXJncworICAgICkKKyAgICBwLmRhZW1vbiA9IFRydWUKKyAgICBwLnN0YXJ0KCkKKworICAgIGxvZ2dpbmcuaW5mbygiU3RhcnQgc3VicHJvY2VzcyB3aXRoIFBJRCAlZCIsIHAucGlkKQorICAgIHNlbGYuZGFlbW9uX3Byb2Nlc3MgPSBwCisKKyAgZGVmIF90ZXJtaW5hdGVfcHJvY2VzcygKKyAgICAgIHNlbGYsIHBpZDogaW50LCB0aW1lb3V0OiBpbnQgPSBERUZBVUxUX1BST0NFU1NfVEVSTUlOQVRJT05fVElNRU9VVF9TRUNPTkRTCisgICk6CisgICAgIiIiVGVybWluYXRlcyBhIHByb2Nlc3Mgd2l0aCBnaXZlbiBwaWQuCisKKyAgICBJdCBmaXJzdCBzZW5kcyBhIFNJR1RFUk0gdG8gdGhlIHByb2Nlc3MgdG8gYWxsb3cgaXQgZm9yIHByb3BlcgorICAgIHRlcm1pbmF0aW9uIHdpdGggYSB0aW1lb3V0LiBJZiB0aGUgcHJvY2VzcyBpcyBub3QgdGVybWluYXRlZCB3aXRoaW4KKyAgICB0aGUgdGltZW91dCwga2lsbHMgaXQgZm9yY2VmdWxseS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR1RFUk0pCisgICAgICBpZiBub3Qgc2VsZi5fd2FpdF9mb3JfcHJvY2Vzc190ZXJtaW5hdGUocGlkLCB0aW1lb3V0KToKKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICAgIlByb2Nlc3MgJWQgbm90IHRlcm1pbmF0ZWQgd2l0aGluIHRpbWVvdXQsIHRyeSBmb3JjZSBraWxsIiwgcGlkCisgICAgICAgICkKKyAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQorICAgIGV4Y2VwdCBQcm9jZXNzTG9va3VwRXJyb3I6CisgICAgICBsb2dnaW5nLmluZm8oIlByb2Nlc3Mgd2l0aCBQSUQgJWQgbm90IGZvdW5kIChhbHJlYWR5IHRlcm1pbmF0ZWQpIiwgcGlkKQorCisgIGRlZiBfd2FpdF9mb3JfcHJvY2Vzc190ZXJtaW5hdGUoc2VsZiwgcGlkOiBpbnQsIHRpbWVvdXQ6IGludCkgLT4gYm9vbDoKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIHdoaWxlIHRpbWUudGltZSgpIDwgc3RhcnRfdGltZSArIHRpbWVvdXQ6CisgICAgICBpZiBub3Qgc2VsZi5faXNfcHJvY2Vzc19hbGl2ZShwaWQpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgdGltZS5zbGVlcCgxKQorCisgICAgbG9nZ2luZy5lcnJvcigiUHJvY2VzcyAlZCBub3QgdGVybWluYXRlZCB3aXRoaW4gJWQgc2Vjb25kcy4iLCBwaWQsIHRpbWVvdXQpCisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9pc19wcm9jZXNzX2FsaXZlKHNlbGYsIHBpZDogaW50KSAtPiBib29sOgorICAgIHRyeToKKyAgICAgIG91dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgIFsicHMiLCAiLXAiLCBzdHIocGlkKSwgIi1vIiwgInN0YXRlPSJdLCB0ZXh0PVRydWUKKyAgICAgICkuc3RyaXAoKQorICAgICAgc3RhdGUgPSBvdXRwdXQuc3BsaXQoKVswXQorICAgICAgcmV0dXJuIHN0YXRlICE9ICJaIiAgIyBDaGVjayBpZiB0aGUgc3RhdGUgaXMgbm90ICdaJyAoem9tYmllKQorICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKKyAgICAgICMgUHJvY2VzcyBub3QgZm91bmQgKGFscmVhZHkgZGVhZCkuCisgICAgICByZXR1cm4gRmFsc2UKKyAgICBleGNlcHQgKEZpbGVOb3RGb3VuZEVycm9yLCBPU0Vycm9yLCBWYWx1ZUVycm9yKSBhcyBlOgorICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICJVbmFibGUgdG8gY2hlY2sgdGhlIHN0YXR1cyBmb3IgcHJvY2VzcyAlZCB3aXRoIGVycm9yOiAlcy4iLCBwaWQsIGUKKyAgICAgICkKKyAgICAgIHJldHVybiBUcnVlCisKKyAgZGVmIF9yZW1vdmVfcGlkZmlsZShzZWxmLCBleHBlY3RlZF9waWQ6IGludCk6CisgICAgcmVjb3JkZWRfcGlkID0gc2VsZi5fcmVhZF9waWRfZnJvbV9waWRmaWxlKCkKKworICAgIGlmIHJlY29yZGVkX3BpZCBpcyBOb25lOgorICAgICAgbG9nZ2luZy5pbmZvKCJwaWQgZmlsZSAlcyBhbHJlYWR5IHJlbW92ZWQuIiwgc2VsZi5waWRfZmlsZV9wYXRoKQorICAgICAgcmV0dXJuCisKKyAgICBpZiByZWNvcmRlZF9waWQgIT0gZXhwZWN0ZWRfcGlkOgorICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICJwaWQgZmlsZSBjb250YWlucyBwaWQgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzLCBleHBlY3RlZCBwaWQ6ICVkLCIKKyAgICAgICAgICAiIGFjdHVhbCBwaWQ6ICVkLiIsCisgICAgICAgICAgZXhwZWN0ZWRfcGlkLAorICAgICAgICAgIHJlY29yZGVkX3BpZCwKKyAgICAgICkKKyAgICAgIHJldHVybgorCisgICAgbG9nZ2luZy5kZWJ1ZygicmVtb3ZpbmcgcGlkZmlsZSB3cml0dGVuIGJ5IHByb2Nlc3MgJXMiLCBleHBlY3RlZF9waWQpCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKHNlbGYucGlkX2ZpbGVfcGF0aCkKKyAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICBsb2dnaW5nLmluZm8oInBpZCBmaWxlICVzIGFscmVhZHkgcmVtb3ZlZC4iLCBzZWxmLnBpZF9maWxlX3BhdGgpCisKKyAgZGVmIF9nZXRfcGlkX2ZpbGVfcGF0aChzZWxmLCBwaWRfZmlsZV9kaXI6IHBhdGhsaWIuUGF0aCkgLT4gcGF0aGxpYi5QYXRoOgorICAgICIiIkdlbmVyYXRlcyB0aGUgcGF0aCB0byBzdG9yZSB0aGUgcGlkZmlsZS4KKworICAgIFRoZSBmaWxlIHBhdGggc2hvdWxkIGhhdmUgdGhlIGZvcm1hdCBvZiAiL3RtcC9lZGl0X21vbml0b3IveHh4eC5sb2NrIgorICAgIHdoZXJlIHh4eHggaXMgYSBoYXNoZWQgdmFsdWUgYmFzZWQgb24gdGhlIGJpbmFyeSBwYXRoIHRoYXQgc3RhcnRzIHRoZQorICAgIHByb2Nlc3MuCisgICAgIiIiCisgICAgaGFzaF9vYmplY3QgPSBoYXNobGliLnNoYTI1NigpCisgICAgaGFzaF9vYmplY3QudXBkYXRlKHNlbGYuYmluYXJ5X3BhdGguZW5jb2RlKCJ1dGYtOCIpKQorICAgIHBpZF9maWxlX3BhdGggPSBwaWRfZmlsZV9kaXIuam9pbnBhdGgoaGFzaF9vYmplY3QuaGV4ZGlnZXN0KCkgKyAiLmxvY2siKQorICAgIGxvZ2dpbmcuaW5mbygicGlkX2ZpbGVfcGF0aDogJXMiLCBwaWRfZmlsZV9wYXRoKQorCisgICAgcmV0dXJuIHBpZF9maWxlX3BhdGgKKworICBkZWYgX2dldF9wcm9jZXNzX21lbW9yeV9wZXJjZW50KHNlbGYsIHBpZDogaW50KSAtPiBmbG9hdDoKKyAgICB3aXRoIG9wZW4oZiIvcHJvYy97cGlkfS9zdGF0IiwgInIiKSBhcyBmOgorICAgICAgc3RhdF9kYXRhID0gZi5yZWFkbGluZSgpLnNwbGl0KCkKKyAgICAgICMgUlNTIGlzIHRoZSAyNHRoIGZpZWxkIGluIC9wcm9jL1twaWRdL3N0YXQKKyAgICAgIHJzc19wYWdlcyA9IGludChzdGF0X2RhdGFbMjNdKQorICAgICAgcHJvY2Vzc19tZW1vcnkgPSByc3NfcGFnZXMgKiA0ICogMTAyNCAgIyBDb252ZXJ0IHRvIGJ5dGVzCisKKyAgICByZXR1cm4gKAorICAgICAgICBwcm9jZXNzX21lbW9yeSAvIHNlbGYudG90YWxfbWVtb3J5X3NpemUKKyAgICAgICAgaWYgc2VsZi50b3RhbF9tZW1vcnlfc2l6ZQorICAgICAgICBlbHNlIDAuMAorICAgICkKKworICBkZWYgX2dldF9wcm9jZXNzX2NwdV9wZXJjZW50KHNlbGYsIHBpZDogaW50LCBpbnRlcnZhbDogaW50ID0gMSkgLT4gZmxvYXQ6CisgICAgdG90YWxfc3RhcnRfdGltZSA9IHNlbGYuX2dldF90b3RhbF9jcHVfdGltZShwaWQpCisgICAgd2l0aCBvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpIGFzIGY6CisgICAgICB1cHRpbWVfc3RhcnQgPSBmbG9hdChmLnJlYWRsaW5lKCkuc3BsaXQoKVswXSkKKworICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCisKKyAgICB0b3RhbF9lbmRfdGltZSA9IHNlbGYuX2dldF90b3RhbF9jcHVfdGltZShwaWQpCisgICAgd2l0aCBvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpIGFzIGY6CisgICAgICB1cHRpbWVfZW5kID0gZmxvYXQoZi5yZWFkbGluZSgpLnNwbGl0KClbMF0pCisKKyAgICByZXR1cm4gKAorICAgICAgICAodG90YWxfZW5kX3RpbWUgLSB0b3RhbF9zdGFydF90aW1lKSAvICh1cHRpbWVfZW5kIC0gdXB0aW1lX3N0YXJ0KSAqIDEwMAorICAgICkKKworICBkZWYgX2dldF90b3RhbF9jcHVfdGltZShzZWxmLCBwaWQ6IGludCkgLT4gZmxvYXQ6CisgICAgd2l0aCBvcGVuKGYiL3Byb2Mve3N0cihwaWQpfS9zdGF0IiwgInIiKSBhcyBmOgorICAgICAgc3RhdHMgPSBmLnJlYWRsaW5lKCkuc3BsaXQoKQorICAgICAgIyB1dGltZSBpcyB0aGUgMTR0aCBmaWVsZCBpbiAvcHJvYy9bcGlkXS9zdGF0IG1lYXN1cmVkIGluIGNsb2NrIHRpY2tzLgorICAgICAgdXRpbWUgPSBpbnQoc3RhdHNbMTNdKQorICAgICAgIyBzdGltZSBpcyB0aGUgMTV0aCBmaWVsZCBpbiAvcHJvYy9bcGlkXS9zdGF0IG1lYXN1cmVkIGluIGNsb2NrIHRpY2tzLgorICAgICAgc3RpbWUgPSBpbnQoc3RhdHNbMTRdKQorICAgICAgcmV0dXJuICh1dGltZSArIHN0aW1lKSAvIG9zLnN5c2NvbmYob3Muc3lzY29uZl9uYW1lc1siU0NfQ0xLX1RDSyJdKQorCisgIGRlZiBfZmluZF9hbGxfaW5zdGFuY2VzX3BpZHMoc2VsZikgLT4gbGlzdFtpbnRdOgorICAgIHBpZHMgPSBbXQorCisgICAgdHJ5OgorICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWyJwcyIsICItZWYiLCAiLS1uby1oZWFkZXJzIl0sIHRleHQ9VHJ1ZSkKKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIHByb2Nlc3NfcGF0aCA9IHBhcnRzWzddCisgICAgICAgIGlmIHBhdGhsaWIuUGF0aChwcm9jZXNzX3BhdGgpLm5hbWUgPT0gImVkaXRfbW9uaXRvciI6CisgICAgICAgICAgcGlkID0gaW50KHBhcnRzWzFdKQorICAgICAgICAgIGlmIHBpZCAhPSBzZWxmLnBpZDogICMgZXhjbHVkZSB0aGUgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICBwaWRzLmFwcGVuZChwaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKAorICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHBpZHMgb2YgZXhpc3RpbmcgZWRpdCBtb25pdG9ycyBmcm9tIHBzIGNvbW1hbmQuIgorICAgICAgKQorCisgICAgcmV0dXJuIHBpZHMKKworICBkZWYgX3NlbmRfZXJyb3JfZXZlbnRfdG9fY2xlYXJjdXQoc2VsZiwgZXJyb3JfdHlwZSk6CisgICAgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50KAorICAgICAgICB1c2VyX25hbWU9c2VsZi51c2VyX25hbWUsCisgICAgICAgIGhvc3RfbmFtZT1zZWxmLmhvc3RfbmFtZSwKKyAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKKyAgICApCisgICAgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvLmVkaXRfbW9uaXRvcl9lcnJvcl9ldmVudC5Db3B5RnJvbSgKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkVkaXRNb25pdG9yRXJyb3JFdmVudChlcnJvcl90eXBlPWVycm9yX3R5cGUpCisgICAgKQorICAgIGxvZ19ldmVudCA9IGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQoCisgICAgICAgIGV2ZW50X3RpbWVfbXM9aW50KHRpbWUudGltZSgpICogMTAwMCksCisgICAgICAgIHNvdXJjZV9leHRlbnNpb249ZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgKQorICAgIHNlbGYuY2NsaWVudC5sb2cobG9nX2V2ZW50KQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL2RhZW1vbl9tYW5hZ2VyX3Rlc3QucHkgYi90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXJfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTI4OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2RhZW1vbl9tYW5hZ2VyX3Rlc3QucHkKQEAgLTAsMCArMSw1MjQgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVW5pdHRlc3RzIGZvciBEYWVtb25NYW5hZ2VyLiIiIgorCitpbXBvcnQgZmNudGwKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZGFlbW9uX21hbmFnZXIKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKKworVEVTVF9CSU5BUllfRklMRSA9ICcvcGF0aC90by90ZXN0X2JpbmFyeScKK1RFU1RfUElEX0ZJTEVfUEFUSCA9ICgKKyAgICAnNTg3MjM5YzJkMTA1MGFmZGY1NDUxMmUyZDc5OWYzYjkyOWY4NmI0MzU3NWViM2M3YjRiYWIxMDVkZDliZDI1ZS5sb2NrJworKQorCisKK2RlZiBzaW1wbGVfZGFlbW9uKG91dHB1dF9maWxlKToKKyAgd2l0aCBvcGVuKG91dHB1dF9maWxlLCAndycpIGFzIGY6CisgICAgZi53cml0ZSgncnVubmluZyBkYWVtb24gdGFyZ2V0JykKKworCitkZWYgbG9uZ19ydW5uaW5nX2RhZW1vbigpOgorICB3aGlsZSBUcnVlOgorICAgIHRpbWUuc2xlZXAoMSkKKworCitkZWYgbWVtb3J5X2NvbnN1bWVfZGFlbW9uX3RhcmdldChzaXplX21iKToKKyAgdHJ5OgorICAgIHNpemVfYnl0ZXMgPSBzaXplX21iICogMTAyNCAqIDEwMjQKKyAgICBkdW1teV9kYXRhID0gYnl0ZWFycmF5KHNpemVfYnl0ZXMpCisgICAgdGltZS5zbGVlcCgxMCkKKyAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgIHByaW50KGYnUHJvY2VzcyBmYWlsZWQgdG8gYWxsb2NhdGUge3NpemVfbWJ9IE1CIG9mIG1lbW9yeS4nKQorCisKK2RlZiBjcHVfY29uc3VtZV9kYWVtb25fdGFyZ2V0KHRhcmdldF91c2FnZV9wZXJjZW50KToKKyAgd2hpbGUgVHJ1ZToKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICB3aGlsZSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUgPCB0YXJnZXRfdXNhZ2VfcGVyY2VudCAvIDEwMDoKKyAgICAgIHBhc3MgICMgQnVzeSBsb29wIHRvIGNvbnN1bWUgQ1BVCisKKyAgICAjIFNsZWVwIHRvIHJlZHVjZSBDUFUgdXNhZ2UKKyAgICB0aW1lLnNsZWVwKDEgLSB0YXJnZXRfdXNhZ2VfcGVyY2VudCAvIDEwMCkKKworCitjbGFzcyBEYWVtb25NYW5hZ2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKKyAgICAjIENvbmZpZ3VyZSB0byBwcmludCBsb2dnaW5nIHRvIHN0ZG91dC4KKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZpbGVuYW1lPU5vbmUsIGxldmVsPWxvZ2dpbmcuREVCVUcpCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCcnKS5hZGRIYW5kbGVyKGNvbnNvbGUpCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHN1cGVyKCkuc2V0VXAoKQorICAgIHNlbGYub3JpZ2luYWxfdGVtcGRpciA9IHRlbXBmaWxlLnRlbXBkaXIKKyAgICBzZWxmLndvcmtpbmdfZGlyID0gdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkKKyAgICAjIFNldHMgdGhlIHRlbXBkaXIgdW5kZXIgdGhlIHdvcmtpbmcgZGlyIHNvIGFueSB0ZW1wIGZpbGVzIGNyZWF0ZWQgZHVyaW5nCisgICAgIyB0ZXN0cyB3aWxsIGJlIGNsZWFuZWQuCisgICAgdGVtcGZpbGUudGVtcGRpciA9IHNlbGYud29ya2luZ19kaXIubmFtZQorICAgIHNlbGYucGF0Y2ggPSBtb2NrLnBhdGNoLmRpY3QoCisgICAgICAgIG9zLmVudmlyb24sIHsnRU5BQkxFX0FORFJPSURfRURJVF9NT05JVE9SJzogJ3RydWUnfQorICAgICkKKyAgICBzZWxmLnBhdGNoLnN0YXJ0KCkKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgIyBDbGVhbnMgdXAgYW55IGNoaWxkIHByb2Nlc3NlcyBsZWZ0IGJ5IHRoZSB0ZXN0cy4KKyAgICBzZWxmLl9jbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcygpCisgICAgc2VsZi53b3JraW5nX2Rpci5jbGVhbnVwKCkKKyAgICAjIFJlc3RvcmVzIHRlbXBkaXIuCisgICAgdGVtcGZpbGUudGVtcGRpciA9IHNlbGYub3JpZ2luYWxfdGVtcGRpcgorICAgIHNlbGYucGF0Y2guc3RvcCgpCisgICAgc3VwZXIoKS50ZWFyRG93bigpCisKKyAgZGVmIHRlc3Rfc3RhcnRfc3VjY2Vzc193aXRoX25vX2V4aXN0aW5nX2luc3RhbmNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3N1Y2Nlc3Nfd2l0aF9leGlzdGluZ19pbnN0YW5jZV9ydW5uaW5nKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgcnVubmluZyBkYWVtb24gc3VicHJvY2VzcworICAgIHAgPSBzZWxmLl9jcmVhdGVfZmFrZV9kZWFtb25fcHJvY2VzcygpCisKKyAgICBzZWxmLmFzc2VydF9ydW5fc2ltcGxlX2RhZW1vbl9zdWNjZXNzKCkKKyAgICBzZWxmLmFzc2VydF9ub19zdWJwcm9jZXNzX3J1bm5pbmcoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3N1Y2Nlc3Nfd2l0aF9leGlzdGluZ19pbnN0YW5jZV9hbHJlYWR5X2RlYWQoc2VsZik6CisgICAgIyBDcmVhdGUgYSBwaWRmaWxlIHdpdGggcGlkIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgICAgcGlkX2ZpbGVfcGF0aF9kaXIgPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2VkaXRfbW9uaXRvcicKKyAgICApCisgICAgcGlkX2ZpbGVfcGF0aF9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorICAgIHdpdGggb3BlbihwaWRfZmlsZV9wYXRoX2Rpci5qb2lucGF0aChURVNUX1BJRF9GSUxFX1BBVEgpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCcxMjM0NTYnKQorCisgICAgc2VsZi5hc3NlcnRfcnVuX3NpbXBsZV9kYWVtb25fc3VjY2VzcygpCisKKyAgZGVmIHRlc3Rfc3RhcnRfc3VjY2Vzc193aXRoX2V4aXN0aW5nX2luc3RhbmNlX2Zyb21fZGlmZmVyZW50X2JpbmFyeShzZWxmKToKKyAgICAjIEZpcnN0IHN0YXJ0IGFuIGluc3RhbmNlIGJhc2VkIG9uICJzb21lX2JpbmFyeV9wYXRoIgorICAgIGV4aXN0aW5nX2RtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgJ3NvbWVfYmluYXJ5X3BhdGgnLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgKQorICAgIGV4aXN0aW5nX2RtLnN0YXJ0KCkKKworICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorICAgIGV4aXN0aW5nX2RtLnN0b3AoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9ibG9ja19zaWduX2V4aXN0cyhzZWxmKToKKyAgICAjIENyZWF0ZXMgdGhlIGJsb2NrIHNpZ24uCisgICAgcGF0aGxpYi5QYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoCisgICAgICAgIGRhZW1vbl9tYW5hZ2VyLkJMT0NLX1NJR05fRklMRQorICAgICkudG91Y2goKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKFRFU1RfQklOQVJZX0ZJTEUpCisgICAgZG0uc3RhcnQoKQorCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBAbW9jay5wYXRjaC5kaWN0KAorICAgICAgb3MuZW52aXJvbiwgeydFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1InOiAnZmFsc2UnfSwgY2xlYXI9VHJ1ZQorICApCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9kaXNhYmxlZChzZWxmKToKKyAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoVEVTVF9CSU5BUllfRklMRSkKKyAgICBkbS5zdGFydCgpCisKKyAgICAjIFZlcmlmeSBubyBkYWVtb24gcHJvY2VzcyBpcyBzdGFydGVkLgorICAgIHNlbGYuYXNzZXJ0SXNOb25lKGRtLmRhZW1vbl9wcm9jZXNzKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9pbl9jb2dfZW52KHNlbGYpOgorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgJy9nb29nbGUvY29nL2Nsb3VkL3VzZXIvd29ya3NwYWNlL2VkaXRfbW9uaXRvcicKKyAgICApCisgICAgZG0uc3RhcnQoKQorCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBkZWYgdGVzdF9zdGFydF9mYWlsZWRfb3RoZXJfaW5zdGFuY2VfaXNfc3RhcnRpbmcoc2VsZik6CisgICAgZiA9IG9wZW4oCisgICAgICAgIHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAgICAgVEVTVF9QSURfRklMRV9QQVRIICsgJy5zZXR1cCcKKyAgICAgICAgKSwKKyAgICAgICAgJ3cnLAorICAgICkKKyAgICAjIEFjcXVpcmUgYW4gZXhjbHVzaXZlIGxvY2sKKyAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcihURVNUX0JJTkFSWV9GSUxFKQorICAgIGRtLnN0YXJ0KCkKKworICAgICMgUmVsZWFzZSB0aGUgbG9jaworICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCisgICAgZi5jbG9zZSgpCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBAbW9jay5wYXRjaCgnb3Mua2lsbCcpCisgIGRlZiB0ZXN0X3N0YXJ0X2ZhaWxlZF90b19raWxsX2V4aXN0aW5nX2luc3RhbmNlKHNlbGYsIG1vY2tfa2lsbCk6CisgICAgbW9ja19raWxsLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisgICAgd2l0aCBvcGVuKHBpZF9maWxlX3BhdGhfZGlyLmpvaW5wYXRoKFRFU1RfUElEX0ZJTEVfUEFUSCksICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoJzEyMzQ1NicpCisKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcik6CisgICAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoVEVTVF9CSU5BUllfRklMRSwgY2NsaWVudD1mYWtlX2NjbGllbnQpCisgICAgICBkbS5zdGFydCgpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICkKKworICBkZWYgdGVzdF9zdGFydF9mYWlsZWRfdG9fd3JpdGVfcGlkZmlsZShzZWxmKToKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisKKyAgICAjIE1ha2VzIHRoZSBkaXJlY3RvcnkgcmVhZC1vbmx5IHNvIHdyaXRlIHBpZGZpbGUgd2lsbCBmYWlsLgorICAgIG9zLmNobW9kKHBpZF9maWxlX3BhdGhfZGlyLCAwbzU1NSkKKworICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQZXJtaXNzaW9uRXJyb3IpOgorICAgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKFRFU1RfQklOQVJZX0ZJTEUsIGNjbGllbnQ9ZmFrZV9jY2xpZW50KQorICAgICAgZG0uc3RhcnQoKQorICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVEFSVF9FRElUX01PTklUT1IKKyAgICApCisKKyAgZGVmIHRlc3Rfc3RhcnRfZmFpbGVkX3RvX3N0YXJ0X2RhZW1vbl9wcm9jZXNzKHNlbGYpOgorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICAgIFRFU1RfQklOQVJZX0ZJTEUsCisgICAgICAgICAgZGFlbW9uX3RhcmdldD0nd3JvbmdfdGFyZ2V0JywKKyAgICAgICAgICBkYWVtb25fYXJncz0oMSksCisgICAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgICApCisgICAgICBkbS5zdGFydCgpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MuZXhlY3YnKQorICBkZWYgdGVzdF9tb25pdG9yX3JlYm9vdF93aXRoX2hpZ2hfbWVtb3J5X3VzYWdlKHNlbGYsIG1vY2tfZXhlY3YpOgorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgYmluYXJ5X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoCisgICAgICAgIGRpcj1zZWxmLndvcmtpbmdfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZQorICAgICkKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgYmluYXJ5X2ZpbGUubmFtZSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1tZW1vcnlfY29uc3VtZV9kYWVtb25fdGFyZ2V0LAorICAgICAgICBkYWVtb25fYXJncz0oMiwpLAorICAgICAgICBjY2xpZW50PWZha2VfY2NsaWVudCwKKyAgICApCisgICAgIyBzZXQgdGhlIGZha2UgdG90YWxfbWVtb3J5X3NpemUKKyAgICBkbS50b3RhbF9tZW1vcnlfc2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0CisgICAgZG0uc3RhcnQoKQorICAgIGRtLm1vbml0b3JfZGFlbW9uKGludGVydmFsPTEpCisKKyAgICBzZWxmLmFzc2VydFRydWUoZG0ubWF4X21lbW9yeV91c2FnZSA+PSAwLjAyKQorICAgIHNlbGYuYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZygpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuS0lMTEVEX0RVRV9UT19FWENFRURFRF9NRU1PUllfVVNBR0UsCisgICAgKQorICAgIG1vY2tfZXhlY3YuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKworICBkZWYgdGVzdF9tb25pdG9yX2RhZW1vbl9zdWJwcm9jZXNzX2tpbGxlZF9oaWdoX2NwdV91c2FnZShzZWxmKToKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1jcHVfY29uc3VtZV9kYWVtb25fdGFyZ2V0LAorICAgICAgICBkYWVtb25fYXJncz0oMjAsKSwKKyAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgKQorICAgIGRtLnN0YXJ0KCkKKyAgICBkbS5tb25pdG9yX2RhZW1vbihpbnRlcnZhbD0xLCBjcHVfdGhyZXNob2xkPTIwKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKGRtLm1heF9jcHVfdXNhZ2UgPj0gMjApCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLl9hc3NlcnRfZXJyb3JfZXZlbnRfbG9nZ2VkKAorICAgICAgICBmYWtlX2NjbGllbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5LSUxMRURfRFVFX1RPX0VYQ0VFREVEX0NQVV9VU0FHRSwKKyAgICApCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MuY2hlY2tfb3V0cHV0JykKKyAgZGVmIHRlc3RfbW9uaXRvcl9kYWVtb25fZmFpbGVkX2RvZXNfbm90X21hdHRlcihzZWxmLCBtb2NrX291dHB1dCk6CisgICAgbW9ja19vdXRwdXQuc2lkZV9lZmZlY3QgPSBPU0Vycm9yKCdVbmtub3duIE9TRXJyb3InKQorICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorCisgIEBtb2NrLnBhdGNoKCdvcy5leGVjdicpCisgIGRlZiB0ZXN0X21vbml0b3JfZGFlbW9uX3JlYm9vdF90cmlnZ2VyZWQoc2VsZiwgbW9ja19leGVjdik6CisgICAgYmluYXJ5X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoCisgICAgICAgIGRpcj1zZWxmLndvcmtpbmdfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZQorICAgICkKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgYmluYXJ5X2ZpbGUubmFtZSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uLAorICAgICkKKyAgICBkbS5zdGFydCgpCisgICAgZG0ubW9uaXRvcl9kYWVtb24ocmVib290X3RpbWVvdXQ9MC41KQorICAgIG1vY2tfZXhlY3YuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKworICBkZWYgdGVzdF9zdG9wX3N1Y2Nlc3Moc2VsZik6CisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBURVNUX0JJTkFSWV9GSUxFLCBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24KKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLnN0b3AoKQorCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRtLnBpZF9maWxlX3BhdGguZXhpc3RzKCkpCisKKyAgQG1vY2sucGF0Y2goJ29zLmtpbGwnKQorICBkZWYgdGVzdF9zdG9wX2ZhaWxlZF90b19raWxsX2RhZW1vbl9wcm9jZXNzKHNlbGYsIG1vY2tfa2lsbCk6CisgICAgbW9ja19raWxsLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uLAorICAgICAgICBjY2xpZW50PWZha2VfY2NsaWVudCwKKyAgICApCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgZG0uc3RhcnQoKQorICAgICAgZG0uc3RvcCgpCisgICAgICBzZWxmLmFzc2VydFRydWUoZG0uZGFlbW9uX3Byb2Nlc3MuaXNfYWxpdmUoKSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkbS5waWRfZmlsZV9wYXRoLmV4aXN0cygpKQorICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVE9QX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MucmVtb3ZlJykKKyAgZGVmIHRlc3Rfc3RvcF9mYWlsZWRfdG9fcmVtb3ZlX3BpZGZpbGUoc2VsZiwgbW9ja19yZW1vdmUpOgorICAgIG1vY2tfcmVtb3ZlLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKworICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBURVNUX0JJTkFSWV9GSUxFLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgICAgIGNjbGllbnQ9ZmFrZV9jY2xpZW50LAorICAgICkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICBkbS5zdGFydCgpCisgICAgICBkbS5zdG9wKCkKKyAgICAgIHNlbGYuYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZygpCisgICAgICBzZWxmLmFzc2VydFRydWUoZG0ucGlkX2ZpbGVfcGF0aC5leGlzdHMoKSkKKworICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVE9QX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MuZXhlY3YnKQorICBkZWYgdGVzdF9yZWJvb3Rfc3VjY2VzcyhzZWxmLCBtb2NrX2V4ZWN2KToKKyAgICBiaW5hcnlfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBiaW5hcnlfZmlsZS5uYW1lLCBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24KKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLnJlYm9vdCgpCisKKyAgICAjIFZlcmlmaWVzIHRoZSBvbGQgcHJvY2VzcyBpcyBzdG9wcGVkCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRtLnBpZF9maWxlX3BhdGguZXhpc3RzKCkpCisKKyAgICBtb2NrX2V4ZWN2LmFzc2VydF9jYWxsZWRfb25jZSgpCisKKyAgQG1vY2sucGF0Y2goJ29zLmV4ZWN2JykKKyAgZGVmIHRlc3RfcmVib290X2JpbmFyeV9ub19sb25nZXJfZXhpc3RzKHNlbGYsIG1vY2tfZXhlY3YpOgorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uCisgICAgKQorICAgIGRtLnN0YXJ0KCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICBkbS5yZWJvb3QoKQorICAgICAgbW9ja19leGVjdi5hc3NlcnRfbm90X2NhbGxlZCgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5jb2RlLCAwKQorCisgIEBtb2NrLnBhdGNoKCdvcy5leGVjdicpCisgIGRlZiB0ZXN0X3JlYm9vdF9mYWlsZWQoc2VsZiwgbW9ja19leGVjdik6CisgICAgbW9ja19leGVjdi5zaWRlX2VmZmVjdCA9IE9TRXJyb3IoJ1Vua25vd24gT1NFcnJvcicpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KCkKKyAgICBiaW5hcnlfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBiaW5hcnlfZmlsZS5uYW1lLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgICAgIGNjbGllbnQ9ZmFrZV9jY2xpZW50LAorICAgICkKKyAgICBkbS5zdGFydCgpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgZG0ucmVib290KCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmNvZGUsIDEpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1JFQk9PVF9FRElUX01PTklUT1IKKyAgICApCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MuY2hlY2tfb3V0cHV0JykKKyAgZGVmIHRlc3RfY2xlYW51cF9zdWNjZXNzKHNlbGYsIG1vY2tfY2hlY2tfb3V0cHV0KToKKyAgICBwID0gc2VsZi5fY3JlYXRlX2Zha2VfZGVhbW9uX3Byb2Nlc3MoKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgbW9ja19jaGVja19vdXRwdXQucmV0dXJuX3ZhbHVlID0gZid1c2VyIHtwLnBpZH0gMSAxIDEgMSAxIGVkaXRfbW9uaXRvciBhcmcnCisKKyAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoCisgICAgICAgIFRFU1RfQklOQVJZX0ZJTEUsCisgICAgICAgIGRhZW1vbl90YXJnZXQ9bG9uZ19ydW5uaW5nX2RhZW1vbiwKKyAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgKQorICAgIGRtLmNsZWFudXAoKQorCisgICAgc2VsZi5hc3NlcnRGYWxzZShwLmlzX2FsaXZlKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKQorICAgICAgICAuam9pbnBhdGgoZGFlbW9uX21hbmFnZXIuQkxPQ0tfU0lHTl9GSUxFKQorICAgICAgICAuZXhpc3RzKCkKKyAgICApCisKKyAgZGVmIGFzc2VydF9ydW5fc2ltcGxlX2RhZW1vbl9zdWNjZXNzKHNlbGYpOgorICAgIGRhbW9uZV9vdXRwdXRfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1zaW1wbGVfZGFlbW9uLAorICAgICAgICBkYWVtb25fYXJncz0oZGFtb25lX291dHB1dF9maWxlLm5hbWUsKSwKKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLm1vbml0b3JfZGFlbW9uKGludGVydmFsPTEpCisKKyAgICAjIFZlcmlmaWVzIHRoZSBleHBlY3RlZCBwaWQgZmlsZSBpcyBjcmVhdGVkLgorICAgIGV4cGVjdGVkX3BpZF9maWxlX3BhdGggPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2VkaXRfbW9uaXRvcicsIFRFU1RfUElEX0ZJTEVfUEFUSAorICAgICkKKyAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWRfcGlkX2ZpbGVfcGF0aC5leGlzdHMoKSkKKworICAgICMgVmVyaWZ5IHRoZSBkYWVtb24gcHJvY2VzcyBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkuCisgICAgd2l0aCBvcGVuKGRhbW9uZV9vdXRwdXRfZmlsZS5uYW1lLCAncicpIGFzIGY6CisgICAgICBjb250ZW50cyA9IGYucmVhZCgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCAncnVubmluZyBkYWVtb24gdGFyZ2V0JykKKworICBkZWYgYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZyhzZWxmKToKKyAgICBjaGlsZF9waWRzID0gc2VsZi5fZ2V0X2NoaWxkX3Byb2Nlc3Nlcyhvcy5nZXRwaWQoKSkKKyAgICBmb3IgY2hpbGRfcGlkIGluIGNoaWxkX3BpZHM6CisgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgIHNlbGYuX2lzX3Byb2Nlc3NfYWxpdmUoY2hpbGRfcGlkKSwgZidwcm9jZXNzIHtjaGlsZF9waWR9IHN0aWxsIGFsaXZlJworICAgICAgKQorCisgIGRlZiBfZ2V0X2NoaWxkX3Byb2Nlc3NlcyhzZWxmLCBwYXJlbnRfcGlkOiBpbnQpIC0+IGxpc3RbaW50XToKKyAgICB0cnk6CisgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICBbJ3BzJywgJy1vJywgJ3BpZCxwcGlkJywgJy0tbm8taGVhZGVycyddLCB0ZXh0PVRydWUKKyAgICAgICkKKworICAgICAgY2hpbGRfcHJvY2Vzc2VzID0gW10KKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBpZCwgcHBpZCA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBpbnQocHBpZCkgPT0gcGFyZW50X3BpZDoKKyAgICAgICAgICBjaGlsZF9wcm9jZXNzZXMuYXBwZW5kKGludChwaWQpKQorICAgICAgcmV0dXJuIGNoaWxkX3Byb2Nlc3NlcworICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgICAgc2VsZi5mYWlsKGYnZmFpbGVkIHRvIGdldCBjaGlsZCBwcm9jZXNzLCBlcnJvcjoge2V9JykKKworICBkZWYgX2lzX3Byb2Nlc3NfYWxpdmUoc2VsZiwgcGlkOiBpbnQpIC0+IGJvb2w6CisgICAgdHJ5OgorICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgWydwcycsICctcCcsIHN0cihwaWQpLCAnLW8nLCAnc3RhdGU9J10sIHRleHQ9VHJ1ZQorICAgICAgKS5zdHJpcCgpCisgICAgICBzdGF0ZSA9IG91dHB1dC5zcGxpdCgpWzBdCisgICAgICByZXR1cm4gc3RhdGUgIT0gJ1onICAjIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBub3QgJ1onICh6b21iaWUpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9jbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcyhzZWxmKToKKyAgICBjaGlsZF9waWRzID0gc2VsZi5fZ2V0X2NoaWxkX3Byb2Nlc3Nlcyhvcy5nZXRwaWQoKSkKKyAgICBmb3IgY2hpbGRfcGlkIGluIGNoaWxkX3BpZHM6CisgICAgICB0cnk6CisgICAgICAgIG9zLmtpbGwoY2hpbGRfcGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgIGV4Y2VwdCBQcm9jZXNzTG9va3VwRXJyb3I6CisgICAgICAgICMgcHJvY2VzcyBhbHJlYWR5IHRlcm1pbmF0ZWQKKyAgICAgICAgcGFzcworCisgIGRlZiBfY3JlYXRlX2Zha2VfZGVhbW9uX3Byb2Nlc3MoCisgICAgICBzZWxmLCBuYW1lOiBzdHIgPSBURVNUX1BJRF9GSUxFX1BBVEgKKyAgKSAtPiBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzczoKKyAgICAjIENyZWF0ZSBhIGxvbmcgcnVubmluZyBzdWJwcm9jZXNzCisgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uKQorICAgIHAuc3RhcnQoKQorCisgICAgIyBDcmVhdGUgdGhlIHBpZGZpbGUgd2l0aCB0aGUgc3VicHJvY2VzcyBwaWQKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisgICAgd2l0aCBvcGVuKHBpZF9maWxlX3BhdGhfZGlyLmpvaW5wYXRoKG5hbWUpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKHN0cihwLnBpZCkpCisgICAgcmV0dXJuIHAKKworICBkZWYgX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoc2VsZiwgZmFrZV9jY2xpZW50LCBlcnJvcl90eXBlKToKKyAgICBlcnJvcl9ldmVudHMgPSBmYWtlX2NjbGllbnQuZ2V0X3NlbnRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZXJyb3JfZXZlbnRzKSwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBlcnJvcl9ldmVudHNbMF0uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLmVkaXRfbW9uaXRvcl9lcnJvcl9ldmVudC5lcnJvcl90eXBlLAorICAgICAgICBlcnJvcl90eXBlLAorICAgICkKKworCitjbGFzcyBGYWtlQ2xlYXJjdXRDbGllbnQ6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnNlbnRfbG9nX2V2ZW50ID0gW10KKworICBkZWYgbG9nKHNlbGYsIGxvZ19ldmVudCk6CisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuYXBwZW5kKGxvZ19ldmVudCkKKworICBkZWYgZmx1c2hfZXZlbnRzKHNlbGYpOgorICAgIHNlbGYuc2VudF9sb2dfZXZlbnQuZXh0ZW5kKHNlbGYucGVuZGluZ19sb2dfZXZlbnRzKQorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzLmNsZWFyKCkKKworICBkZWYgZ2V0X3NlbnRfZXZlbnRzKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnNlbnRfbG9nX2V2ZW50ICsgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3IucHkgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTI4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yLnB5CkBAIC0wLDAgKzEsMjIwIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworaW1wb3J0IGdldHBhc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24KK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKKworZnJvbSBhdGVzdC5tZXRyaWNzIGltcG9ydCBjbGVhcmN1dF9jbGllbnQKK2Zyb20gYXRlc3QucHJvdG8gaW1wb3J0IGNsaWVudGFuYWx5dGljc19wYjIKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCitmcm9tIHdhdGNoZG9nLmV2ZW50cyBpbXBvcnQgRmlsZVN5c3RlbUV2ZW50Citmcm9tIHdhdGNoZG9nLmV2ZW50cyBpbXBvcnQgUGF0dGVybk1hdGNoaW5nRXZlbnRIYW5kbGVyCitmcm9tIHdhdGNoZG9nLm9ic2VydmVycyBpbXBvcnQgT2JzZXJ2ZXIKKworIyBFbnVtIG9mIHRoZSBDbGVhcmN1dCBsb2cgc291cmNlIGRlZmluZWQgdW5kZXIKKyMgL2dvb2dsZTMvd2lyZWxlc3MvYW5kcm9pZC9wbGF5L3BsYXlsb2cvcHJvdG8vbG9nX3NvdXJjZV9lbnVtLnByb3RvCitMT0dfU09VUkNFID0gMjUyNAorREVGQVVMVF9GTFVTSF9JTlRFUlZBTF9TRUNPTkRTID0gNQorREVGQVVMVF9TSU5HTEVfRVZFTlRTX1NJWkVfVEhSRVNIT0xEID0gMTAwCisKKworY2xhc3MgQ2xlYXJjdXRFdmVudEhhbmRsZXIoUGF0dGVybk1hdGNoaW5nRXZlbnRIYW5kbGVyKToKKworICBkZWYgX19pbml0X18oCisgICAgICBzZWxmLAorICAgICAgcGF0aDogc3RyLAorICAgICAgZmx1c2hfaW50ZXJ2YWxfc2VjOiBpbnQsCisgICAgICBzaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkOiBpbnQsCisgICAgICBpc19kcnlfcnVuOiBib29sID0gRmFsc2UsCisgICAgICBjY2xpZW50OiBjbGVhcmN1dF9jbGllbnQuQ2xlYXJjdXQgfCBOb25lID0gTm9uZSwKKyAgKToKKworICAgIHN1cGVyKCkuX19pbml0X18ocGF0dGVybnM9WyIqIl0sIGlnbm9yZV9kaXJlY3Rvcmllcz1UcnVlKQorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGggPSBwYXRoCisgICAgc2VsZi5mbHVzaF9pbnRlcnZhbF9zZWMgPSBmbHVzaF9pbnRlcnZhbF9zZWMKKyAgICBzZWxmLnNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQgPSBzaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkCisgICAgc2VsZi5pc19kcnlfcnVuID0gaXNfZHJ5X3J1bgorICAgIHNlbGYuY2NsaWVudCA9IGNjbGllbnQgb3IgY2xlYXJjdXRfY2xpZW50LkNsZWFyY3V0KExPR19TT1VSQ0UpCisKKyAgICBzZWxmLnVzZXJfbmFtZSA9IGdldHBhc3MuZ2V0dXNlcigpCisgICAgc2VsZi5ob3N0X25hbWUgPSBwbGF0Zm9ybS5ub2RlKCkKKyAgICBzZWxmLnNvdXJjZV9yb290ID0gb3MuZW52aXJvbi5nZXQoIkFORFJPSURfQlVJTERfVE9QIiwgIiIpCisKKyAgICBzZWxmLnBlbmRpbmdfZXZlbnRzID0gW10KKyAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZCA9IE5vbmUKKyAgICBzZWxmLl9wZW5kaW5nX2V2ZW50c19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCisgIGRlZiBvbl9tb3ZlZChzZWxmLCBldmVudDogRmlsZVN5c3RlbUV2ZW50KToKKyAgICBzZWxmLl9sb2dfZWRpdF9ldmVudChldmVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PVkUpCisKKyAgZGVmIG9uX2NyZWF0ZWQoc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCk6CisgICAgc2VsZi5fbG9nX2VkaXRfZXZlbnQoZXZlbnQsIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5DUkVBVEUpCisKKyAgZGVmIG9uX2RlbGV0ZWQoc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCk6CisgICAgc2VsZi5fbG9nX2VkaXRfZXZlbnQoZXZlbnQsIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5ERUxFVEUpCisKKyAgZGVmIG9uX21vZGlmaWVkKHNlbGYsIGV2ZW50OiBGaWxlU3lzdGVtRXZlbnQpOgorICAgIHNlbGYuX2xvZ19lZGl0X2V2ZW50KGV2ZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuTU9ESUZZKQorCisgIGRlZiBmbHVzaGFsbChzZWxmKToKKyAgICBsb2dnaW5nLmluZm8oImZsdXNoaW5nIGFsbCBwZW5kaW5nIGV2ZW50cy4iKQorICAgIGlmIHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkOgorICAgICAgbG9nZ2luZy5pbmZvKCJjYW5jZWxpbmcgbG9nIHRocmVhZCIpCisgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZC5jYW5jZWwoKQorICAgICAgc2VsZi5fc2NoZWR1bGVkX2xvZ190aHJlYWQgPSBOb25lCisKKyAgICBzZWxmLl9sb2dfY2xlYXJjdXRfZXZlbnRzKCkKKyAgICBzZWxmLmNjbGllbnQuZmx1c2hfZXZlbnRzKCkKKworICBkZWYgX2xvZ19lZGl0X2V2ZW50KAorICAgICAgc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCwgZWRpdF90eXBlOiBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRWRpdFR5cGUKKyAgKToKKyAgICB0cnk6CisgICAgICBldmVudF90aW1lID0gdGltZS50aW1lKCkKKworICAgICAgaWYgc2VsZi5faXNfaGlkZGVuX2ZpbGUocGF0aGxpYi5QYXRoKGV2ZW50LnNyY19wYXRoKSk6CisgICAgICAgIGxvZ2dpbmcuZGVidWcoImlnbm9yZSBoaWRkZW4gZmlsZTogJXMuIiwgZXZlbnQuc3JjX3BhdGgpCisgICAgICAgIHJldHVybgorCisgICAgICBpZiBub3Qgc2VsZi5faXNfdW5kZXJfZ2l0X3Byb2plY3QocGF0aGxpYi5QYXRoKGV2ZW50LnNyY19wYXRoKSk6CisgICAgICAgIGxvZ2dpbmcuZGVidWcoCisgICAgICAgICAgICAiaWdub3JlIGZpbGUgJXMgd2hpY2ggZG9lcyBub3QgYmVsb25nIHRvIGEgZ2l0IHByb2plY3QiLAorICAgICAgICAgICAgZXZlbnQuc3JjX3BhdGgsCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuCisKKyAgICAgIGxvZ2dpbmcuaW5mbygiJXM6ICVzIiwgZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQuc3JjX3BhdGgpCisKKyAgICAgIGV2ZW50X3Byb3RvID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50KAorICAgICAgICAgIHVzZXJfbmFtZT1zZWxmLnVzZXJfbmFtZSwKKyAgICAgICAgICBob3N0X25hbWU9c2VsZi5ob3N0X25hbWUsCisgICAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKKyAgICAgICkKKyAgICAgIGV2ZW50X3Byb3RvLnNpbmdsZV9lZGl0X2V2ZW50LkNvcHlGcm9tKAorICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgICAgICAgIGZpbGVfcGF0aD1ldmVudC5zcmNfcGF0aCwgZWRpdF90eXBlPWVkaXRfdHlwZQorICAgICAgICAgICkKKyAgICAgICkKKyAgICAgIHdpdGggc2VsZi5fcGVuZGluZ19ldmVudHNfbG9jazoKKyAgICAgICAgc2VsZi5wZW5kaW5nX2V2ZW50cy5hcHBlbmQoKGV2ZW50X3Byb3RvLCBldmVudF90aW1lKSkKKyAgICAgICAgaWYgbm90IHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkOgorICAgICAgICAgIGxvZ2dpbmcuZGVidWcoCisgICAgICAgICAgICAgICJTY2hlZHVsaW5nIHRocmVhZCB0byBydW4gaW4gJWQgc2Vjb25kcyIsIHNlbGYuZmx1c2hfaW50ZXJ2YWxfc2VjCisgICAgICAgICAgKQorICAgICAgICAgIHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkID0gdGhyZWFkaW5nLlRpbWVyKAorICAgICAgICAgICAgICBzZWxmLmZsdXNoX2ludGVydmFsX3NlYywgc2VsZi5fbG9nX2NsZWFyY3V0X2V2ZW50cworICAgICAgICAgICkKKyAgICAgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZC5zdGFydCgpCisKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBsb2cgZWRpdCBldmVudC4iKQorCisgIGRlZiBfaXNfaGlkZGVuX2ZpbGUoc2VsZiwgZmlsZV9wYXRoOiBwYXRobGliLlBhdGgpIC0+IGJvb2w6CisgICAgcmV0dXJuIGFueSgKKyAgICAgICAgcGFydC5zdGFydHN3aXRoKCIuIikKKyAgICAgICAgZm9yIHBhcnQgaW4gZmlsZV9wYXRoLnJlbGF0aXZlX3RvKHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgpLnBhcnRzCisgICAgKQorCisgIGRlZiBfaXNfdW5kZXJfZ2l0X3Byb2plY3Qoc2VsZiwgZmlsZV9wYXRoOiBwYXRobGliLlBhdGgpIC0+IGJvb2w6CisgICAgcm9vdF9wYXRoID0gcGF0aGxpYi5QYXRoKHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgpLnJlc29sdmUoKQorICAgIHJldHVybiBhbnkoCisgICAgICAgIHJvb3RfcGF0aC5qb2lucGF0aChkaXIpLmpvaW5wYXRoKCcuZ2l0JykuZXhpc3RzKCkKKyAgICAgICAgZm9yIGRpciBpbiBmaWxlX3BhdGgucmVsYXRpdmVfdG8ocm9vdF9wYXRoKS5wYXJlbnRzCisgICAgKQorCisgIGRlZiBfbG9nX2NsZWFyY3V0X2V2ZW50cyhzZWxmKToKKyAgICB3aXRoIHNlbGYuX3BlbmRpbmdfZXZlbnRzX2xvY2s6CisgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZCA9IE5vbmUKKyAgICAgIGVkaXRfZXZlbnRzID0gc2VsZi5wZW5kaW5nX2V2ZW50cworICAgICAgc2VsZi5wZW5kaW5nX2V2ZW50cyA9IFtdCisKKyAgICBwZW5kaW5nX2V2ZW50c19zaXplID0gbGVuKGVkaXRfZXZlbnRzKQorICAgIGlmIHBlbmRpbmdfZXZlbnRzX3NpemUgPiBzZWxmLnNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQ6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgImdvdCAlZCBldmVudHMgaW4gJWQgc2Vjb25kcywgc2VuZGluZyBhZ2dyZWdhdGVkIGV2ZW50cyBpbnN0ZWFkIiwKKyAgICAgICAgICBwZW5kaW5nX2V2ZW50c19zaXplLAorICAgICAgICAgIHNlbGYuZmx1c2hfaW50ZXJ2YWxfc2VjLAorICAgICAgKQorICAgICAgYWdncmVnYXRlZF9ldmVudF90aW1lID0gZWRpdF9ldmVudHNbMF1bMV0KKyAgICAgIGFnZ3JlZ2F0ZWRfZXZlbnRfcHJvdG8gPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQoCisgICAgICAgICAgdXNlcl9uYW1lPXNlbGYudXNlcl9uYW1lLAorICAgICAgICAgIGhvc3RfbmFtZT1zZWxmLmhvc3RfbmFtZSwKKyAgICAgICAgICBzb3VyY2Vfcm9vdD1zZWxmLnNvdXJjZV9yb290LAorICAgICAgKQorICAgICAgYWdncmVnYXRlZF9ldmVudF9wcm90by5hZ2dyZWdhdGVkX2VkaXRfZXZlbnQuQ29weUZyb20oCisgICAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkFnZ3JlZ2F0ZWRFZGl0RXZlbnQoCisgICAgICAgICAgICAgIG51bV9lZGl0cz1wZW5kaW5nX2V2ZW50c19zaXplCisgICAgICAgICAgKQorICAgICAgKQorICAgICAgZWRpdF9ldmVudHMgPSBbKGFnZ3JlZ2F0ZWRfZXZlbnRfcHJvdG8sIGFnZ3JlZ2F0ZWRfZXZlbnRfdGltZSldCisKKyAgICBpZiBzZWxmLmlzX2RyeV9ydW46CisgICAgICBsb2dnaW5nLmluZm8oIlNlbnQgJWQgZWRpdCBldmVudHMgaW4gZHJ5IHJ1bi4iLCBsZW4oZWRpdF9ldmVudHMpKQorICAgICAgcmV0dXJuCisKKyAgICBmb3IgZXZlbnRfcHJvdG8sIGV2ZW50X3RpbWUgaW4gZWRpdF9ldmVudHM6CisgICAgICBsb2dfZXZlbnQgPSBjbGllbnRhbmFseXRpY3NfcGIyLkxvZ0V2ZW50KAorICAgICAgICAgIGV2ZW50X3RpbWVfbXM9aW50KGV2ZW50X3RpbWUgKiAxMDAwKSwKKyAgICAgICAgICBzb3VyY2VfZXh0ZW5zaW9uPWV2ZW50X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgICApCisgICAgICBzZWxmLmNjbGllbnQubG9nKGxvZ19ldmVudCkKKworICAgIGxvZ2dpbmcuaW5mbygic2VudCAlZCBlZGl0IGV2ZW50cyIsIGxlbihlZGl0X2V2ZW50cykpCisKKworZGVmIHN0YXJ0KAorICAgIHBhdGg6IHN0ciwKKyAgICBpc19kcnlfcnVuOiBib29sID0gRmFsc2UsCisgICAgZmx1c2hfaW50ZXJ2YWxfc2VjOiBpbnQgPSBERUZBVUxUX0ZMVVNIX0lOVEVSVkFMX1NFQ09ORFMsCisgICAgc2luZ2xlX2V2ZW50c19zaXplX3RocmVzaG9sZDogaW50ID0gREVGQVVMVF9TSU5HTEVfRVZFTlRTX1NJWkVfVEhSRVNIT0xELAorICAgIGNjbGllbnQ6IGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dCB8IE5vbmUgPSBOb25lLAorICAgIHBpcGVfc2VuZGVyOiBtdWx0aXByb2Nlc3NpbmcuY29ubmVjdGlvbi5Db25uZWN0aW9uIHwgTm9uZSA9IE5vbmUsCispOgorICAiIiJNZXRob2QgdG8gc3RhcnQgdGhlIGVkaXQgbW9uaXRvci4KKworICBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBzdGFydCB0aGUgZWRpdCBtb25pdG9yIGFzIGEgc3VicHJvY2VzcyBvZgorICB0aGUgZGFlbW9uIG1hbmFnZXIuCisKKyAgcGFyYW1zOgorICAgIHBhdGg6IFRoZSByb290IHBhdGggdG8gbW9uaXRvcgorICAgIGNjbGllbnQ6IFRoZSBjbGVhcmN1dCBjbGllbnQgdG8gc2VuZCB0aGUgZWRpdCBsb2dzLgorICAgIGNvbm46IHRoZSBzZW5kZXIgb2YgdGhlIHBpcGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGVhbW9uIG1hbmFnZXIuCisgICIiIgorICBldmVudF9oYW5kbGVyID0gQ2xlYXJjdXRFdmVudEhhbmRsZXIoCisgICAgICBwYXRoLCBmbHVzaF9pbnRlcnZhbF9zZWMsIHNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQsIGlzX2RyeV9ydW4sIGNjbGllbnQpCisgIG9ic2VydmVyID0gT2JzZXJ2ZXIoKQorCisgIGxvZ2dpbmcuaW5mbygiU3RhcnRpbmcgb2JzZXJ2ZXIgb24gcGF0aCAlcy4iLCBwYXRoKQorICBvYnNlcnZlci5zY2hlZHVsZShldmVudF9oYW5kbGVyLCBwYXRoLCByZWN1cnNpdmU9VHJ1ZSkKKyAgb2JzZXJ2ZXIuc3RhcnQoKQorICBsb2dnaW5nLmluZm8oIk9ic2VydmVyIHN0YXJ0ZWQuIikKKyAgaWYgcGlwZV9zZW5kZXI6CisgICAgcGlwZV9zZW5kZXIuc2VuZCgiT2JzZXJ2ZXIgc3RhcnRlZC4iKQorCisgIHRyeToKKyAgICB3aGlsZSBUcnVlOgorICAgICAgdGltZS5zbGVlcCgxKQorICBmaW5hbGx5OgorICAgIGV2ZW50X2hhbmRsZXIuZmx1c2hhbGwoKQorICAgIG9ic2VydmVyLnN0b3AoKQorICAgIG9ic2VydmVyLmpvaW4oKQorICAgIGlmIHBpcGVfc2VuZGVyOgorICAgICAgcGlwZV9zZW5kZXIuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5IGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWI5MzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yX2ludGVncmF0aW9uX3Rlc3QucHkKQEAgLTAsMCArMSwxNjkgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiSW50ZWdyYXRpb24gdGVzdHMgZm9yIEVkaXQgTW9uaXRvci4iIiIKKworaW1wb3J0IGdsb2IKK2Zyb20gaW1wb3J0bGliIGltcG9ydCByZXNvdXJjZXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCisKKworY2xhc3MgRWRpdE1vbml0b3JJbnRlZ3JhdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIEBjbGFzc21ldGhvZAorICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCisgICAgIyBDb25maWd1cmUgdG8gcHJpbnQgbG9nZ2luZyB0byBzdGRvdXQuCisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmaWxlbmFtZT1Ob25lLCBsZXZlbD1sb2dnaW5nLkRFQlVHKQorICAgIGNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkKKyAgICBsb2dnaW5nLmdldExvZ2dlcigiIikuYWRkSGFuZGxlcihjb25zb2xlKQorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzdXBlcigpLnNldFVwKCkKKyAgICBzZWxmLndvcmtpbmdfZGlyID0gdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkKKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoID0gcGF0aGxpYi5QYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoCisgICAgICAgICJmaWxlcyIKKyAgICApCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5ta2RpcigpCisgICAgc2VsZi5lZGl0X21vbml0b3JfYmluYXJ5X3BhdGggPSBzZWxmLl9pbXBvcnRfZXhlY3V0YWJsZSgiZWRpdF9tb25pdG9yIikKKyAgICBzZWxmLnBhdGNoID0gbW9jay5wYXRjaC5kaWN0KAorICAgICAgICBvcy5lbnZpcm9uLCB7IkVOQUJMRV9BTkRST0lEX0VESVRfTU9OSVRPUiI6ICJ0cnVlIn0KKyAgICApCisgICAgc2VsZi5wYXRjaC5zdGFydCgpCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIHNlbGYucGF0Y2guc3RvcCgpCisgICAgc2VsZi53b3JraW5nX2Rpci5jbGVhbnVwKCkKKyAgICBzdXBlcigpLnRlYXJEb3duKCkKKworICBkZWYgdGVzdF9sb2dfc2luZ2xlX2VkaXRfZXZlbnRfc3VjY2VzcyhzZWxmKToKKyAgICBwID0gc2VsZi5fc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3MoKQorCisgICAgIyBDcmVhdGUgdGhlIC5naXQgZmlsZSB1bmRlciB0aGUgbW9uaXRvcmluZyBkaXIuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgiLmdpdCIpLnRvdWNoKCkKKworICAgICMgQ3JlYXRlIGFuZCBtb2RpZnkgYSBmaWxlLgorICAgIHRlc3RfZmlsZSA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoInRlc3QudHh0IikKKyAgICB3aXRoIG9wZW4odGVzdF9maWxlLCAidyIpIGFzIGY6CisgICAgICBmLndyaXRlKCJzb21ldGhpbmciKQorCisgICAgIyBNb3ZlIHRoZSBmaWxlLgorICAgIHRlc3RfZmlsZV9tb3ZlZCA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoIm5ld190ZXN0LnR4dCIpCisgICAgdGVzdF9maWxlLnJlbmFtZSh0ZXN0X2ZpbGVfbW92ZWQpCisKKyAgICAjIERlbGV0ZSB0aGUgZmlsZS4KKyAgICB0ZXN0X2ZpbGVfbW92ZWQudW5saW5rKCkKKworICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmNvbW11bmljYXRlKCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHNfbnVtKCksIDQpCisKKyAgZGVmIHRlc3Rfc3RhcnRfbXVsdGlwbGVfZWRpdF9tb25pdG9yX29ubHlfb25lX3N0YXJ0ZWQoc2VsZik6CisgICAgcDEgPSBzZWxmLl9zdGFydF9lZGl0X21vbml0b3JfcHJvY2Vzcyh3YWl0X2Zvcl9vYnNlcnZlcl9zdGFydD1GYWxzZSkKKyAgICBwMiA9IHNlbGYuX3N0YXJ0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKHdhaXRfZm9yX29ic2VydmVyX3N0YXJ0PUZhbHNlKQorICAgIHAzID0gc2VsZi5fc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3Mod2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ9RmFsc2UpCisKKyAgICBsaXZlX3Byb2Nlc3NlcyA9IHNlbGYuX2dldF9saXZlX3Byb2Nlc3NlcyhbcDEsIHAyLCBwM10pCisKKyAgICAjIENsZWFudXAgYWxsIGxpdmUgcHJvY2Vzc2VzLgorICAgIGZvciBwIGluIGxpdmVfcHJvY2Vzc2VzOgorICAgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgIHAuY29tbXVuaWNhdGUoKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGl2ZV9wcm9jZXNzZXMpLCAxKQorCisgIGRlZiBfc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3Moc2VsZiwgd2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ9VHJ1ZSk6CisgICAgY29tbWFuZCA9IGYiIiIKKyAgICBleHBvcnQgVE1QRElSPSJ7c2VsZi53b3JraW5nX2Rpci5uYW1lfSIKKyAgICB7c2VsZi5lZGl0X21vbml0b3JfYmluYXJ5X3BhdGh9IC0tcGF0aD17c2VsZi5yb290X21vbml0b3JpbmdfcGF0aH0gLS1kcnlfcnVuIiIiCisgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgIGNvbW1hbmQsCisgICAgICAgIHNoZWxsPVRydWUsCisgICAgICAgIHRleHQ9VHJ1ZSwKKyAgICAgICAgc3RhcnRfbmV3X3Nlc3Npb249VHJ1ZSwKKyAgICAgICAgZXhlY3V0YWJsZT0iL2Jpbi9iYXNoIiwKKyAgICApCisgICAgaWYgd2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ6CisgICAgICBzZWxmLl93YWl0X2Zvcl9vYnNlcnZlcl9zdGFydCh0aW1lX291dD01KQorCisgICAgcmV0dXJuIHAKKworICBkZWYgX3dhaXRfZm9yX29ic2VydmVyX3N0YXJ0KHNlbGYsIHRpbWVfb3V0KToKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIHdoaWxlIHRpbWUudGltZSgpIDwgc3RhcnRfdGltZSArIHRpbWVfb3V0OgorICAgICAgbG9nX2ZpbGVzID0gZ2xvYi5nbG9iKHNlbGYud29ya2luZ19kaXIubmFtZSArICIvZWRpdF9tb25pdG9yXyovKi5sb2ciKQorICAgICAgaWYgbG9nX2ZpbGVzOgorICAgICAgICB3aXRoIG9wZW4obG9nX2ZpbGVzWzBdLCAiciIpIGFzIGY6CisgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoImluaXRpYWwgbG9nOiAlcyIsIGxpbmUpCisgICAgICAgICAgICBpZiBsaW5lLnJzdHJpcCgiXG4iKS5lbmRzd2l0aCgiT2JzZXJ2ZXIgc3RhcnRlZC4iKToKKyAgICAgICAgICAgICAgcmV0dXJuCisgICAgICBlbHNlOgorICAgICAgICB0aW1lLnNsZWVwKDEpCisKKyAgICBzZWxmLmZhaWwoZiJPYnNlcnZlciBub3Qgc3RhcnRlZCBpbiB7dGltZV9vdXR9IHNlY29uZHMuIikKKworICBkZWYgX2dldF9sb2dnZWRfZXZlbnRzX251bShzZWxmKToKKyAgICBsb2dfZmlsZXMgPSBnbG9iLmdsb2Ioc2VsZi53b3JraW5nX2Rpci5uYW1lICsgIi9lZGl0X21vbml0b3JfKi8qLmxvZyIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nX2ZpbGVzKSwgMSkKKworICAgIHdpdGggb3Blbihsb2dfZmlsZXNbMF0sICJyIikgYXMgZjoKKyAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgIGxvZ2dpbmcuZGVidWcoImNvbXBsZXRlIGxvZzogJXMiLCBsaW5lKQorICAgICAgICBpZiBsaW5lLnJzdHJpcCgiXG4iKS5lbmRzd2l0aCgiaW4gZHJ5IHJ1bi4iKToKKyAgICAgICAgICByZXR1cm4gaW50KGxpbmUuc3BsaXQoIjoiKVstMV0uc3BsaXQoIiAiKVsyXSkKKworICAgIHJldHVybiAwCisKKyAgZGVmIF9nZXRfbGl2ZV9wcm9jZXNzZXMoc2VsZiwgcHJvY2Vzc2VzKToKKyAgICBsaXZlX3Byb2Nlc3NlcyA9IFtdCisgICAgZm9yIHAgaW4gcHJvY2Vzc2VzOgorICAgICAgdHJ5OgorICAgICAgICBwLndhaXQodGltZW91dD01KQorICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuVGltZW91dEV4cGlyZWQgYXMgZToKKyAgICAgICAgbGl2ZV9wcm9jZXNzZXMuYXBwZW5kKHApCisgICAgICAgIGxvZ2dpbmcuaW5mbygicHJvY2VzczogJWQgc3RpbGwgYWxpdmUuIiwgcC5waWQpCisgICAgICBlbHNlOgorICAgICAgICBsb2dnaW5nLmluZm8oInByb2Nlc3M6ICVkIHN0b3BwZWQuIiwgcC5waWQpCisgICAgcmV0dXJuIGxpdmVfcHJvY2Vzc2VzCisKKyAgZGVmIF9pbXBvcnRfZXhlY3V0YWJsZShzZWxmLCBleGVjdXRhYmxlX25hbWU6IHN0cikgLT4gcGF0aGxpYi5QYXRoOgorICAgIGJpbmFyeV9kaXIgPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgiYmluYXJ5IikKKyAgICBiaW5hcnlfZGlyLm1rZGlyKCkKKyAgICBleGVjdXRhYmxlX3BhdGggPSBiaW5hcnlfZGlyLmpvaW5wYXRoKGV4ZWN1dGFibGVfbmFtZSkKKyAgICB3aXRoIHJlc291cmNlcy5hc19maWxlKAorICAgICAgICByZXNvdXJjZXMuZmlsZXMoInRlc3RkYXRhIikuam9pbnBhdGgoZXhlY3V0YWJsZV9uYW1lKQorICAgICkgYXMgYmluYXJ5OgorICAgICAgc2h1dGlsLmNvcHkoYmluYXJ5LCBleGVjdXRhYmxlX3BhdGgpCisgICAgZXhlY3V0YWJsZV9wYXRoLmNobW9kKDBvNzU1KQorICAgIHJldHVybiBleGVjdXRhYmxlX3BhdGgKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfdGVzdC5weSBiL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGEzODcxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl90ZXN0LnB5CkBAIC0wLDAgKzEsMzAxIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlVuaXR0ZXN0cyBmb3IgRWRpdCBNb25pdG9yLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gYXRlc3QucHJvdG8gaW1wb3J0IGNsaWVudGFuYWx5dGljc19wYjIKK2Zyb20gZWRpdF9tb25pdG9yIGltcG9ydCBlZGl0X21vbml0b3IKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKKworY2xhc3MgRWRpdE1vbml0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQorICAgICMgQ29uZmlndXJlIHRvIHByaW50IGxvZ2dpbmcgdG8gc3Rkb3V0LgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZmlsZW5hbWU9Tm9uZSwgbGV2ZWw9bG9nZ2luZy5ERUJVRykKKyAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpCisgICAgbG9nZ2luZy5nZXRMb2dnZXIoJycpLmFkZEhhbmRsZXIoY29uc29sZSkKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc3VwZXIoKS5zZXRVcCgpCisgICAgc2VsZi53b3JraW5nX2RpciA9IHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aCA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZmlsZXMnCisgICAgKQorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgubWtkaXIoKQorICAgIHNlbGYubG9nX2V2ZW50X2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKCdsb2dzJykKKyAgICBzZWxmLmxvZ19ldmVudF9kaXIubWtkaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLndvcmtpbmdfZGlyLmNsZWFudXAoKQorICAgIHN1cGVyKCkudGVhckRvd24oKQorCisgIGRlZiB0ZXN0X2xvZ19zaW5nbGVfZWRpdF9ldmVudF9zdWNjZXNzKHNlbGYpOgorICAgICMgQ3JlYXRlIHRoZSAuZ2l0IGZpbGUgdW5kZXIgdGhlIG1vbml0b3JpbmcgZGlyLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy5naXQnKS50b3VjaCgpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KAorICAgICAgICBsb2dfb3V0cHV0X2ZpbGU9c2VsZi5sb2dfZXZlbnRfZGlyLmpvaW5wYXRoKCdsb2dzLm91dHB1dCcpCisgICAgKQorICAgIHAgPSBzZWxmLl9zdGFydF90ZXN0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKGZha2VfY2NsaWVudCkKKworICAgICMgQ3JlYXRlIGFuZCBtb2RpZnkgYSBmaWxlLgorICAgIHRlc3RfZmlsZSA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3QudHh0JykKKyAgICB3aXRoIG9wZW4odGVzdF9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCdzb21ldGhpbmcnKQorICAgICMgTW92ZSB0aGUgZmlsZS4KKyAgICB0ZXN0X2ZpbGVfbW92ZWQgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCduZXdfdGVzdC50eHQnKQorICAgIHRlc3RfZmlsZS5yZW5hbWUodGVzdF9maWxlX21vdmVkKQorICAgICMgRGVsZXRlIHRoZSBmaWxlLgorICAgIHRlc3RfZmlsZV9tb3ZlZC51bmxpbmsoKQorICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmpvaW4oKQorCisgICAgbG9nZ2VkX2V2ZW50cyA9IHNlbGYuX2dldF9sb2dnZWRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dnZWRfZXZlbnRzKSwgNCkKKyAgICBleHBlY3RlZF9jcmVhdGVfZXZlbnQgPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuU2luZ2xlRWRpdEV2ZW50KAorICAgICAgICBmaWxlX3BhdGg9c3RyKAorICAgICAgICAgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdC50eHQnKS5yZXNvbHZlKCkKKyAgICAgICAgKSwKKyAgICAgICAgZWRpdF90eXBlPWVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5DUkVBVEUsCisgICAgKQorICAgIGV4cGVjdGVkX21vZGlmeV9ldmVudCA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgIGZpbGVfcGF0aD1zdHIoCisgICAgICAgICAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnJlc29sdmUoKQorICAgICAgICApLAorICAgICAgICBlZGl0X3R5cGU9ZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PRElGWSwKKyAgICApCisgICAgZXhwZWN0ZWRfbW92ZV9ldmVudCA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgIGZpbGVfcGF0aD1zdHIoCisgICAgICAgICAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnJlc29sdmUoKQorICAgICAgICApLAorICAgICAgICBlZGl0X3R5cGU9ZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PVkUsCisgICAgKQorICAgIGV4cGVjdGVkX2RlbGV0ZV9ldmVudCA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgIGZpbGVfcGF0aD1zdHIoCisgICAgICAgICAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCduZXdfdGVzdC50eHQnKS5yZXNvbHZlKCkKKyAgICAgICAgKSwKKyAgICAgICAgZWRpdF90eXBlPWVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5ERUxFVEUsCisgICAgKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX2NyZWF0ZV9ldmVudCwKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBsb2dnZWRfZXZlbnRzWzBdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5zaW5nbGVfZWRpdF9ldmVudCwKKyAgICApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZXhwZWN0ZWRfbW9kaWZ5X2V2ZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRnJvbVN0cmluZygKKyAgICAgICAgICAgIGxvZ2dlZF9ldmVudHNbMV0uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLnNpbmdsZV9lZGl0X2V2ZW50LAorICAgICkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9tb3ZlX2V2ZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRnJvbVN0cmluZygKKyAgICAgICAgICAgIGxvZ2dlZF9ldmVudHNbMl0uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLnNpbmdsZV9lZGl0X2V2ZW50LAorICAgICkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9kZWxldGVfZXZlbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgbG9nZ2VkX2V2ZW50c1szXS5zb3VyY2VfZXh0ZW5zaW9uCisgICAgICAgICkuc2luZ2xlX2VkaXRfZXZlbnQsCisgICAgKQorCisKKyAgZGVmIHRlc3RfbG9nX2FnZ3JlZ2F0ZWRfZWRpdF9ldmVudF9zdWNjZXNzKHNlbGYpOgorICAgICMgQ3JlYXRlIHRoZSAuZ2l0IGZpbGUgdW5kZXIgdGhlIG1vbml0b3JpbmcgZGlyLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy5naXQnKS50b3VjaCgpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KAorICAgICAgICBsb2dfb3V0cHV0X2ZpbGU9c2VsZi5sb2dfZXZlbnRfZGlyLmpvaW5wYXRoKCdsb2dzLm91dHB1dCcpCisgICAgKQorICAgIHAgPSBzZWxmLl9zdGFydF90ZXN0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKGZha2VfY2NsaWVudCkKKworICAgICMgQ3JlYXRlIDYgdGVzdCBmaWxlcworICAgIGZvciBpIGluIHJhbmdlKDYpOgorICAgICAgdGVzdF9maWxlID0gc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdF8nICsgc3RyKGkpKQorICAgICAgdGVzdF9maWxlLnRvdWNoKCkKKworICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmpvaW4oKQorCisgICAgbG9nZ2VkX2V2ZW50cyA9IHNlbGYuX2dldF9sb2dnZWRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dnZWRfZXZlbnRzKSwgMSkKKworICAgIGV4cGVjdGVkX2FnZ3JlZ2F0ZWRfZWRpdF9ldmVudCA9ICgKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkFnZ3JlZ2F0ZWRFZGl0RXZlbnQoCisgICAgICAgICAgICBudW1fZWRpdHM9NiwKKyAgICAgICAgKQorICAgICkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX2FnZ3JlZ2F0ZWRfZWRpdF9ldmVudCwKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBsb2dnZWRfZXZlbnRzWzBdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5hZ2dyZWdhdGVkX2VkaXRfZXZlbnQsCisgICAgKQorCisgIGRlZiB0ZXN0X2RvX25vdF9sb2dfZWRpdF9ldmVudF9mb3JfZGlyZWN0b3J5X2NoYW5nZShzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKQorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhIHN1YiBkaXJlY3RvcnkKKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0X2RpcicpLm1rZGlyKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDApCisKKyAgZGVmIHRlc3RfZG9fbm90X2xvZ19lZGl0X2V2ZW50X2Zvcl9oaWRkZW5fZmlsZShzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKQorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhIGhpZGRlbiBmaWxlLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy50ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIENyZWF0ZSBhIGhpZGRlbiBkaXIuCisgICAgaGlkZGVuX2RpciA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy50ZXN0JykKKyAgICBoaWRkZW5fZGlyLm1rZGlyKCkKKyAgICBoaWRkZW5fZGlyLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDApCisKKyAgZGVmIHRlc3RfZG9fbm90X2xvZ19lZGl0X2V2ZW50X2Zvcl9ub25fZ2l0X3Byb2plY3RfZmlsZShzZWxmKToKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoCisgICAgICAgIGxvZ19vdXRwdXRfZmlsZT1zZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JykKKyAgICApCisgICAgcCA9IHNlbGYuX3N0YXJ0X3Rlc3RfZWRpdF9tb25pdG9yX3Byb2Nlc3MoZmFrZV9jY2xpZW50KQorCisgICAgIyBDcmVhdGUgYSBmaWxlLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3QudHh0JykudG91Y2goKQorICAgICMgQ3JlYXRlIGEgZmlsZSB1bmRlciBhIHN1YiBkaXIuCisgICAgc3ViX2RpciA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy50ZXN0JykKKyAgICBzdWJfZGlyLm1rZGlyKCkKKyAgICBzdWJfZGlyLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDApCisKKyAgZGVmIHRlc3RfbG9nX2VkaXRfZXZlbnRfZmFpbChzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKSwKKyAgICAgICAgcmFpc2VfbG9nX2V4Y2VwdGlvbj1UcnVlLAorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhIGZpbGUuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdC50eHQnKS50b3VjaCgpCisgICAgIyBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIGVkaXQgbW9uaXRvciB0byByZWNlaXZlIHRoZSBlZGl0IGV2ZW50LgorICAgIHRpbWUuc2xlZXAoMSkKKyAgICAjIFN0b3AgdGhlIGVkaXQgbW9uaXRvciBhbmQgZmx1c2ggYWxsIGV2ZW50cy4KKyAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorICAgIHAuam9pbigpCisKKyAgICBsb2dnZWRfZXZlbnRzID0gc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ2dlZF9ldmVudHMpLCAwKQorCisgIGRlZiBfc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcygKKyAgICAgIHNlbGYsIGNjbGllbnQKKyAgKSAtPiBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzczoKKyAgICByZWNlaXZlciwgc2VuZGVyID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoKQorICAgICMgU3RhcnQgZWRpdCBtb25pdG9yIGluIGEgc3VicHJvY2Vzcy4KKyAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MoCisgICAgICAgIHRhcmdldD1lZGl0X21vbml0b3Iuc3RhcnQsCisgICAgICAgIGFyZ3M9KHN0cihzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLnJlc29sdmUoKSksIEZhbHNlLCAwLjUsIDUsIGNjbGllbnQsIHNlbmRlciksCisgICAgKQorICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgIHAuc3RhcnQoKQorCisgICAgIyBXYWl0IHVudGlsIG9ic2VydmVyIHN0YXJ0ZWQuCisgICAgcmVjZWl2ZWRfZGF0YSA9IHJlY2VpdmVyLnJlY3YoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlY2VpdmVkX2RhdGEsICdPYnNlcnZlciBzdGFydGVkLicpCisKKyAgICByZWNlaXZlci5jbG9zZSgpCisgICAgcmV0dXJuIHAKKworICBkZWYgX2dldF9sb2dnZWRfZXZlbnRzKHNlbGYpOgorICAgIHdpdGggb3BlbihzZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JyksICdyYicpIGFzIGY6CisgICAgICBkYXRhID0gZi5yZWFkKCkKKworICAgIHJldHVybiBbCisgICAgICAgIGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQuRnJvbVN0cmluZyhyZWNvcmQpCisgICAgICAgIGZvciByZWNvcmQgaW4gZGF0YS5zcGxpdChiJ1x4MDAnKQorICAgICAgICBpZiByZWNvcmQKKyAgICBdCisKKworY2xhc3MgRmFrZUNsZWFyY3V0Q2xpZW50OgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dfb3V0cHV0X2ZpbGUsIHJhaXNlX2xvZ19leGNlcHRpb249RmFsc2UpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnJhaXNlX2xvZ19leGNlcHRpb24gPSByYWlzZV9sb2dfZXhjZXB0aW9uCisgICAgc2VsZi5sb2dfb3V0cHV0X2ZpbGUgPSBsb2dfb3V0cHV0X2ZpbGUKKworICBkZWYgbG9nKHNlbGYsIGxvZ19ldmVudCk6CisgICAgaWYgc2VsZi5yYWlzZV9sb2dfZXhjZXB0aW9uOgorICAgICAgcmFpc2UgRXhjZXB0aW9uKCd1bmtub3duIGV4Y2VwdGlvbicpCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuYXBwZW5kKGxvZ19ldmVudCkKKworICBkZWYgZmx1c2hfZXZlbnRzKHNlbGYpOgorICAgIGRlbGltaXRlciA9IGInXHgwMCcgICMgVXNlIGEgbnVsbCBieXRlIGFzIHRoZSBkZWxpbWl0ZXIKKyAgICB3aXRoIG9wZW4oc2VsZi5sb2dfb3V0cHV0X2ZpbGUsICd3YicpIGFzIGY6CisgICAgICBmb3IgbG9nX2V2ZW50IGluIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzOgorICAgICAgICBmLndyaXRlKGxvZ19ldmVudC5TZXJpYWxpemVUb1N0cmluZygpICsgZGVsaW1pdGVyKQorCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuY2xlYXIoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL21haW4ucHkgYi90b29scy9lZGl0X21vbml0b3IvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJkMTgzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL21haW4ucHkKQEAgLTAsMCArMSwxMTkgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworZnJvbSBlZGl0X21vbml0b3IgaW1wb3J0IGRhZW1vbl9tYW5hZ2VyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZWRpdF9tb25pdG9yCisKKworZGVmIGNyZWF0ZV9hcmdfcGFyc2VyKCk6CisgICIiIkNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgYXJnIHBhcnNlci4iIiIKKworICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgIGRlc2NyaXB0aW9uPSgKKyAgICAgICAgICAnTW9uaXRvcnMgZWRpdHMgaW4gQW5kcm9pZCBzb3VyY2UgY29kZSBhbmQgdXBsb2FkcyB0aGUgZWRpdCBsb2dzLicKKyAgICAgICksCisgICAgICBhZGRfaGVscD1UcnVlLAorICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1wYXRoJywKKyAgICAgIHR5cGU9c3RyLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9J1Jvb3QgcGF0aCB0byBtb25pdG9yIHRoZSBlZGl0IGV2ZW50cy4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRyeV9ydW4nLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0RyeSBydW4gdGhlIGVkaXQgbW9uaXRvci4gVGhpcyBzdGFydHMgdGhlIGVkaXQgbW9uaXRvciBwcm9jZXNzIHdpdGhvdXQgYWN0dWFsbHkgc2VuZCB0aGUgZWRpdCBsb2dzIHRvIGNsZWFyY3V0LicsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tZm9yY2VfY2xlYW51cCcsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgaGVscD0oCisgICAgICAgICAgJ0luc3RlYWQgb2Ygc3RhcnQgYSBuZXcgZWRpdCBtb25pdG9yLCBmb3JjZSBzdG9wIGFsbCBleGlzdGluZyBlZGl0JworICAgICAgICAgICcgbW9uaXRvcnMgaW4gdGhlIHN5c3RlbS4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGluIGVtZXJnZW50IGNhc2VzJworICAgICAgICAgICcgd2hlbiB3ZSB3YW50IHRvIHByZXZlbnQgdXNlciBkYW1hZ2UgYnkgdGhlIGVkaXQgbW9uaXRvci4nCisgICAgICApLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXZlcmJvc2UnLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9KAorICAgICAgICAgICdMb2cgdmVyYm9zZSBpbmZvIGluIHRoZSBsb2cgZmlsZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuJworICAgICAgKSwKKyAgKQorCisgIHJldHVybiBwYXJzZXIKKworCitkZWYgY29uZmlndXJlX2xvZ2dpbmcodmVyYm9zZT1GYWxzZSk6CisgIHJvb3RfbG9nZ2luZ19kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0nZWRpdF9tb25pdG9yXycpCisgIF8sIGxvZ19wYXRoID0gdGVtcGZpbGUubWtzdGVtcChkaXI9cm9vdF9sb2dnaW5nX2Rpciwgc3VmZml4PScubG9nJykKKworCisgIGxvZ19mbXQgPSAnJShhc2N0aW1lKXMuJShtc2VjcykwM2QgJShmaWxlbmFtZSlzOiUobGluZW5vKXM6JShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMnCisgIGRhdGVfZm10ID0gJyVZLSVtLSVkICVIOiVNOiVTJworICBsb2dfbGV2ZWwgPSBsb2dnaW5nLkRFQlVHIGlmIHZlcmJvc2UgZWxzZSBsb2dnaW5nLklORk8KKworICBsb2dnaW5nLmJhc2ljQ29uZmlnKAorICAgICAgZmlsZW5hbWU9bG9nX3BhdGgsIGxldmVsPWxvZ19sZXZlbCwgZm9ybWF0PWxvZ19mbXQsIGRhdGVmbXQ9ZGF0ZV9mbXQKKyAgKQorICAjIEZpbHRlciBvdXQgbG9ncyBmcm9tIGlub3RpZnlfYnVmZiB0byBwcmV2ZW50IGxvZyBwb2xsdXRpb24uCisgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCd3YXRjaGRvZy5vYnNlcnZlcnMuaW5vdGlmeV9idWZmZXInKS5hZGRGaWx0ZXIoCisgICAgICBsYW1iZGEgcmVjb3JkOiByZWNvcmQuZmlsZW5hbWUgIT0gJ2lub3RpZnlfYnVmZmVyLnB5JykKKyAgcHJpbnQoZidsb2dnaW5nIHRvIGZpbGUge2xvZ19wYXRofScpCisKKworZGVmIHRlcm1fc2lnbmFsX2hhbmRsZXIoX3NpZ25hbF9udW1iZXIsIF9mcmFtZSk6CisgIGxvZ2dpbmcuaW5mbygnUHJvY2VzcyAlZCByZWNlaXZlZCBTSUdURVJNLCBUZXJtaW5hdGluZy4uLicsIG9zLmdldHBpZCgpKQorICBzeXMuZXhpdCgwKQorCisKK2RlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSk6CisgIGFyZ3MgPSBjcmVhdGVfYXJnX3BhcnNlcigpLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgIGNvbmZpZ3VyZV9sb2dnaW5nKGFyZ3MudmVyYm9zZSkKKyAgaWYgYXJncy5kcnlfcnVuOgorICAgIGxvZ2dpbmcuaW5mbygnVGhpcyBpcyBhIGRyeSBydW4uJykKKyAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgYmluYXJ5X3BhdGg9YXJndlswXSwKKyAgICAgIGRhZW1vbl90YXJnZXQ9ZWRpdF9tb25pdG9yLnN0YXJ0LAorICAgICAgZGFlbW9uX2FyZ3M9KGFyZ3MucGF0aCwgYXJncy5kcnlfcnVuKSwKKyAgKQorCisgIHRyeToKKyAgICBpZiBhcmdzLmZvcmNlX2NsZWFudXA6CisgICAgICBkbS5jbGVhbnVwKCkKKyAgICBlbHNlOgorICAgICAgZG0uc3RhcnQoKQorICAgICAgZG0ubW9uaXRvcl9kYWVtb24oKQorICBleGNlcHQgRXhjZXB0aW9uOgorICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBydW4gZGFlbW9uLicpCisgIGZpbmFsbHk6CisgICAgZG0uc3RvcCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgdGVybV9zaWduYWxfaGFuZGxlcikKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9wcm90by9lZGl0X2V2ZW50LnByb3RvIGIvdG9vbHMvZWRpdF9tb25pdG9yL3Byb3RvL2VkaXRfZXZlbnQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjYzJlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9wcm90by9lZGl0X2V2ZW50LnByb3RvCkBAIC0wLDAgKzEsNTcgQEAKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHRvb2xzLmFzdWl0ZS5lZGl0X21vbml0b3I7CisKK21lc3NhZ2UgRWRpdEV2ZW50IHsKKyAgZW51bSBFZGl0VHlwZSB7CisgICAgVU5TVVBQT1JURURfVFlQRSA9IDA7CisgICAgQ1JFQVRFID0gMTsKKyAgICBNT0RJRlkgPSAyOworICAgIERFTEVURSA9IDM7CisgICAgTU9WRSA9IDQ7CisgIH0KKworICBlbnVtIEVycm9yVHlwZSB7CisgICAgVU5LTk9XTl9FUlJPUiA9IDA7CisgICAgRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUiA9IDE7CisgICAgRkFJTEVEX1RPX1NUT1BfRURJVF9NT05JVE9SID0gMjsKKyAgICBGQUlMRURfVE9fUkVCT09UX0VESVRfTU9OSVRPUiA9IDM7CisgICAgS0lMTEVEX0RVRV9UT19FWENFRURFRF9NRU1PUllfVVNBR0UgPSA0OworICAgIEZPUkNFX0NMRUFOVVAgPSA1OworICAgIEtJTExFRF9EVUVfVE9fRVhDRUVERURfQ1BVX1VTQUdFID0gNjsKKyAgfQorCisgIC8vIEV2ZW50IHRoYXQgbG9ncyBhIHNpbmdsZSBlZGl0CisgIG1lc3NhZ2UgU2luZ2xlRWRpdEV2ZW50IHsKKyAgICAvLyBGdWxsIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBlZGl0ZWQuCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IDE7CisgICAgLy8gVHlwZSBvZiB0aGUgZWRpdC4KKyAgICBFZGl0VHlwZSBlZGl0X3R5cGUgPSAyOworICB9CisKKyAgLy8gRXZlbnQgdGhhdCBsb2dzIGFnZ3JlZ2F0ZWQgaW5mbyBmb3IgYSBzZXQgb2YgZWRpdHMuCisgIG1lc3NhZ2UgQWdncmVnYXRlZEVkaXRFdmVudCB7CisgICAgaW50MzIgbnVtX2VkaXRzID0gMTsKKyAgfQorCisgIC8vIEV2ZW50IHRoYXQgbG9ncyBlcnJvcnMgaGFwcGVuZWQgaW4gdGhlIGVkaXQgbW9uaXRvci4KKyAgbWVzc2FnZSBFZGl0TW9uaXRvckVycm9yRXZlbnQgeworICAgIEVycm9yVHlwZSBlcnJvcl90eXBlID0gMTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBGSUVMRFMgRk9SIEVkaXRFdmVudAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW50ZXJuYWwgdXNlciBuYW1lLgorICBzdHJpbmcgdXNlcl9uYW1lID0gMTsKKyAgLy8gVGhlIHJvb3Qgb2YgQW5kcm9pZCBzb3VyY2UuCisgIHN0cmluZyBzb3VyY2Vfcm9vdCA9IDI7CisgIC8vIE5hbWUgb2YgdGhlIGhvc3Qgd29ya3N0YXRpb24uCisgIHN0cmluZyBob3N0X25hbWUgPSAzOworCisgIG9uZW9mIGV2ZW50IHsKKyAgICBTaW5nbGVFZGl0RXZlbnQgc2luZ2xlX2VkaXRfZXZlbnQgPSA0OworICAgIEFnZ3JlZ2F0ZWRFZGl0RXZlbnQgYWdncmVnYXRlZF9lZGl0X2V2ZW50ID0gNTsKKyAgICBFZGl0TW9uaXRvckVycm9yRXZlbnQgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50ID0gNjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL3V0aWxzLnB5IGIvdG9vbHMvZWRpdF9tb25pdG9yL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODk0OWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvdXRpbHMucHkKQEAgLTAsMCArMSw1MyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworCisKK2RlZiBpc19mZWF0dXJlX2VuYWJsZWQoCisgICAgZmVhdHVyZV9uYW1lOiBzdHIsCisgICAgdXNlcl9uYW1lOiBzdHIsCisgICAgZW5hYmxlX2ZsYWc6IHN0ciA9IE5vbmUsCisgICAgcm9sbG91dF9wZXJjZW50OiBpbnQgPSAxMDAsCispIC0+IGJvb2w6CisgICIiIkRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuCisKKyAgV2hldGhlciBhIGdpdmVuIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBub3QgZGVwZW5kcyBvbiB0d28gZmxhZ3M6IDEpIHRoZQorICBlbmFibGVfZmxhZyB0aGF0IGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgdGhlIGZlYXR1cmUgYW5kIDIpIHRoZSByb2xsb3V0X2ZsYWcKKyAgdGhhdCBjb250cm9scyB0aGUgcm9sbG91dCBwZXJjZW50YWdlLgorCisgIEFyZ3M6CisgICAgZmVhdHVyZV9uYW1lOiBuYW1lIG9mIHRoZSBmZWF0dXJlLgorICAgIHVzZXJfbmFtZTogc3lzdGVtIHVzZXIgbmFtZS4KKyAgICBlbmFibGVfZmxhZzogbmFtZSBvZiB0aGUgZW52IHZhciB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdGhlIGZlYXR1cmUKKyAgICAgIGV4cGxpY2l0bHkuCisgICAgcm9sbG91dF9mbGc6IG5hbWUgb2YgdGhlIGVudiB2YXIgdGhhdCBjb250cm9scyB0aGUgcm9sbG91dCBwZXJjZW50YWdlLCB0aGUKKyAgICAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgZW52IHZhciBzaG91bGQgYmUgYW4gaW50IGJldHdlZW4gMCBhbmQgMTAwIHN0cmluZworICAiIiIKKyAgaWYgZW5hYmxlX2ZsYWc6CisgICAgaWYgb3MuZW52aXJvbi5nZXQoZW5hYmxlX2ZsYWcsICIiKSA9PSAiZmFsc2UiOgorICAgICAgbG9nZ2luZy5pbmZvKCJmZWF0dXJlOiAlcyBpcyBkaXNhYmxlZCIsIGZlYXR1cmVfbmFtZSkKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgb3MuZW52aXJvbi5nZXQoZW5hYmxlX2ZsYWcsICIiKSA9PSAidHJ1ZSI6CisgICAgICBsb2dnaW5nLmluZm8oImZlYXR1cmU6ICVzIGlzIGVuYWJsZWQiLCBmZWF0dXJlX25hbWUpCisgICAgICByZXR1cm4gVHJ1ZQorCisgIGhhc2hfb2JqZWN0ID0gaGFzaGxpYi5zaGEyNTYoKQorICBoYXNoX29iamVjdC51cGRhdGUoKHVzZXJfbmFtZSArIGZlYXR1cmVfbmFtZSkuZW5jb2RlKCJ1dGYtOCIpKQorICBoYXNoX251bWJlciA9IGludChoYXNoX29iamVjdC5oZXhkaWdlc3QoKSwgMTYpICUgMTAwCisKKyAgcmV0dXJuIGhhc2hfbnVtYmVyIDwgcm9sbG91dF9wZXJjZW50CmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvdXRpbHNfdGVzdC5weSBiL3Rvb2xzL2VkaXRfbW9uaXRvci91dGlsc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvdXRpbHNfdGVzdC5weQpAQCAtMCwwICsxLDcxIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlVuaXR0ZXN0cyBmb3IgZWRpdCBtb25pdG9yIHV0aWxzLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKKworZnJvbSBlZGl0X21vbml0b3IgaW1wb3J0IHV0aWxzCisKK1RFU1RfVVNFUiA9ICd0ZXN0X3VzZXInCitURVNUX0ZFQVRVUkUgPSAndGVzdF9mZWF0dXJlJworRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHID0gJ0VOQUJMRV9URVNUX0ZFQVRVUkUnCitST0xMT1VUX1RFU1RfRkVBVFVSRV9GTEFHID0gJ1JPTExPVVRfVEVTVF9GRUFUVVJFJworCisKK2NsYXNzIEVuYWJsZUZlYXR1cmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdF9mZWF0dXJlX2VuYWJsZWRfd2l0aG91dF9mbGFnKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoVEVTVF9GRUFUVVJFLCBURVNUX1VTRVIpKQorCisgIEBtb2NrLnBhdGNoLmRpY3Qob3MuZW52aXJvbiwge0VOQUJMRV9URVNUX0ZFQVRVUkVfRkxBRzogJ2ZhbHNlJ30sIGNsZWFyPVRydWUpCisgIGRlZiB0ZXN0X2ZlYXR1cmVfZGlzYWJsZWRfd2l0aF9mbGFnKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIHV0aWxzLmlzX2ZlYXR1cmVfZW5hYmxlZCgKKyAgICAgICAgICAgIFRFU1RfRkVBVFVSRSwgVEVTVF9VU0VSLCBFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUcKKyAgICAgICAgKQorICAgICkKKworICBAbW9jay5wYXRjaC5kaWN0KG9zLmVudmlyb24sIHtFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUc6ICd0cnVlJ30sIGNsZWFyPVRydWUpCisgIGRlZiB0ZXN0X2ZlYXR1cmVfZW5hYmxlZF93aXRoX2ZsYWcoc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICB1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoCisgICAgICAgICAgICBURVNUX0ZFQVRVUkUsIFRFU1RfVVNFUiwgRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHCisgICAgICAgICkKKyAgICApCisKKyAgZGVmIHRlc3RfZmVhdHVyZV9lbmFibGVkX3dpdGhfcm9sbG91dF9wZXJjZW50YWdlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgdXRpbHMuaXNfZmVhdHVyZV9lbmFibGVkKAorICAgICAgICAgICAgVEVTVF9GRUFUVVJFLAorICAgICAgICAgICAgVEVTVF9VU0VSLAorICAgICAgICAgICAgRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHLAorICAgICAgICAgICAgOTAsCisgICAgICAgICkKKyAgICApCisKKyAgZGVmIHRlc3RfZmVhdHVyZV9kaXNhYmxlZF93aXRoX3JvbGxvdXRfcGVyY2VudGFnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICB1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoCisgICAgICAgICAgICBURVNUX0ZFQVRVUkUsCisgICAgICAgICAgICBURVNUX1VTRVIsCisgICAgICAgICAgICBFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUcsCisgICAgICAgICAgICAxMCwKKyAgICAgICAgKQorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5IGIvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKaW5kZXggYTZhZTlmMS4uZTg1OWI2YiAxMDA2NDQKLS0tIGEvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKKysrIGIvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKQEAgLTE0LDIxICsxNCwyMSBAQAogCiAiIiJBIG1vZHVsZSBmb3IgcmVhZGluZyBhbmQgcGFyc2luZyBldmVudC1sb2ctdGFncyBmaWxlcy4iIiIKIAoraW1wb3J0IGRhdGFjbGFzc2VzCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKK2Zyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAogCi1jbGFzcyBUYWcob2JqZWN0KToKLSAgX19zbG90c19fID0gWyJ0YWdudW0iLCAidGFnbmFtZSIsICJkZXNjcmlwdGlvbiIsICJmaWxlbmFtZSIsICJsaW5lbnVtIl0KLQotICBkZWYgX19pbml0X18oc2VsZiwgdGFnbnVtLCB0YWduYW1lLCBkZXNjcmlwdGlvbiwgZmlsZW5hbWUsIGxpbmVudW0pOgotICAgIHNlbGYudGFnbnVtID0gdGFnbnVtCi0gICAgc2VsZi50YWduYW1lID0gdGFnbmFtZQotICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgotICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQotICAgIHNlbGYubGluZW51bSA9IGxpbmVudW0KK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKK2NsYXNzIFRhZzoKKyAgdGFnbnVtOiBpbnQKKyAgdGFnbmFtZTogc3RyCisgIGRlc2NyaXB0aW9uOiBPcHRpb25hbFtzdHJdCisgIGZpbGVuYW1lOiBzdHIKKyAgbGluZW51bTogaW50CiAKIAotY2xhc3MgVGFnRmlsZShvYmplY3QpOgorY2xhc3MgVGFnRmlsZToKICAgIiIiUmVhZCBhbiBpbnB1dCBldmVudC1sb2ctdGFncyBmaWxlLiIiIgogICBkZWYgQWRkRXJyb3Ioc2VsZiwgbXNnLCBsaW5lbnVtPU5vbmUpOgogICAgIGlmIGxpbmVudW0gaXMgTm9uZToKQEAgLTc2LDE0ICs3NiwxMSBAQAogICAgICAgICAgIHNlbGYub3B0aW9uc1twYXJ0c1sxXV0gPSBwYXJ0c1syOl0KICAgICAgICAgICBjb250aW51ZQogCi0gICAgICAgIGlmIHBhcnRzWzBdID09ICI/IjoKLSAgICAgICAgICB0YWcgPSBOb25lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGFnID0gaW50KHBhcnRzWzBdKQotICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgc2VsZi5BZGRFcnJvcigiXCIlc1wiIGlzbid0IGFuIGludGVnZXIgdGFnIG9yICc/JyIgJSAocGFydHNbMF0sKSkKLSAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICB0YWcgPSBpbnQocGFydHNbMF0pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgIHNlbGYuQWRkRXJyb3IoIlwiJXNcIiBpc24ndCBhbiBpbnRlZ2VyIHRhZyIgJSAocGFydHNbMF0sKSkKKyAgICAgICAgICBjb250aW51ZQogCiAgICAgICAgIHRhZ25hbWUgPSBwYXJ0c1sxXQogICAgICAgICBpZiBsZW4ocGFydHMpID09IDM6CkBAIC0xMjgsOCArMTI1LDggQEAKICAgICAgIG91dCA9IHN5cy5zdGRvdXQKICAgICAgIG91dHB1dF9maWxlID0gIjxzdGRvdXQ+IgogICAgIGVsc2U6Ci0gICAgICBvdXQgPSBvcGVuKG91dHB1dF9maWxlLCAid2IiKQotICAgIG91dC53cml0ZShzdHIuZW5jb2RlKGRhdGEpKQorICAgICAgb3V0ID0gb3BlbihvdXRwdXRfZmlsZSwgInciKQorICAgIG91dC53cml0ZShkYXRhKQogICAgIG91dC5jbG9zZSgpCiAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcikgYXMgZToKICAgICBwcmludCgiZmFpbGVkIHRvIHdyaXRlICVzOiAlcyIgJSAob3V0cHV0X2ZpbGUsIGUpLCBmaWxlPXN5cy5zdGRlcnIpCmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icCBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCmluZGV4IGFiNzY2ZDYuLjM4MjZlNTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCkBAIC0yNCw0ICsyNCw5IEBACiBwcmVidWlsdF9ldGNfaG9zdCB7CiAgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdCIsCiAgICAgc3JjOiAiYWxsb3dsaXN0IiwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CisKK3ByZWJ1aWx0X2V0Y19ob3N0IHsKKyAgICBuYW1lOiAic3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0X25leHQiLAorICAgIHNyYzogImFsbG93bGlzdF9uZXh0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9PV05FUlMgYi90b29scy9maWxlbGlzdGRpZmYvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGZiMTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvT1dORVJTCkBAIC0wLDAgKzEgQEAKK3Blci1maWxlIGFsbG93bGlzdCA9IGp1c3Rpbnl1bkBnb29nbGUuY29tLCBqZW9uZ2lrQGdvb2dsZS5jb20sIGtpeW91bmdraW1AZ29vZ2xlLmNvbSwgaW5zZW9iQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0CmluZGV4IDcyYzEyYTAuLmViNzg1ODcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QKKysrIGIvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdApAQCAtMSw5OSArMSw1IEBACi0jIEtub3duIGRpZmZzIG9ubHkgaW4gdGhlIEtBVEkgc3lzdGVtIGltYWdlCi1ldGMvTk9USUNFLnhtbC5negotZXRjL2NvbXBhdGNvbmZpZy9UZWxlU2VydmljZS1wbGF0Zm9ybS1jb21wYXQtY29uZmlnLnhtbAotZXRjL2NvbXBhdGNvbmZpZy9jYWxlbmRhci1wcm92aWRlci1jb21wYXQtY29uZmlnLnhtbAotZXRjL2NvbXBhdGNvbmZpZy9jb250YWN0cy1wcm92aWRlci1wbGF0Zm9ybS1jb21wYXQtY29uZmlnLnhtbAotZXRjL2NvbXBhdGNvbmZpZy9kb2N1bWVudHMtdWktY29tcGF0LWNvbmZpZy54bWwKLWV0Yy9jb21wYXRjb25maWcvZnJhbWV3b3JrLWxvY2F0aW9uLWNvbXBhdC1jb25maWcueG1sCi1ldGMvY29tcGF0Y29uZmlnL2ZyYW1ld29yay1wbGF0Zm9ybS1jb21wYXQtY29uZmlnLnhtbAotZXRjL2NvbXBhdGNvbmZpZy9pY3U0ai1wbGF0Zm9ybS1jb21wYXQtY29uZmlnLnhtbAotZXRjL2NvbXBhdGNvbmZpZy9zZXJ2aWNlcy1wbGF0Zm9ybS1jb21wYXQtY29uZmlnLnhtbAotZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuc29mdHdhcmUuY3JlZGVudGlhbHMueG1sCi1ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay54bWwKLWV0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLndlYnZpZXcueG1sCi1ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS53aW5kb3dfbWFnbmlmaWNhdGlvbi54bWwKLWV0Yy9wZXJtaXNzaW9ucy9jb20uYW5kcm9pZC5hZHNlcnZpY2VzLnNka3NhbmRib3gueG1sCi1ldGMvc2VjdXJpdHkvb3RhY2VydHMuemlwCi1ldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguMjAyNDA0LnhtbAotZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LjIwMjUwNC54bWwKLWV0Yy92aW50Zi9jb21wYXRpYmlsaXR5X21hdHJpeC41LnhtbAotZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LjYueG1sCi1ldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguNy54bWwKLWV0Yy92aW50Zi9jb21wYXRpYmlsaXR5X21hdHJpeC44LnhtbAotZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LmRldmljZS54bWwKLWV0Yy92aW50Zi9tYW5pZmVzdC54bWwKLWZyYW1ld29yay9ib290LWFwYWNoZS14bWwudmRleAotZnJhbWV3b3JrL2Jvb3QtYXBhY2hlLXhtbC52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC1ib3VuY3ljYXN0bGUudmRleAotZnJhbWV3b3JrL2Jvb3QtYm91bmN5Y2FzdGxlLnZkZXguZnN2X21ldGEKLWZyYW1ld29yay9ib290LWNvcmUtaWN1NGoudmRleAotZnJhbWV3b3JrL2Jvb3QtY29yZS1pY3U0ai52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC1jb3JlLWxpYmFydC52ZGV4Ci1mcmFtZXdvcmsvYm9vdC1jb3JlLWxpYmFydC52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC1leHQudmRleAotZnJhbWV3b3JrL2Jvb3QtZXh0LnZkZXguZnN2X21ldGEKLWZyYW1ld29yay9ib290LWZyYW1ld29yay1hZHNlcnZpY2VzLnZkZXgKLWZyYW1ld29yay9ib290LWZyYW1ld29yay1hZHNlcnZpY2VzLnZkZXguZnN2X21ldGEKLWZyYW1ld29yay9ib290LWZyYW1ld29yay1ncmFwaGljcy52ZGV4Ci1mcmFtZXdvcmsvYm9vdC1mcmFtZXdvcmstZ3JhcGhpY3MudmRleC5mc3ZfbWV0YQotZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWxvY2F0aW9uLnZkZXgKLWZyYW1ld29yay9ib290LWZyYW1ld29yay1sb2NhdGlvbi52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC1mcmFtZXdvcmsudmRleAotZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLnZkZXguZnN2X21ldGEKLWZyYW1ld29yay9ib290LWltcy1jb21tb24udmRleAotZnJhbWV3b3JrL2Jvb3QtaW1zLWNvbW1vbi52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC1va2h0dHAudmRleAotZnJhbWV3b3JrL2Jvb3Qtb2todHRwLnZkZXguZnN2X21ldGEKLWZyYW1ld29yay9ib290LXRlbGVwaG9ueS1jb21tb24udmRleAotZnJhbWV3b3JrL2Jvb3QtdGVsZXBob255LWNvbW1vbi52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC12b2lwLWNvbW1vbi52ZGV4Ci1mcmFtZXdvcmsvYm9vdC12b2lwLWNvbW1vbi52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvYm9vdC52ZGV4Ci1mcmFtZXdvcmsvYm9vdC52ZGV4LmZzdl9tZXRhCi1mcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLm9kZXgKLWZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMub2RleC5mc3ZfbWV0YQotZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy52ZGV4Ci1mcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLnZkZXguZnN2X21ldGEKLWxpYi9hYXVkaW8tYWlkbC1jcHAuc28KLWxpYi9hbmRyb2lkLmhhcmR3YXJlLmJpb21ldHJpY3MuZmluZ2VycHJpbnRAMi4xLnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5jb25maWdAMS4wLnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5kZXByZWNhdGVkQDEuMC5zbwotbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4wLnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjEuc28KLWxpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMi5zbwotbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4zLnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjQuc28KLWxpYi9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyZV9lbGVtZW50QDEuMC5zbwotbGliL2NvbS5hbmRyb2lkLm1lZGlhLmFhdWRpby1hY29uZmlnLWNjLnNvCi1saWIvaGVhcHByb2ZkX2NsaWVudC5zbwotbGliL2hlYXBwcm9mZF9jbGllbnRfYXBpLnNvCi1saWIvbGliYWF1ZGlvLnNvCi1saWIvbGliYWF1ZGlvX2ludGVybmFsLnNvCi1saWIvbGliYWxhcm1fam5pLnNvCi1saWIvbGliYW1pZGkuc28KLWxpYi9saWJjdXBzLnNvCi1saWIvbGliam5pX2RldmljZUFzV2ViY2FtLnNvCi1saWIvbGlicHJpbnRzcG9vbGVyX2puaS5zbwotbGliL2xpYnZlbmRvcnN1cHBvcnQuc28KLWxpYi9saWJ3ZmRzLnNvCi1saWIvbGlieXV2LnNvCi0KLSMgYi8zNTEyNTg0NjEKLWFkYl9rZXlzCisjIEtub3duIGRpZmZzIHRoYXQgYXJlIGluc3RhbGxlZCBpbiBlaXRoZXIgc3lzdGVtIGltYWdlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24KKyMgYi8zNTM0Mjk0MjIKIGluaXQuZW52aXJvbi5yYwotCi0jIEtub3duIGRpZmZzIG9ubHkgaW4gdGhlIFNvb25nIHN5c3RlbSBpbWFnZQotbGliL2xpYmhpZGNvbW1hbmRfam5pLnNvCi1saWIvbGlidWlucHV0Y29tbWFuZF9qbmkuc28KLQotIyBLbm93biBkaWZmcyBpbiBpbnRlcm5hbCBzb3VyY2UKLWJpbi91cHJvYmVzdGF0cwotZXRjL2Fjb25maWcvZmxhZy5tYXAKLWV0Yy9hY29uZmlnL2ZsYWcudmFsCi1ldGMvYWNvbmZpZy9wYWNrYWdlLm1hcAotZXRjL2JwZi91cHJvYmVzdGF0cy9CaXRtYXBBbGxvY2F0aW9uLm8KLWV0Yy9icGYvdXByb2Jlc3RhdHMvR2VuZXJpY0luc3RydW1lbnRhdGlvbi5vCi1ldGMvaW5pdC9VcHJvYmVTdGF0cy5yYwotbGliL2xpYnVwcm9iZXN0YXRzX2NsaWVudC5zbwotbGliNjQvbGlidXByb2Jlc3RhdHNfY2xpZW50LnNvCi1wcml2LWFwcC9EZXZpY2VEaWFnbm9zdGljcy9EZXZpY2VEaWFnbm9zdGljcy5hcGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjIGIvMzM4MzQyMzgxCitldGMvTk9USUNFLnhtbC5negpkaWZmIC0tZ2l0IGEvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdF9uZXh0IGIvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdF9uZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTFjOWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0X25leHQKQEAgLTAsMCArMSw5IEBACisjIEFsbG93bGlzdCBvbmx5IGZvciB0aGUgbmV4dCByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCisjIFRPRE8oYi8zNjk2NzgxMjIpOiBUaGUgbGlzdCB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgdHJ1bmsgY29uZmlndXJhdGlvbnMgYXJlCisjIGF2YWlsYWJsZSB0byB0aGUgbmV4dC4KKworIyBLQVRJIG9ubHkgaW5zdGFsbGVkIGZpbGVzCitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLm9kZXgKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMub2RleC5mc3ZfbWV0YQorZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy52ZGV4CitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLnZkZXguZnN2X21ldGEKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9maWxlX2xpc3RfZGlmZi5weSBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9maWxlX2xpc3RfZGlmZi5weQppbmRleCBjZGM1YjJlLi5hNjQwOGU4IDEwMDY0NAotLS0gYS90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkKKysrIGIvdG9vbHMvZmlsZWxpc3RkaWZmL2ZpbGVfbGlzdF9kaWZmLnB5CkBAIC0xOSwzOCArMTksNTQgQEAKIENPTE9SX0VSUk9SID0gJ1wwMzNbOTFtJwogQ09MT1JfTk9STUFMID0gJ1wwMzNbMG0nCiAKLWRlZiBmaW5kX3VuaXF1ZV9pdGVtcyhrYXRpX2luc3RhbGxlZF9maWxlcywgc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCBhbGxvd2xpc3QsIHN5c3RlbV9tb2R1bGVfbmFtZSk6CitkZWYgZmluZF91bmlxdWVfaXRlbXMoa2F0aV9pbnN0YWxsZWRfZmlsZXMsIHNvb25nX2luc3RhbGxlZF9maWxlcywgc3lzdGVtX21vZHVsZV9uYW1lLCBhbGxvd2xpc3RzKToKICAgICB3aXRoIG9wZW4oa2F0aV9pbnN0YWxsZWRfZmlsZXMsICdyJykgYXMga2F0aV9saXN0X2ZpbGUsIFwKLSAgICAgICAgICAgIG9wZW4oc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCAncicpIGFzIHNvb25nX2xpc3RfZmlsZSwgXAotICAgICAgICAgICAgb3BlbihhbGxvd2xpc3QsICdyJykgYXMgYWxsb3dsaXN0X2ZpbGU6CisgICAgICAgICAgICBvcGVuKHNvb25nX2luc3RhbGxlZF9maWxlcywgJ3InKSBhcyBzb29uZ19saXN0X2ZpbGU6CiAgICAgICAgIGthdGlfZmlsZXMgPSBzZXQoa2F0aV9saXN0X2ZpbGUucmVhZCgpLnNwbGl0KCkpCiAgICAgICAgIHNvb25nX2ZpbGVzID0gc2V0KHNvb25nX2xpc3RfZmlsZS5yZWFkKCkuc3BsaXQoKSkKLSAgICAgICAgYWxsb3dlZF9maWxlcyA9IHNldChmaWx0ZXIobGFtYmRhIHg6IGxlbih4KSwgbWFwKGxhbWJkYSB4OiB4LmxzdHJpcCgpLnNwbGl0KCcjJywxKVswXS5yc3RyaXAoKSAsIGFsbG93bGlzdF9maWxlLnJlYWQoKS5zcGxpdCgnXG4nKSkpKQorCisgICAgYWxsb3dlZF9maWxlcyA9IHNldCgpCisgICAgZm9yIGFsbG93bGlzdCBpbiBhbGxvd2xpc3RzOgorICAgICAgICB3aXRoIG9wZW4oYWxsb3dsaXN0LCAncicpIGFzIGFsbG93bGlzdF9maWxlOgorICAgICAgICAgICAgYWxsb3dlZF9maWxlcy51cGRhdGUoc2V0KGZpbHRlcihsYW1iZGEgeDogbGVuKHgpLCBtYXAobGFtYmRhIHg6IHgubHN0cmlwKCkuc3BsaXQoJyMnLDEpWzBdLnJzdHJpcCgpICwgYWxsb3dsaXN0X2ZpbGUucmVhZCgpLnNwbGl0KCdcbicpKSkpKQogCiAgICAgZGVmIGlzX3Vua25vd25fZGlmZihmaWxlcGF0aCk6Ci0gICAgICAgIHJldHVybiBub3QgZmlsZXBhdGggaW4gYWxsb3dlZF9maWxlcworICAgICAgICByZXR1cm4gZmlsZXBhdGggbm90IGluIGFsbG93ZWRfZmlsZXMKKworICAgIGRlZiBpc191bm5lY2Vzc2FyeV9hbGxvd2xpc3QoZmlsZXBhdGgpOgorICAgICAgICByZXR1cm4gZmlsZXBhdGggbm90IGluIGthdGlfZmlsZXMuc3ltbWV0cmljX2RpZmZlcmVuY2Uoc29vbmdfZmlsZXMpCiAKICAgICB1bmlxdWVfaW5fa2F0aSA9IHNldChmaWx0ZXIoaXNfdW5rbm93bl9kaWZmLCBrYXRpX2ZpbGVzIC0gc29vbmdfZmlsZXMpKQogICAgIHVuaXF1ZV9pbl9zb29uZyA9IHNldChmaWx0ZXIoaXNfdW5rbm93bl9kaWZmLCBzb29uZ19maWxlcyAtIGthdGlfZmlsZXMpKQorICAgIHVubmVjZXNzYXJ5X2FsbG93bGlzdHMgPSBzZXQoZmlsdGVyKGlzX3VubmVjZXNzYXJ5X2FsbG93bGlzdCwgYWxsb3dlZF9maWxlcykpCiAKICAgICBpZiB1bmlxdWVfaW5fa2F0aToKLSAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9UGxlYXNlIGFkZCBmb2xsb3dpbmcgbW9kdWxlcyBpbnRvIHN5c3RlbSBpbWFnZSBtb2R1bGUge3N5c3RlbV9tb2R1bGVfbmFtZX0ue0NPTE9SX05PUk1BTH0nKQotICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBtb2R1bGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludCgnJykKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9TWlzc2luZyByZXF1aXJlZCBtb2R1bGVzIGluIHtzeXN0ZW1fbW9kdWxlX25hbWV9IG1vZHVsZS57Q09MT1JfTk9STUFMfScpCisgICAgICAgIHByaW50KGYnVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgYWRkIHRoZSBtb2R1bGVzIHRvIHRoZSBBbmRyb2lkLmJwIGZpbGUgZm9yIHRoZSB7c3lzdGVtX21vZHVsZV9uYW1lfSB0byBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgS0FUSSBvbmx5IGluc3RhbGxlZCBmaWxlcy4nKQorICAgICAgICBwcmludChmJ1lvdSBjYW4gZmluZCB0aGUgY29ycmVjdCBBbmRyb2lkLmJwIGZpbGUgdXNpbmcgdGhlIGNvbW1hbmQgImdvbW9kIHtzeXN0ZW1fbW9kdWxlX25hbWV9Ii4nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBpbnN0YWxsZWQgZmlsZShzKTp7Q09MT1JfTk9STUFMfScpCiAgICAgICAgIGZvciBpdGVtIGluIHNvcnRlZCh1bmlxdWVfaW5fa2F0aSk6Ci0gICAgICAgICAgICBwcmludChpdGVtKQorICAgICAgICAgICAgcHJpbnQoJyAgJytpdGVtKQogCiAgICAgaWYgdW5pcXVlX2luX3Nvb25nOgotICAgICAgICBpZiB1bmlxdWVfaW5fa2F0aToKLSAgICAgICAgICAgIHByaW50KCcnKQotCi0gICAgICAgIHByaW50KGYne0NPTE9SX0VSUk9SfVBsZWFzZSBhZGQgZm9sbG93aW5nIG1vZHVsZXMgaW50byBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rLntDT0xPUl9OT1JNQUx9JykKLSAgICAgICAgcHJpbnQoZid7Q09MT1JfV0FSTklOR31Tb29uZyBvbmx5IG1vZHVsZShzKTp7Q09MT1JfTk9STUFMfScpCi0gICAgICAgIGZvciBpdGVtIGluIHNvcnRlZCh1bmlxdWVfaW5fc29vbmcpOgotICAgICAgICAgICAgcHJpbnQoaXRlbSkKLQotICAgIGlmIHVuaXF1ZV9pbl9rYXRpIG9yIHVuaXF1ZV9pbl9zb29uZzoKICAgICAgICAgcHJpbnQoJycpCi0gICAgICAgIHByaW50KGYne0NPTE9SX0VSUk9SfUZBSUxFRDogU3lzdGVtIGltYWdlIGZyb20gS0FUSSBhbmQgU09PTkcgZGlmZmVycyBmcm9tIGluc3RhbGxlZCBmaWxlIGxpc3Que0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1NaXNzaW5nIHBhY2thZ2VzIGluIGJhc2Vfc3lzdGVtLm1rLntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgcHJpbnQoJ1BsZWFzZSBhZGQgcGFja2FnZXMgaW50byBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rIG9yIGJ1aWxkL21ha2UvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdCB0byBpbnN0YWxsIG9yIHNraXAgdGhlIGZvbGxvd2luZyBTb29uZyBvbmx5IGluc3RhbGxlZCBmaWxlcy4nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfVNvb25nIG9ubHkgaW5zdGFsbGVkIGZpbGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX3Nvb25nKToKKyAgICAgICAgICAgIHByaW50KCcgICcraXRlbSkKKworICAgIGlmIHVubmVjZXNzYXJ5X2FsbG93bGlzdHM6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1Vbm5lY2Vzc2FyeSBmaWxlcyBpbiBhbGxvd2xpc3Que0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludCgnUGxlYXNlIHJlbW92ZSB0aGVzZSBlbnRyaWVzIGZyb20gYnVpbGQvbWFrZS90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0JykKKyAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKHVubmVjZXNzYXJ5X2FsbG93bGlzdHMpOgorICAgICAgICAgICAgcHJpbnQoJyAgJytpdGVtKQorCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aSBvciB1bmlxdWVfaW5fc29vbmcgb3IgdW5uZWNlc3NhcnlfYWxsb3dsaXN0czoKKyAgICAgICAgcHJpbnQoJycpCiAgICAgICAgIHN5cy5leGl0KDEpCiAKIApAQCAtNTksOCArNzUsOCBAQAogCiAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgna2F0aV9pbnN0YWxsZWRfZmlsZV9saXN0JykKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdzb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0JykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhbGxvd2xpc3QnKQogICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3N5c3RlbV9tb2R1bGVfbmFtZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbGxvd2xpc3RzJywgbmFyZ3M9JyonLCBkZWZhdWx0PVtdKQogICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKLSAgICBmaW5kX3VuaXF1ZV9pdGVtcyhhcmdzLmthdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCwgYXJncy5zb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLmFsbG93bGlzdCwgYXJncy5zeXN0ZW1fbW9kdWxlX25hbWUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGZpbmRfdW5pcXVlX2l0ZW1zKGFyZ3Mua2F0aV9pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLnNvb25nX2luc3RhbGxlZF9maWxlX2xpc3QsIGFyZ3Muc3lzdGVtX21vZHVsZV9uYW1lLCBhcmdzLmFsbG93bGlzdHMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC1hbmQtbS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAtYW5kLW0uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg0MzgwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAtYW5kLW0uc2gKQEAgLTAsMCArMSwyMCBAQAorCisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorc2V0IC1leAorZnVuY3Rpb24gaGVscCgpIHsKKyAgICBlY2hvICJGaW5hbGl6ZSBWSU5URiBhbmQgYnVpbGQgYSB0YXJnZXQgZm9yIHRlc3QuIgorICAgIGVjaG8gInVzYWdlOiAkKGJhc2VuYW1lICIkMCIpIHRhcmdldCBbZ29hbHMuLi5dIgorfQorZnVuY3Rpb24gZmluYWxpemVfbWFpbl9zdGVwMF9hbmRfbSgpIHsKKyAgICBpZiBbICQjID09IDAgXSA7IHRoZW4KKyAgICAgICAgaGVscAorICAgICAgICBleGl0IDEKKyAgICBmaTsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2gKKyAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9JDEgVEFSR0VUX1JFTEVBU0U9ZmluYV8wIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAjIFRoaXMgY29tbWFuZCB0ZXN0cyB0aGUgcmVsZWFzZSBzdGF0ZSBmb3IgQUlETC4KKyAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbSAke0A6Mn0KK30KK2ZpbmFsaXplX21haW5fc3RlcDBfYW5kX20gJEAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLnNoCmluZGV4IGY4MWI3MjAuLjg4MjZiMzUgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC5zaApAQCAtNywxMSArNywyNiBAQAogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKKyAgICBsb2NhbCBuZWVkX3ZpbnRmX2ZpbmFsaXplPWZhbHNlCiAgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSA7IHRoZW4KLSAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgbmVlZF92aW50Zl9maW5hbGl6ZT10cnVlCisgICAgZWxzZQorICAgICAgICAjIGJ1aWxkLXN0ZXAtMC5zaCB0ZXN0cyB0aGUgdmludGYgZmluYWxpemF0aW9uIHN0ZXAgKHN0ZXAtMCkgd2hlbiB0aGUKKyAgICAgICAgIyBGSU5BTF9CT0FSRF9BUElfTEVWRUwgaXMgdGhlIHNhbWUgYXMgdGhlIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMOyBhbmQKKyAgICAgICAgIyBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gaXMgbm90IHRydWUgZnJvbSB0aGUgZmluYV8wIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICMgVGhlIEZJTkFMX0JPQVJEX0FQSV9MRVZFTCBtdXN0IGJlIHRoZSBuZXh0IHZlbmRvciBBUEkgbGV2ZWwgdG8gYmUgZmluYWxpemVkLgorICAgICAgICBsb2NhbCBib2FyZF9hcGlfbGV2ZWxfdmFycz0kKFRBUkdFVF9SRUxFQVNFPWZpbmFfMCAkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1kdW1wdmFycy1tb2RlIC12YXJzICJSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwiKQorICAgICAgICBsb2NhbCB0YXJnZXRfYm9hcmRfYXBpX2xldmVsX3ZhcnM9IlJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTj0nJworUkVMRUFTRV9CT0FSRF9BUElfTEVWRUw9JyRGSU5BTF9CT0FSRF9BUElfTEVWRUwnIgorICAgICAgICBpZiBbICIkYm9hcmRfYXBpX2xldmVsX3ZhcnMiID0gIiR0YXJnZXRfYm9hcmRfYXBpX2xldmVsX3ZhcnMiIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvIFRoZSB0YXJnZXQgaXMgYSBmaW5hbGl6YXRpb24gY2FuZGlkYXRlLgorICAgICAgICAgICAgbmVlZF92aW50Zl9maW5hbGl6ZT10cnVlCisgICAgICAgIGZpOworICAgIGZpOworCisgICAgaWYgWyAiJG5lZWRfdmludGZfZmluYWxpemUiID0gdHJ1ZSBdIDsgdGhlbiAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KICAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCiAgICAgZmk7CiB9CiAKIGZpbmFsaXplX21haW5fc3RlcDAKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCmluZGV4IGY2OGE2OGIuLmNmM2U2MWIgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKQEAgLTI5LDQgKzI5LDggQEAKICMgRklOQUwgdmVyc2lvbnMgZm9yIFZJTlRGCiAjIFRPRE8oYi8zMjM5ODUyOTcpOiBUaGUgdmVyc2lvbiBtdXN0IG1hdGNoIHdpdGggdGhhdCBmcm9tIHRoZSByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCiAjIEluc3RlYWQgb2YgaGFyZGNvZGluZyB0aGUgdmVyc2lvbiBoZXJlLCByZWFkIGl0IGZyb20gYSByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCi1leHBvcnQgRklOQUxfQk9BUkRfQVBJX0xFVkVMPScyMDI0MDQnCitleHBvcnQgRklOQUxfQk9BUkRfQVBJX0xFVkVMPScyMDI1MDQnCitleHBvcnQgRklOQUxfQ09SUkVTUE9ORElOR19WRVJTSU9OX0xFVFRFUj0nVycKK2V4cG9ydCBGSU5BTF9DT1JSRVNQT05ESU5HX1BMQVRGT1JNX1ZFUlNJT049JzE2JworZXhwb3J0IEZJTkFMX05FWFRfQk9BUkRfQVBJX0xFVkVMPScyMDI2MDQnCitleHBvcnQgRklOQUxfTkVYVF9DT1JSRVNQT05ESU5HX1ZFUlNJT05fTEVUVEVSPSdYJwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKaW5kZXggZDUzMmIyNS4uNmYxYTZmNiAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCkBAIC0zMywxOCArMzMsMTggQEAKIGZ1bmN0aW9uIGNyZWF0ZV9uZXdfY29tcGF0X21hdHJpeF9hbmRfa2VybmVsX2NvbmZpZ3MoKSB7CiAgICAgIyBUaGUgY29tcGF0aWJpbGl0eSBtYXRyaXggdmVyc2lvbnMgYXJlIGJ1bXBlZCBkdXJpbmcgdkZSQwogICAgICMgVGhlc2Ugd2lsbCBjaGFuZ2UgZXZlcnkgdGltZSB3ZSBoYXZlIGEgbmV3IHZGUkMKLSAgICBsb2NhbCBDVVJSRU5UX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMPScyMDI0MDQnCi0gICAgbG9jYWwgTkVYVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTD0nMjAyNTA0JworICAgIGxvY2FsIENVUlJFTlRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUw9IiRGSU5BTF9CT0FSRF9BUElfTEVWRUwiCisgICAgbG9jYWwgTkVYVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTD0iJEZJTkFMX05FWFRfQk9BUkRfQVBJX0xFVkVMIgogICAgICMgVGhlIGtlcm5lbCBjb25maWdzIG5lZWQgdGhlIGxldHRlciBvZiB0aGUgQW5kcm9pZCByZWxlYXNlCi0gICAgbG9jYWwgQ1VSUkVOVF9SRUxFQVNFX0xFVFRFUj0ndicKLSAgICBsb2NhbCBORVhUX1JFTEVBU0VfTEVUVEVSPSd3JworICAgIGxvY2FsIENVUlJFTlRfUkVMRUFTRV9MRVRURVI9IiRGSU5BTF9DT1JSRVNQT05ESU5HX1ZFUlNJT05fTEVUVEVSIgorICAgIGxvY2FsIE5FWFRfUkVMRUFTRV9MRVRURVI9IiRGSU5BTF9ORVhUX0NPUlJFU1BPTkRJTkdfVkVSU0lPTl9MRVRURVIiCiAKIAogICAgICMgYnVpbGQgdGhlIHRhcmdldHMgcmVxdWlyZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBBbmRyb2lkLmJwL0FuZHJvaWQubWsgZmlsZXMKICAgICBsb2NhbCBidWlsZF9jbWQ9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSIKICAgICAkYnVpbGRfY21kIGJwbW9kaWZ5CiAKLSAgICAiJHRvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvcGF0aC9saW51eC14ODYvcHl0aG9uMyIgIiR0b3AvaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpY2VzL2J1bXAucHkiICIkQ1VSUkVOVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCIgIiRORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIiAiJENVUlJFTlRfUkVMRUFTRV9MRVRURVIiICIkTkVYVF9SRUxFQVNFX0xFVFRFUiIKKyAgICAiJHRvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvcGF0aC9saW51eC14ODYvcHl0aG9uMyIgIiR0b3AvaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpY2VzL2J1bXAucHkiICIkQ1VSUkVOVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCIgIiRORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIiAiJENVUlJFTlRfUkVMRUFTRV9MRVRURVIiICIkTkVYVF9SRUxFQVNFX0xFVFRFUiIgIiRGSU5BTF9DT1JSRVNQT05ESU5HX1BMQVRGT1JNX1ZFUlNJT04iCiAKICAgICAjIEZyZWV6ZSB0aGUgY3VycmVudCBmcmFtZXdvcmsgbWFuaWZlc3QgZmlsZS4gVGhpcyByZWxpZXMgb24gdGhlCiAgICAgIyBhb3NwX2NmX3g4Nl82NC10cnVua19zdGFnaW5nIGJ1aWxkIHRhcmdldCB0byBnZXQgdGhlIHJpZ2h0IG1hbmlmZXN0CmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwCmluZGV4IDZhYTUyODkuLmE1YjZmZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0yNzcsNiArMjc3LDcgQEAKICAgICBvdXQ6IFsib3V0Il0sCiB9CiAKKy8vIHN5c3RlbQogZ2VucnVsZSB7CiAgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9nZW4iLAogICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLApAQCAtMzA3LDYgKzMwOCw3IEBACiAgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZ2VuIiwKIH0KIAorLy8gc3lzdGVtX2V4dAogZ2VucnVsZSB7CiAgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9leHRfZ2VuIiwKICAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKQEAgLTMzNyw2ICszMzksNyBAQAogICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCiB9CiAKKy8vIHByb2R1Y3QKIGdlbnJ1bGUgewogICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19wcm9kdWN0X2dlbiIsCiAgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCkBAIC0zNjcsNiArMzcwLDcgQEAKICAgICBwcm9kdWN0X3NwZWNpZmljOiB0cnVlLAogfQogCisvLyB2ZW5kb3IKIGdlbnJ1bGUgewogICAgIG5hbWU6ICJmc19jb25maWdfZGlyc192ZW5kb3JfZ2VuIiwKICAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKQEAgLTM5Nyw2ICs0MDEsNyBAQAogICAgIHZlbmRvcjogdHJ1ZSwKIH0KIAorLy8gb2RtCiBnZW5ydWxlIHsKICAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2RtX2dlbiIsCiAgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCkBAIC00MjcsNCArNDMyLDIxNCBAQAogICAgIGRldmljZV9zcGVjaWZpYzogdHJ1ZSwKIH0KIAotLy8gVE9ETyhqaXlvbmcpOiBhZGQgZnNfY29uZmlnIGZvciBvZW0sIHN5c3RlbV9kbGttLCB2ZW5kb3JfZGxrbSwgb2RtX2Rsa20gcGFydGl0aW9ucworLy8gc3lzdGVtX2Rsa20KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19zeXN0ZW1fZGxrbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9kaXJzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbV9kbGttICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfc3lzdGVtX2Rsa21fZ2VuIiwKKyAgICBzeXN0ZW1fZGxrbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZGxrbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiBzeXN0ZW1fZGxrbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfc3lzdGVtX2Rsa20iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9kbGttX2dlbiIsCisgICAgc3lzdGVtX2Rsa21fc3BlY2lmaWM6IHRydWUsCit9CisKKy8vIHZlbmRvcl9kbGttCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfdmVuZG9yX2Rsa21fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiB2ZW5kb3JfZGxrbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc192ZW5kb3JfZGxrbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9kbGttX2dlbiIsCisgICAgdmVuZG9yX2Rsa21fc3BlY2lmaWM6IHRydWUsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfdmVuZG9yX2Rsa21fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZmlsZXMgKworICAgICAgICAiLS1wYXJ0aXRpb24gdmVuZG9yX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9kbGttIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbV9nZW4iLAorICAgIHZlbmRvcl9kbGttX3NwZWNpZmljOiB0cnVlLAorfQorCisvLyBvZG1fZGxrbQorZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX29kbV9kbGttX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gb2RtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2RtX2Rsa20iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHNyYzogIjpmc19jb25maWdfZGlyc19vZG1fZGxrbV9nZW4iLAorICAgIG9kbV9kbGttX3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29kbV9kbGttX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIG9kbV9kbGttICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19vZG1fZGxrbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfb2RtX2Rsa21fZ2VuIiwKKyAgICBvZG1fZGxrbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworLy8gb2VtCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2VtX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gb2VtICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX29lbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19kaXJzX29lbV9nZW4iLAorICAgIG9lbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19vZW1fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZmlsZXMgKworICAgICAgICAiLS1wYXJ0aXRpb24gb2VtICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19vZW0iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX29lbV9nZW4iLAorICAgIG9lbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworLy8gR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGVzIGZvciBlYWNoIHBhcnRpdGlvbi4KKy8vIEFkZCBmc19jb25maWdfZGlycyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KK3Bob255IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJmc19jb25maWdfZGlyc19zeXN0ZW0iLAorICAgICAgICAiZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dCIsCisgICAgICAgICJmc19jb25maWdfZGlyc19wcm9kdWN0IiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSIsCisgICAgXSwKK30KKworLy8gR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlcyBmb3IgZWFjaCBwYXJ0aXRpb24uCisvLyBBZGQgZnNfY29uZmlnX2ZpbGVzIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgorcGhvbnkgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJmc19jb25maWdfZmlsZXNfc3lzdGVtIiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19wcm9kdWN0IiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0iLAorICAgIF0sCit9CisKKy8vIEdlbmVyYXRlIHRoZSA8cD4vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlcyBmb3IgYWxsIGVuYWJsZWQgcGFydGl0aW9ucworLy8gZXhjbHVkaW5nIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0IGFuZCAvcHJvZHVjdC4gQWRkIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0bworLy8gUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCitwaG9ueSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSIsCisgICAgcmVxdWlyZWQ6IFtdICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgInZlbmRvciIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19kaXJzX3ZlbmRvciJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgIm9lbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19kaXJzX29lbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgIm9kbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19kaXJzX29kbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgInZlbmRvcl9kbGttIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfdmVuZG9yX2Rsa20iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJvZG1fZGxrbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19kaXJzX29kbV9kbGttIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAic3lzdGVtX2Rsa20iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZGlyc19zeXN0ZW1fZGxrbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pLAorfQorCisvLyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGVzIGZvciBhbGwgZW5hYmxlZCBwYXJ0aXRpb25zCisvLyBleGNsdWRpbmcgL3N5c3RlbSwgL3N5c3RlbV9leHQgYW5kIC9wcm9kdWN0LiBBZGQgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0bworLy8gUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCitwaG9ueSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0iLAorICAgIHJlcXVpcmVkOiBbXSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJ2ZW5kb3IiKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZmlsZXNfdmVuZG9yIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2VtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2ZpbGVzX29lbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgIm9kbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19maWxlc19vZG0iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJ2ZW5kb3JfZGxrbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgIm9kbV9kbGttIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2ZpbGVzX29kbV9kbGttIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAic3lzdGVtX2Rsa20iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZmlsZXNfc3lzdGVtX2Rsa20iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzM2MjYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIE9uZSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIGZpbGUgYnkgdXNpbmcgVEFSR0VUX0ZTX0NPTkZJR19HRU4uCi0jICAgU2V0IFRBUkdFVF9GU19DT05GSUdfR0VOIHRvIGNvbnRhaW4gYSBsaXN0IG9mIGludGVybWVkaWF0ZSBmb3JtYXQgZmlsZXMKLSMgICBmb3IgZ2VuZXJhdGluZyB0aGUgYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIGZpbGUuCi0jCi0jIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBSRUFETUUKLQotaWZuZXEgKCQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oKSwpCi0kKGVycm9yIFVzaW5nICQoVEFSR0VUX0RFVklDRV9ESVIpL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFRBUkdFVF9GU19DT05GSUdfR0VOIGluc3RlYWQpCi1lbmRpZgotCi1hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnIDo9IHN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCi1jYXBhYmlsaXR5X2hlYWRlciA6PSBiaW9uaWMvbGliYy9rZXJuZWwvdWFwaS9saW51eC9jYXBhYmlsaXR5LmgKLQotIyBMaXN0IG9mIHN1cHBvcnRlZCB2ZW5kb3IsIG9lbSwgb2RtLCB2ZW5kb3JfZGxrbSwgb2RtX2Rsa20sIGFuZCBzeXN0ZW1fZGxrbSBQYXJ0aXRpb25zCi1mc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QgOj0gJChzdHJpcCBcCi0gICQoaWYgJChCT0FSRF9VU0VTX1ZFTkRPUklNQUdFKSQoQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdmVuZG9yKSBcCi0gICQoaWYgJChCT0FSRF9VU0VTX09FTUlNQUdFKSQoQk9BUkRfT0VNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksb2VtKSBcCi0gICQoaWYgJChCT0FSRF9VU0VTX09ETUlNQUdFKSQoQk9BUkRfT0RNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksb2RtKSBcCi0gICQoaWYgJChCT0FSRF9VU0VTX1ZFTkRPUl9ETEtNSU1BR0UpJChCT0FSRF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHZlbmRvcl9kbGttKSBcCi0gICQoaWYgJChCT0FSRF9VU0VTX09ETV9ETEtNSU1BR0UpJChCT0FSRF9PRE1fRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLG9kbV9kbGttKSBcCi0gICQoaWYgJChCT0FSRF9VU0VTX1NZU1RFTV9ETEtNSU1BR0UpJChCT0FSRF9TWVNURU1fRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHN5c3RlbV9kbGttKSBcCi0pCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGVzIGZvciBlYWNoIHBhcnRpdGlvbi4KLSMgQWRkIGZzX2NvbmZpZ19kaXJzIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlycwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKLSAgZnNfY29uZmlnX2RpcnNfc3lzdGVtIFwKLSAgZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dCBcCi0gIGZzX2NvbmZpZ19kaXJzX3Byb2R1Y3QgXAotICBmc19jb25maWdfZGlyc19ub25zeXN0ZW0KLWluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSA8cD4vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZXMgZm9yIGVhY2ggcGFydGl0aW9uLgotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gIGZzX2NvbmZpZ19maWxlc19zeXN0ZW0gXAotICBmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dCBcCi0gIGZzX2NvbmZpZ19maWxlc19wcm9kdWN0IFwKLSAgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGVzIGZvciBhbGwgZW5hYmxlZCBwYXJ0aXRpb25zCi0jIGV4Y2x1ZGluZyAvc3lzdGVtLCAvc3lzdGVtX2V4dCBhbmQgL3Byb2R1Y3QuIEFkZCBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8KLSMgUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoZm9yZWFjaCB0LCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSxmc19jb25maWdfZGlyc18kKHQpKQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlcyBmb3IgYWxsIGVuYWJsZWQgcGFydGl0aW9ucwotIyBleGNsdWRpbmcgL3N5c3RlbSwgL3N5c3RlbV9leHQgYW5kIC9wcm9kdWN0LiBBZGQgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0bwotIyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoZm9yZWFjaCB0LCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSxmc19jb25maWdfZmlsZXNfJCh0KSkKLWluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQotCi1pZm5lcSAoJChmaWx0ZXIgb2VtLCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSksKQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgb2VtL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzX29lbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRU0pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9lbSBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBvZW0vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX29lbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT0VNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBvZW0gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciB2ZW5kb3JfZGxrbSwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHZlbmRvcl9kbGttL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9kbGttCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZGlycwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiB2ZW5kb3JfZGxrbSBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSB2ZW5kb3JfZGxrbS9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZmlsZXMgb3IgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTIGluCi0jIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfdmVuZG9yX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiB2ZW5kb3JfZGxrbSBcCi0JICAgLS1maWxlcyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotZW5kaWYKLQotaWZuZXEgKCQoZmlsdGVyIG9kbV9kbGttLCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSksKQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgb2RtX2Rsa20vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfb2RtX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19kaXJzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT0RNX0RMS00pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9kbV9kbGttIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIG9kbV9kbGttL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19maWxlc19vZG1fZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT0RNX0RMS00pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9kbV9kbGttIFwKLQkgICAtLWZpbGVzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi1lbmRpZgotCi1pZm5lcSAoJChmaWx0ZXIgc3lzdGVtX2Rsa20sJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZGxrbS9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19kaXJzIG9yIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTCi0jIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlyc19zeXN0ZW1fZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gc3lzdGVtX2Rsa20gXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgc3lzdGVtX2Rsa20vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9kbGttCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gc3lzdGVtX2Rsa20gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcgOj0KLWNhcGFiaWxpdHlfaGVhZGVyIDo9Ci1mc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QgOj0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LmdvCmluZGV4IDIzYzdhYmQuLmM3Y2Y1ZWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28KKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbwpAQCAtMjkzLDExICsyOTMsMTkgQEAKIC8vIElmIGEgZmlsZSBpcyBjb3ZlcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMsIHRoZSBmaXJzdCBtb2R1bGUgaXMgcmV0dXJuZWQuCiBmdW5jIGZpbmRKYXZhTW9kdWxlcyhwYXRocyBbXXN0cmluZywgbW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlKSBtYXBbc3RyaW5nXXN0cmluZyB7CiAJcmV0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCi0JZm9yIG5hbWUsIG1vZHVsZSA6PSByYW5nZSBtb2R1bGVzIHsKKwkvLyBBIGZpbGUgbWF5IGJlIHBhcnQgb2YgbXVsdGlwbGUgbW9kdWxlcy4gVG8gbWFrZSB0aGUgcmVzdWx0IGRldGVybWluaXN0aWMsCisJLy8gY2hlY2sgdGhlIG1vZHVsZXMgaW4gc29ydGVkIG9yZGVyLgorCWtleXMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKG1vZHVsZXMpKQorCWZvciBuYW1lIDo9IHJhbmdlIG1vZHVsZXMgeworCQlrZXlzID0gYXBwZW5kKGtleXMsIG5hbWUpCisJfQorCXNsaWNlcy5Tb3J0KGtleXMpCisJZm9yIF8sIG5hbWUgOj0gcmFuZ2Uga2V5cyB7CiAJCWlmIHN0cmluZ3MuSGFzU3VmZml4KG5hbWUsICIuaW1wbCIpIHsKIAkJCWNvbnRpbnVlCiAJCX0KIAorCQltb2R1bGUgOj0gbW9kdWxlc1tuYW1lXQogCQlmb3IgaSwgcCA6PSByYW5nZSBwYXRocyB7CiAJCQlpZiBzbGljZXMuQ29udGFpbnMobW9kdWxlLlNyY3MsIHApIHsKIAkJCQlyZXRbcF0gPSBuYW1lCkBAIC0zNDEsNiArMzQ5LDggQEAKIAkJCUlkOiAgICAgICAgICAgICAgbW9kdWxlTmFtZSwKIAkJCUxhbmd1YWdlOiAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfSkFWQSwKIAkJCVNvdXJjZUZpbGVQYXRoczogbS5TcmNzLAorCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIG0pLAorCQkJRGVwZW5kZW5jeUlkczogICBtLkRlcHMsCiAJCX0KIAkJdW5pdHNCeUlkW3UuSWRdID0gdQogCkBAIC0zNTUsMTQgKzM2NSwxMSBAQAogCQkJCWNvbnRpbnVlCiAJCQl9CiAKLQkJCXZhciBwYXRocyBbXXN0cmluZwotCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNzLi4uKQotCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNKYXJzLi4uKQotCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5KYXJzLi4uKQogCQkJdW5pdHNCeUlkW25hbWVdID0gJnBiLkJ1aWxkYWJsZVVuaXR7CiAJCQkJSWQ6ICAgICAgICAgICAgICBuYW1lLAogCQkJCVNvdXJjZUZpbGVQYXRoczogbW9kLlNyY3MsCi0JCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIHBhdGhzKSwKKwkJCQlHZW5lcmF0ZWRGaWxlczogIGdlbkZpbGVzKGVudiwgbW9kKSwKKwkJCQlEZXBlbmRlbmN5SWRzOiAgIG1vZC5EZXBzLAogCQkJfQogCiAJCQlmb3IgXywgZCA6PSByYW5nZSBtb2QuRGVwcyB7CkBAIC0zNzksOCArMzg2LDEzIEBACiB9CiAKIC8vIGdlbkZpbGVzIHJldHVybnMgdGhlIGdlbmVyYXRlZCBmaWxlcyAocGF0aHMgdGhhdCBzdGFydCB3aXRoIG91dERpci8pIGZvciB0aGUKLS8vIGdpdmVuIHBhdGhzLiBHZW5lcmF0ZWQgZmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQuCi1mdW5jIGdlbkZpbGVzKGVudiBFbnYsIHBhdGhzIFtdc3RyaW5nKSBbXSpwYi5HZW5lcmF0ZWRGaWxlIHsKKy8vIGdpdmVuIG1vZHVsZS4gR2VuZXJhdGVkIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkLgorZnVuYyBnZW5GaWxlcyhlbnYgRW52LCBtb2QgKmphdmFNb2R1bGUpIFtdKnBiLkdlbmVyYXRlZEZpbGUgeworCXZhciBwYXRocyBbXXN0cmluZworCXBhdGhzID0gYXBwZW5kKHBhdGhzLCBtb2QuU3Jjcy4uLikKKwlwYXRocyA9IGFwcGVuZChwYXRocywgbW9kLlNyY0phcnMuLi4pCisJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5KYXJzLi4uKQorCiAJcHJlZml4IDo9IGVudi5PdXREaXIgKyAiLyIKIAl2YXIgcmV0IFtdKnBiLkdlbmVyYXRlZEZpbGUKIAlmb3IgXywgcCA6PSByYW5nZSBwYXRocyB7CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5zaAppbmRleCA2ZjliMGM0Li44ZGZmZmMxIDEwMDc1NQotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2gKQEAgLTE5LDcgKzE5LDcgQEAKIHJlcXVpcmVfdG9wCiAKICMgRW5zdXJlIGNvZ3NldHVwIChvdXQvIHdpbGwgYmUgc3ltbGluayBvdXRzaWRlIHRoZSByZXBvKQotLiAke1RPUH0vYnVpbGQvbWFrZS9jb2dzZXR1cC5zaAorc2V0dXBfY29nX2Vudl9pZl9uZWVkZWQKIAogY2FzZSAkKHVuYW1lIC1zKSBpbgogICAgIExpbnV4KQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dAppbmRleCBjZDdjZTZkLi5iZTQ4ZGExIDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dApAQCAtMSw3ICsxLDkgQEAKIAotA291dBKWYQotOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjGjhwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9iaW4vY2xhbmcrKxoHLW10aHVtYhoDLU9zGhQtZm9taXQtZnJhbWUtcG9pbnRlchoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgMtTzIaBS1XYWxsGgctV2V4dHJhGgstV2luaXQtc2VsZhoPLVdwb2ludGVyLWFyaXRoGhgtV3VuZ3VhcmRlZC1hdmFpbGFiaWxpdHkaES1XZXJyb3I9ZGF0ZS10aW1lGhYtV2Vycm9yPWludC1jb252ZXJzaW9uGhMtV2Vycm9yPXByYWdtYS1wYWNrGiYtV2Vycm9yPXByYWdtYS1wYWNrLXN1c3BpY2lvdXMtaW5jbHVkZRoYLVdlcnJvcj1zaXplb2YtYXJyYXktZGl2GhctV2Vycm9yPXN0cmluZy1wbHVzLWludBonLVdlcnJvcj11bnJlYWNoYWJsZS1jb2RlLWxvb3AtaW5jcmVtZW50GiItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zGhMtV25vLWM5OS1kZXNpZ25hdG9yGhktV25vLWdudS1mb2xkaW5nLWNvbnN0YW50GiItV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlGhwtV25vLWVycm9yPXJlb3JkZXItaW5pdC1saXN0GhYtV25vLXJlb3JkZXItaW5pdC1saXN0GhEtV25vLXNpZ24tY29tcGFyZRoLLVduby11bnVzZWQaCS1EQU5EUk9JRBoILUROREVCVUcaBy1VREVCVUcaKC1EX19jb21waWxlcl9vZmZzZXRvZj1fX2J1aWx0aW5fb2Zmc2V0b2YaKi1EX19BTkRST0lEX1VOQVZBSUxBQkxFX1NZTUJPTFNfQVJFX1dFQUtfXxoJLWZhZGRyc2lnGhktZmRlYnVnLWRlZmF1bHQtdmVyc2lvbj01GhMtZmNvbG9yLWRpYWdub3N0aWNzGhEtZmZwLWNvbnRyYWN0PW9mZhoPLWZuby1leGNlcHRpb25zGhQtZm5vLXN0cmljdC1hbGlhc2luZxoSLWZtZXNzYWdlLWxlbmd0aD0wGiMtZm5vLXJlbGF4ZWQtdGVtcGxhdGUtdGVtcGxhdGUtYXJncxoXLWdzaW1wbGUtdGVtcGxhdGUtbmFtZXMaCC1nej16c3RkGhYtbm8tY2Fub25pY2FsLXByZWZpeGVzGhEtV25vLWVycm9yPWZvcm1hdBoiLWZkZWJ1Zy1wcmVmaXgtbWFwPS9wcm9jL3NlbGYvY3dkPRocLWZ0cml2aWFsLWF1dG8tdmFyLWluaXQ9emVybxoCLWcaEy1mZnVuY3Rpb24tc2VjdGlvbnMaDy1mZGF0YS1zZWN0aW9ucxoQLWZuby1zaG9ydC1lbnVtcxoPLWZ1bndpbmQtdGFibGVzGhgtZnN0YWNrLXByb3RlY3Rvci1zdHJvbmcaES1XYSwtLW5vZXhlY3N0YWNrGhMtRF9GT1JUSUZZX1NPVVJDRT0yGhMtV3N0cmljdC1hbGlhc2luZz0yGhMtV2Vycm9yPXJldHVybi10eXBlGhgtV2Vycm9yPW5vbi12aXJ0dWFsLWR0b3IaDy1XZXJyb3I9YWRkcmVzcxoWLVdlcnJvcj1zZXF1ZW5jZS1wb2ludBoXLVdlcnJvcj1mb3JtYXQtc2VjdXJpdHkaDC1ub3N0ZGxpYmluYxoaLWZkZWJ1Zy1pbmZvLWZvci1wcm9maWxpbmcaDC1tc29mdC1mbG9hdBoOLW1hcmNoPWFybXY3LWEaEi1tZmxvYXQtYWJpPXNvZnRmcBoKLS1tZnB1PW5lb24aLy1JYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGrMBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90by9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAahQEtSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYy9hbmRyb2lkX2FybV9hcm12Ny1hLW5lb24vZ2VuL3Byb3RvGhQtRF9fTElCQ19BUElfXz0xMDAwMBoULURfX0xJQk1fQVBJX189MTAwMDAaFS1EX19MSUJETF9BUElfXz0xMDAwMBoXLUlleHRlcm5hbC9wcm90b2J1Zi9zcmMaWS1JcHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYW5kcm9pZF9saWJjKysvcGxhdGZvcm0vYXJtL2luY2x1ZGUvYysrL3YxGj0tSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2luY2x1ZGUvYysrL3YxGiAtSWJpb25pYy9saWJjL2FzeW5jX3NhZmUvaW5jbHVkZRofLUlzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZRonLUliaW9uaWMvbGliYy9zeXN0ZW1fcHJvcGVydGllcy9pbmNsdWRlGjwtSXN5c3RlbS9jb3JlL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL2luY2x1ZGUaCC1pc3lzdGVtGhNiaW9uaWMvbGliYy9pbmNsdWRlGggtaXN5c3RlbRofYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybRoILWlzeXN0ZW0aF2Jpb25pYy9saWJjL2tlcm5lbC91YXBpGggtaXN5c3RlbRofYmlvbmljL2xpYmMva2VybmVsL2FuZHJvaWQvc2NzaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3VhcGkaBy10YXJnZXQaHWFybXY3YS1saW51eC1hbmRyb2lkZWFiaTEwMDAwGhAtREFORFJPSURfU1RSSUNUGgUtZlBJRRoHLVdlcnJvchoVLVduby11bnVzZWQtcGFyYW1ldGVyGhktREdPT0dMRV9QUk9UT0JVRl9OT19SVFRJGhYtV2ltcGxpY2l0LWZhbGx0aHJvdWdoGiotRF9MSUJDUFBfRU5BQkxFX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTlMaFS1Xbm8tZ251LWluY2x1ZGUtbmV4dBobLWZ2aXNpYmlsaXR5LWlubGluZXMtaGlkZGVuGgYtbWxsdm0aGS1lbmFibGUtc2hyaW5rLXdyYXA9ZmFsc2UaDC1zdGQ9Z251KysyMBoJLWZuby1ydHRpGhUtSXN5c3RlbS9jb3JlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaHC1Jc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUaHi1JaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZRolLUloYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvaW5jbHVkZRoWLUloYXJkd2FyZS9yaWwvaW5jbHVkZRobLUlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlGiItSWZyYW1ld29ya3MvbmF0aXZlL29wZW5nbC9pbmNsdWRlGhctSWZyYW1ld29ya3MvYXYvaW5jbHVkZRoWLVdlcnJvcj1ib29sLW9wZXJhdGlvbhogLVdlcnJvcj1mb3JtYXQtaW5zdWZmaWNpZW50LWFyZ3MaJS1XZXJyb3I9aW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aGy1XZXJyb3I9aW50LWluLWJvb2wtY29udGV4dBobLVdlcnJvcj1pbnQtdG8tcG9pbnRlci1jYXN0GhstV2Vycm9yPXBvaW50ZXItdG8taW50LWNhc3QaFy1XZXJyb3I9eG9yLXVzZWQtYXMtcG93Gh4tV25vLXZvaWQtcG9pbnRlci10by1lbnVtLWNhc3QaHS1Xbm8tdm9pZC1wb2ludGVyLXRvLWludC1jYXN0GhgtV25vLXBvaW50ZXItdG8taW50LWNhc3QaFi1XZXJyb3I9Zm9ydGlmeS1zb3VyY2UaFC1Xbm8tdW51c2VkLXZhcmlhYmxlGh8tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzGhMtV25vLXBhY2tlZC1ub24tcG9kGhwtV2Vycm9yPWFkZHJlc3Mtb2YtdGVtcG9yYXJ5GistV2Vycm9yPWluY29tcGF0aWJsZS1mdW5jdGlvbi1wb2ludGVyLXR5cGVzGhgtV2Vycm9yPW51bGwtZGVyZWZlcmVuY2UaEy1XZXJyb3I9cmV0dXJuLXR5cGUaIi1Xbm8tdGF1dG9sb2dpY2FsLWNvbnN0YW50LWNvbXBhcmUaJC1Xbm8tdGF1dG9sb2dpY2FsLXR5cGUtbGltaXQtY29tcGFyZRoiLVduby1pbXBsaWNpdC1pbnQtZmxvYXQtY29udmVyc2lvbhohLVduby10YXV0b2xvZ2ljYWwtb3ZlcmxhcC1jb21wYXJlGhQtV25vLWRlcHJlY2F0ZWQtY29weRoZLVduby1yYW5nZS1sb29wLWNvbnN0cnVjdBoiLVduby16ZXJvLWFzLW51bGwtcG9pbnRlci1jb25zdGFudBopLVduby1kZXByZWNhdGVkLWFub24tZW51bS1lbnVtLWNvbnZlcnNpb24aJC1Xbm8tZGVwcmVjYXRlZC1lbnVtLWVudW0tY29udmVyc2lvbhoVLVduby1wZXNzaW1pemluZy1tb3ZlGh4tV25vLW5vbi1jLXR5cGVkZWYtZm9yLWxpbmthZ2UaEy1Xbm8tYWxpZ24tbWlzbWF0Y2gaIi1Xbm8tZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGUaIy1Xbm8tZXJyb3I9dW51c2VkLWJ1dC1zZXQtcGFyYW1ldGVyGh4tV25vLWVycm9yPWRlcHJlY2F0ZWQtYnVpbHRpbnMaFS1Xbm8tZXJyb3I9ZGVwcmVjYXRlZBoyLVduby1lcnJvcj1zaW5nbGUtYml0LWJpdGZpZWxkLWNvbnN0YW50LWNvbnZlcnNpb24aJC1Xbm8tZXJyb3I9ZW51bS1jb25zdGV4cHItY29udmVyc2lvbhobLVduby1lcnJvcj1pbnZhbGlkLW9mZnNldG9mGiYtV25vLWRlcHJlY2F0ZWQtZHluYW1pYy1leGNlcHRpb24tc3BlYxo4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2Mi1T8KKwNvdXQyeAorOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjEgIIARo4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2M6lyIKKzhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxACGjhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYyI4cHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MzA1NjcvYmluL2NsYW5nKysiDC1ub3N0ZGxpYmluYyIHLW10aHVtYiIDLU9zIhQtZm9taXQtZnJhbWUtcG9pbnRlciIGLW1sbHZtIhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlIgMtTzIiBS1XYWxsIgctV2V4dHJhIgstV2luaXQtc2VsZiIPLVdwb2ludGVyLWFyaXRoIhgtV3VuZ3VhcmRlZC1hdmFpbGFiaWxpdHkiES1XZXJyb3I9ZGF0ZS10aW1lIhYtV2Vycm9yPWludC1jb252ZXJzaW9uIhMtV2Vycm9yPXByYWdtYS1wYWNrIiYtV2Vycm9yPXByYWdtYS1wYWNrLXN1c3BpY2lvdXMtaW5jbHVkZSIYLVdlcnJvcj1zaXplb2YtYXJyYXktZGl2IhctV2Vycm9yPXN0cmluZy1wbHVzLWludCInLVdlcnJvcj11bnJlYWNoYWJsZS1jb2RlLWxvb3AtaW5jcmVtZW50IiItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIhMtV25vLWMyMy1leHRlbnNpb25zIhMtV25vLWM5OS1kZXNpZ25hdG9yIhktV25vLWdudS1mb2xkaW5nLWNvbnN0YW50IiItV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlIhwtV25vLWVycm9yPXJlb3JkZXItaW5pdC1saXN0IhYtV25vLXJlb3JkZXItaW5pdC1saXN0IhEtV25vLXNpZ24tY29tcGFyZSILLVduby11bnVzZWQiCS1EQU5EUk9JRCIILUROREVCVUciBy1VREVCVUciKC1EX19jb21waWxlcl9vZmZzZXRvZj1fX2J1aWx0aW5fb2Zmc2V0b2YiKi1EX19BTkRST0lEX1VOQVZBSUxBQkxFX1NZTUJPTFNfQVJFX1dFQUtfXyIJLWZhZGRyc2lnIhktZmRlYnVnLWRlZmF1bHQtdmVyc2lvbj01IhMtZmNvbG9yLWRpYWdub3N0aWNzIhEtZmZwLWNvbnRyYWN0PW9mZiIPLWZuby1leGNlcHRpb25zIhQtZm5vLXN0cmljdC1hbGlhc2luZyISLWZtZXNzYWdlLWxlbmd0aD0wIhctZ3NpbXBsZS10ZW1wbGF0ZS1uYW1lcyIILWd6PXpzdGQiFi1uby1jYW5vbmljYWwtcHJlZml4ZXMiIi1mZGVidWctcHJlZml4LW1hcD0vcHJvYy9zZWxmL2N3ZD0iHC1mdHJpdmlhbC1hdXRvLXZhci1pbml0PXplcm8iAi1nIhMtZmZ1bmN0aW9uLXNlY3Rpb25zIg8tZmRhdGEtc2VjdGlvbnMiEC1mbm8tc2hvcnQtZW51bXMiDy1mdW53aW5kLXRhYmxlcyIYLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nIhEtV2EsLS1ub2V4ZWNzdGFjayITLURfRk9SVElGWV9TT1VSQ0U9MiITLVdzdHJpY3QtYWxpYXNpbmc9MiITLVdlcnJvcj1yZXR1cm4tdHlwZSIYLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yIg8tV2Vycm9yPWFkZHJlc3MiFi1XZXJyb3I9c2VxdWVuY2UtcG9pbnQiFy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5IgwtbXNvZnQtZmxvYXQiDi1tYXJjaD1hcm12Ny1hIhItbWZsb2F0LWFiaT1zb2Z0ZnAiCistbWZwdT1uZW9uIi8tSWJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcCKzAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwIoUBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90byIULURfX0xJQkNfQVBJX189MTAwMDAiFC1EX19MSUJNX0FQSV9fPTEwMDAwIhUtRF9fTElCRExfQVBJX189MTAwMDAiFy1JZXh0ZXJuYWwvcHJvdG9idWYvc3JjIlktSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTMwNTY3L2FuZHJvaWRfbGliYysrL3BsYXRmb3JtL2FybS9pbmNsdWRlL2MrKy92MSI9LUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUzMDU2Ny9pbmNsdWRlL2MrKy92MSIgLUliaW9uaWMvbGliYy9hc3luY19zYWZlL2luY2x1ZGUiHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUiJy1JYmlvbmljL2xpYmMvc3lzdGVtX3Byb3BlcnRpZXMvaW5jbHVkZSI8LUlzeXN0ZW0vY29yZS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlIggtaXN5c3RlbSITYmlvbmljL2xpYmMvaW5jbHVkZSIILWlzeXN0ZW0iH2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm0iCC1pc3lzdGVtIhdiaW9uaWMvbGliYy9rZXJuZWwvdWFwaSIILWlzeXN0ZW0iH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3Njc2kiCC1pc3lzdGVtIh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC91YXBpIgctdGFyZ2V0Ih1hcm12N2EtbGludXgtYW5kcm9pZGVhYmkxMDAwMCIQLURBTkRST0lEX1NUUklDVCIFLWZQSUUiBy1XZXJyb3IiFS1Xbm8tdW51c2VkLXBhcmFtZXRlciIZLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSIWLVdpbXBsaWNpdC1mYWxsdGhyb3VnaCIqLURfTElCQ1BQX0VOQUJMRV9USFJFQURfU0FGRVRZX0FOTk9UQVRJT05TIhUtV25vLWdudS1pbmNsdWRlLW5leHQiGy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbiIGLW1sbHZtIhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlIgwtc3RkPWdudSsrMjAiCS1mbm8tcnR0aSIVLUlzeXN0ZW0vY29yZS9pbmNsdWRlIh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlIhwtSXN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlIh4tSWhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUiJS1JaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUiFi1JaGFyZHdhcmUvcmlsL2luY2x1ZGUiGy1JZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIiLUlmcmFtZXdvcmtzL25hdGl2ZS9vcGVuZ2wvaW5jbHVkZSIXLUlmcmFtZXdvcmtzL2F2L2luY2x1ZGUiFi1XZXJyb3I9Ym9vbC1vcGVyYXRpb24iIC1XZXJyb3I9Zm9ybWF0LWluc3VmZmljaWVudC1hcmdzIiUtV2Vycm9yPWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uIhstV2Vycm9yPWludC1pbi1ib29sLWNvbnRleHQiGy1XZXJyb3I9aW50LXRvLXBvaW50ZXItY2FzdCIbLVdlcnJvcj1wb2ludGVyLXRvLWludC1jYXN0IhctV2Vycm9yPXhvci11c2VkLWFzLXBvdyIeLVduby12b2lkLXBvaW50ZXItdG8tZW51bS1jYXN0Ih0tV25vLXZvaWQtcG9pbnRlci10by1pbnQtY2FzdCIYLVduby1wb2ludGVyLXRvLWludC1jYXN0IhYtV2Vycm9yPWZvcnRpZnktc291cmNlIhQtV25vLXVudXNlZC12YXJpYWJsZSIfLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyITLVduby1wYWNrZWQtbm9uLXBvZCIcLVdlcnJvcj1hZGRyZXNzLW9mLXRlbXBvcmFyeSIrLVdlcnJvcj1pbmNvbXBhdGlibGUtZnVuY3Rpb24tcG9pbnRlci10eXBlcyIYLVdlcnJvcj1udWxsLWRlcmVmZXJlbmNlIhMtV2Vycm9yPXJldHVybi10eXBlIiItV25vLXRhdXRvbG9naWNhbC1jb25zdGFudC1jb21wYXJlIiQtV25vLXRhdXRvbG9naWNhbC10eXBlLWxpbWl0LWNvbXBhcmUiIi1Xbm8taW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24iIS1Xbm8tdGF1dG9sb2dpY2FsLW92ZXJsYXAtY29tcGFyZSIULVduby1kZXByZWNhdGVkLWNvcHkiGS1Xbm8tcmFuZ2UtbG9vcC1jb25zdHJ1Y3QiIi1Xbm8temVyby1hcy1udWxsLXBvaW50ZXItY29uc3RhbnQiKS1Xbm8tZGVwcmVjYXRlZC1hbm9uLWVudW0tZW51bS1jb252ZXJzaW9uIiQtV25vLWRlcHJlY2F0ZWQtZW51bS1lbnVtLWNvbnZlcnNpb24iGy1Xbm8tZXJyb3I9cGVzc2ltaXppbmctbW92ZSIeLVduby1ub24tYy10eXBlZGVmLWZvci1saW5rYWdlIhMtV25vLWFsaWduLW1pc21hdGNoIiItV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXZhcmlhYmxlIiMtV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXBhcmFtZXRlciIeLVduby1lcnJvcj1kZXByZWNhdGVkLWJ1aWx0aW5zIhUtV25vLWVycm9yPWRlcHJlY2F0ZWQiJi1Xbm8tZGVwcmVjYXRlZC1keW5hbWljLWV4Y2VwdGlvbi1zcGVjIiQtV25vLWVycm9yPWVudW0tY29uc3RleHByLWNvbnZlcnNpb24iGy1Xbm8tZXJyb3I9aW52YWxpZC1vZmZzZXRvZiIpLVduby1lcnJvcj10aHJlYWQtc2FmZXR5LXJlZmVyZW5jZS1yZXR1cm4iFi1Xbm8tdmxhLWN4eC1leHRlbnNpb24iOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjMkVnZW5maWxlc19mb3JfYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2M6n0AKK0VnZW5maWxlc19mb3JfYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2Mq1T8KILYBc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90by9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnBiLmgSmT4vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQogLy8gc291cmNlOiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmEgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDNmNzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UganZtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworLyoqIEZvbyBjbGFzcy4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGb28geworCisgIHZvaWQgdGVzdENvbXBsZXRpb24oKSB7CisgICAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4obGlzdCk7CisKKyAgICAvLyBeCisKKyAgICAvLyBzdGVwCisgICAgLy8gOyBUZXN0IGNvbXBsZXRpb24gb24gdGhlIHN0YW5kYXJkIHR5cGVzLgorICAgIC8vIHR5cGUoImxpc3QuIikKKyAgICAvLyBjb21wbGV0aW9uLnRyaWdnZXIoKQorICAgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0iYWRkLioiKQorICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL3N1aXRlLnRleHRwYiBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vc3VpdGUudGV4dHBiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGUwOGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL3N1aXRlLnRleHRwYgpAQCAtMCwwICsxLDQgQEAKK3Rlc3RzOiB7CisgIG5hbWU6ICJnZW5lcmFsIgorICBzY3JpcHRzOiAiYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhIgorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoCmluZGV4IDJlZGZlNTMuLjA0YTAyNjQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9yZWdlbi5zaAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKQEAgLTIxLDEzICsyMSw4IEBACiAjIGlkZV9xdWVyeS5zaC4gVGhlIHByb2JlciBkb2Vzbid0IGNoZWNrLW91dCB0aGUgZnVsbCBzb3VyY2UgY29kZSwgc28gaXQKICMgY2FuJ3QgcnVuIGlkZV9xdWVyeS5zaCBpdHNlbGYuCiAKLWNkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpCi1zb3VyY2UgJChwd2QpLy4uLy4uLy4uL3NoZWxsX3V0aWxzLnNoCi1yZXF1aXJlX3RvcAotCiBmaWxlc190b19idWlsZD0oCiAgIGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCiApCiAKLWNkICR7VE9QfQogYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIC0tbHVuY2hfdGFyZ2V0PWFvc3BfYXJtLXRydW5rX3N0YWdpbmctZW5nICR7ZmlsZXNfdG9fYnVpbGRbQF19ID4gYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dApkaWZmIC0tZ2l0IGEvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weSBiL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKaW5kZXggYmJkNjVmYS4uZTNkYzA3ZSAxMDA3NTUKLS0tIGEvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weQorKysgYi90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5CkBAIC0xNSwxNiArMTUsMTIgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICIiIgotVXNhZ2U6IGphdmEtZXZlbnQtbG9nLXRhZ3MucHkgWy1vIG91dHB1dF9maWxlXSA8aW5wdXRfZmlsZT4gPG1lcmdlZF90YWdzX2ZpbGU+Ci0KIEdlbmVyYXRlIGEgamF2YSBjbGFzcyBjb250YWluaW5nIGNvbnN0YW50cyBmb3IgZWFjaCBvZiB0aGUgZXZlbnQgbG9nCiB0YWdzIGluIHRoZSBnaXZlbiBpbnB1dCBmaWxlLgotCi0taCB0byBkaXNwbGF5IHRoaXMgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KICIiIgogCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwotaW1wb3J0IGdldG9wdAoraW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgb3MKIGltcG9ydCBvcy5wYXRoCiBpbXBvcnQgcmUKQEAgLTMyLDU3ICsyOCwxNCBAQAogCiBpbXBvcnQgZXZlbnRfbG9nX3RhZ3MKIAotb3V0cHV0X2ZpbGUgPSBOb25lCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCBkZXN0PSdvdXRwdXRfZmlsZScpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCdmaWxlJykKK2FyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKLXRyeToKLSAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiaG86IikKLWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3IgYXMgZXJyOgotICBwcmludChzdHIoZXJyKSkKLSAgcHJpbnQoX19kb2NfXykKLSAgc3lzLmV4aXQoMikKLQotZm9yIG8sIGEgaW4gb3B0czoKLSAgaWYgbyA9PSAiLWgiOgotICAgIHByaW50KF9fZG9jX18pCi0gICAgc3lzLmV4aXQoMikKLSAgZWxpZiBvID09ICItbyI6Ci0gICAgb3V0cHV0X2ZpbGUgPSBhCi0gIGVsc2U6Ci0gICAgcHJpbnQoInVuaGFuZGxlZCBvcHRpb24gJXMiICUgKG8sKSwgZmlsZT1zeXMuc3RkZXJyKQotICAgIHN5cy5leGl0KDEpCi0KLWlmIGxlbihhcmdzKSAhPSAxIGFuZCBsZW4oYXJncykgIT0gMjoKLSAgcHJpbnQoIm5lZWQgb25lIG9yIHR3byBpbnB1dCBmaWxlcywgbm90ICVkIiAlIChsZW4oYXJncyksKSkKLSAgcHJpbnQoX19kb2NfXykKLSAgc3lzLmV4aXQoMSkKLQotZm4gPSBhcmdzWzBdCitmbiA9IGFyZ3MuZmlsZQogdGFnZmlsZSA9IGV2ZW50X2xvZ190YWdzLlRhZ0ZpbGUoZm4pCiAKLWlmIGxlbihhcmdzKSA+IDE6Ci0gICMgTG9hZCB0aGUgbWVyZ2VkIHRhZyBmaWxlICh3aGljaCBzaG91bGQgaGF2ZSBudW1iZXJzIGFzc2lnbmVkIGZvciBhbGwKLSAgIyB0YWdzLiAgVXNlIHRoZSBudW1iZXJzIGZyb20gdGhlIG1lcmdlZCBmaWxlIHRvIGZpbGwgaW4gYW55IG1pc3NpbmcKLSAgIyBudW1iZXJzIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gIG1lcmdlZF9mbiA9IGFyZ3NbMV0KLSAgbWVyZ2VkX3RhZ2ZpbGUgPSBldmVudF9sb2dfdGFncy5UYWdGaWxlKG1lcmdlZF9mbikKLSAgbWVyZ2VkX2J5X25hbWUgPSBkaWN0KFsodC50YWduYW1lLCB0KSBmb3IgdCBpbiBtZXJnZWRfdGFnZmlsZS50YWdzXSkKLSAgZm9yIHQgaW4gdGFnZmlsZS50YWdzOgotICAgIGlmIHQudGFnbnVtIGlzIE5vbmU6Ci0gICAgICBpZiB0LnRhZ25hbWUgaW4gbWVyZ2VkX2J5X25hbWU6Ci0gICAgICAgIHQudGFnbnVtID0gbWVyZ2VkX2J5X25hbWVbdC50YWduYW1lXS50YWdudW0KLSAgICAgIGVsc2U6Ci0gICAgICAgICMgV2UncmUgYnVpbGRpbmcgc29tZXRoaW5nIHRoYXQncyBub3QgYmVpbmcgaW5jbHVkZWQgaW4gdGhlCi0gICAgICAgICMgcHJvZHVjdCwgc28gaXRzIHRhZ3MgZG9uJ3QgYXBwZWFyIGluIHRoZSBtZXJnZWQgZmlsZS4gIEFzc2lnbgotICAgICAgICAjIHRoZW0gYWxsIGFuIGFyYml0cmFyeSBudW1iZXIgc28gd2UgY2FuIGVtaXQgdGhlIGphdmEgYW5kCi0gICAgICAgICMgY29tcGlsZSB0aGUgKHVudXNlZCkgcGFja2FnZS4KLSAgICAgICAgdC50YWdudW0gPSA5OTk5OTkKLWVsc2U6Ci0gICMgTm90IHVzaW5nIHRoZSBtZXJnZWQgdGFnIGZpbGUsIHNvIGFsbCB0YWdzIG11c3QgaGF2ZSBtYW51YWxseSBhc3NpZ25lZAotICAjIG51bWJlcnMKLSAgZm9yIHQgaW4gdGFnZmlsZS50YWdzOgotICAgIGlmIHQudGFnbnVtIGlzIE5vbmU6Ci0gICAgICB0YWdmaWxlZi5BZGRFcnJvcigidGFnIFwiJXNcIiBoYXMgbm8gbnVtYmVyIiAlICh0YWduYW1lLCksIHRhZy5saW5lbnVtKQotCiBpZiAiamF2YV9wYWNrYWdlIiBub3QgaW4gdGFnZmlsZS5vcHRpb25zOgogICB0YWdmaWxlLkFkZEVycm9yKCJqYXZhX3BhY2thZ2Ugb3B0aW9uIG5vdCBzcGVjaWZpZWQiLCBsaW5lbnVtPTApCiAKQEAgLTE0MSwxMSArOTQsMTEgQEAKIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKICAgbWV0aG9kTmFtZSA9IGphdmFOYW1lKCJ3cml0ZV8iICsgdC50YWduYW1lKQogICBpZiB0LmRlc2NyaXB0aW9uOgotICAgIGFyZ3MgPSBbYXJnLnN0cmlwKCIoKSAiKS5zcGxpdCgifCIpIGZvciBhcmcgaW4gdC5kZXNjcmlwdGlvbi5zcGxpdCgiLCIpXQorICAgIGZuX2FyZ3MgPSBbYXJnLnN0cmlwKCIoKSAiKS5zcGxpdCgifCIpIGZvciBhcmcgaW4gdC5kZXNjcmlwdGlvbi5zcGxpdCgiLCIpXQogICBlbHNlOgotICAgIGFyZ3MgPSBbXQotICBhcmdUeXBlc05hbWVzID0gIiwgIi5qb2luKFtqYXZhVHlwZXNbaW50KGFyZ1sxXSldICsgIiAiICsgamF2YU5hbWUoYXJnWzBdKSBmb3IgYXJnIGluIGFyZ3NdKQotICBhcmdOYW1lcyA9ICIiLmpvaW4oWyIsICIgKyBqYXZhTmFtZShhcmdbMF0pIGZvciBhcmcgaW4gYXJnc10pCisgICAgZm5fYXJncyA9IFtdCisgIGFyZ1R5cGVzTmFtZXMgPSAiLCAiLmpvaW4oW2phdmFUeXBlc1tpbnQoYXJnWzFdKV0gKyAiICIgKyBqYXZhTmFtZShhcmdbMF0pIGZvciBhcmcgaW4gZm5fYXJnc10pCisgIGFyZ05hbWVzID0gIiIuam9pbihbIiwgIiArIGphdmFOYW1lKGFyZ1swXSkgZm9yIGFyZyBpbiBmbl9hcmdzXSkKICAgYnVmZmVyLndyaXRlKCJcbiAgcHVibGljIHN0YXRpYyB2b2lkICVzKCVzKSB7IiAlIChtZXRob2ROYW1lLCBhcmdUeXBlc05hbWVzKSkKICAgYnVmZmVyLndyaXRlKCJcbiAgICBhbmRyb2lkLnV0aWwuRXZlbnRMb2cud3JpdGVFdmVudCglcyVzKTsiICUgKHQudGFnbmFtZS51cHBlcigpLCBhcmdOYW1lcykpCiAgIGJ1ZmZlci53cml0ZSgiXG4gIH1cbiIpCkBAIC0xNTMsOCArMTA2LDggQEAKIAogYnVmZmVyLndyaXRlKCJ9XG4iKTsKIAotb3V0cHV0X2RpciA9IG9zLnBhdGguZGlybmFtZShvdXRwdXRfZmlsZSkKK291dHB1dF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYXJncy5vdXRwdXRfZmlsZSkKIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXRfZGlyKToKICAgb3MubWFrZWRpcnMob3V0cHV0X2RpcikKIAotZXZlbnRfbG9nX3RhZ3MuV3JpdGVPdXRwdXQob3V0cHV0X2ZpbGUsIGJ1ZmZlcikKK2V2ZW50X2xvZ190YWdzLldyaXRlT3V0cHV0KGFyZ3Mub3V0cHV0X2ZpbGUsIGJ1ZmZlcikKZGlmZiAtLWdpdCBhL3Rvb2xzL21lcmdlLWV2ZW50LWxvZy10YWdzLnB5IGIvdG9vbHMvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkKaW5kZXggMjkyNjA0Yy4uNTczMGMxMSAxMDA3NTUKLS0tIGEvdG9vbHMvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkKKysrIGIvdG9vbHMvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkKQEAgLTE1LDIyICsxNSwxMyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIiIiCi1Vc2FnZTogbWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkgWy1vIG91dHB1dF9maWxlXSBbaW5wdXRfZmlsZXMuLi5dCi0KIE1lcmdlIHRvZ2V0aGVyIHplcm8gb3IgbW9yZSBldmVudC1sb2dzLXRhZ3MgZmlsZXMgdG8gcHJvZHVjZSBhIHNpbmdsZQogb3V0cHV0IGZpbGUsIHN0cmlwcGVkIG9mIGNvbW1lbnRzLiAgQ2hlY2tzIHRoYXQgbm8gdGFnIG51bWJlcnMgY29uZmxpY3QKIGFuZCBmYWlscyBpZiB0aGV5IGRvLgotCi0taCB0byBkaXNwbGF5IHRoaXMgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KICIiIgogCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwotaW1wb3J0IGdldG9wdAotdHJ5OgotICBpbXBvcnQgaGFzaGxpYgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgbWQ1IGFzIGhhc2hsaWIKLWltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBhcmdwYXJzZQogaW1wb3J0IHN5cwogCiBpbXBvcnQgZXZlbnRfbG9nX3RhZ3MKQEAgLTM4LDMyICsyOSwxMCBAQAogZXJyb3JzID0gW10KIHdhcm5pbmdzID0gW10KIAotb3V0cHV0X2ZpbGUgPSBOb25lCi1wcmVfbWVyZ2VkX2ZpbGUgPSBOb25lCi0KLSMgVGFncyB3aXRoIGEgdGFnIG51bWJlciBvZiA/IGFyZSBhc3NpZ25lZCBhIHRhZyBpbiB0aGUgcmFuZ2UKLSMgW0FTU0lHTl9TVEFSVCwgQVNTSUdOX0xJTUlUKS4KLUFTU0lHTl9TVEFSVCA9IDkwMDAwMAotQVNTSUdOX0xJTUlUID0gMTAwMDAwMAotCi10cnk6Ci0gIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImhvOm06IikKLWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3IgYXMgZXJyOgotICBwcmludChzdHIoZXJyKSkKLSAgcHJpbnQoX19kb2NfXykKLSAgc3lzLmV4aXQoMikKLQotZm9yIG8sIGEgaW4gb3B0czoKLSAgaWYgbyA9PSAiLWgiOgotICAgIHByaW50KF9fZG9jX18pCi0gICAgc3lzLmV4aXQoMikKLSAgZWxpZiBvID09ICItbyI6Ci0gICAgb3V0cHV0X2ZpbGUgPSBhCi0gIGVsaWYgbyA9PSAiLW0iOgotICAgIHByZV9tZXJnZWRfZmlsZSA9IGEKLSAgZWxzZToKLSAgICBwcmludCgidW5oYW5kbGVkIG9wdGlvbiAlcyIgJSAobywpLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgc3lzLmV4aXQoMSkKK3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctbycsIGRlc3Q9J291dHB1dF9maWxlJykKK3BhcnNlci5hZGRfYXJndW1lbnQoJ2ZpbGVzJywgbmFyZ3M9JyonKQorYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAogIyBSZXN0cmljdGlvbnMgb24gdGFnczoKICMKQEAgLTc3LDEyICs0Niw3IEBACiBieV90YWduYW1lID0ge30KIGJ5X3RhZ251bSA9IHt9CiAKLXByZV9tZXJnZWRfdGFncyA9IHt9Ci1pZiBwcmVfbWVyZ2VkX2ZpbGU6Ci0gIGZvciB0IGluIGV2ZW50X2xvZ190YWdzLlRhZ0ZpbGUocHJlX21lcmdlZF9maWxlKS50YWdzOgotICAgIHByZV9tZXJnZWRfdGFnc1t0LnRhZ25hbWVdID0gdAotCi1mb3IgZm4gaW4gYXJnczoKK2ZvciBmbiBpbiBhcmdzLmZpbGVzOgogICB0YWdmaWxlID0gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShmbikKIAogICBmb3IgdCBpbiB0YWdmaWxlLnRhZ3M6CkBAIC05MywxMiArNTcsNiBAQAogICAgIGlmIHQudGFnbmFtZSBpbiBieV90YWduYW1lOgogICAgICAgb3JpZyA9IGJ5X3RhZ25hbWVbdC50YWduYW1lXQogCi0gICAgICAjIEFsbG93IGFuIGV4cGxpY2l0IHRhZyBudW1iZXIgdG8gZGVmaW5lIGFuIGltcGxpY2l0IHRhZyBudW1iZXIKLSAgICAgIGlmIG9yaWcudGFnbnVtIGlzIE5vbmU6Ci0gICAgICAgIG9yaWcudGFnbnVtID0gdC50YWdudW0KLSAgICAgIGVsaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICAgICAgdC50YWdudW0gPSBvcmlnLnRhZ251bQotCiAgICAgICBpZiAodC50YWdudW0gPT0gb3JpZy50YWdudW0gYW5kCiAgICAgICAgICAgdC5kZXNjcmlwdGlvbiA9PSBvcmlnLmRlc2NyaXB0aW9uKToKICAgICAgICAgIyBpZiB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gYXJlIGlkZW50aWNhbCwgaXNzdWUgYSB3YXJuaW5nCkBAIC0xMTQsNyArNzIsNyBAQAogICAgICAgICAgICAgbGluZW51bT10LmxpbmVudW0pCiAgICAgICBjb250aW51ZQogCi0gICAgaWYgdC50YWdudW0gaXMgbm90IE5vbmUgYW5kIHQudGFnbnVtIGluIGJ5X3RhZ251bToKKyAgICBpZiB0LnRhZ251bSBpbiBieV90YWdudW06CiAgICAgICBvcmlnID0gYnlfdGFnbnVtW3QudGFnbnVtXQogCiAgICAgICBpZiB0LnRhZ25hbWUgIT0gb3JpZy50YWduYW1lOgpAQCAtMTI1LDggKzgzLDcgQEAKICAgICAgICAgY29udGludWUKIAogICAgIGJ5X3RhZ25hbWVbdC50YWduYW1lXSA9IHQKLSAgICBpZiB0LnRhZ251bSBpcyBub3QgTm9uZToKLSAgICAgIGJ5X3RhZ251bVt0LnRhZ251bV0gPSB0CisgICAgYnlfdGFnbnVtW3QudGFnbnVtXSA9IHQKIAogICBlcnJvcnMuZXh0ZW5kKHRhZ2ZpbGUuZXJyb3JzKQogICB3YXJuaW5ncy5leHRlbmQodGFnZmlsZS53YXJuaW5ncykKQEAgLTE0MCwzOCArOTcsNiBAQAogICBmb3IgZm4sIGxuLCBtc2cgaW4gd2FybmluZ3M6CiAgICAgcHJpbnQoIiVzOiVkOiB3YXJuaW5nOiAlcyIgJSAoZm4sIGxuLCBtc2cpLCBmaWxlPXN5cy5zdGRlcnIpCiAKLSMgUHl0aG9uJ3MgaGFzaCBmdW5jdGlvbiAoYSkgaXNuJ3QgZ3JlYXQgYW5kIChiKSB2YXJpZXMgYmV0d2VlbgotIyB2ZXJzaW9ucyBvZiBweXRob24uICBVc2luZyBtZDUgaXMgb3ZlcmtpbGwgaGVyZSBidXQgaXMgdGhlIHNhbWUgZnJvbQotIyBwbGF0Zm9ybSB0byBwbGF0Zm9ybSBhbmQgc3BlZWQgc2hvdWxkbid0IG1hdHRlciBpbiBwcmFjdGljZS4KLWRlZiBoYXNobmFtZShzdHIpOgotICBkID0gaGFzaGxpYi5tZDUoc3RyKS5kaWdlc3QoKVs6NF0KLSAgcmV0dXJuIHN0cnVjdC51bnBhY2soIiFJIiwgZClbMF0KLQotIyBBc3NpZ24gYSB0YWcgbnVtYmVyIHRvIGFsbCB0aGUgZW50cmllcyB0aGF0IHNheSB0aGV5IHdhbnQgb25lCi0jIGFzc2lnbmVkLiAgV2UgZG8gdGhpcyBiYXNlZCBvbiBhIGhhc2ggb2YgdGhlIHRhZyBuYW1lIHNvIHRoYXQgdGhlCi0jIG51bWJlcnMgc2hvdWxkIHN0YXkgcmVsYXRpdmVseSBzdGFibGUgYXMgdGFncyBhcmUgYWRkZWQuCi0KLSMgSWYgd2Ugd2VyZSBwcm92aWRlZCBwcmUtbWVyZ2VkIHRhZ3MgKHcvIHRoZSAtbSBvcHRpb24pLCB0aGVuIGRvbid0Ci0jIGV2ZXIgdHJ5IHRvIGFsbG9jYXRlIG9uZSwganVzdCBmYWlsIGlmIHdlIGRvbid0IGhhdmUgYSBudW1iZXIKLQotZm9yIG5hbWUsIHQgaW4gc29ydGVkKGJ5X3RhZ25hbWUuaXRlbXMoKSk6Ci0gIGlmIHQudGFnbnVtIGlzIE5vbmU6Ci0gICAgaWYgcHJlX21lcmdlZF90YWdzOgotICAgICAgdHJ5OgotICAgICAgICB0LnRhZ251bSA9IHByZV9tZXJnZWRfdGFnc1t0LnRhZ25hbWVdCi0gICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHByaW50KCJFcnJvcjogVGFnIG51bWJlciBub3QgZGVmaW5lZCBmb3IgdGFnIGAlcycuIEhhdmUgeW91IGRvbmUgYSBmdWxsIGJ1aWxkPyIgJSB0LnRhZ25hbWUsCi0gICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgc3lzLmV4aXQoMSkKLSAgICBlbHNlOgotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgeCA9IChoYXNobmFtZShuYW1lKSAlIChBU1NJR05fTElNSVQgLSBBU1NJR05fU1RBUlQgLSAxKSkgKyBBU1NJR05fU1RBUlQKLSAgICAgICAgaWYgeCBub3QgaW4gYnlfdGFnbnVtOgotICAgICAgICAgIHQudGFnbnVtID0geAotICAgICAgICAgIGJ5X3RhZ251bVt4XSA9IHQKLSAgICAgICAgICBicmVhawotICAgICAgICBuYW1lID0gIl8iICsgbmFtZQotCiAjIGJ5X3RhZ251bSBzaG91bGQgYmUgY29tcGxldGUgbm93OyB3ZSd2ZSBhc3NpZ25lZCBudW1iZXJzIHRvIGFsbCB0YWdzLgogCiBidWZmZXIgPSBTdHJpbmdJTygpCkBAIC0xODEsNCArMTA2LDQgQEAKICAgZWxzZToKICAgICBidWZmZXIud3JpdGUoIiVkICVzXG4iICUgKHQudGFnbnVtLCB0LnRhZ25hbWUpKQogCi1ldmVudF9sb2dfdGFncy5Xcml0ZU91dHB1dChvdXRwdXRfZmlsZSwgYnVmZmVyKQorZXZlbnRfbG9nX3RhZ3MuV3JpdGVPdXRwdXQoYXJncy5vdXRwdXRfZmlsZSwgYnVmZmVyKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvQW5kcm9pZC5icCBiL3Rvb2xzL21ldGFkYXRhL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDEwNmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgewotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KLQotYmx1ZXByaW50X2dvX2JpbmFyeSB7Ci0gICAgbmFtZTogIm1ldGFkYXRhIiwKLSAgICBkZXBzOiBbCi0gICAgICAgICAgICAic29vbmctdGVzdGluZy10ZXN0X3NwZWNfcHJvdG8iLAotICAgICAgICAgICAgInNvb25nLXRlc3RpbmctY29kZV9tZXRhZGF0YV9wcm90byIsCi0gICAgICAgICAgICAic29vbmctdGVzdGluZy1jb2RlX21ldGFkYXRhX2ludGVybmFsX3Byb3RvIiwKLSAgICAgICAgICAgICJnb2xhbmctcHJvdG9idWYtcHJvdG8iLAotICAgICAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImdlbmVyYXRvci5nbyIsCi0gICAgXQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL09XTkVSUyBiL3Rvb2xzL21ldGFkYXRhL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiY2RmMS4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWRhcmlvZnJlbmlAZ29vZ2xlLmNvbQotam9lb0Bnb29nbGUuY29tCi1yb25pc2hAZ29vZ2xlLmNvbQotY2FkaXR5YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9nZW5lcmF0b3IuZ28gYi90b29scy9tZXRhZGF0YS9nZW5lcmF0b3IuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NjY4YmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvZ2VuZXJhdG9yLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLXBhY2thZ2UgbWFpbgotCi1pbXBvcnQgKAotCSJmbGFnIgotCSJmbXQiCi0JImlvIgotCSJsb2ciCi0JIm9zIgotCSJzb3J0IgotCSJzdHJpbmdzIgotCSJzeW5jIgotCi0JImFuZHJvaWQvc29vbmcvdGVzdGluZy9jb2RlX21ldGFkYXRhX2ludGVybmFsX3Byb3RvIgotCSJhbmRyb2lkL3Nvb25nL3Rlc3RpbmcvY29kZV9tZXRhZGF0YV9wcm90byIKLQkiYW5kcm9pZC9zb29uZy90ZXN0aW5nL3Rlc3Rfc3BlY19wcm90byIKLQkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcHJvdG8iCi0pCi0KLXR5cGUga2V5VG9Mb2Nrc01hcCBzdHJ1Y3QgewotCWxvY2tzIHN5bmMuTWFwCi19Ci0KLWZ1bmMgKGtsICprZXlUb0xvY2tzTWFwKSBHZXRMb2NrRm9yS2V5KGtleSBzdHJpbmcpICpzeW5jLk11dGV4IHsKLQltdXRleCwgXyA6PSBrbC5sb2Nrcy5Mb2FkT3JTdG9yZShrZXksICZzeW5jLk11dGV4e30pCi0JcmV0dXJuIG11dGV4Ligqc3luYy5NdXRleCkKLX0KLQotLy8gRGVmaW5lIGEgc3RydWN0IHRvIGhvbGQgdGhlIGNvbWJpbmF0aW9uIG9mIHRlYW0gSUQgYW5kIG11bHRpLW93bmVyc2hpcCBmbGFnIGZvciB2YWxpZGF0aW9uCi10eXBlIHNvdXJjZUZpbGVBdHRyaWJ1dGVzIHN0cnVjdCB7Ci0JVGVhbUlEICAgICAgICAgc3RyaW5nCi0JTXVsdGlPd25lcnNoaXAgYm9vbAotCVBhdGggICAgICAgICAgIHN0cmluZwotfQotCi1mdW5jIGdldFNvcnRlZEtleXMoc3luY01hcCAqc3luYy5NYXApIFtdc3RyaW5nIHsKLQl2YXIgYWxsS2V5cyBbXXN0cmluZwotCXN5bmNNYXAuUmFuZ2UoCi0JCWZ1bmMoa2V5LCBfIGludGVyZmFjZXt9KSBib29sIHsKLQkJCWFsbEtleXMgPSBhcHBlbmQoYWxsS2V5cywga2V5LihzdHJpbmcpKQotCQkJcmV0dXJuIHRydWUKLQkJfSwKLQkpCi0KLQlzb3J0LlN0cmluZ3MoYWxsS2V5cykKLQlyZXR1cm4gYWxsS2V5cwotfQotCi0vLyB3cml0ZVByb3RvVG9GaWxlIG1hcnNoYWxzIGEgcHJvdG9idWYgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIGEgZmlsZQotZnVuYyB3cml0ZVByb3RvVG9GaWxlKG91dHB1dEZpbGUgc3RyaW5nLCBtZXNzYWdlIHByb3RvLk1lc3NhZ2UpIHsKLQlkYXRhLCBlcnIgOj0gcHJvdG8uTWFyc2hhbChtZXNzYWdlKQotCWlmIGVyciAhPSBuaWwgewotCQlsb2cuRmF0YWwoZXJyKQotCX0KLQlmaWxlLCBlcnIgOj0gb3MuQ3JlYXRlKG91dHB1dEZpbGUpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotCWRlZmVyIGZpbGUuQ2xvc2UoKQotCi0JXywgZXJyID0gZmlsZS5Xcml0ZShkYXRhKQotCWlmIGVyciAhPSBuaWwgewotCQlsb2cuRmF0YWwoZXJyKQotCX0KLX0KLQotZnVuYyByZWFkRmlsZVRvU3RyaW5nKGZpbGVQYXRoIHN0cmluZykgc3RyaW5nIHsKLQlmaWxlLCBlcnIgOj0gb3MuT3BlbihmaWxlUGF0aCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsKGVycikKLQl9Ci0JZGVmZXIgZmlsZS5DbG9zZSgpCi0KLQlkYXRhLCBlcnIgOj0gaW8uUmVhZEFsbChmaWxlKQotCWlmIGVyciAhPSBuaWwgewotCQlsb2cuRmF0YWwoZXJyKQotCX0KLQlyZXR1cm4gc3RyaW5nKGRhdGEpCi19Ci0KLWZ1bmMgd3JpdGVFbXB0eU91dHB1dFByb3RvKG91dHB1dEZpbGUgc3RyaW5nLCBtZXRhZGF0YVJ1bGUgc3RyaW5nKSB7Ci0JZmlsZSwgZXJyIDo9IG9zLkNyZWF0ZShvdXRwdXRGaWxlKQotCWlmIGVyciAhPSBuaWwgewotCQlsb2cuRmF0YWwoZXJyKQotCX0KLQl2YXIgbWVzc2FnZSBwcm90by5NZXNzYWdlCi0JaWYgbWV0YWRhdGFSdWxlID09ICJ0ZXN0X3NwZWMiIHsKLQkJbWVzc2FnZSA9ICZ0ZXN0X3NwZWNfcHJvdG8uVGVzdFNwZWN7fQotCX0gZWxzZSBpZiBtZXRhZGF0YVJ1bGUgPT0gImNvZGVfbWV0YWRhdGEiIHsKLQkJbWVzc2FnZSA9ICZjb2RlX21ldGFkYXRhX3Byb3RvLkNvZGVNZXRhZGF0YXt9Ci0JfQotCWRhdGEsIGVyciA6PSBwcm90by5NYXJzaGFsKG1lc3NhZ2UpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotCWRlZmVyIGZpbGUuQ2xvc2UoKQotCi0JXywgZXJyID0gZmlsZS5Xcml0ZShbXWJ5dGUoZGF0YSkpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotfQotCi1mdW5jIHByb2Nlc3NUZXN0U3BlY1Byb3RvYnVmKAotCWZpbGVQYXRoIHN0cmluZywgb3duZXJzaGlwTWV0YWRhdGFNYXAgKnN5bmMuTWFwLCBrZXlMb2NrcyAqa2V5VG9Mb2Nrc01hcCwKLQllcnJDaCBjaGFuIGVycm9yLCB3ZyAqc3luYy5XYWl0R3JvdXAsCi0pIHsKLQlkZWZlciB3Zy5Eb25lKCkKLQotCWZpbGVDb250ZW50IDo9IHN0cmluZ3MuVHJpbVJpZ2h0KHJlYWRGaWxlVG9TdHJpbmcoZmlsZVBhdGgpLCAiXG4iKQotCXRlc3REYXRhIDo9IHRlc3Rfc3BlY19wcm90by5UZXN0U3BlY3t9Ci0JZXJyIDo9IHByb3RvLlVubWFyc2hhbChbXWJ5dGUoZmlsZUNvbnRlbnQpLCAmdGVzdERhdGEpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWVyckNoIDwtIGVycgotCQlyZXR1cm4KLQl9Ci0KLQlvd25lcnNoaXBNZXRhZGF0YSA6PSB0ZXN0RGF0YS5HZXRPd25lcnNoaXBNZXRhZGF0YUxpc3QoKQotCWZvciBfLCBtZXRhZGF0YSA6PSByYW5nZSBvd25lcnNoaXBNZXRhZGF0YSB7Ci0JCWtleSA6PSBtZXRhZGF0YS5HZXRUYXJnZXROYW1lKCkKLQkJbG9jayA6PSBrZXlMb2Nrcy5HZXRMb2NrRm9yS2V5KGtleSkKLQkJbG9jay5Mb2NrKCkKLQotCQl2YWx1ZSwgbG9hZGVkIDo9IG93bmVyc2hpcE1ldGFkYXRhTWFwLkxvYWRPclN0b3JlKAotCQkJa2V5LCBbXSp0ZXN0X3NwZWNfcHJvdG8uVGVzdFNwZWNfT3duZXJzaGlwTWV0YWRhdGF7bWV0YWRhdGF9LAotCQkpCi0JCWlmIGxvYWRlZCB7Ci0JCQlleGlzdGluZ01ldGFkYXRhIDo9IHZhbHVlLihbXSp0ZXN0X3NwZWNfcHJvdG8uVGVzdFNwZWNfT3duZXJzaGlwTWV0YWRhdGEpCi0JCQlpc0R1cGxpY2F0ZSA6PSBmYWxzZQotCQkJZm9yIF8sIGV4aXN0aW5nIDo9IHJhbmdlIGV4aXN0aW5nTWV0YWRhdGEgewotCQkJCWlmIG1ldGFkYXRhLkdldFRyZW5keVRlYW1JZCgpICE9IGV4aXN0aW5nLkdldFRyZW5keVRlYW1JZCgpIHsKLQkJCQkJZXJyQ2ggPC0gZm10LkVycm9yZigKLQkJCQkJCSJDb25mbGljdGluZyB0cmVuZHkgdGVhbSBJRHMgZm91bmQgZm9yICVzIGF0OlxuJXMgd2l0aCB0ZWFtSWQiKwotCQkJCQkJCSI6ICVzLFxuJXMgd2l0aCB0ZWFtSWQ6ICVzIiwKLQkJCQkJCWtleSwKLQkJCQkJCW1ldGFkYXRhLkdldFBhdGgoKSwgbWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCksIGV4aXN0aW5nLkdldFBhdGgoKSwKLQkJCQkJCWV4aXN0aW5nLkdldFRyZW5keVRlYW1JZCgpLAotCQkJCQkpCi0KLQkJCQkJbG9jay5VbmxvY2soKQotCQkJCQlyZXR1cm4KLQkJCQl9Ci0JCQkJaWYgbWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCkgPT0gZXhpc3RpbmcuR2V0VHJlbmR5VGVhbUlkKCkgJiYgbWV0YWRhdGEuR2V0UGF0aCgpID09IGV4aXN0aW5nLkdldFBhdGgoKSB7Ci0JCQkJCWlzRHVwbGljYXRlID0gdHJ1ZQotCQkJCQlicmVhawotCQkJCX0KLQkJCX0KLQkJCWlmICFpc0R1cGxpY2F0ZSB7Ci0JCQkJZXhpc3RpbmdNZXRhZGF0YSA9IGFwcGVuZChleGlzdGluZ01ldGFkYXRhLCBtZXRhZGF0YSkKLQkJCQlvd25lcnNoaXBNZXRhZGF0YU1hcC5TdG9yZShrZXksIGV4aXN0aW5nTWV0YWRhdGEpCi0JCQl9Ci0JCX0KLQotCQlsb2NrLlVubG9jaygpCi0JfQotfQotCi0vLyBwcm9jZXNzQ29kZU1ldGFkYXRhUHJvdG9idWYgcHJvY2Vzc2VzIENvZGVNZXRhZGF0YSBwcm90b2J1ZiBmaWxlcwotZnVuYyBwcm9jZXNzQ29kZU1ldGFkYXRhUHJvdG9idWYoCi0JZmlsZVBhdGggc3RyaW5nLCBvd25lcnNoaXBNZXRhZGF0YU1hcCAqc3luYy5NYXAsIHNvdXJjZUZpbGVNZXRhZGF0YU1hcCAqc3luYy5NYXAsIGtleUxvY2tzICprZXlUb0xvY2tzTWFwLAotCWVyckNoIGNoYW4gZXJyb3IsIHdnICpzeW5jLldhaXRHcm91cCwKLSkgewotCWRlZmVyIHdnLkRvbmUoKQotCi0JZmlsZUNvbnRlbnQgOj0gc3RyaW5ncy5UcmltUmlnaHQocmVhZEZpbGVUb1N0cmluZyhmaWxlUGF0aCksICJcbiIpCi0JaW50ZXJuYWxDb2RlRGF0YSA6PSBjb2RlX21ldGFkYXRhX2ludGVybmFsX3Byb3RvLkNvZGVNZXRhZGF0YUludGVybmFse30KLQllcnIgOj0gcHJvdG8uVW5tYXJzaGFsKFtdYnl0ZShmaWxlQ29udGVudCksICZpbnRlcm5hbENvZGVEYXRhKQotCWlmIGVyciAhPSBuaWwgewotCQllcnJDaCA8LSBlcnIKLQkJcmV0dXJuCi0JfQotCi0JLy8gUHJvY2VzcyBlYWNoIFRhcmdldE93bmVyc2hpcCBlbnRyeQotCWZvciBfLCBpbnRlcm5hbE1ldGFkYXRhIDo9IHJhbmdlIGludGVybmFsQ29kZURhdGEuR2V0VGFyZ2V0T3duZXJzaGlwTGlzdCgpIHsKLQkJa2V5IDo9IGludGVybmFsTWV0YWRhdGEuR2V0VGFyZ2V0TmFtZSgpCi0JCWxvY2sgOj0ga2V5TG9ja3MuR2V0TG9ja0ZvcktleShrZXkpCi0JCWxvY2suTG9jaygpCi0KLQkJZm9yIF8sIHNyY0ZpbGUgOj0gcmFuZ2UgaW50ZXJuYWxNZXRhZGF0YS5HZXRTb3VyY2VGaWxlcygpIHsKLQkJCXNyY0ZpbGVLZXkgOj0gc3JjRmlsZQotCQkJc3JjRmlsZUxvY2sgOj0ga2V5TG9ja3MuR2V0TG9ja0ZvcktleShzcmNGaWxlS2V5KQotCQkJc3JjRmlsZUxvY2suTG9jaygpCi0JCQlhdHRyaWJ1dGVzIDo9IHNvdXJjZUZpbGVBdHRyaWJ1dGVzewotCQkJCVRlYW1JRDogICAgICAgICBpbnRlcm5hbE1ldGFkYXRhLkdldFRyZW5keVRlYW1JZCgpLAotCQkJCU11bHRpT3duZXJzaGlwOiBpbnRlcm5hbE1ldGFkYXRhLkdldE11bHRpT3duZXJzaGlwKCksCi0JCQkJUGF0aDogICAgICAgICAgIGludGVybmFsTWV0YWRhdGEuR2V0UGF0aCgpLAotCQkJfQotCi0JCQlleGlzdGluZ0F0dHJpYnV0ZXMsIGV4aXN0cyA6PSBzb3VyY2VGaWxlTWV0YWRhdGFNYXAuTG9hZChzcmNGaWxlS2V5KQotCQkJaWYgZXhpc3RzIHsKLQkJCQlleGlzdGluZyA6PSBleGlzdGluZ0F0dHJpYnV0ZXMuKHNvdXJjZUZpbGVBdHRyaWJ1dGVzKQotCQkJCWlmIGF0dHJpYnV0ZXMuVGVhbUlEICE9IGV4aXN0aW5nLlRlYW1JRCAmJiAoIWF0dHJpYnV0ZXMuTXVsdGlPd25lcnNoaXAgfHwgIWV4aXN0aW5nLk11bHRpT3duZXJzaGlwKSB7Ci0JCQkJCWVyckNoIDwtIGZtdC5FcnJvcmYoCi0JCQkJCQkiQ29uZmxpY3QgZm91bmQgZm9yIHNvdXJjZSBmaWxlICVzIGNvdmVyZWQgYXQgJXMgd2l0aCB0ZWFtIElEOiAlcy4gRXhpc3RpbmcgdGVhbSBJRDogJXMgYW5kIHBhdGg6ICVzLiIrCi0JCQkJCQkJIiBJZiBtdWx0aS1vd25lcnNoaXAgaXMgcmVxdWlyZWQsIG11bHRpT3duZXJzaGlwIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBpbiBhbGwgdGVzdF9zcGVjIG1vZHVsZXMgdXNpbmcgdGhpcyB0YXJnZXQuICIrCi0JCQkJCQkJIk11bHRpcGxlLW93bmVyc2hpcCBpbiBnZW5lcmFsIGlzIGRpc2NvdXJhZ2VkIHRob3VnaCBhcyBpdCBtYWtlIGluZnJhc3RydWN0dXJlIGFyb3VuZCBhbmRyb2lkIHJlbHlpbmcgb24gdGhpcyBpbmZvcm1hdGlvbiBwaWNrIHVwIGEgcmFuZG9tIHZhbHVlIHdoZW4gaXQgbmVlZHMgb25seSBvbmUuIiwKLQkJCQkJCXNyY0ZpbGUsIGludGVybmFsTWV0YWRhdGEuR2V0UGF0aCgpLCBhdHRyaWJ1dGVzLlRlYW1JRCwgZXhpc3RpbmcuVGVhbUlELCBleGlzdGluZy5QYXRoLAotCQkJCQkpCi0JCQkJCXNyY0ZpbGVMb2NrLlVubG9jaygpCi0JCQkJCWxvY2suVW5sb2NrKCkKLQkJCQkJcmV0dXJuCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTdG9yZSB0aGUgbWV0YWRhdGEgaWYgbm8gY29uZmxpY3QKLQkJCQlzb3VyY2VGaWxlTWV0YWRhdGFNYXAuU3RvcmUoc3JjRmlsZUtleSwgYXR0cmlidXRlcykKLQkJCX0KLQkJCXNyY0ZpbGVMb2NrLlVubG9jaygpCi0JCX0KLQotCQl2YWx1ZSwgbG9hZGVkIDo9IG93bmVyc2hpcE1ldGFkYXRhTWFwLkxvYWRPclN0b3JlKAotCQkJa2V5LCBbXSpjb2RlX21ldGFkYXRhX2ludGVybmFsX3Byb3RvLkNvZGVNZXRhZGF0YUludGVybmFsX1RhcmdldE93bmVyc2hpcHtpbnRlcm5hbE1ldGFkYXRhfSwKLQkJKQotCQlpZiBsb2FkZWQgewotCQkJZXhpc3RpbmdNZXRhZGF0YSA6PSB2YWx1ZS4oW10qY29kZV9tZXRhZGF0YV9pbnRlcm5hbF9wcm90by5Db2RlTWV0YWRhdGFJbnRlcm5hbF9UYXJnZXRPd25lcnNoaXApCi0JCQlpc0R1cGxpY2F0ZSA6PSBmYWxzZQotCQkJZm9yIF8sIGV4aXN0aW5nIDo9IHJhbmdlIGV4aXN0aW5nTWV0YWRhdGEgewotCQkJCWlmIGludGVybmFsTWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCkgPT0gZXhpc3RpbmcuR2V0VHJlbmR5VGVhbUlkKCkgJiYgaW50ZXJuYWxNZXRhZGF0YS5HZXRQYXRoKCkgPT0gZXhpc3RpbmcuR2V0UGF0aCgpIHsKLQkJCQkJaXNEdXBsaWNhdGUgPSB0cnVlCi0JCQkJCWJyZWFrCi0JCQkJfQotCQkJfQotCQkJaWYgIWlzRHVwbGljYXRlIHsKLQkJCQlleGlzdGluZ01ldGFkYXRhID0gYXBwZW5kKGV4aXN0aW5nTWV0YWRhdGEsIGludGVybmFsTWV0YWRhdGEpCi0JCQkJb3duZXJzaGlwTWV0YWRhdGFNYXAuU3RvcmUoa2V5LCBleGlzdGluZ01ldGFkYXRhKQotCQkJfQotCQl9Ci0KLQkJbG9jay5VbmxvY2soKQotCX0KLX0KLQotZnVuYyBtYWluKCkgewotCWlucHV0RmlsZSA6PSBmbGFnLlN0cmluZygiaW5wdXRGaWxlIiwgIiIsICJJbnB1dCBmaWxlIHBhdGgiKQotCW91dHB1dEZpbGUgOj0gZmxhZy5TdHJpbmcoIm91dHB1dEZpbGUiLCAiIiwgIk91dHB1dCBmaWxlIHBhdGgiKQotCXJ1bGUgOj0gZmxhZy5TdHJpbmcoCi0JCSJydWxlIiwgIiIsICJNZXRhZGF0YSBydWxlIChIaW50OiB0ZXN0X3NwZWMgb3IgY29kZV9tZXRhZGF0YSkiLAotCSkKLQlmbGFnLlBhcnNlKCkKLQotCWlmICppbnB1dEZpbGUgPT0gIiIgfHwgKm91dHB1dEZpbGUgPT0gIiIgfHwgKnJ1bGUgPT0gIiIgewotCQlmbXQuUHJpbnRsbigiVXNhZ2U6IG1ldGFkYXRhIC1ydWxlIDxydWxlPiAtaW5wdXRGaWxlIDxpbnB1dCBmaWxlIHBhdGg+IC1vdXRwdXRGaWxlIDxvdXRwdXQgZmlsZSBwYXRoPiIpCi0JCW9zLkV4aXQoMSkKLQl9Ci0KLQlpbnB1dEZpbGVEYXRhIDo9IHN0cmluZ3MuVHJpbVJpZ2h0KHJlYWRGaWxlVG9TdHJpbmcoKmlucHV0RmlsZSksICJcbiIpCi0JZmlsZVBhdGhzIDo9IHN0cmluZ3MuU3BsaXQoaW5wdXRGaWxlRGF0YSwgIiAiKQotCWlmIGxlbihmaWxlUGF0aHMpID09IDEgJiYgZmlsZVBhdGhzWzBdID09ICIiIHsKLQkJd3JpdGVFbXB0eU91dHB1dFByb3RvKCpvdXRwdXRGaWxlLCAqcnVsZSkKLQkJcmV0dXJuCi0JfQotCW93bmVyc2hpcE1ldGFkYXRhTWFwIDo9ICZzeW5jLk1hcHt9Ci0Ja2V5TG9ja3MgOj0gJmtleVRvTG9ja3NNYXB7fQotCWVyckNoIDo9IG1ha2UoY2hhbiBlcnJvciwgbGVuKGZpbGVQYXRocykpCi0JdmFyIHdnIHN5bmMuV2FpdEdyb3VwCi0KLQlzd2l0Y2ggKnJ1bGUgewotCWNhc2UgInRlc3Rfc3BlYyI6Ci0JCWZvciBfLCBmaWxlUGF0aCA6PSByYW5nZSBmaWxlUGF0aHMgewotCQkJd2cuQWRkKDEpCi0JCQlnbyBwcm9jZXNzVGVzdFNwZWNQcm90b2J1ZigKLQkJCQlmaWxlUGF0aCwgb3duZXJzaGlwTWV0YWRhdGFNYXAsIGtleUxvY2tzLCBlcnJDaCwgJndnLAotCQkJKQotCQl9Ci0KLQkJd2cuV2FpdCgpCi0JCWNsb3NlKGVyckNoKQotCi0JCWZvciBlcnIgOj0gcmFuZ2UgZXJyQ2ggewotCQkJbG9nLkZhdGFsKGVycikKLQkJfQotCi0JCWFsbEtleXMgOj0gZ2V0U29ydGVkS2V5cyhvd25lcnNoaXBNZXRhZGF0YU1hcCkKLQkJdmFyIGFsbE1ldGFkYXRhIFtdKnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY19Pd25lcnNoaXBNZXRhZGF0YQotCi0JCWZvciBfLCBrZXkgOj0gcmFuZ2UgYWxsS2V5cyB7Ci0JCQl2YWx1ZSwgXyA6PSBvd25lcnNoaXBNZXRhZGF0YU1hcC5Mb2FkKGtleSkKLQkJCW1ldGFkYXRhTGlzdCA6PSB2YWx1ZS4oW10qdGVzdF9zcGVjX3Byb3RvLlRlc3RTcGVjX093bmVyc2hpcE1ldGFkYXRhKQotCQkJYWxsTWV0YWRhdGEgPSBhcHBlbmQoYWxsTWV0YWRhdGEsIG1ldGFkYXRhTGlzdC4uLikKLQkJfQotCi0JCXRlc3RTcGVjIDo9ICZ0ZXN0X3NwZWNfcHJvdG8uVGVzdFNwZWN7Ci0JCQlPd25lcnNoaXBNZXRhZGF0YUxpc3Q6IGFsbE1ldGFkYXRhLAotCQl9Ci0JCXdyaXRlUHJvdG9Ub0ZpbGUoKm91dHB1dEZpbGUsIHRlc3RTcGVjKQotCQlicmVhawotCWNhc2UgImNvZGVfbWV0YWRhdGEiOgotCQlzb3VyY2VGaWxlTWV0YWRhdGFNYXAgOj0gJnN5bmMuTWFwe30KLQkJZm9yIF8sIGZpbGVQYXRoIDo9IHJhbmdlIGZpbGVQYXRocyB7Ci0JCQl3Zy5BZGQoMSkKLQkJCWdvIHByb2Nlc3NDb2RlTWV0YWRhdGFQcm90b2J1ZigKLQkJCQlmaWxlUGF0aCwgb3duZXJzaGlwTWV0YWRhdGFNYXAsIHNvdXJjZUZpbGVNZXRhZGF0YU1hcCwga2V5TG9ja3MsIGVyckNoLCAmd2csCi0JCQkpCi0JCX0KLQotCQl3Zy5XYWl0KCkKLQkJY2xvc2UoZXJyQ2gpCi0KLQkJZm9yIGVyciA6PSByYW5nZSBlcnJDaCB7Ci0JCQlsb2cuRmF0YWwoZXJyKQotCQl9Ci0KLQkJc29ydGVkS2V5cyA6PSBnZXRTb3J0ZWRLZXlzKG93bmVyc2hpcE1ldGFkYXRhTWFwKQotCQlhbGxNZXRhZGF0YSA6PSBtYWtlKFtdKmNvZGVfbWV0YWRhdGFfcHJvdG8uQ29kZU1ldGFkYXRhX1RhcmdldE93bmVyc2hpcCwgMCkKLQkJZm9yIF8sIGtleSA6PSByYW5nZSBzb3J0ZWRLZXlzIHsKLQkJCXZhbHVlLCBfIDo9IG93bmVyc2hpcE1ldGFkYXRhTWFwLkxvYWQoa2V5KQotCQkJbWV0YWRhdGEgOj0gdmFsdWUuKFtdKmNvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8uQ29kZU1ldGFkYXRhSW50ZXJuYWxfVGFyZ2V0T3duZXJzaGlwKQotCQkJZm9yIF8sIG0gOj0gcmFuZ2UgbWV0YWRhdGEgewotCQkJCXRhcmdldE5hbWUgOj0gbS5HZXRUYXJnZXROYW1lKCkKLQkJCQlwYXRoIDo9IG0uR2V0UGF0aCgpCi0JCQkJdHJlbmR5VGVhbUlkIDo9IG0uR2V0VHJlbmR5VGVhbUlkKCkKLQotCQkJCWFsbE1ldGFkYXRhID0gYXBwZW5kKGFsbE1ldGFkYXRhLCAmY29kZV9tZXRhZGF0YV9wcm90by5Db2RlTWV0YWRhdGFfVGFyZ2V0T3duZXJzaGlwewotCQkJCQlUYXJnZXROYW1lOiAgICZ0YXJnZXROYW1lLAotCQkJCQlQYXRoOiAgICAgICAgICZwYXRoLAotCQkJCQlUcmVuZHlUZWFtSWQ6ICZ0cmVuZHlUZWFtSWQsCi0JCQkJCVNvdXJjZUZpbGVzOiAgbS5HZXRTb3VyY2VGaWxlcygpLAotCQkJCX0pCi0JCQl9Ci0JCX0KLQotCQlmaW5hbE1ldGFkYXRhIDo9ICZjb2RlX21ldGFkYXRhX3Byb3RvLkNvZGVNZXRhZGF0YXsKLQkJCVRhcmdldE93bmVyc2hpcExpc3Q6IGFsbE1ldGFkYXRhLAotCQl9Ci0JCXdyaXRlUHJvdG9Ub0ZpbGUoKm91dHB1dEZpbGUsIGZpbmFsTWV0YWRhdGEpCi0JCWJyZWFrCi0JZGVmYXVsdDoKLQkJbG9nLkZhdGFsZigiTm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBpbXBsZW1lbnRlZCBmb3IgcnVsZSAnJXMnLlxuIiwgKnJ1bGUpCi0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvZ28ubW9kIGIvdG9vbHMvbWV0YWRhdGEvZ28ubW9kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQwNGIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL2dvLm1vZAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotbW9kdWxlIGFuZHJvaWQvc29vbmcvdG9vbHMvbWV0YWRhdGEKLQotcmVxdWlyZSBnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAKLQotcmVwbGFjZSBnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAgPT4gLi4vLi4vLi4vZXh0ZXJuYWwvZ29sYW5nLXByb3RvYnVmCi0KLWdvIDEuMTgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9nby53b3JrIGIvdG9vbHMvbWV0YWRhdGEvZ28ud29yawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZGY4ZS4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS9nby53b3JrCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotZ28gMS4xOAotCi11c2UgKAotCS4KLQkuLi8uLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKLQkuLi8uLi8uLi9zb29uZy90ZXN0aW5nL3Rlc3Rfc3BlY19wcm90bwotCS4uLy4uLy4uL3Nvb25nL3Rlc3RpbmcvY29kZV9tZXRhZGF0YV9wcm90bwotCS4uLy4uLy4uL3Nvb25nL3Rlc3RpbmcvY29kZV9tZXRhZGF0YV9wcm90b19pbnRlcm5hbAotKQotCi1yZXBsYWNlIGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2VtcHR5SW5wdXRGaWxlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2VtcHR5SW5wdXRGaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9lbXB0eUlucHV0RmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2V4cGVjdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2V4cGVjdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1Y2Y0MC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9leHBlY3RlZENvZGVNZXRhZGF0YU91dHB1dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotIAotA2JhchIKLUFuZHJvaWQuYnAaBTEyMzQ2IgZiLmphdmEKLSAKLQNmb28SCi1BbmRyb2lkLmJwGgUxMjM0NSIGYS5qYXZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRPdXRwdXRGaWxlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2V4cGVjdGVkT3V0cHV0RmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDM4MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRPdXRwdXRGaWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BbmRyb2lkLmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcXdlcnR5LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1Bc2RmZ2hqLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BenhjdmJuLmJwGgUxMjM0NQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUxLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUxLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiZWVkMC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlMS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXNkZmdoai5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXp4Y3Zibi5icBoFMTIzNDUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUyLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhNzUzZi4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlMi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0KLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQW5kcm9pZC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXF3ZXJ0eS5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUzLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiZWVkMC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlMy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXNkZmdoai5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXp4Y3Zibi5icBoFMTIzNDUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU0LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3NTkwMC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0KLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQW5kcm9pZC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXF3ZXJ0eS5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU1LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU1LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkZTA2NC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotIAotA2ZvbxIKLUFuZHJvaWQuYnAaBTEyMzQ1IgZhLmphdmEKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU2LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU2LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3Y2RjZC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotIAotA2JhchIKLUFuZHJvaWQuYnAaBTEyMzQ2IgZiLmphdmEKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU3LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU3LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkZTA2NC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotIAotA2ZvbxIKLUFuZHJvaWQuYnAaBTEyMzQ1IgZhLmphdmEKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU4LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU4LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzMTY5MC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlOC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotIAotA2ZvbxIKLUFuZHJvaWQuZ3AaBTEyMzQ2IgZhLmphdmEKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dC50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVjZjQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotIAotA2JhchIKLUFuZHJvaWQuYnAaBTEyMzQ2IgZiLmphdmEKLSAKLQNmb28SCi1BbmRyb2lkLmJwGgUxMjM0NSIGYS5qYXZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXRGaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1Y2Y0MC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXRGaWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi0gCi0DYmFyEgotQW5kcm9pZC5icBoFMTIzNDYiBmIuamF2YQotIAotA2ZvbxIKLUFuZHJvaWQuYnAaBTEyMzQ1IgZhLmphdmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkRW1wdHlPdXRwdXRGaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZE91dHB1dEZpbGUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkT3V0cHV0RmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDM4MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkT3V0cHV0RmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQW5kcm9pZC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXF3ZXJ0eS5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXNkZmdoai5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXp4Y3Zibi5icBoFMTIzNDUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODFiN2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRDb2RlTWV0YWRhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZTUudHh0IGZpbGU2LnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0Q29kZU1ldGFkYXRhTmVnYXRpdmUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRDb2RlTWV0YWRhdGFOZWdhdGl2ZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjY4ZTQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRDb2RlTWV0YWRhdGFOZWdhdGl2ZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1maWxlNy50eHQgZmlsZTgudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRGaWxlcy50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dEZpbGVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0YmM5NC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dEZpbGVzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbGUxLnR4dCBmaWxlMi50eHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dEZpbGVzTmVnYXRpdmVDYXNlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXNOZWdhdGl2ZUNhc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzdhYTNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXNOZWdhdGl2ZUNhc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZTMudHh0IGZpbGU0LnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL21ldGFkYXRhX3Rlc3QuZ28gYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9tZXRhZGF0YV90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRhZGQzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL21ldGFkYXRhX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBtYWluCi0KLWltcG9ydCAoCi0JImZtdCIKLQkiaW8vaW91dGlsIgotCSJvcy9leGVjIgotCSJzdHJpbmdzIgotCSJ0ZXN0aW5nIgotKQotCi1mdW5jIFRlc3RNZXRhZGF0YSh0ICp0ZXN0aW5nLlQpIHsKLQljbWQgOj0gZXhlYy5Db21tYW5kKAotCQkibWV0YWRhdGEiLCAiLXJ1bGUiLCAidGVzdF9zcGVjIiwgIi1pbnB1dEZpbGUiLCAiLi9pbnB1dEZpbGVzLnR4dCIsICItb3V0cHV0RmlsZSIsCi0JCSIuL2dlbmVyYXRlZE91dHB1dEZpbGUudHh0IiwKLQkpCi0Jc3RkZXJyLCBlcnIgOj0gY21kLkNvbWJpbmVkT3V0cHV0KCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbGYoIkVycm9yIHJ1bm5pbmcgbWV0YWRhdGEgY29tbWFuZDogJXMuIEVycm9yOiAldiIsIHN0ZGVyciwgZXJyKQotCX0KLQotCS8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHBlY3RlZCBvdXRwdXQgZmlsZQotCWV4cGVjdGVkT3V0cHV0LCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKCIuL2V4cGVjdGVkT3V0cHV0RmlsZS50eHQiKQotCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsZigiRXJyb3IgcmVhZGluZyBleHBlY3RlZCBvdXRwdXQgZmlsZTogJXMiLCBlcnIpCi0JfQotCi0JLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZQotCWdlbmVyYXRlZE91dHB1dCwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZSgiLi9nZW5lcmF0ZWRPdXRwdXRGaWxlLnR4dCIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJFcnJvciByZWFkaW5nIGdlbmVyYXRlZCBvdXRwdXQgZmlsZTogJXMiLCBlcnIpCi0JfQotCi0JZm10LlByaW50bG4oKQotCi0JLy8gQ29tcGFyZSB0aGUgY29udGVudHMKLQlpZiBzdHJpbmcoZXhwZWN0ZWRPdXRwdXQpICE9IHN0cmluZyhnZW5lcmF0ZWRPdXRwdXQpIHsKLQkJdC5FcnJvcmYoIkdlbmVyYXRlZCBmaWxlIGNvbnRlbnRzIGRvIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IikKLQl9Ci19Ci0KLWZ1bmMgVGVzdE1ldGFkYXRhTmVnYXRpdmVDYXNlKHQgKnRlc3RpbmcuVCkgewotCWNtZCA6PSBleGVjLkNvbW1hbmQoCi0JCSJtZXRhZGF0YSIsICItcnVsZSIsICJ0ZXN0X3NwZWMiLCAiLWlucHV0RmlsZSIsICIuL2lucHV0RmlsZXNOZWdhdGl2ZUNhc2UudHh0IiwgIi1vdXRwdXRGaWxlIiwKLQkJIi4vZ2VuZXJhdGVkT3V0cHV0RmlsZU5lZ2F0aXZlQ2FzZS50eHQiLAotCSkKLQlzdGRlcnIsIGVyciA6PSBjbWQuQ29tYmluZWRPdXRwdXQoKQotCWlmIGVyciA9PSBuaWwgewotCQl0LkZhdGFsZigKLQkJCSJFeHBlY3RlZCBhbiBlcnJvciwgYnV0IHRoZSBtZXRhZGF0YSBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS4gT3V0cHV0OiAlcyIsCi0JCQlzdGRlcnIsCi0JCSkKLQl9Ci0KLQlleHBlY3RlZEVycm9yIDo9ICJDb25mbGljdGluZyB0cmVuZHkgdGVhbSBJRHMgZm91bmQgZm9yIGphdmEtdGVzdC1tb2R1bGUiICsKLQkJIi1uYW1lLW9uZSBhdDpcbkFuZHJvaWQuYnAgd2l0aCB0ZWFtSWQ6IDEyMzQ2LCIgKwotCQkiXG5BbmRyb2lkLmJwIHdpdGggdGVhbUlkOiAxMjM0NSIKLQlpZiAhc3RyaW5ncy5Db250YWlucygKLQkJc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5nKHN0ZGVycikpLCBzdHJpbmdzLlRyaW1TcGFjZShleHBlY3RlZEVycm9yKSwKLQkpIHsKLQkJdC5FcnJvcmYoCi0JCQkiVW5leHBlY3RlZCBlcnJvciBtZXNzYWdlLiBFeHBlY3RlZCB0byBjb250YWluOiAlcywgR290OiAlcyIsCi0JCQlleHBlY3RlZEVycm9yLCBzdGRlcnIsCi0JCSkKLQl9Ci19Ci0KLWZ1bmMgVGVzdEVtcHR5SW5wdXRGaWxlKHQgKnRlc3RpbmcuVCkgewotCWNtZCA6PSBleGVjLkNvbW1hbmQoCi0JCSJtZXRhZGF0YSIsICItcnVsZSIsICJ0ZXN0X3NwZWMiLCAiLWlucHV0RmlsZSIsICIuL2VtcHR5SW5wdXRGaWxlLnR4dCIsICItb3V0cHV0RmlsZSIsCi0JCSIuL2dlbmVyYXRlZEVtcHR5T3V0cHV0RmlsZS50eHQiLAotCSkKLQlzdGRlcnIsIGVyciA6PSBjbWQuQ29tYmluZWRPdXRwdXQoKQotCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsZigiRXJyb3IgcnVubmluZyBtZXRhZGF0YSBjb21tYW5kOiAlcy4gRXJyb3I6ICV2Iiwgc3RkZXJyLCBlcnIpCi0JfQotCi0JLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZQotCWdlbmVyYXRlZE91dHB1dCwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZSgiLi9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0IikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbGYoIkVycm9yIHJlYWRpbmcgZ2VuZXJhdGVkIG91dHB1dCBmaWxlOiAlcyIsIGVycikKLQl9Ci0KLQlmbXQuUHJpbnRsbigpCi0KLQkvLyBDb21wYXJlIHRoZSBjb250ZW50cwotCWlmIHN0cmluZyhnZW5lcmF0ZWRPdXRwdXQpICE9ICJcbiIgewotCQl0LkVycm9yZigiR2VuZXJhdGVkIGZpbGUgY29udGVudHMgZG8gbm90IG1hdGNoIHRoZSBleHBlY3RlZCBvdXRwdXQiKQotCX0KLX0KLQotZnVuYyBUZXN0Q29kZU1ldGFkYXRhKHQgKnRlc3RpbmcuVCkgewotCWNtZCA6PSBleGVjLkNvbW1hbmQoCi0JCSJtZXRhZGF0YSIsICItcnVsZSIsICJjb2RlX21ldGFkYXRhIiwgIi1pbnB1dEZpbGUiLCAiLi9pbnB1dENvZGVNZXRhZGF0YS50eHQiLCAiLW91dHB1dEZpbGUiLAotCQkiLi9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXRGaWxlLnR4dCIsCi0JKQotCXN0ZGVyciwgZXJyIDo9IGNtZC5Db21iaW5lZE91dHB1dCgpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJFcnJvciBydW5uaW5nIG1ldGFkYXRhIGNvbW1hbmQ6ICVzLiBFcnJvcjogJXYiLCBzdGRlcnIsIGVycikKLQl9Ci0KLQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwZWN0ZWQgb3V0cHV0IGZpbGUKLQlleHBlY3RlZE91dHB1dCwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZSgiLi9leHBlY3RlZENvZGVNZXRhZGF0YU91dHB1dC50eHQiKQotCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsZigiRXJyb3IgcmVhZGluZyBleHBlY3RlZCBvdXRwdXQgZmlsZTogJXMiLCBlcnIpCi0JfQotCi0JLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZQotCWdlbmVyYXRlZE91dHB1dCwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZSgiLi9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXRGaWxlLnR4dCIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJFcnJvciByZWFkaW5nIGdlbmVyYXRlZCBvdXRwdXQgZmlsZTogJXMiLCBlcnIpCi0JfQotCi0JZm10LlByaW50bG4oKQotCi0JLy8gQ29tcGFyZSB0aGUgY29udGVudHMKLQlpZiBzdHJpbmcoZXhwZWN0ZWRPdXRwdXQpICE9IHN0cmluZyhnZW5lcmF0ZWRPdXRwdXQpIHsKLQkJdC5FcnJvcmYoIkdlbmVyYXRlZCBmaWxlIGNvbnRlbnRzIGRvIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IikKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9vdXRwdXRGaWxlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL291dHB1dEZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQzODJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL291dHB1dEZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLW9uZRIKLUFuZHJvaWQuYnAaBTEyMzQ1Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKLUFuZHJvaWQuYnAaBTEyMzQ2Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKLUFxd2VydHkuYnAaBTEyMzQ2Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKLUFwb2l1eXQuYnAaBTEyMzQ2Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKLUFuZHJvaWQuYnAaBTEyMzQ1Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKLUFzZGZnaGouYnAaBTEyMzQ1Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKLUF6eGN2Ym4uYnAaBTEyMzQ1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL0FuZHJvaWQuYnAgYi90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icAppbmRleCA5YjEzNGYyLi5lMzcxYjIzIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icAorKysgYi90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icApAQCAtOTYsNiArOTYsNyBAQAogICAgIF0sCiAgICAgbGliczogWwogICAgICAgICAiYXBleF9tYW5pZmVzdCIsCisgICAgICAgICJyZWxlYXNldG9vbHNfYXBleF91dGlscyIsCiAgICAgICAgICJyZWxlYXNldG9vbHNfY29tbW9uIiwKICAgICBdLAogICAgIHJlcXVpcmVkOiBbCkBAIC0xMDcsNyArMTA4LDcgQEAKIHB5dGhvbl9saWJyYXJ5X2hvc3QgewogICAgIG5hbWU6ICJvdGFfbWV0YWRhdGFfcHJvdG8iLAogICAgIHNyY3M6IFsKLSAgICAgICAib3RhX21ldGFkYXRhLnByb3RvIiwKKyAgICAgICAgIm90YV9tZXRhZGF0YS5wcm90byIsCiAgICAgXSwKICAgICBwcm90bzogewogICAgICAgICBjYW5vbmljYWxfcGF0aF9mcm9tX3Jvb3Q6IGZhbHNlLApAQCAtMTE3LDcgKzExOCw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogIm90YV9tZXRhZGF0YV9wcm90b19jYyIsCiAgICAgc3JjczogWwotICAgICAgICJvdGFfbWV0YWRhdGEucHJvdG8iLAorICAgICAgICAib3RhX21ldGFkYXRhLnByb3RvIiwKICAgICBdLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTE0NCw3ICsxNDUsNyBAQAogICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsibGlicHJvdG9idWYtamF2YS1uYW5vIl0sCiAgICAgICAgIH0sCiAgICAgfSwKLSAgICB2aXNpYmlsaXR5OiBbIi8vZnJhbWV3b3Jrcy9iYXNlOl9fc3VicGFja2FnZXNfXyJdCisgICAgdmlzaWJpbGl0eTogWyIvL2ZyYW1ld29ya3MvYmFzZTpfX3N1YnBhY2thZ2VzX18iXSwKIH0KIAogcHl0aG9uX2RlZmF1bHRzIHsKQEAgLTM2Nyw2ICszNjgsOSBAQAogICAgIGxpYnM6IFsKICAgICAgICAgIm90YV91dGlsc19saWIiLAogICAgIF0sCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgInNpZ25hcGsiLAorICAgIF0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7CkBAIC00MzYsNyArNDQwLDcgQEAKICAgICBuYW1lOiAiY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyIsCi0gICAgICAgICJyZWxlYXNldG9vbHNfY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmX2RlZmF1bHRzIgorICAgICAgICAicmVsZWFzZXRvb2xzX2NoZWNrX3RhcmdldF9maWxlc192aW50Zl9kZWZhdWx0cyIsCiAgICAgXSwKIH0KIApAQCAtNTQ2LDEzICs1NTAsMTUgQEAKICAgICBkZWZhdWx0czogWyJyZWxlYXNldG9vbHNfYmluYXJ5X2RlZmF1bHRzIl0sCiAgICAgc3JjczogWwogICAgICAgICAic2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weSIsCi0gICAgICAgICJwYXlsb2FkX3NpZ25lci5weSIsCi0gICAgICAgICJvdGFfc2lnbmluZ191dGlscy5weSIsCisgICAgICAgICJvdGFfZnJvbV9yYXdfaW1nLnB5IiwKICAgICBdLAogICAgIGxpYnM6IFsKICAgICAgICAgInJlbGVhc2V0b29sc19hZGRfaW1nX3RvX3RhcmdldF9maWxlcyIsCiAgICAgICAgICJyZWxlYXNldG9vbHNfYXBleF91dGlscyIsCiAgICAgICAgICJyZWxlYXNldG9vbHNfY29tbW9uIiwKKyAgICAgICAgIm90YV9tZXRhZGF0YV9wcm90byIsCisgICAgICAgICJvdGFfdXRpbHNfbGliIiwKKyAgICAgICAgInVwZGF0ZV9wYXlsb2FkIiwKICAgICBdLAogfQogCkBAIC02MzEsOCArNjM3LDEwIEBACiAgICAgXSwKICAgICBkYXRhOiBbCiAgICAgICAgICJ0ZXN0ZGF0YS8qKi8qIiwKKyAgICBdLAorICAgIGRldmljZV9jb21tb25fZGF0YTogWwogICAgICAgICAiOmNvbS5hbmRyb2lkLmFwZXguY29tcHJlc3NlZC52MSIsCi0gICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC52ZW5kb3IuZm9vLndpdGhfdmludGYiCisgICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC52ZW5kb3IuZm9vLndpdGhfdmludGYiLAogICAgIF0sCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIGRhcndpbjogewpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IGIzOWE4MmMuLjMwYTZhY2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKQEAgLTQ2NCw2ICs0NjQsNyBAQAogICBkdGJvX3ByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIlBSRUJVSUxUX0lNQUdFUyIsICJkdGJvLmltZyIpCiAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhkdGJvX3ByZWJ1aWx0X3BhdGgpCisgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShpbWcubmFtZSksIGV4aXN0X29rPVRydWUpCiAgIHNodXRpbC5jb3B5KGR0Ym9fcHJlYnVpbHRfcGF0aCwgaW1nLm5hbWUpCiAKICAgIyBBVkItc2lnbiB0aGUgaW1hZ2UgYXMgbmVlZGVkLgpAQCAtMTA5OSw3ICsxMTAwLDcgQEAKICAgICB2Ym1ldGFfcGFydGl0aW9ucyA9IGNvbW1vbi5BVkJfUEFSVElUSU9OU1s6XSArIHR1cGxlKGF2Yl9jdXN0b21fcGFydGl0aW9ucykKIAogICAgIHZibWV0YV9zeXN0ZW0gPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl92Ym1ldGFfc3lzdGVtIiwgIiIpLnN0cmlwKCkKLSAgICBpZiB2Ym1ldGFfc3lzdGVtOgorICAgIGlmIHZibWV0YV9zeXN0ZW0gYW5kIHNldCh2Ym1ldGFfc3lzdGVtLnNwbGl0KCkpLmludGVyc2VjdGlvbihwYXJ0aXRpb25zKToKICAgICAgIGJhbm5lcigidmJtZXRhX3N5c3RlbSIpCiAgICAgICBwYXJ0aXRpb25zWyJ2Ym1ldGFfc3lzdGVtIl0gPSBBZGRWQk1ldGEoCiAgICAgICAgICAgb3V0cHV0X3ppcCwgcGFydGl0aW9ucywgInZibWV0YV9zeXN0ZW0iLCB2Ym1ldGFfc3lzdGVtLnNwbGl0KCkpCkBAIC0xMTA5LDcgKzExMTAsNyBAQAogICAgICAgdmJtZXRhX3BhcnRpdGlvbnMuYXBwZW5kKCJ2Ym1ldGFfc3lzdGVtIikKIAogICAgIHZibWV0YV92ZW5kb3IgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl92Ym1ldGFfdmVuZG9yIiwgIiIpLnN0cmlwKCkKLSAgICBpZiB2Ym1ldGFfdmVuZG9yOgorICAgIGlmIHZibWV0YV92ZW5kb3IgYW5kIHNldCh2Ym1ldGFfdmVuZG9yLnNwbGl0KCkpLmludGVyc2VjdGlvbihwYXJ0aXRpb25zKToKICAgICAgIGJhbm5lcigidmJtZXRhX3ZlbmRvciIpCiAgICAgICBwYXJ0aXRpb25zWyJ2Ym1ldGFfdmVuZG9yIl0gPSBBZGRWQk1ldGEoCiAgICAgICAgICAgb3V0cHV0X3ppcCwgcGFydGl0aW9ucywgInZibWV0YV92ZW5kb3IiLCB2Ym1ldGFfdmVuZG9yLnNwbGl0KCkpCkBAIC0xMTM2LDcgKzExMzcsNyBAQAogICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gaW5jbHVkZWRfcGFydGl0aW9uc10KICAgICAgICAgdmJtZXRhX3BhcnRpdGlvbnMuYXBwZW5kKHBhcnRpdGlvbl9uYW1lKQogCi0gICAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfYnVpbGRpbmdfdmJtZXRhX2ltYWdlIikgPT0gInRydWUiOgorICAgIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX2J1aWxkaW5nX3ZibWV0YV9pbWFnZSIpID09ICJ0cnVlIiBhbmQgc2V0KHZibWV0YV9wYXJ0aXRpb25zKS5pbnRlcnNlY3Rpb24ocGFydGl0aW9ucyk6CiAgICAgICBiYW5uZXIoInZibWV0YSIpCiAgICAgICBBZGRWQk1ldGEob3V0cHV0X3ppcCwgcGFydGl0aW9ucywgInZibWV0YSIsIHZibWV0YV9wYXJ0aXRpb25zKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYXBleF91dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5CmluZGV4IDNhYmVmM2IuLjA4ZjJiODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5CkBAIC0zNiw2ICszNiw4IEBACiAKIEFQRVhfUFVCS0VZID0gJ2FwZXhfcHVia2V5JwogCisjIFBhcnRpdGlvbnMgc3VwcG9ydGluZyBBUEVYZXMKK1BBUlRJVElPTlMgPSBbJ3N5c3RlbScsICdzeXN0ZW1fZXh0JywgJ3Byb2R1Y3QnLCAndmVuZG9yJywgJ29kbSddCiAKIGNsYXNzIEFwZXhJbmZvRXJyb3IoRXhjZXB0aW9uKToKICAgIiIiQW4gRXhjZXB0aW9uIHJhaXNlZCBkdXJpbmcgQXBleCBJbmZvcm1hdGlvbiBjb21tYW5kLiIiIgpAQCAtNzcsMTUgKzc5LDEwIEBACiAgICAgUmV0dXJuczoKICAgICAgIFRoZSByZXBhY2tlZCBhcGV4IGZpbGUgY29udGFpbmluZyB0aGUgc2lnbmVkIGFwayBmaWxlcy4KICAgICAiIiIKLSAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5kZWJ1Z2ZzX3BhdGgpOgotICAgICAgcmFpc2UgQXBleFNpZ25pbmdFcnJvcigKLSAgICAgICAgICAiQ291bGRuJ3QgZmluZCBsb2NhdGlvbiBvZiBkZWJ1Z2ZzX3N0YXRpYzogIiArCi0gICAgICAgICAgIlBhdGgge30gZG9lcyBub3QgZXhpc3QuICIuZm9ybWF0KHNlbGYuZGVidWdmc19wYXRoKSArCi0gICAgICAgICAgIk1ha2Ugc3VyZSBiaW4vZGVidWdmc19zdGF0aWMgY2FuIGJlIGZvdW5kIGluIC1wIDxwYXRoPiIpCi0gICAgbGlzdF9jbWQgPSBbJ2RlYXBleGVyJywgJy0tZGVidWdmc19wYXRoJywgc2VsZi5kZWJ1Z2ZzX3BhdGgsCi0gICAgICAgICAgICAgICAgJ2xpc3QnLCBzZWxmLmFwZXhfcGF0aF0KLSAgICBlbnRyaWVzX25hbWVzID0gY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGxpc3RfY21kKS5zcGxpdCgpCi0gICAgYXBrX2VudHJpZXMgPSBbbmFtZSBmb3IgbmFtZSBpbiBlbnRyaWVzX25hbWVzIGlmIG5hbWUuZW5kc3dpdGgoJy5hcGsnKV0KKyAgICBwYXlsb2FkX2RpciA9IHNlbGYuRXh0cmFjdEFwZXhQYXlsb2FkKHNlbGYuYXBleF9wYXRoKQorICAgIGFwa19lbnRyaWVzID0gW10KKyAgICBmb3IgYmFzZV9kaXIsIF8sIGZpbGVzIGluIG9zLndhbGsocGF5bG9hZF9kaXIpOgorICAgICAgYXBrX2VudHJpZXMuZXh0ZW5kKG9zLnBhdGguam9pbihiYXNlX2RpciwgZmlsZSkgZm9yIGZpbGUgaW4gZmlsZXMgaWYgZmlsZS5lbmRzd2l0aCgnLmFwaycpKQogCiAgICAgIyBObyBuZWVkIHRvIHNpZ24gYW5kIHJlcGFjaywgcmV0dXJuIHRoZSBvcmlnaW5hbCBhcGV4IHBhdGguCiAgICAgaWYgbm90IGFwa19lbnRyaWVzIGFuZCBzZWxmLnNpZ25fdG9vbCBpcyBOb25lOgpAQCAtMTAzLDE2ICsxMDAsMTYgQEAKICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0FwayBwYXRoIGRvZXMgbm90IGNvbnRhaW4gdGhlIGludGVuZGVkIGRpcmVjdG9yeSBuYW1lOicKICAgICAgICAgICAgICAgICAgICAgICAgJyAlcycsIGVudHJ5KQogCi0gICAgcGF5bG9hZF9kaXIsIGhhc19zaWduZWRfY29udGVudCA9IHNlbGYuRXh0cmFjdEFwZXhQYXlsb2FkQW5kU2lnbkNvbnRlbnRzKAotICAgICAgICBhcGtfZW50cmllcywgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpCisgICAgaGFzX3NpZ25lZF9jb250ZW50ID0gc2VsZi5TaWduQ29udGVudHNJblBheWxvYWQoCisgICAgICAgIHBheWxvYWRfZGlyLCBhcGtfZW50cmllcywgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpCiAgICAgaWYgbm90IGhhc19zaWduZWRfY29udGVudDoKICAgICAgIGxvZ2dlci5pbmZvKCdObyBjb250ZW50cyBoYXMgYmVlbiBzaWduZWQgaW4gJXMnLCBzZWxmLmFwZXhfcGF0aCkKICAgICAgIHJldHVybiBzZWxmLmFwZXhfcGF0aAogCiAgICAgcmV0dXJuIHNlbGYuUmVwYWNrQXBleFBheWxvYWQocGF5bG9hZF9kaXIsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpCiAKLSAgZGVmIEV4dHJhY3RBcGV4UGF5bG9hZEFuZFNpZ25Db250ZW50cyhzZWxmLCBhcGtfZW50cmllcywgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpOgotICAgICIiIkV4dHJhY3RzIHRoZSBwYXlsb2FkIGltYWdlIGFuZCBzaWducyB0aGUgY29udGFpbmluZyBhcGsgZmlsZXMuIiIiCisgIGRlZiBFeHRyYWN0QXBleFBheWxvYWQoc2VsZiwgYXBleF9wYXRoKToKKyAgICAiIiJFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYW4gQVBFWCBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjb250ZW50cyIiIgogICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmRlYnVnZnNfcGF0aCk6CiAgICAgICByYWlzZSBBcGV4U2lnbmluZ0Vycm9yKAogICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGxvY2F0aW9uIG9mIGRlYnVnZnNfc3RhdGljOiAiICsKQEAgLTEyNyw5ICsxMjQsMTIgQEAKICAgICBleHRyYWN0X2NtZCA9IFsnZGVhcGV4ZXInLCAnLS1kZWJ1Z2ZzX3BhdGgnLCBzZWxmLmRlYnVnZnNfcGF0aCwKICAgICAgICAgICAgICAgICAgICAnLS1mc2NrZXJvZnNfcGF0aCcsIHNlbGYuZnNja2Vyb2ZzX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgJ2V4dHJhY3QnLAotICAgICAgICAgICAgICAgICAgIHNlbGYuYXBleF9wYXRoLCBwYXlsb2FkX2Rpcl0KKyAgICAgICAgICAgICAgICAgICBhcGV4X3BhdGgsIHBheWxvYWRfZGlyXQogICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChleHRyYWN0X2NtZCkKKyAgICByZXR1cm4gcGF5bG9hZF9kaXIKIAorICBkZWYgU2lnbkNvbnRlbnRzSW5QYXlsb2FkKHNlbGYsIHBheWxvYWRfZGlyLCBhcGtfZW50cmllcywgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpOgorICAgICIiIlNpZ25zIHRoZSBjb250ZW50cyBpbiBwYXlsb2FkLiIiIgogICAgIGhhc19zaWduZWRfY29udGVudCA9IEZhbHNlCiAgICAgZm9yIGVudHJ5IGluIGFwa19lbnRyaWVzOgogICAgICAgYXBrX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF5bG9hZF9kaXIsIGVudHJ5KQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQogICAgICAgaGFzX3NpZ25lZF9jb250ZW50ID0gVHJ1ZQogCi0gICAgcmV0dXJuIHBheWxvYWRfZGlyLCBoYXNfc2lnbmVkX2NvbnRlbnQKKyAgICByZXR1cm4gaGFzX3NpZ25lZF9jb250ZW50CiAKICAgZGVmIFJlcGFja0FwZXhQYXlsb2FkKHNlbGYsIHBheWxvYWRfZGlyLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzPU5vbmUpOgogICAgICIiIlJlYnVpbGRzIHRoZSBhcGV4IGZpbGUgd2l0aCB0aGUgdXBkYXRlZCBwYXlsb2FkIGRpcmVjdG9yeS4iIiIKQEAgLTU1MCw3ICs1NTAsNyBAQAogICBpZiBub3QgaXNpbnN0YW5jZShpbnB1dF9maWxlLCBzdHIpOgogICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigibXVzdCBwYXNzIGZpbGVwYXRoIHRvIHRhcmdldC1maWxlcyB6aXAgb3IgZGlyZWN0b3J5IikKICAgYXBleF9pbmZvcyA9IFtdCi0gIGZvciBwYXJ0aXRpb24gaW4gWydzeXN0ZW0nLCAnc3lzdGVtX2V4dCcsICdwcm9kdWN0JywgJ3ZlbmRvciddOgorICBmb3IgcGFydGl0aW9uIGluIFBBUlRJVElPTlM6CiAgICAgYXBleF9pbmZvcy5leHRlbmQoR2V0QXBleEluZm9Gb3JQYXJ0aXRpb24oaW5wdXRfZmlsZSwgcGFydGl0aW9uKSkKICAgcmV0dXJuIGFwZXhfaW5mb3MKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5CmluZGV4IDQ2NGFkOWIuLjI1YmNiNTIgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkKQEAgLTY3Nyw2ICs2NzcsMjEgQEAKICAgICAgIGdsb2JfZGljdFsiZmluZ2VycHJpbnQiXSA9IGZpbmdlcnByaW50CiAgICAgICByZXR1cm4KIAorZGVmIFRyeVBhcnNlRmluZ2VycHJpbnRBbmRUaW1lc3RhbXAoZ2xvYl9kaWN0KToKKyAgIiIiSGVscGVyIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGZpbmdlcnByaW50IGFuZCB0aW1lc3RhbXAgZnJvbSB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkuCisKKyAgQXJnczoKKyAgICBnbG9iX2RpY3Q6IHRoZSBnbG9iYWwgZGljdGlvbmFyeSBmcm9tIHRoZSBidWlsZCBzeXN0ZW0uCisgICIiIgorICBUcnlQYXJzZUZpbmdlcnByaW50KGdsb2JfZGljdCkKKworICAjIFNldCBmaXhlZCB0aW1lc3RhbXAgZm9yIGJ1aWxkaW5nIHRoZSBPVEEgcGFja2FnZS4KKyAgaWYgInVzZV9maXhlZF90aW1lc3RhbXAiIGluIGdsb2JfZGljdDoKKyAgICBnbG9iX2RpY3RbInRpbWVzdGFtcCJdID0gRklYRURfRklMRV9USU1FU1RBTVAKKyAgaWYgImJ1aWxkLnByb3AiIGluIGdsb2JfZGljdDoKKyAgICB0aW1lc3RhbXAgPSBnbG9iX2RpY3RbImJ1aWxkLnByb3AiXS5HZXRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIpCisgICAgaWYgdGltZXN0YW1wOgorICAgICAgZ2xvYl9kaWN0WyJ0aW1lc3RhbXAiXSA9IHRpbWVzdGFtcAogCiBkZWYgSW1hZ2VQcm9wRnJvbUdsb2JhbERpY3QoZ2xvYl9kaWN0LCBtb3VudF9wb2ludCk6CiAgICIiIkJ1aWxkIGFuIGltYWdlIHByb3BlcnR5IGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkuCkBAIC02ODYsMTUgKzcwMSw3IEBACiAgICAgbW91bnRfcG9pbnQ6IHN1Y2ggYXMgInN5c3RlbSIsICJkYXRhIiBldGMuCiAgICIiIgogICBkID0ge30KLSAgVHJ5UGFyc2VGaW5nZXJwcmludChnbG9iX2RpY3QpCi0KLSAgIyBTZXQgZml4ZWQgdGltZXN0YW1wIGZvciBidWlsZGluZyB0aGUgT1RBIHBhY2thZ2UuCi0gIGlmICJ1c2VfZml4ZWRfdGltZXN0YW1wIiBpbiBnbG9iX2RpY3Q6Ci0gICAgZFsidGltZXN0YW1wIl0gPSBGSVhFRF9GSUxFX1RJTUVTVEFNUAotICBpZiAiYnVpbGQucHJvcCIgaW4gZ2xvYl9kaWN0OgotICAgIHRpbWVzdGFtcCA9IGdsb2JfZGljdFsiYnVpbGQucHJvcCJdLkdldFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKLSAgICBpZiB0aW1lc3RhbXA6Ci0gICAgICBkWyJ0aW1lc3RhbXAiXSA9IHRpbWVzdGFtcAorICBUcnlQYXJzZUZpbmdlcnByaW50QW5kVGltZXN0YW1wKGdsb2JfZGljdCkKIAogICBkZWYgY29weV9wcm9wKHNyY19wLCBkZXN0X3ApOgogICAgICIiIkNvcHkgYSBwcm9wZXJ0eSBmcm9tIHRoZSBnbG9iYWwgZGljdGlvbmFyeS4KQEAgLTczMCw2ICs3MzcsNyBAQAogICAgICAgImF2Yl9hdmJ0b29sIiwKICAgICAgICJ1c2VfZHluYW1pY19wYXJ0aXRpb25fc2l6ZSIsCiAgICAgICAiZmluZ2VycHJpbnQiLAorICAgICAgInRpbWVzdGFtcCIsCiAgICkKICAgZm9yIHAgaW4gY29tbW9uX3Byb3BzOgogICAgIGNvcHlfcHJvcChwLCBwKQpAQCAtOTY5LDYgKzk3Nyw4IEBACiAgICAgIndpbGwgaW5zdGFsbCBpbiBieSBkZWZhdWx0LCBzbyB0aGVyZSBjb3VsZCBiZSBmaWxlcyBpbiB0aGUgaW5wdXRfZGlyZWN0b3J5IHRoYXQgYXJlIG5vdCAiCiAgICAgImFjdHVhbGx5IHN1cHBvc2VkIHRvIGJlIHBhcnQgb2YgdGhlIHBhcnRpdGlvbi4gVGhlIHBhdGhzIGluIHRoaXMgZmlsZSBtdXN0IGJlIHJlbGF0aXZlIHRvICIKICAgICAiaW5wdXRfZGlyZWN0b3J5LiIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tYnVpbGRfZGF0ZXRpbWVfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIGlkIHRpbWVzdGFtcCIpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoImlucHV0X2RpcmVjdG9yeSIsCiAgICAgaGVscD0idGhlIHN0YWdpbmcgZGlyZWN0b3J5IHRvIGJlIGNvbnZlcnRlZCB0byBhbiBpbWFnZSBmaWxlIikKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgicHJvcGVydGllc19maWxlIiwKQEAgLTk4OCwxMCArOTk4LDE2IEBACiAgIGNvbW1vbi5Jbml0TG9nZ2luZygpCiAKICAgZ2xvYl9kaWN0ID0gTG9hZEdsb2JhbERpY3QoYXJncy5wcm9wZXJ0aWVzX2ZpbGUpCisgIGlmIGFyZ3MuYnVpbGRfZGF0ZXRpbWVfZmlsZToKKyAgICAjIFBhcnNlIHRoZSB0aW1lc3RhbXAgZnJvbSBidWlsZF9kYXRldGltZV9maWxlLgorICAgIHdpdGggb3BlbihhcmdzLmJ1aWxkX2RhdGV0aW1lX2ZpbGUsICJyIikgYXMgZjoKKyAgICAgIGdsb2JfZGljdFsidGltZXN0YW1wIl0gPSBpbnQoZi5yZWFkKCkpCisKICAgaWYgIm1vdW50X3BvaW50IiBpbiBnbG9iX2RpY3Q6CiAgICAgIyBUaGUgY2FsbGVyIGtub3dzIHRoZSBtb3VudCBwb2ludCBhbmQgcHJvdmlkZXMgYSBkaWN0aW9uYXJ5IG5lZWRlZCBieQogICAgICMgQnVpbGRJbWFnZSgpLgogICAgIGltYWdlX3Byb3BlcnRpZXMgPSBnbG9iX2RpY3QKKyAgICBUcnlQYXJzZUZpbmdlcnByaW50QW5kVGltZXN0YW1wKGltYWdlX3Byb3BlcnRpZXMpCiAgIGVsc2U6CiAgICAgaW1hZ2VfZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGFyZ3Mub3V0X2ZpbGUpCiAgICAgbW91bnRfcG9pbnQgPSAiIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfdmludGYucHkKaW5kZXggYjhkY2Q4NC4uZGMxMjNlZiAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmLnB5CkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgemlwZmlsZQogCitpbXBvcnQgYXBleF91dGlscwogaW1wb3J0IGNvbW1vbgogZnJvbSBhcGV4X21hbmlmZXN0IGltcG9ydCBQYXJzZUFwZXhNYW5pZmVzdAogCkBAIC0yMjksNyArMjMwLDcgQEAKICAgYXBleF9ob3N0ID0gb3MucGF0aC5qb2luKE9QVElPTlMuc2VhcmNoX3BhdGgsICdiaW4nLCAnYXBleGRfaG9zdCcpCiAgIGNtZCA9IFthcGV4X2hvc3QsICctLXRvb2xfcGF0aCcsIE9QVElPTlMuc2VhcmNoX3BhdGhdCiAgIGNtZCArPSBbJy0tYXBleF9wYXRoJywgZGlybWFwWycvYXBleCddXQotICBmb3IgcCBpbiBbJ3N5c3RlbScsICdzeXN0ZW1fZXh0JywgJ3Byb2R1Y3QnLCAndmVuZG9yJ106CisgIGZvciBwIGluIGFwZXhfdXRpbHMuUEFSVElUSU9OUzoKICAgICBpZiAnLycgKyBwIGluIGRpcm1hcDoKICAgICAgIGNtZCArPSBbJy0tJyArIHAgKyAnX3BhdGgnLCBkaXJtYXBbJy8nICsgcF1dCiAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQppbmRleCA0ODM0ODM0Li5mMDRkZmI3IDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKQEAgLTg5OCw3ICs4OTgsNyBAQAogICAgICAgaWYga2V5LmVuZHN3aXRoKCJzZWxpbnV4X2ZjIik6CiAgICAgICAgIGZjX2Jhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShkW2tleV0pCiAgICAgICAgIGZjX2NvbmZpZyA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAiTUVUQSIsIGZjX2Jhc2VuYW1lKQotICAgICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoZmNfY29uZmlnKQorICAgICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoZmNfY29uZmlnKSwgInt9IGRvZXMgbm90IGV4aXN0Ii5mb3JtYXQoZmNfY29uZmlnKQogCiAgICAgICAgIGRba2V5XSA9IGZjX2NvbmZpZwogCkBAIC05MDcsOSArOTA3LDEwIEBACiAgICAgZFsicm9vdF9mc19jb25maWciXSA9IG9zLnBhdGguam9pbigKICAgICAgICAgaW5wdXRfZmlsZSwgIk1FVEEiLCAicm9vdF9maWxlc3lzdGVtX2NvbmZpZy50eHQiKQogCisgICAgcGFydGl0aW9ucyA9IFsic3lzdGVtIiwgInZlbmRvciIsICJzeXN0ZW1fZXh0IiwgInByb2R1Y3QiLCAib2RtIiwKKyAgICAgICAgICAgICAgICAgICJ2ZW5kb3JfZGxrbSIsICJvZG1fZGxrbSIsICJzeXN0ZW1fZGxrbSJdCiAgICAgIyBSZWRpcmVjdCB7cGFydGl0aW9ufV9iYXNlX2ZzX2ZpbGUgZm9yIGVhY2ggb2YgdGhlIG5hbWVkIHBhcnRpdGlvbnMuCi0gICAgZm9yIHBhcnRfbmFtZSBpbiBbInN5c3RlbSIsICJ2ZW5kb3IiLCAic3lzdGVtX2V4dCIsICJwcm9kdWN0IiwgIm9kbSIsCi0gICAgICAgICAgICAgICAgICAgICAgInZlbmRvcl9kbGttIiwgIm9kbV9kbGttIiwgInN5c3RlbV9kbGttIl06CisgICAgZm9yIHBhcnRfbmFtZSBpbiBwYXJ0aXRpb25zOgogICAgICAga2V5X25hbWUgPSBwYXJ0X25hbWUgKyAiX2Jhc2VfZnNfZmlsZSIKICAgICAgIGlmIGtleV9uYW1lIG5vdCBpbiBkOgogICAgICAgICBjb250aW51ZQpAQCAtOTIyLDYgKzkyMywyNSBAQAogICAgICAgICAgICAgIkZhaWxlZCB0byBmaW5kICVzIGJhc2UgZnMgZmlsZTogJXMiLCBwYXJ0X25hbWUsIGJhc2VfZnNfZmlsZSkKICAgICAgICAgZGVsIGRba2V5X25hbWVdCiAKKyAgICAjIFJlZGlyZWN0aW5nIGhlbHBlciBmb3Igb3B0aW9uYWwgcHJvcGVydGllcyBsaWtlIGVyb2ZzX2NvbXByZXNzX2hpbnRzCisgICAgZGVmIHJlZGlyZWN0X2ZpbGUocHJvcCwgZmlsZW5hbWUpOgorICAgICAgaWYgcHJvcCBub3QgaW4gZDoKKyAgICAgICAgcmV0dXJuCisgICAgICBjb25maWdfZmlsZSA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAiTUVUQS8iICsgZmlsZW5hbWUpCisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjb25maWdfZmlsZSk6CisgICAgICAgIGRbcHJvcF0gPSBjb25maWdfZmlsZQorICAgICAgZWxzZToKKyAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgJXMgZnJvICVzIiwgZmlsZW5hbWUsIHByb3ApCisgICAgICAgIGRlbCBkW3Byb3BdCisKKyAgICAjIFJlZGlyZWN0IGVyb2ZzX1tkZWZhdWx0X11jb21wcmVzc19oaW50cyBmaWxlcworICAgIHJlZGlyZWN0X2ZpbGUoImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NfaGludHMiLAorICAgICAgICAgICAgICAgICAgImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NfaGludHMudHh0IikKKyAgICBmb3IgcGFydCBpbiBwYXJ0aXRpb25zOgorICAgICAgcmVkaXJlY3RfZmlsZShwYXJ0ICsgIl9lcm9mc19jb21wcmVzc19oaW50cyIsCisgICAgICAgICAgICAgICAgICAgIHBhcnQgKyAiX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dCIpCisKICAgZGVmIG1ha2VpbnQoa2V5KToKICAgICBpZiBrZXkgaW4gZDoKICAgICAgIGRba2V5XSA9IGludChkW2tleV0sIDApCkBAIC0yNDM0LDEyICsyNDU0LDIzIEBACiAgICAgICAgICJGYWlsZWQgdG8gb2J0YWluIG1pblNka1ZlcnNpb24gZm9yIHt9OiBhYXB0MiByZXR1cm4gY29kZSB7fTpcbnt9XG57fSIuZm9ybWF0KAogICAgICAgICAgICAgYXBrX25hbWUsIHByb2MucmV0dXJuY29kZSwgc3Rkb3V0ZGF0YSwgc3RkZXJyZGF0YSkpCiAKKyAgaXNfc3BsaXRfYXBrID0gRmFsc2UKICAgZm9yIGxpbmUgaW4gc3Rkb3V0ZGF0YS5zcGxpdCgiXG4iKToKKyAgICAjIFNlZSBiLzM1MzgzNzM0NyAsIHNwbGl0IEFQS3MgZG8gbm90IGhhdmUgc2RrIHZlcnNpb24gZGVmaW5lZCwKKyAgICAjIHNvIHdlIGRlZmF1bHQgdG8gMjEgYXMgc3BsaXQgQVBLcyBhcmUgb25seSBzdXBwb3J0ZWQgc2luY2UgU0RLCisgICAgIyAyMS4KKyAgICBpZiAocmUuc2VhcmNoKHIic3BsaXQ9W1wiJ10uKltcIiddIiwgbGluZSkpOgorICAgICAgaXNfc3BsaXRfYXBrID0gVHJ1ZQogICAgICMgRHVlIHRvIGFnLzI0MTYxNzA4LCBsb29raW5nIGZvciBsaW5lcyBzdWNoIGFzIG1pblNka1ZlcnNpb246JzIzJyxtaW5TZGtWZXJzaW9uOidNJwogICAgICMgb3Igc2RrVmVyc2lvbjonMjMnLCBzZGtWZXJzaW9uOidNJy4KICAgICBtID0gcmUubWF0Y2gocicoPzptaW5TZGtWZXJzaW9ufHNka1ZlcnNpb24pOlwnKFteXCddKilcJycsIGxpbmUpCiAgICAgaWYgbToKICAgICAgIHJldHVybiBtLmdyb3VwKDEpCisgIGlmIGlzX3NwbGl0X2FwazoKKyAgICBsb2dnZXIuaW5mbygiJXMgaXMgYSBzcGxpdCBBUEssIGl0IGRvZXMgbm90IGhhdmUgbWluaW11bSBTREsgdmVyc2lvbiIKKyAgICAgICAgICAgICAgICAiIGRlZmluZWQuIERlZmF1bHRpbmcgdG8gMjEgYmVjYXVzZSBzcGxpdCBBUEsgaXNuJ3Qgc3VwcG9ydGVkIgorICAgICAgICAgICAgICAgICIgYmVmb3JlIHRoYXQuIiwgYXBrX25hbWUpCisgICAgcmV0dXJuIDIxCiAgIHJhaXNlIEV4dGVybmFsRXJyb3IoIk5vIG1pblNka1ZlcnNpb24gcmV0dXJuZWQgYnkgYWFwdDIgZm9yIGFwazoge30iLmZvcm1hdChhcGtfbmFtZSkpCiAKIApAQCAtMjk3Nyw3ICszMDA4LDcgQEAKICAgICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gc2F2ZWRfemlwNjRfbGltaXQKIAogCi1kZWYgWmlwV3JpdGVTdHIoemlwX2ZpbGUsIHppbmZvX29yX2FyY25hbWUsIGRhdGEsIHBlcm1zPU5vbmUsCitkZWYgWmlwV3JpdGVTdHIoemlwX2ZpbGU6IHppcGZpbGUuWmlwRmlsZSwgemluZm9fb3JfYXJjbmFtZSwgZGF0YSwgcGVybXM9Tm9uZSwKICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPU5vbmUpOgogICAiIiJXcmFwIHppcGZpbGUud3JpdGVzdHIoKSBmdW5jdGlvbiB0byB3b3JrIGFyb3VuZCB0aGUgemlwNjQgbGltaXQuCiAKQEAgLTMyMDcsNyArMzIzOCw5IEBACiAgICAgcmV0dXJuIHQKIAogICBkZWYgV3JpdGVUb0RpcihzZWxmLCBkKToKLSAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGQsIHNlbGYubmFtZSksICJ3YiIpIGFzIGZwOgorICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKGQsIHNlbGYubmFtZSkKKyAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpLCBleGlzdF9vaz1UcnVlKQorICAgIHdpdGggb3BlbihvdXRwdXRfcGF0aCwgIndiIikgYXMgZnA6CiAgICAgICBmcC53cml0ZShzZWxmLmRhdGEpCiAKICAgZGVmIEFkZFRvWmlwKHNlbGYsIHosIGNvbXByZXNzaW9uPU5vbmUpOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlX290YS5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZV9vdGEucHkKaW5kZXggZmI1OTU3YS4uZTg3MzJhMiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlX290YS5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2Vfb3RhLnB5CkBAIC0yMjYsOSArMjI2LDIxIEBACiAgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKIAogICBsb2dnZXIuaW5mbyhhcmdzKQorICBpZiBhcmdzLmphdmFfcGF0aDoKKyAgICBjb21tb24uT1BUSU9OUy5qYXZhX3BhdGggPSBhcmdzLmphdmFfcGF0aAorCiAgIGlmIGFyZ3Muc2VhcmNoX3BhdGg6CiAgICAgY29tbW9uLk9QVElPTlMuc2VhcmNoX3BhdGggPSBhcmdzLnNlYXJjaF9wYXRoCiAKKyAgaWYgYXJncy5zaWduYXBrX3BhdGg6CisgICAgY29tbW9uLk9QVElPTlMuc2lnbmFwa19wYXRoID0gYXJncy5zaWduYXBrX3BhdGgKKworICBpZiBhcmdzLmV4dHJhX3NpZ25hcGtfYXJnczoKKyAgICBjb21tb24uT1BUSU9OUy5leHRyYV9zaWduYXBrX2FyZ3MgPSBhcmdzLmV4dHJhX3NpZ25hcGtfYXJncworCisgIGlmIGFyZ3Muc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoOgorICAgIGNvbW1vbi5PUFRJT05TLnNpZ25hcGtfc2hhcmVkX2xpYnJhcnlfcGF0aCA9IGFyZ3Muc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoCisKICAgbWV0YWRhdGFfb3RhID0gYXJncy5wYWNrYWdlc1stMV0KICAgaWYgYXJncy5tZXRhZGF0YV9vdGEgaXMgbm90IE5vbmU6CiAgICAgbWV0YWRhdGFfb3RhID0gYXJncy5tZXRhZGF0YV9vdGEKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV9yYXdfaW1nLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKaW5kZXggMDNiNDRmMS4uM2I5Mzc0YSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKQEAgLTEwNSw5ICsxMDUsNiBAQAogCiAgICAgaWYgYXJncy5wYWNrYWdlX2tleToKICAgICAgIGxvZ2dlci5pbmZvKCJTaWduaW5nIHBheWxvYWQuLi4iKQotICAgICAgIyBUT0RPOiByZW1vdmUgT1BUSU9OUyB3aGVuIG5vIGxvbmdlciB1c2VkIGFzIGZhbGxiYWNrIGluIHBheWxvYWRfc2lnbmVyCi0gICAgICBjb21tb24uT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzID0gTm9uZQotICAgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSA9IE5vbmUKICAgICAgIHNpZ25lciA9IFBheWxvYWRTaWduZXIoYXJncy5wYWNrYWdlX2tleSwgYXJncy5wcml2YXRlX2tleV9zdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9wYXNzd29yZHNbYXJncy5wYWNrYWdlX2tleV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2lnbmVyPWFyZ3MucGF5bG9hZF9zaWduZXIsCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcy5weQppbmRleCA5ODVjZDU2Li43NmQxNjhjIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKQEAgLTI2NCw2ICsyNjQsMTAgQEAKIAogICAtLWNvbXByZXNzaW9uX2ZhY3RvcgogICAgICAgU3BlY2lmeSB0aGUgbWF4aW11bSBibG9jayBzaXplIHRvIGJlIGNvbXByZXNzZWQgYXQgb25jZSBkdXJpbmcgT1RBLiBzdXBwb3J0ZWQgb3B0aW9uczogNGssIDhrLCAxNmssIDMyaywgNjRrLCAxMjhrLCAyNTZrCisKKyAgLS1mdWxsX290YV9wYXJ0aXRpb25zCisgICAgICBTcGVjaWZ5IGxpc3Qgb2YgcGFydGl0aW9ucyBzaG91bGQgYmUgdXBkYXRlZCBpbiBmdWxsIE9UQSBmYXNoaW9uLCBldmVuIGlmCisgICAgICBhbiBpbmNyZW1lbnRhbCBPVEEgaXMgYWJvdXQgdG8gYmUgZ2VuZXJhdGVkCiAiIiIKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgpAQCAtMjgzLDcgKzI4Nyw3IEBACiBpbXBvcnQgb3RhX3V0aWxzCiBpbXBvcnQgcGF5bG9hZF9zaWduZXIKIGZyb20gb3RhX3V0aWxzIGltcG9ydCAoVkFCQ19DT01QUkVTU0lPTl9QQVJBTV9TVVBQT1JULCBGaW5hbGl6ZU1ldGFkYXRhLCBHZXRQYWNrYWdlTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRHZW5lcmF0b3IsIFNFQ1VSSVRZX1BBVENIX0xFVkVMX1BST1BfTkFNRSwgRXh0cmFjdFRhcmdldEZpbGVzLCBDb3B5VGFyZ2V0RmlsZXNEaXIpCisgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRHZW5lcmF0b3IsIFNFQ1VSSVRZX1BBVENIX0xFVkVMX1BST1BfTkFNRSwgRXh0cmFjdFRhcmdldEZpbGVzLCBDb3B5VGFyZ2V0RmlsZXNEaXIsIFRBUkdFVF9GSUxFU19JTUFHRVNfU1VCRElSKQogZnJvbSBjb21tb24gaW1wb3J0IERvZXNJbnB1dEZpbGVDb250YWluLCBJc1NwYXJzZUltYWdlCiBpbXBvcnQgdGFyZ2V0X2ZpbGVzX2RpZmYKIGZyb20gbm9uX2FiX290YSBpbXBvcnQgR2VuZXJhdGVOb25BYk90YVBhY2thZ2UKQEAgLTMzNyw2ICszNDEsNyBAQAogT1BUSU9OUy5tYXhfdGhyZWFkcyA9IE5vbmUKIE9QVElPTlMudmFiY19jb3dfdmVyc2lvbiA9IE5vbmUKIE9QVElPTlMuY29tcHJlc3Npb25fZmFjdG9yID0gTm9uZQorT1BUSU9OUy5mdWxsX290YV9wYXJ0aXRpb25zID0gTm9uZQogCiAKIFBPU1RJTlNUQUxMX0NPTkZJRyA9ICdNRVRBL3Bvc3RpbnN0YWxsX2NvbmZpZy50eHQnCkBAIC04OTIsNiArODk3LDE0IEBACiAKICAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6CiAgICAgc291cmNlX2ZpbGUgPSBFeHRyYWN0VGFyZ2V0RmlsZXMoc291cmNlX2ZpbGUpCisgICAgaWYgT1BUSU9OUy5mdWxsX290YV9wYXJ0aXRpb25zOgorICAgICAgZm9yIHBhcnRpdGlvbiBpbiBPUFRJT05TLmZ1bGxfb3RhX3BhcnRpdGlvbnM6CisgICAgICAgIGZvciBzdWJkaXIgaW4gVEFSR0VUX0ZJTEVTX0lNQUdFU19TVUJESVI6CisgICAgICAgICAgaW1hZ2VfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZmlsZSwgc3ViZGlyLCBwYXJ0aXRpb24gKyAiLmltZyIpCisgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW1hZ2VfcGF0aCk6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygKKyAgICAgICAgICAgICAgICAiSWdub3Jpbmcgc291cmNlIGltYWdlICVzIGZvciBwYXJ0aXRpb24gJXMgYmVjYXVzZSBpdCBpcyBjb25maWd1cmVkIHRvIHVzZSBmdWxsIE9UQSIsIGltYWdlX3BhdGgsIHBhcnRpdGlvbikKKyAgICAgICAgICAgIG9zLnJlbW92ZShpbWFnZV9wYXRoKQogICAgIGFzc2VydCAiYWJfcGFydGl0aW9ucyIgaW4gT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0LCBcCiAgICAgICAgICJNRVRBL2FiX3BhcnRpdGlvbnMudHh0IGlzIHJlcXVpcmVkIGZvciBhYl91cGRhdGUuIgogICAgIGFzc2VydCAiYWJfcGFydGl0aW9ucyIgaW4gT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0LCBcCkBAIC0xMDI2LDYgKzEwMzksOSBAQAogCiAgICMgUHJlcGFyZSBjdXN0b20gaW1hZ2VzLgogICBpZiBPUFRJT05TLmN1c3RvbV9pbWFnZXM6CisgICAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICBzb3VyY2VfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tSW1hZ2VzVXBkYXRlcygKKyAgICAgICAgICAgc291cmNlX2ZpbGUsIE9QVElPTlMuY3VzdG9tX2ltYWdlcykKICAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tSW1hZ2VzVXBkYXRlcygKICAgICAgICAgdGFyZ2V0X2ZpbGUsIE9QVElPTlMuY3VzdG9tX2ltYWdlcykKIApAQCAtMTEwOCwxNyArMTEyNCwxOCBAQAogICBhZGRpdGlvbmFsX2FyZ3MgKz0gWyItLWVuYWJsZV9sejRkaWZmPSIgKwogICAgICAgICAgICAgICAgICAgICAgIHN0cihPUFRJT05TLmVuYWJsZV9sejRkaWZmKS5sb3dlcigpXQogCisgIGVudl9vdmVycmlkZSA9IHt9CiAgIGlmIHNvdXJjZV9maWxlIGFuZCBPUFRJT05TLmVuYWJsZV9sejRkaWZmOgotICAgIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoc291cmNlX2ZpbGUsIFsiTUVUQS9saWJsejQuc28iXSkKLSAgICBsaWJsejRfcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF90bXAsICJNRVRBIiwgImxpYmx6NC5zbyIpCisgICAgbGlibHo0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2ZpbGUsICJNRVRBIiwgImxpYmx6NC5zbyIpCiAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKAogICAgICAgICBsaWJsejRfcGF0aCksICJsaWJsejQuc28gbm90IGZvdW5kIGluIE1FVEEvIGRpciBvZiB0YXJnZXQgZmlsZSB7fSIuZm9ybWF0KGxpYmx6NF9wYXRoKQogICAgIGxvZ2dlci5pbmZvKCJFbmFibGluZyBsejRkaWZmICVzIiwgbGlibHo0X3BhdGgpCi0gICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1saWJsejRfcGF0aCIsIGxpYmx6NF9wYXRoXQogICAgIGVyb2ZzX2NvbXByZXNzaW9uX3BhcmFtID0gT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0LmdldCgKICAgICAgICAgImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NvciIpCiAgICAgYXNzZXJ0IGVyb2ZzX2NvbXByZXNzaW9uX3BhcmFtIGlzIG5vdCBOb25lLCAiJ2Vyb2ZzX2RlZmF1bHRfY29tcHJlc3Nvcicgbm90IGZvdW5kIGluIE1FVEEvbWlzY19pbmZvLnR4dCBvZiB0YXJnZXQgYnVpbGQuIFRoaXMgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIGx6NGRpZmYuIgogICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZXJvZnNfY29tcHJlc3Npb25fcGFyYW0iLCBlcm9mc19jb21wcmVzc2lvbl9wYXJhbV0KKyAgICBlbnZfb3ZlcnJpZGVbIkxEX1BSRUxPQUQiXSA9IGxpYmx6NF9wYXRoICsgXAorICAgICAgICAiOiIgKyBvcy5lbnZpcm9uLmdldCgiTERfUFJFTE9BRCIsICIiKQogCiAgIGlmIE9QVElPTlMuZGlzYWJsZV92YWJjOgogICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZGlzYWJsZV92YWJjPXRydWUiXQpAQCAtMTEyOCwxMCArMTE0NSwxNSBAQAogICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tY29tcHJlc3Nvcl90eXBlcyIsIE9QVElPTlMuY29tcHJlc3Nvcl90eXBlc10KICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1tYXhfdGltZXN0YW1wIiwgbWF4X3RpbWVzdGFtcF0KIAorICBlbnYgPSBkaWN0KG9zLmVudmlyb24pCisgIGlmIGVudl9vdmVycmlkZToKKyAgICBsb2dnZXIuaW5mbygiVXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzICVzIiwgZW52X292ZXJyaWRlKQorICAgIGVudi51cGRhdGUoZW52X292ZXJyaWRlKQogICBwYXlsb2FkLkdlbmVyYXRlKAogICAgICAgdGFyZ2V0X2ZpbGUsCiAgICAgICBzb3VyY2VfZmlsZSwKLSAgICAgIGFkZGl0aW9uYWxfYXJncyArIHBhcnRpdGlvbl90aW1lc3RhbXBzX2ZsYWdzCisgICAgICBhZGRpdGlvbmFsX2FyZ3MgKyBwYXJ0aXRpb25fdGltZXN0YW1wc19mbGFncywKKyAgICAgIGVudj1lbnYKICAgKQogCiAgICMgU2lnbiB0aGUgcGF5bG9hZC4KQEAgLTExOTMsNyArMTIxNSw3IEBACiAKIGRlZiBtYWluKGFyZ3YpOgogCi0gIGRlZiBvcHRpb25faGFuZGxlcihvLCBhKToKKyAgZGVmIG9wdGlvbl9oYW5kbGVyKG8sIGE6IHN0cik6CiAgICAgaWYgbyBpbiAoIi1pIiwgIi0taW5jcmVtZW50YWxfZnJvbSIpOgogICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBhCiAgICAgZWxpZiBvID09ICItLWZ1bGxfcmFkaW8iOgpAQCAtMTMyMCw2ICsxMzQyLDkgQEAKICAgICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICVyIC0gb25seSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSAoYSwgbykpCisgICAgZWxpZiBvID09ICItLWZ1bGxfb3RhX3BhcnRpdGlvbnMiOgorICAgICAgT1BUSU9OUy5mdWxsX290YV9wYXJ0aXRpb25zID0gc2V0KAorICAgICAgICAgIGEuc3RyaXAoKS5zdHJpcCgiXCIiKS5zdHJpcCgiJyIpLnNwbGl0KCIsIikpCiAgICAgZWxzZToKICAgICAgIHJldHVybiBGYWxzZQogICAgIHJldHVybiBUcnVlCkBAIC0xMzcwLDYgKzEzOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heF90aHJlYWRzPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFiY19jb3dfdmVyc2lvbj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzaW9uX2ZhY3Rvcj0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGxfb3RhX3BhcnRpdGlvbnM9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZXh0cmFfb3B0aW9uX2hhbmRsZXI9W29wdGlvbl9oYW5kbGVyLCBwYXlsb2FkX3NpZ25lci5zaWduZXJfb3B0aW9uc10pCiAgIGNvbW1vbi5Jbml0TG9nZ2luZygpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfc2lnbmluZ191dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfc2lnbmluZ191dGlscy5weQppbmRleCA2MGM4Yzk0Li45ZDA0YzNiIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX3NpZ25pbmdfdXRpbHMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9zaWduaW5nX3V0aWxzLnB5CkBAIC0yMywxMCArMjMsMTggQEAKIAogCiBkZWYgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UocGFyc2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tamF2YV9wYXRoJywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBKVk0gaWYgb3RoZXIgdGhhbiBkZWZhdWx0JykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYWNrYWdlX2tleScsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGhzIHRvIHByaXZhdGUga2V5IGZvciBzaWduaW5nIHBheWxvYWQnKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlYXJjaF9wYXRoJywgJy0tcGF0aCcsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NlYXJjaCBwYXRoIGZvciBmcmFtZXdvcmsvc2lnbmFway5qYXInKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNpZ25hcGtfcGF0aCcsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gc2lnbmFway5qYXIsIHJlbGF0aXZlIHRvIHNlYXJjaF9wYXRoJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRyYV9zaWduYXBrX2FyZ3MnLCB0eXBlPVBhcnNlU2lnbmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdFeHRyYSBhcmd1bWVudHMgZm9yIHNpZ25hcGsuamFyJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGgnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIGxpYjY0IGxpYnJhcmllcyB1c2VkIGJ5IHNpZ25hcGsuamFyJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcicsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gY3VzdG9tIHBheWxvYWQgc2lnbmVyJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcl9hcmdzJywgdHlwZT1QYXJzZVNpZ25lckFyZ3MsCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV91dGlscy5weQppbmRleCA4MWI1M2RjLi44NTJkNjJiIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX3V0aWxzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfdXRpbHMucHkKQEAgLTg0NSwxNiArODQ1LDE2IEBACiAgICAgc2VsZi5pc19wYXJ0aWFsX3VwZGF0ZSA9IGlzX3BhcnRpYWxfdXBkYXRlCiAgICAgc2VsZi5zcGxfZG93bmdyYWRlID0gc3BsX2Rvd25ncmFkZQogCi0gIGRlZiBfUnVuKHNlbGYsIGNtZCk6ICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICBkZWYgX1J1bihzZWxmLCBjbWQsICoqa3dhcmdzKTogICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCiAgICAgIyBEb24ndCBwaXBlIChidWZmZXIpIHRoZSBvdXRwdXQgaWYgdmVyYm9zZSBpcyBzZXQuIExldAogICAgICMgYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIHdyaXRlIHRvIHN0ZG91dC9zdGRlcnIgZGlyZWN0bHksIHNvIGl0cyBwcm9ncmVzcyBjYW4KICAgICAjIGJlIG1vbml0b3JlZC4KICAgICBpZiBPUFRJT05TLnZlcmJvc2U6Ci0gICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUpCisgICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsICoqa3dhcmdzKQogICAgIGVsc2U6Ci0gICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQorICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCwgKiprd2FyZ3MpCiAKLSAgZGVmIEdlbmVyYXRlKHNlbGYsIHRhcmdldF9maWxlLCBzb3VyY2VfZmlsZT1Ob25lLCBhZGRpdGlvbmFsX2FyZ3M9Tm9uZSk6CisgIGRlZiBHZW5lcmF0ZShzZWxmLCB0YXJnZXRfZmlsZSwgc291cmNlX2ZpbGU9Tm9uZSwgYWRkaXRpb25hbF9hcmdzPU5vbmUsICoqa3dhcmdzKToKICAgICAiIiJHZW5lcmF0ZXMgYSBwYXlsb2FkIGZyb20gdGhlIGdpdmVuIHRhcmdldC1maWxlcyB6aXAocykuCiAKICAgICBBcmdzOgpAQCAtODYzLDYgKzg2Myw3IEBACiAgICAgICAgICAgZ2VuZXJhdGluZyBhIGZ1bGwgT1RBLgogICAgICAgYWRkaXRpb25hbF9hcmdzOiBBIGxpc3Qgb2YgYWRkaXRpb25hbCBhcmdzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0bwogICAgICAgICAgIGRlbHRhX2dlbmVyYXRvciBiaW5hcnk7IG9yIE5vbmUuCisgICAgICBrd2FyZ3M6IEFueSBhZGRpdGlvbmFsIGFyZ3MgdG8gcGFzcyB0byBzdWJwcm9jZXNzLlBvcGVuCiAgICAgIiIiCiAgICAgaWYgYWRkaXRpb25hbF9hcmdzIGlzIE5vbmU6CiAgICAgICBhZGRpdGlvbmFsX2FyZ3MgPSBbXQpAQCAtOTE4LDcgKzkxOSw3IEBACiAgICAgaWYgc2VsZi5pc19wYXJ0aWFsX3VwZGF0ZToKICAgICAgIGNtZC5leHRlbmQoWyItLWlzX3BhcnRpYWxfdXBkYXRlPXRydWUiXSkKICAgICBjbWQuZXh0ZW5kKGFkZGl0aW9uYWxfYXJncykKLSAgICBzZWxmLl9SdW4oY21kKQorICAgIHNlbGYuX1J1bihjbWQsICoqa3dhcmdzKQogCiAgICAgc2VsZi5wYXlsb2FkX2ZpbGUgPSBwYXlsb2FkX2ZpbGUKICAgICBzZWxmLnBheWxvYWRfcHJvcGVydGllcyA9IE5vbmUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKaW5kZXggYjhmODQ4Zi4uNGFkOTdlMCAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKQEAgLTE4NCwxNCArMTg0LDE3IEBACiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAogaW1wb3J0IHN5cworaW1wb3J0IHNobGV4CiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB6aXBmaWxlCiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKIAogaW1wb3J0IGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzCitpbXBvcnQgb3RhX2Zyb21fcmF3X2ltZwogaW1wb3J0IGFwZXhfdXRpbHMKIGltcG9ydCBjb21tb24KIGltcG9ydCBwYXlsb2FkX3NpZ25lcgoraW1wb3J0IHVwZGF0ZV9wYXlsb2FkCiBmcm9tIHBheWxvYWRfc2lnbmVyIGltcG9ydCBTaWduT3RhUGFja2FnZSwgUEFZTE9BRF9CSU4KIAogCkBAIC0yMjEsNiArMjI0LDcgQEAKIE9QVElPTlMuYWxsb3dfZ3NpX2RlYnVnX3NlcG9saWN5ID0gRmFsc2UKIE9QVElPTlMub3ZlcnJpZGVfYXBrX2tleXMgPSBOb25lCiBPUFRJT05TLm92ZXJyaWRlX2FwZXhfa2V5cyA9IE5vbmUKK09QVElPTlMuaW5wdXRfdG1wID0gTm9uZQogCiAKIEFWQl9GT09URVJfQVJHU19CWV9QQVJUSVRJT04gPSB7CkBAIC01NzksNyArNTgzLDEwNCBAQAogICAgICAgICBmaWxlbmFtZS5lbmRzd2l0aCgiL3Byb3AuZGVmYXVsdCIpCiAKIAotZGVmIFByb2Nlc3NUYXJnZXRGaWxlcyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvLAorZGVmIEdldE90YVNpZ25pbmdBcmdzKCk6CisgIGFyZ3MgPSBbXQorICBpZiBPUFRJT05TLnBhY2thZ2Vfa2V5OgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYWNrYWdlX2tleSIsIE9QVElPTlMucGFja2FnZV9rZXldKQorICBpZiBPUFRJT05TLnBheWxvYWRfc2lnbmVyOgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXlsb2FkX3NpZ25lcj0iICsgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl0pCisgIGlmIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJnczoKKyAgICBhcmdzLmV4dGVuZChbIi0tcGF5bG9hZF9zaWduZXJfYXJncz0iICsgc2hsZXguam9pbihPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MpXSkKKyAgaWYgT1BUSU9OUy5zZWFyY2hfcGF0aDoKKyAgICBhcmdzLmV4dGVuZChbIi0tc2VhcmNoX3BhdGgiLCBPUFRJT05TLnNlYXJjaF9wYXRoXSkKKyAgaWYgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplOgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplIiwKKyAgICAgICAgICAgICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemVdKQorICBpZiBPUFRJT05TLnByaXZhdGVfa2V5X3N1ZmZpeDoKKyAgICBhcmdzLmV4dGVuZChbIi0tcHJpdmF0ZV9rZXlfc3VmZml4IiwgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXhdKQorICByZXR1cm4gYXJncworCisKK2RlZiBSZWdlbmVyYXRlS2VybmVsUGFydGl0aW9ucyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBtaXNjX2luZm8pOgorICAiIiJSZS1nZW5lcmF0ZSBib290IGFuZCBkdGJvIHBhcnRpdGlvbnMgdXNpbmcgbmV3IHNpZ25pbmcgY29uZmlndXJhdGlvbiIiIgorICBmaWxlc190b191bnppcCA9IFsKKyAgICAgICJQUkVCVUlMVF9JTUFHRVMvKiIsICJCT09UQUJMRV9JTUFHRVMvKi5pbWciLCAiKi9ib290XzE2ay5pbWciLCAiKi9kdGJvXzE2ay5pbWciXQorICBpZiBPUFRJT05TLmlucHV0X3RtcCBpcyBOb25lOgorICAgIE9QVElPTlMuaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChpbnB1dF90Zl96aXAuZmlsZW5hbWUsIGZpbGVzX3RvX3VuemlwKQorICBlbHNlOgorICAgIGNvbW1vbi5VbnppcFRvRGlyKGlucHV0X3RmX3ppcC5maWxlbmFtZSwgT1BUSU9OUy5pbnB1dF90bXAsIGZpbGVzX3RvX3VuemlwKQorICB1bnppcF9kaXIgPSBPUFRJT05TLmlucHV0X3RtcAorICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4odW56aXBfZGlyLCAiSU1BR0VTIiksIGV4aXN0X29rPVRydWUpCisKKyAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAorICAgICAgIklNQUdFUy9ib290LmltZyIsICJib290LmltZyIsIHVuemlwX2RpciwgIkJPT1QiLCBtaXNjX2luZm8pCisgIGlmIGJvb3RfaW1hZ2U6CisgICAgYm9vdF9pbWFnZS5Xcml0ZVRvRGlyKHVuemlwX2RpcikKKyAgICBib290X2ltYWdlID0gb3MucGF0aC5qb2luKHVuemlwX2RpciwgYm9vdF9pbWFnZS5uYW1lKQorICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBib290X2ltYWdlLCAiSU1BR0VTL2Jvb3QuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgIGlmIG1pc2NfaW5mby5nZXQoImhhc19kdGJvIikgPT0gInRydWUiOgorICAgIGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLkFkZER0Ym8ob3V0cHV0X3RmX3ppcCkKKyAgcmV0dXJuIHVuemlwX2RpcgorCisKK2RlZiBSZWdlbmVyYXRlQm9vdE9UQShpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgZmlsZW5hbWUsIGlucHV0X290YSk6CisgIHdpdGggaW5wdXRfdGZfemlwLm9wZW4oZmlsZW5hbWUsICJyIikgYXMgaW5fZnA6CisgICAgcGF5bG9hZCA9IHVwZGF0ZV9wYXlsb2FkLlBheWxvYWQoaW5fZnApCisgIGlzX2luY3JlbWVudGFsID0gYW55KFtwYXJ0Lkhhc0ZpZWxkKCdvbGRfcGFydGl0aW9uX2luZm8nKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gcGF5bG9hZC5tYW5pZmVzdC5wYXJ0aXRpb25zXSkKKyAgaXNfYm9vdF9vdGEgPSBmaWxlbmFtZS5zdGFydHN3aXRoKAorICAgICAgIlZFTkRPUi9ib290X290YXMvIikgb3IgZmlsZW5hbWUuc3RhcnRzd2l0aCgiU1lTVEVNL2Jvb3Rfb3Rhcy8iKQorICBpZiBub3QgaXNfYm9vdF9vdGE6CisgICAgcmV0dXJuCisgIGlzXzRrX2Jvb3Rfb3RhID0gZmlsZW5hbWUgaW4gWworICAgICAgIlZFTkRPUi9ib290X290YXMvYm9vdF9vdGFfNGsuemlwIiwgIlNZU1RFTS9ib290X290YXMvYm9vdF9vdGFfNGsuemlwIl0KKyAgIyBPbmx5IDRLIGJvb3QgaW1hZ2UgaXMgcmUtZ2VuZXJhdGVkLCBzbyBpZiAxNksgYm9vdCBvdGEgaXNuJ3QgaW5jcmVtZW50YWwsCisgICMgd2UgZG8gbm90IG5lZWQgdG8gcmUtZ2VuZXJhdGUKKyAgaWYgbm90IGlzXzRrX2Jvb3Rfb3RhIGFuZCBub3QgaXNfaW5jcmVtZW50YWw6CisgICAgcmV0dXJuCisKKyAgdGltZXN0YW1wID0gc3RyKHBheWxvYWQubWFuaWZlc3QubWF4X3RpbWVzdGFtcCkKKyAgcGFydGl0aW9ucyA9IFtwYXJ0LnBhcnRpdGlvbl9uYW1lIGZvciBwYXJ0IGluIHBheWxvYWQubWFuaWZlc3QucGFydGl0aW9uc10KKyAgdW56aXBfZGlyID0gT1BUSU9OUy5pbnB1dF90bXAKKyAgc2lnbmVkX2Jvb3RfaW1hZ2UgPSBvcy5wYXRoLmpvaW4odW56aXBfZGlyLCAiSU1BR0VTIiwgImJvb3QuaW1nIikKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNpZ25lZF9ib290X2ltYWdlKToKKyAgICBsb2dnZXIud2FybigiTmVlZCB0byByZS1nZW5lcmF0ZSBib290IE9UQSB7fSBidXQgZmFpbGVkIHRvIGdldCBzaWduZWQgYm9vdCBpbWFnZS4gMTZLIGRldiBvcHRpb24gd2lsbCBiZSBpbXBhY3RlZCwgYWZ0ZXIgcm9sbGluZyBiYWNrIHRvIDRLIHVzZXIgd291bGQgbmVlZCB0byBzaWRlbG9hZC9mbGFzaCB0aGVpciBkZXZpY2UgdG8gY29udGludWUgcmVjZWl2aW5nIE9UQXMuIikKKyAgICByZXR1cm4KKyAgc2lnbmVkX2R0Ym9faW1hZ2UgPSBvcy5wYXRoLmpvaW4odW56aXBfZGlyLCAiSU1BR0VTIiwgImR0Ym8uaW1nIikKKyAgaWYgImR0Ym8iIGluIHBhcnRpdGlvbnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhzaWduZWRfZHRib19pbWFnZSk6CisgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgIkJvb3QgT1RBIHt9IGhhcyBkdGJvIHBhcnRpdGlvbiwgYnV0IG5vIGR0Ym8gaW1hZ2UgZm91bmQgaW4gdGFyZ2V0IGZpbGVzLiIuZm9ybWF0KGZpbGVuYW1lKSkKKyAgaWYgaXNfaW5jcmVtZW50YWw6CisgICAgc2lnbmVkXzE2a19ib290X2ltYWdlID0gb3MucGF0aC5qb2luKAorICAgICAgICB1bnppcF9kaXIsICJJTUFHRVMiLCAiYm9vdF8xNmsuaW1nIikKKyAgICBzaWduZWRfMTZrX2R0Ym9faW1hZ2UgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIHVuemlwX2RpciwgIklNQUdFUyIsICJkdGJvXzE2ay5pbWciKQorICAgIGlmIGlzXzRrX2Jvb3Rfb3RhOgorICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2lnbmVkXzE2a19ib290X2ltYWdlKToKKyAgICAgICAgc2lnbmVkX2Jvb3RfaW1hZ2UgPSBzaWduZWRfMTZrX2Jvb3RfaW1hZ2UgKyAiOiIgKyBzaWduZWRfYm9vdF9pbWFnZQorICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2lnbmVkXzE2a19kdGJvX2ltYWdlKToKKyAgICAgICAgc2lnbmVkX2R0Ym9faW1hZ2UgPSBzaWduZWRfMTZrX2R0Ym9faW1hZ2UgKyAiOiIgKyBzaWduZWRfZHRib19pbWFnZQorICAgIGVsc2U6CisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaWduZWRfMTZrX2Jvb3RfaW1hZ2UpOgorICAgICAgICBzaWduZWRfYm9vdF9pbWFnZSArPSAiOiIgKyBzaWduZWRfMTZrX2Jvb3RfaW1hZ2UKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNpZ25lZF8xNmtfZHRib19pbWFnZSk6CisgICAgICAgIHNpZ25lZF9kdGJvX2ltYWdlICs9ICI6IiArIHNpZ25lZF8xNmtfZHRib19pbWFnZQorCisgIGFyZ3MgPSBbIm90YV9mcm9tX3Jhd19pbWciLAorICAgICAgICAgICItLW1heF90aW1lc3RhbXAiLCB0aW1lc3RhbXAsICItLW91dHB1dCIsIGlucHV0X290YS5uYW1lXQorICBhcmdzLmV4dGVuZChHZXRPdGFTaWduaW5nQXJncygpKQorICBpZiAiZHRibyIgaW4gcGFydGl0aW9uczoKKyAgICBhcmdzLmV4dGVuZChbIi0tcGFydGl0aW9uX25hbWUiLCAiYm9vdCxkdGJvIiwKKyAgICAgICAgICAgICAgICBzaWduZWRfYm9vdF9pbWFnZSwgc2lnbmVkX2R0Ym9faW1hZ2VdKQorICBlbHNlOgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXJ0aXRpb25fbmFtZSIsICJib290Iiwgc2lnbmVkX2Jvb3RfaW1hZ2VdKQorICBsb2dnZXIuaW5mbygKKyAgICAgICJSZS1nZW5lcmF0aW5nIGJvb3QgT1RBIHt9IHVzaW5nIGNtZCB7fSIuZm9ybWF0KGZpbGVuYW1lLCBhcmdzKSkKKyAgb3RhX2Zyb21fcmF3X2ltZy5tYWluKGFyZ3MpCisKKworZGVmIFByb2Nlc3NUYXJnZXRGaWxlcyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBtaXNjX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgIGFwa19rZXlzLCBhcGV4X2tleXMsIGtleV9wYXNzd29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2FwaV9sZXZlbCwgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24pOgpAQCAtNTkzLDYgKzY5NCwxNiBAQAogICAgICMgU2V0cyB0aGlzIHRvIHplcm8gZm9yIHRhcmdldHMgd2l0aG91dCBBUEsgZmlsZXMuCiAgICAgbWF4c2l6ZSA9IDAKIAorICAjIFJlcGxhY2UgdGhlIEFWQiBzaWduaW5nIGtleXMsIGlmIGFueS4KKyAgUmVwbGFjZUF2YlNpZ25pbmdLZXlzKG1pc2NfaW5mbykKKyAgT1BUSU9OUy5pbmZvX2RpY3QgPSBtaXNjX2luZm8KKworICAjIFJld3JpdGUgdGhlIHByb3BzIGluIEFWQiBzaWduaW5nIGFyZ3MuCisgIGlmIG1pc2NfaW5mby5nZXQoJ2F2Yl9lbmFibGUnKSA9PSAndHJ1ZSc6CisgICAgUmV3cml0ZUF2YlByb3BzKG1pc2NfaW5mbykKKworICBSZWdlbmVyYXRlS2VybmVsUGFydGl0aW9ucyhpbnB1dF90Zl96aXAsIG91dHB1dF90Zl96aXAsIG1pc2NfaW5mbykKKwogICBmb3IgaW5mbyBpbiBpbnB1dF90Zl96aXAuaW5mb2xpc3QoKToKICAgICBmaWxlbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICBpZiBmaWxlbmFtZS5zdGFydHN3aXRoKCJJTUFHRVMvIik6CkBAIC02MDMsMTAgKzcxNCwxMCBAQAogICAgIGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoIk9UQS8iKSBhbmQgZmlsZW5hbWUuZW5kc3dpdGgoIi5pbWciKToKICAgICAgIGNvbnRpbnVlCiAKLSAgICBkYXRhID0gaW5wdXRfdGZfemlwLnJlYWQoZmlsZW5hbWUpCi0gICAgb3V0X2luZm8gPSBjb3B5LmNvcHkoaW5mbykKICAgICAoaXNfYXBrLCBpc19jb21wcmVzc2VkLCBzaG91bGRfYmVfc2tpcHBlZCkgPSBHZXRBcGtGaWxlSW5mbygKICAgICAgICAgZmlsZW5hbWUsIGNvbXByZXNzZWRfZXh0ZW5zaW9uLCBPUFRJT05TLnNraXBfYXBrc193aXRoX3BhdGhfcHJlZml4KQorICAgIGRhdGEgPSBpbnB1dF90Zl96aXAucmVhZChmaWxlbmFtZSkKKyAgICBvdXRfaW5mbyA9IGNvcHkuY29weShpbmZvKQogCiAgICAgaWYgaXNfYXBrIGFuZCBzaG91bGRfYmVfc2tpcHBlZDoKICAgICAgICMgQ29weSBza2lwcGVkIEFQS3MgdmVyYmF0aW0uCkBAIC02NzAsOSArNzgxLDggQEAKICAgICBlbGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIuemlwIikgYW5kIElzRW50cnlPdGFQYWNrYWdlKGlucHV0X3RmX3ppcCwgZmlsZW5hbWUpOgogICAgICAgbG9nZ2VyLmluZm8oIlJlLXNpZ25pbmcgT1RBIHBhY2thZ2Uge30iLmZvcm1hdChmaWxlbmFtZSkpCiAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGlucHV0X290YSwgdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgb3V0cHV0X290YToKLSAgICAgICAgd2l0aCBpbnB1dF90Zl96aXAub3BlbihmaWxlbmFtZSwgInIiKSBhcyBpbl9mcDoKLSAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooaW5fZnAsIGlucHV0X290YSkKLSAgICAgICAgICBpbnB1dF9vdGEuZmx1c2goKQorICAgICAgICBSZWdlbmVyYXRlQm9vdE9UQShpbnB1dF90Zl96aXAsIGZpbGVuYW1lLCBpbnB1dF9vdGEpCisKICAgICAgICAgU2lnbk90YVBhY2thZ2UoaW5wdXRfb3RhLm5hbWUsIG91dHB1dF9vdGEubmFtZSkKICAgICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF90Zl96aXAsIG91dHB1dF9vdGEubmFtZSwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKQEAgLTgxMSwxNyArOTIxLDE4IEBACiAgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBpbWFnZS5uYW1lLCBmaWxlbmFtZSkKICAgICAjIEEgbm9uLUFQSyBmaWxlOyBjb3B5IGl0IHZlcmJhdGltLgogICAgIGVsc2U6Ci0gICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCisgICAgICB0cnk6CisgICAgICAgIGVudHJ5ID0gb3V0cHV0X3RmX3ppcC5nZXRpbmZvKGZpbGVuYW1lKQorICAgICAgICBpZiBvdXRwdXRfdGZfemlwLnJlYWQoZW50cnkpICE9IGRhdGE6CisgICAgICAgICAgbG9nZ2VyLndhcm4oCisgICAgICAgICAgICAgICJPdXRwdXQgemlwIGNvbnRhaW5zIGR1cGxpY2F0ZSBlbnRyaWVzIGZvciAlcyB3aXRoIGRpZmZlcmVudCBjb250ZW50cyIsIGZpbGVuYW1lKQorICAgICAgICBjb250aW51ZQorICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCiAKICAgaWYgT1BUSU9OUy5yZXBsYWNlX290YV9rZXlzOgogICAgIFJlcGxhY2VPdGFLZXlzKGlucHV0X3RmX3ppcCwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvKQogCi0gICMgUmVwbGFjZSB0aGUgQVZCIHNpZ25pbmcga2V5cywgaWYgYW55LgotICBSZXBsYWNlQXZiU2lnbmluZ0tleXMobWlzY19pbmZvKQotCi0gICMgUmV3cml0ZSB0aGUgcHJvcHMgaW4gQVZCIHNpZ25pbmcgYXJncy4KLSAgaWYgbWlzY19pbmZvLmdldCgnYXZiX2VuYWJsZScpID09ICd0cnVlJzoKLSAgICBSZXdyaXRlQXZiUHJvcHMobWlzY19pbmZvKQogCiAgICMgV3JpdGUgYmFjayBtaXNjX2luZm8gd2l0aCB0aGUgbGF0ZXN0IHZhbHVlcy4KICAgUmVwbGFjZU1pc2NJbmZvVHh0KGlucHV0X3RmX3ppcCwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvKQpAQCAtMTA2Niw5ICsxMTc3LDkgQEAKICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsIGZpbGVuYW1lLCB0ZW1wX2ZpbGUuZ2V0dmFsdWUoKSkKIAogCi1kZWYgUmVwbGFjZU90YUtleXMoaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pOgorZGVmIFJlcGxhY2VPdGFLZXlzKGlucHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pOgogICB0cnk6Ci0gICAga2V5bGlzdCA9IGlucHV0X3RmX3ppcC5yZWFkKCJNRVRBL290YWtleXMudHh0Iikuc3BsaXQoKQorICAgIGtleWxpc3QgPSBpbnB1dF90Zl96aXAucmVhZCgiTUVUQS9vdGFrZXlzLnR4dCIpLmRlY29kZSgpLnNwbGl0KCkKICAgZXhjZXB0IEtleUVycm9yOgogICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKCJjYW4ndCByZWFkIE1FVEEvb3Rha2V5cy50eHQgZnJvbSBpbnB1dCIpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vQW5kcm9pZC5icCBiL3Rvb2xzL3Nib20vQW5kcm9pZC5icAppbmRleCAyYjJiNTczLi40ZjZkM2I3IDEwMDY0NAotLS0gYS90b29scy9zYm9tL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvc2JvbS9BbmRyb2lkLmJwCkBAIC0zNCw2ICszNCwzMSBAQAogfQogCiBweXRob25fbGlicmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiY29tcGxpYW5jZV9tZXRhZGF0YSIsCisgICAgc3JjczogWworICAgICAgICAiY29tcGxpYW5jZV9tZXRhZGF0YS5weSIsCisgICAgXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZ2VuX3Nib20iLAorICAgIHNyY3M6IFsKKyAgICAgICAgImdlbl9zYm9tLnB5IiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGxpYnM6IFsKKyAgICAgICAgImNvbXBsaWFuY2VfbWV0YWRhdGEiLAorICAgICAgICAibWV0YWRhdGFfZmlsZV9wcm90b19weSIsCisgICAgICAgICJsaWJwcm90b2J1Zi1weXRob24iLAorICAgICAgICAic2JvbV9saWIiLAorICAgIF0sCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgewogICAgIG5hbWU6ICJzYm9tX2xpYiIsCiAgICAgc3JjczogWwogICAgICAgICAic2JvbV9kYXRhLnB5IiwKQEAgLTkxLDQgKzExNiwxOCBAQAogICAgIGxpYnM6IFsKICAgICAgICAgInNib21fbGliIiwKICAgICBdLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZ2VuX25vdGljZV94bWwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImdlbl9ub3RpY2VfeG1sLnB5IiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGxpYnM6IFsKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9jb21wbGlhbmNlX21ldGFkYXRhLnB5IGIvdG9vbHMvc2JvbS9jb21wbGlhbmNlX21ldGFkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTAyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zYm9tL2NvbXBsaWFuY2VfbWV0YWRhdGEucHkKQEAgLTAsMCArMSwyMDQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBzcWxpdGUzCisKK2NsYXNzIE1ldGFkYXRhRGI6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBkYik6CisgICAgc2VsZi5jb25uID0gc3FsaXRlMy5jb25uZWN0KCc6bWVtb3J5JykKKyAgICBzZWxmLmNvbm4ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdworICAgIHdpdGggc3FsaXRlMy5jb25uZWN0KGRiKSBhcyBjOgorICAgICAgYy5iYWNrdXAoc2VsZi5jb25uKQorICAgIHNlbGYucmVvcmcoKQorCisgIGRlZiByZW9yZyhzZWxmKToKKyAgICAjIHBhY2thZ2VfbGljZW5zZSB0YWJsZQorICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgcGFja2FnZV9saWNlbnNlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IG5hbWUgYXMgcGFja2FnZSwgcGtnX2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcyBhcyBsaWNlbnNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgbW9kdWxlX3R5cGUgPSAncGFja2FnZScgIikKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IHBhY2thZ2UsbGljZW5zZSBmcm9tIHBhY2thZ2VfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQorICAgIG11bHRpX2xpY2Vuc2VzX3BhY2thZ2VzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIHJvd3MgPSBbXQorICAgIGZvciBwIGluIG11bHRpX2xpY2Vuc2VzX3BhY2thZ2VzOgorICAgICAgbGljZW5zZXMgPSBwWydsaWNlbnNlJ10uc3RyaXAoKS5zcGxpdCgnICcpCisgICAgICBmb3IgbGljIGluIGxpY2Vuc2VzOgorICAgICAgICByb3dzLmFwcGVuZCgocFsncGFja2FnZSddLCBsaWMpKQorICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gcGFja2FnZV9saWNlbnNlIHZhbHVlcyAoPywgPyknLCByb3dzKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHBhY2thZ2VfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgIyBtb2R1bGVfbGljZW5zZSB0YWJsZQorICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgbW9kdWxlX2xpY2Vuc2UgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgZGlzdGluY3QgbmFtZSBhcyBtb2R1bGUsIHBhY2thZ2UsIGxpY2Vuc2VzIGFzIGxpY2Vuc2UgIgorICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBsaWNlbnNlcyAhPSAnJyAiKQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCJzZWxlY3QgbW9kdWxlLHBhY2thZ2UsbGljZW5zZSBmcm9tIG1vZHVsZV9saWNlbnNlIHdoZXJlIGxpY2Vuc2UgbGlrZSAnJSAlJyIpCisgICAgbXVsdGlfbGljZW5zZXNfbW9kdWxlcyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICByb3dzID0gW10KKyAgICBmb3IgbSBpbiBtdWx0aV9saWNlbnNlc19tb2R1bGVzOgorICAgICAgbGljZW5zZXMgPSBtWydsaWNlbnNlJ10uc3RyaXAoKS5zcGxpdCgnICcpCisgICAgICBmb3IgbGljIGluIGxpY2Vuc2VzOgorICAgICAgICByb3dzLmFwcGVuZCgobVsnbW9kdWxlJ10sIG1bJ3BhY2thZ2UnXSxsaWMpKQorICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2xpY2Vuc2UgdmFsdWVzICg/LCA/LCA/KScsIHJvd3MpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gbW9kdWxlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgICMgbW9kdWxlX2luc3RhbGxlZF9maWxlIHRhYmxlCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgaWQgYXMgbW9kdWxlX2lkLCBuYW1lIGFzIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBpbnN0YWxsZWRfZmlsZXMgYXMgaW5zdGFsbGVkX2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBpbnN0YWxsZWRfZmlsZXMgIT0gJycgIikKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IG1vZHVsZV9pZCwgbW9kdWxlX25hbWUsIHBhY2thZ2UsIGluc3RhbGxlZF9maWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgd2hlcmUgaW5zdGFsbGVkX2ZpbGUgbGlrZSAnJSAlJyIpCisgICAgbXVsdGlfaW5zdGFsbGVkX2ZpbGVfbW9kdWxlcyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICByb3dzID0gW10KKyAgICBmb3IgbSBpbiBtdWx0aV9pbnN0YWxsZWRfZmlsZV9tb2R1bGVzOgorICAgICAgaW5zdGFsbGVkX2ZpbGVzID0gbVsnaW5zdGFsbGVkX2ZpbGUnXS5zdHJpcCgpLnNwbGl0KCcgJykKKyAgICAgIGZvciBmIGluIGluc3RhbGxlZF9maWxlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZV9pZCddLCBtWydtb2R1bGVfbmFtZSddLCBtWydwYWNrYWdlJ10sIGYpKQorICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2luc3RhbGxlZF9maWxlIHZhbHVlcyAoPywgPywgPywgPyknLCByb3dzKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB3aGVyZSBpbnN0YWxsZWRfZmlsZSBsaWtlICclICUnIikKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgICMgbW9kdWxlX2J1aWx0X2ZpbGUgdGFibGUKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIG1vZHVsZV9idWlsdF9maWxlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGlkIGFzIG1vZHVsZV9pZCwgbmFtZSBhcyBtb2R1bGVfbmFtZSwgcGFja2FnZSwgYnVpbHRfZmlsZXMgYXMgYnVpbHRfZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIGJ1aWx0X2ZpbGVzICE9ICcnICIpCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBtb2R1bGVfaWQsIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBidWlsdF9maWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVfYnVpbHRfZmlsZSB3aGVyZSBidWlsdF9maWxlIGxpa2UgJyUgJSciKQorICAgIG11bHRpX2J1aWx0X2ZpbGVfbW9kdWxlcyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICByb3dzID0gW10KKyAgICBmb3IgbSBpbiBtdWx0aV9idWlsdF9maWxlX21vZHVsZXM6CisgICAgICBidWlsdF9maWxlcyA9IG1bJ2luc3RhbGxlZF9maWxlJ10uc3RyaXAoKS5zcGxpdCgnICcpCisgICAgICBmb3IgZiBpbiBidWlsdF9maWxlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZV9pZCddLCBtWydtb2R1bGVfbmFtZSddLCBtWydwYWNrYWdlJ10sIGYpKQorICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2J1aWx0X2ZpbGUgdmFsdWVzICg/LCA/LCA/LCA/KScsIHJvd3MpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gbW9kdWxlX2J1aWx0X2ZpbGUgd2hlcmUgYnVpbHRfZmlsZSBsaWtlICclICUnIikKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworCisgICAgIyBJbmRleGVzCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlc19pZCBvbiBtb2R1bGVzIChpZCknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZXNfbmFtZSBvbiBtb2R1bGVzIChuYW1lKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfcGFja2FnZV9saWNuZXNlX3BhY2thZ2Ugb24gcGFja2FnZV9saWNlbnNlIChwYWNrYWdlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfcGFja2FnZV9saWNuZXNlX2xpY2Vuc2Ugb24gcGFja2FnZV9saWNlbnNlIChsaWNlbnNlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2xpY25lc2VfbW9kdWxlIG9uIG1vZHVsZV9saWNlbnNlIChtb2R1bGUpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfbGljbmVzZV9saWNlbnNlIG9uIG1vZHVsZV9saWNlbnNlIChsaWNlbnNlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2luc3RhbGxlZF9maWxlX21vZHVsZV9pZCBvbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgKG1vZHVsZV9pZCknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9pbnN0YWxsZWRfZmlsZV9pbnN0YWxsZWRfZmlsZSBvbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgKGluc3RhbGxlZF9maWxlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2J1aWx0X2ZpbGVfbW9kdWxlX2lkIG9uIG1vZHVsZV9idWlsdF9maWxlIChtb2R1bGVfaWQpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfYnVpbHRfZmlsZV9idWlsdF9maWxlIG9uIG1vZHVsZV9idWlsdF9maWxlIChidWlsdF9maWxlKScpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgZGVmIGR1bXBfZGVidWdfZGIoc2VsZiwgZGVidWdfZGIpOgorICAgIHdpdGggc3FsaXRlMy5jb25uZWN0KGRlYnVnX2RiKSBhcyBjOgorICAgICAgc2VsZi5jb25uLmJhY2t1cChjKQorCisgIGRlZiBnZXRfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgorICAgICMgR2V0IGFsbCByZWNvcmRzIGZyb20gdGFibGUgbWFrZV9tZXRhZGF0YSwgd2hpY2ggY29udGFpbnMgYWxsIGluc3RhbGxlZCBmaWxlcyBhbmQgY29ycmVzcG9uZGluZyBtYWtlIG1vZHVsZXMnIG1ldGFkYXRhCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBpbnN0YWxsZWRfZmlsZSwgbW9kdWxlX3BhdGgsIGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLCBwcm9kdWN0X2NvcHlfZmlsZXMsIGtlcm5lbF9tb2R1bGVfY29weV9maWxlcywgaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLCBsaWNlbnNlX3RleHQgZnJvbSBtYWtlX21ldGFkYXRhJykKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YSA9IFtdCisgICAgZm9yIHJvdyBpbiByb3dzOgorICAgICAgbWV0YWRhdGEgPSBkaWN0KHppcChyb3cua2V5cygpLCByb3cpKQorICAgICAgaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhLmFwcGVuZChtZXRhZGF0YSkKKyAgICByZXR1cm4gaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhCisKKyAgZGVmIGdldF9zb29uZ19tb2R1bGVzKHNlbGYpOgorICAgICMgR2V0IGFsbCByZWNvcmRzIGZyb20gdGFibGUgbW9kdWxlcywgd2hpY2ggY29udGFpbnMgbWV0YWRhdGEgb2YgYWxsIHNvb25nIG1vZHVsZXMKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG5hbWUsIHBhY2thZ2UsIHBhY2thZ2UgYXMgbW9kdWxlX3BhdGgsIG1vZHVsZV90eXBlIGFzIHNvb25nX21vZHVsZV90eXBlLCBidWlsdF9maWxlcywgaW5zdGFsbGVkX2ZpbGVzLCBzdGF0aWNfZGVwX2ZpbGVzLCB3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzIGZyb20gbW9kdWxlcycpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBzb29uZ19tb2R1bGVzID0gW10KKyAgICBmb3Igcm93IGluIHJvd3M6CisgICAgICBzb29uZ19tb2R1bGUgPSBkaWN0KHppcChyb3cua2V5cygpLCByb3cpKQorICAgICAgc29vbmdfbW9kdWxlcy5hcHBlbmQoc29vbmdfbW9kdWxlKQorICAgIHJldHVybiBzb29uZ19tb2R1bGVzCisKKyAgZGVmIGdldF9wYWNrYWdlX2xpY2Vuc2VzKHNlbGYsIHBhY2thZ2UpOgorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbS5uYW1lLCBtLnBhY2thZ2UsIG0ubGljX2xpY2Vuc2VfdGV4dCBhcyBsaWNlbnNlX3RleHQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIHBhY2thZ2VfbGljZW5zZSBwbCBqb2luIG1vZHVsZXMgbSBvbiBwbC5saWNlbnNlID0gbS5uYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgcGwucGFja2FnZSA9ID8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLy8nICsgcGFja2FnZSwpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGxpY2Vuc2VzID0ge30KKyAgICBmb3IgciBpbiByb3dzOgorICAgICAgbGljZW5zZXNbclsnbmFtZSddXSA9IHJbJ2xpY2Vuc2VfdGV4dCddCisgICAgcmV0dXJuIGxpY2Vuc2VzCisKKyAgZGVmIGdldF9tb2R1bGVfbGljZW5zZXMoc2VsZiwgbW9kdWxlX25hbWUsIHBhY2thZ2UpOgorICAgIGxpY2Vuc2VzID0ge30KKyAgICAjIElmIHByb3BlcnR5ICJsaWNlbnNlcyIgaXMgZGVmaW5lZCBvbiBtb2R1bGUKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG0ubmFtZSwgbS5wYWNrYWdlLCBtLmxpY19saWNlbnNlX3RleHQgYXMgbGljZW5zZV90ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBtb2R1bGVfbGljZW5zZSBtbCBqb2luIG1vZHVsZXMgbSBvbiBtbC5saWNlbnNlID0gbS5uYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgbWwubW9kdWxlID0gPyBhbmQgbWwucGFja2FnZSA9ID8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2R1bGVfbmFtZSwgcGFja2FnZSkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgZm9yIHIgaW4gcm93czoKKyAgICAgIGxpY2Vuc2VzW3JbJ25hbWUnXV0gPSByWydsaWNlbnNlX3RleHQnXQorICAgIGlmIGxlbihsaWNlbnNlcykgPiAwOgorICAgICAgcmV0dXJuIGxpY2Vuc2VzCisKKyAgICAjIFVzZSBkZWZhdWx0IHBhY2thZ2UgbGljZW5zZQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbS5uYW1lLCBtLnBhY2thZ2UsIG0ubGljX2xpY2Vuc2VfdGV4dCBhcyBsaWNlbnNlX3RleHQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIHBhY2thZ2VfbGljZW5zZSBwbCBqb2luIG1vZHVsZXMgbSBvbiBwbC5saWNlbnNlID0gbS5uYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgcGwucGFja2FnZSA9ID8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLy8nICsgcGFja2FnZSwpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGZvciByIGluIHJvd3M6CisgICAgICBsaWNlbnNlc1tyWyduYW1lJ11dID0gclsnbGljZW5zZV90ZXh0J10KKyAgICByZXR1cm4gbGljZW5zZXMKKworICBkZWYgZ2V0X3Nvb25nX21vZHVsZV9vZl9pbnN0YWxsZWRfZmlsZShzZWxmLCBpbnN0YWxsZWRfZmlsZSk6CisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBuYW1lLCBtLnBhY2thZ2UsIG0ucGFja2FnZSBhcyBtb2R1bGVfcGF0aCwgbW9kdWxlX3R5cGUgYXMgc29vbmdfbW9kdWxlX3R5cGUsIGJ1aWx0X2ZpbGVzLCBpbnN0YWxsZWRfZmlsZXMsIHN0YXRpY19kZXBfZmlsZXMsIHdob2xlX3N0YXRpY19kZXBfZmlsZXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIG1vZHVsZXMgbSBqb2luIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSBtaWYgb24gbS5pZCA9IG1pZi5tb2R1bGVfaWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBtaWYuaW5zdGFsbGVkX2ZpbGUgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFsbGVkX2ZpbGUsKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIGlmIHJvd3M6CisgICAgICBzb29uZ19tb2R1bGUgPSBkaWN0KHppcChyb3dzWzBdLmtleXMoKSwgcm93c1swXSkpCisgICAgICByZXR1cm4gc29vbmdfbW9kdWxlCisKKyAgICByZXR1cm4gTm9uZQorCisgIGRlZiBnZXRfc29vbmdfbW9kdWxlX29mX2J1aWx0X2ZpbGUoc2VsZiwgYnVpbHRfZmlsZSk6CisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBuYW1lLCBtLnBhY2thZ2UsIG0ucGFja2FnZSBhcyBtb2R1bGVfcGF0aCwgbW9kdWxlX3R5cGUgYXMgc29vbmdfbW9kdWxlX3R5cGUsIGJ1aWx0X2ZpbGVzLCBpbnN0YWxsZWRfZmlsZXMsIHN0YXRpY19kZXBfZmlsZXMsIHdob2xlX3N0YXRpY19kZXBfZmlsZXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIG1vZHVsZXMgbSBqb2luIG1vZHVsZV9idWlsdF9maWxlIG1iZiBvbiBtLmlkID0gbWJmLm1vZHVsZV9pZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIG1iZi5idWlsdF9maWxlID0gPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWx0X2ZpbGUsKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIGlmIHJvd3M6CisgICAgICBzb29uZ19tb2R1bGUgPSBkaWN0KHppcChyb3dzWzBdLmtleXMoKSwgcm93c1swXSkpCisgICAgICByZXR1cm4gc29vbmdfbW9kdWxlCisKKyAgICByZXR1cm4gTm9uZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vZ2VuX25vdGljZV94bWwucHkgYi90b29scy9zYm9tL2dlbl9ub3RpY2VfeG1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zYm9tL2dlbl9ub3RpY2VfeG1sLnB5CkBAIC0wLDAgKzEsODEgQEAKKyMgIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiIKK0dlbmVyYXRlIE5PVElDRS54bWwuZ3ogb2YgYSBwYXJ0aXRpb24uCitVc2FnZSBleGFtcGxlOgorICBnZW5fbm90aWNlX3htbC5weSAtLW91dHB1dF9maWxlIG91dC9zb29uZy8uaW50ZXJtZWRpYXRlLy4uLi9OT1RJQ0UueG1sLmd6IFwKKyAgICAgICAgICAgICAgLS1tZXRhZGF0YSBvdXQvc29vbmcvY29tcGxpYW5jZS1tZXRhZGF0YS9hb3NwX2NmX3g4Nl82NF9waG9uZS9jb21wbGlhbmNlLW1ldGFkYXRhLmRiIFwKKyAgICAgICAgICAgICAgLS1wYXJ0aXRpb24gc3lzdGVtIFwKKyAgICAgICAgICAgICAgLS1wcm9kdWN0X291dCBvdXQvdGFyZ2V0L3Zzb2NfeDg2XzY0IFwKKyAgICAgICAgICAgICAgLS1zb29uZ19vdXQgb3V0L3Nvb25nCisiIiIKKworaW1wb3J0IGFyZ3BhcnNlCisKKworRklMRV9IRUFERVIgPSAnJydcCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPGxpY2Vuc2VzPgorJycnCitGSUxFX0ZPT1RFUiA9ICcnJ1wKKzwvbGljZW5zZXM+CisnJycKKworCitkZWYgZ2V0X2FyZ3MoKToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdQcmludCBtb3JlIGluZm9ybWF0aW9uLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kJywgJy0tZGVidWcnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PVRydWUsIGhlbHA9J0RlYnVnIG1vZGUnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dF9maWxlJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBOT1RJQ0UueG1sLmd6IGZpbGUuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXJ0aXRpb24nLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgbmFtZSBvZiBwYXJ0aXRpb24gZm9yIHdoaWNoIHRoZSBOT1RJQ0UueG1sLmd6IGlzIGdlbmVyYXRlZC4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW1ldGFkYXRhJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHBhdGggb2YgY29tcGxpYW5jZSBtZXRhZGF0YSBEQiBmaWxlLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdF9vdXQnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBQUk9EVUNUX09VVCwgZS5nLiBvdXQvdGFyZ2V0L3Byb2R1Y3QvdnNvY194ODZfNjQuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zb29uZ19vdXQnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBTb29uZyBvdXRwdXQgZGlyZWN0b3J5LCBlLmcuIG91dC9zb29uZycpCisKKyAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKCkKKworCitkZWYgbG9nKCppbmZvKToKKyAgaWYgYXJncy52ZXJib3NlOgorICAgIGZvciBpIGluIGluZm86CisgICAgICBwcmludChpKQorCisKK2RlZiBuZXdfZmlsZV9uYW1lX3RhZyhmaWxlX21ldGFkYXRhLCBwYWNrYWdlX25hbWUpOgorICBmaWxlX3BhdGggPSBmaWxlX21ldGFkYXRhWydpbnN0YWxsZWRfZmlsZSddLnJlbW92ZXByZWZpeChhcmdzLnByb2R1Y3Rfb3V0KQorICBsaWIgPSAnQW5kcm9pZCcKKyAgaWYgcGFja2FnZV9uYW1lOgorICAgIGxpYiA9IHBhY2thZ2VfbmFtZQorICByZXR1cm4gZic8ZmlsZS1uYW1lIGNvbnRlbnRJZD0iIiBsaWI9IntsaWJ9Ij57ZmlsZV9wYXRofTwvZmlsZS1uYW1lPlxuJworCisKK2RlZiBuZXdfZmlsZV9jb250ZW50X3RhZygpOgorICBwYXNzCisKKworZGVmIG1haW4oKToKKyAgZ2xvYmFsIGFyZ3MKKyAgYXJncyA9IGdldF9hcmdzKCkKKyAgbG9nKCdBcmdzOicsIHZhcnMoYXJncykpCisKKyAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0X2ZpbGUsICd3JywgZW5jb2Rpbmc9InV0Zi04IikgYXMgbm90aWNlX3htbF9maWxlOgorICAgIG5vdGljZV94bWxfZmlsZS53cml0ZShGSUxFX0hFQURFUikKKyAgICBub3RpY2VfeG1sX2ZpbGUud3JpdGUoRklMRV9GT09URVIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9zYm9tL2dlbl9zYm9tLnB5IGIvdG9vbHMvc2JvbS9nZW5fc2JvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzNhOGJlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2JvbS9nZW5fc2JvbS5weQpAQCAtMCwwICsxLDc0MCBAQAorIyAhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIgorR2VuZXJhdGUgdGhlIFNCT00gb2YgdGhlIGN1cnJlbnQgdGFyZ2V0IHByb2R1Y3QgaW4gU1BEWCBmb3JtYXQuCitVc2FnZSBleGFtcGxlOgorICBnZW5fc2JvbS5weSAtLW91dHB1dF9maWxlIG91dC9zb29uZy9zYm9tL2Fvc3BfY2ZfeDg2XzY0X3Bob25lL3Nib20uc3BkeCBcCisgICAgICAgICAgICAgIC0tbWV0YWRhdGEgb3V0L3Nvb25nL21ldGFkYXRhL2Fvc3BfY2ZfeDg2XzY0X3Bob25lL21ldGFkYXRhLmRiIFwKKyAgICAgICAgICAgICAgLS1wcm9kdWN0X291dCBvdXQvdGFyZ2V0L3Zzb2NfeDg2XzY0CisgICAgICAgICAgICAgIC0tc29vbmdfb3V0IG91dC9zb29uZworICAgICAgICAgICAgICAtLWJ1aWxkX3ZlcnNpb24gJChjYXQgb3V0L3RhcmdldC9wcm9kdWN0L3Zzb2NfeDg2XzY0L2J1aWxkX2ZpbmdlcnByaW50LnR4dCkgXAorICAgICAgICAgICAgICAtLXByb2R1Y3RfbWZyPUdvb2dsZQorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGNvbXBsaWFuY2VfbWV0YWRhdGEKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGdvb2dsZS5wcm90b2J1Zi50ZXh0X2Zvcm1hdCBhcyB0ZXh0X2Zvcm1hdAoraW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBxdWV1ZQoraW1wb3J0IG1ldGFkYXRhX2ZpbGVfcGIyCitpbXBvcnQgc2JvbV9kYXRhCitpbXBvcnQgc2JvbV93cml0ZXJzCisKKyMgUGFja2FnZSB0eXBlCitQS0dfU09VUkNFID0gJ1NPVVJDRScKK1BLR19VUFNUUkVBTSA9ICdVUFNUUkVBTScKK1BLR19QUkVCVUlMVCA9ICdQUkVCVUlMVCcKKworIyBTZWN1cml0eSB0YWcKK05WRF9DUEUyMyA9ICdOVkQtQ1BFMi4zOicKKworIyBSZXBvcnQKK0lTU1VFX05PX01FVEFEQVRBID0gJ05vIG1ldGFkYXRhIGdlbmVyYXRlZCBpbiBNYWtlIGZvciBpbnN0YWxsZWQgZmlsZXM6JworSVNTVUVfTk9fTUVUQURBVEFfRklMRSA9ICdObyBNRVRBREFUQSBmaWxlIGZvdW5kIGZvciBpbnN0YWxsZWQgZmlsZTonCitJU1NVRV9NRVRBREFUQV9GSUxFX0lOQ09NUExFVEUgPSAnTUVUQURBVEEgZmlsZSBpbmNvbXBsZXRlOicKK0lTU1VFX1VOS05PV05fU0VDVVJJVFlfVEFHX1RZUEUgPSAnVW5rbm93biBzZWN1cml0eSB0YWcgdHlwZTonCitJU1NVRV9JTlNUQUxMRURfRklMRV9OT1RfRVhJU1QgPSAnTm9uLWV4aXN0ZW50IGluc3RhbGxlZCBmaWxlczonCitJU1NVRV9OT19NT0RVTEVfRk9VTkRfRk9SX1NUQVRJQ19ERVAgPSAnTm8gbW9kdWxlIGZvdW5kIGZvciBzdGF0aWMgZGVwZW5kZW5jeSBmaWxlczonCitJTkZPX01FVEFEQVRBX0ZPVU5EX0ZPUl9QQUNLQUdFID0gJ01FVEFEQVRBIGZpbGUgZm91bmQgZm9yIHBhY2thZ2VzOicKKworU09PTkdfUFJFQlVJTFRfTU9EVUxFX1RZUEVTID0gWworICAgICdhbmRyb2lkX2FwcF9pbXBvcnQnLAorICAgICdhbmRyb2lkX2xpYnJhcnlfaW1wb3J0JywKKyAgICAnY2NfcHJlYnVpbHRfYmluYXJ5JywKKyAgICAnY2NfcHJlYnVpbHRfbGlicmFyeScsCisgICAgJ2NjX3ByZWJ1aWx0X2xpYnJhcnlfaGVhZGVycycsCisgICAgJ2NjX3ByZWJ1aWx0X2xpYnJhcnlfc2hhcmVkJywKKyAgICAnY2NfcHJlYnVpbHRfbGlicmFyeV9zdGF0aWMnLAorICAgICdjY19wcmVidWlsdF9vYmplY3QnLAorICAgICdkZXhfaW1wb3J0JywKKyAgICAnamF2YV9pbXBvcnQnLAorICAgICdqYXZhX3Nka19saWJyYXJ5X2ltcG9ydCcsCisgICAgJ2phdmFfc3lzdGVtX21vZHVsZXNfaW1wb3J0JywKKyAgICAnbGliY2xhbmdfcnRfcHJlYnVpbHRfbGlicmFyeV9zdGF0aWMnLAorICAgICdsaWJjbGFuZ19ydF9wcmVidWlsdF9saWJyYXJ5X3NoYXJlZCcsCisgICAgJ2xsdm1fcHJlYnVpbHRfbGlicmFyeV9zdGF0aWMnLAorICAgICduZGtfcHJlYnVpbHRfb2JqZWN0JywKKyAgICAnbmRrX3ByZWJ1aWx0X3NoYXJlZF9zdGwnLAorICAgICdua2RfcHJlYnVpbHRfc3RhdGljX3N0bCcsCisgICAgJ3ByZWJ1aWx0X2FwZXgnLAorICAgICdwcmVidWlsdF9ib290Y2xhc3NwYXRoX2ZyYWdtZW50JywKKyAgICAncHJlYnVpbHRfZHNwJywKKyAgICAncHJlYnVpbHRfZmlybXdhcmUnLAorICAgICdwcmVidWlsdF9rZXJuZWxfbW9kdWxlcycsCisgICAgJ3ByZWJ1aWx0X3Jmc2EnLAorICAgICdwcmVidWlsdF9yb290JywKKyAgICAncnVzdF9wcmVidWlsdF9keWxpYicsCisgICAgJ3J1c3RfcHJlYnVpbHRfbGlicmFyeScsCisgICAgJ3J1c3RfcHJlYnVpbHRfcmxpYicsCisgICAgJ3ZuZGtfcHJlYnVpbHRfc2hhcmVkJywKK10KKworVEhJUkRfUEFSVFlfSURFTlRJRklFUl9UWVBFUyA9IFsKKyAgICAjIFR5cGVzIGRlZmluZWQgaW4gbWV0YWRhdGFfZmlsZS5wcm90bworICAgICdHaXQnLAorICAgICdTVk4nLAorICAgICdIZycsCisgICAgJ0RhcmNzJywKKyAgICAnVkNTJywKKyAgICAnQXJjaGl2ZScsCisgICAgJ1ByZWJ1aWx0QnlBbHBoYWJldCcsCisgICAgJ0xvY2FsU291cmNlJywKKyAgICAnT3RoZXInLAorICAgICMgT1NWIGVjb3N5c3RlbXMgZGVmaW5lZCBhdCBodHRwczovL29zc2YuZ2l0aHViLmlvL29zdi1zY2hlbWEvI2FmZmVjdGVkcGFja2FnZS1maWVsZC4KKyAgICAnR28nLAorICAgICducG0nLAorICAgICdPU1MtRnV6eicsCisgICAgJ1B5UEknLAorICAgICdSdWJ5R2VtcycsCisgICAgJ2NyYXRlcy5pbycsCisgICAgJ0hhY2thZ2UnLAorICAgICdHSEMnLAorICAgICdQYWNrYWdpc3QnLAorICAgICdNYXZlbicsCisgICAgJ051R2V0JywKKyAgICAnTGludXgnLAorICAgICdEZWJpYW4nLAorICAgICdBbHBpbmUnLAorICAgICdIZXgnLAorICAgICdBbmRyb2lkJywKKyAgICAnR2l0SHViIEFjdGlvbnMnLAorICAgICdQdWInLAorICAgICdDb25hbkNlbnRlcicsCisgICAgJ1JvY2t5IExpbnV4JywKKyAgICAnQWxtYUxpbnV4JywKKyAgICAnQml0bmFtaScsCisgICAgJ1Bob3RvbiBPUycsCisgICAgJ0NSQU4nLAorICAgICdCaW9jb25kdWN0b3InLAorICAgICdTd2lmdFVSTCcKK10KKworCitkZWYgZ2V0X2FyZ3MoKToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdQcmludCBtb3JlIGluZm9ybWF0aW9uLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kJywgJy0tZGVidWcnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdEZWJ1ZyBtb2RlJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXRfZmlsZScsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBnZW5lcmF0ZWQgU0JPTSBmaWxlIGluIFNQRFggZm9ybWF0LicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbWV0YWRhdGEnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgbWV0YWRhdGEgREIgZmlsZSBwYXRoLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdF9vdXQnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBQUk9EVUNUX09VVCwgZS5nLiBvdXQvdGFyZ2V0L3Byb2R1Y3QvdnNvY194ODZfNjQuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zb29uZ19vdXQnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBTb29uZyBvdXRwdXQgZGlyZWN0b3J5LCBlLmcuIG91dC9zb29uZycpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYnVpbGRfdmVyc2lvbicsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBidWlsZCB2ZXJzaW9uLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdF9tZnInLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcHJvZHVjdCBtYW51ZmFjdHVyZXIuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1qc29uJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nR2VuZXJhdGVkIFNCT00gZmlsZSBpbiBTUERYIEpTT04gZm9ybWF0JykKKworICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBsb2coKmluZm8pOgorICBpZiBhcmdzLnZlcmJvc2U6CisgICAgZm9yIGkgaW4gaW5mbzoKKyAgICAgIHByaW50KGkpCisKKworZGVmIG5ld19wYWNrYWdlX2lkKHBhY2thZ2VfbmFtZSwgdHlwZSk6CisgIHJldHVybiBmJ1NQRFhSZWYte3R5cGV9LXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQocGFja2FnZV9uYW1lKX0nCisKKworZGVmIG5ld19maWxlX2lkKGZpbGVfcGF0aCk6CisgIHJldHVybiBmJ1NQRFhSZWYte3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChmaWxlX3BhdGgpfScKKworCitkZWYgbmV3X2xpY2Vuc2VfaWQobGljZW5zZV9uYW1lKToKKyAgcmV0dXJuIGYnTGljZW5zZVJlZi17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKGxpY2Vuc2VfbmFtZSl9JworCisKK2RlZiBjaGVja3N1bShmaWxlX3BhdGgpOgorICBoID0gaGFzaGxpYi5zaGExKCkKKyAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZV9wYXRoKToKKyAgICBoLnVwZGF0ZShvcy5yZWFkbGluayhmaWxlX3BhdGgpLmVuY29kZSgndXRmLTgnKSkKKyAgZWxzZToKKyAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgorICAgICAgaC51cGRhdGUoZi5yZWFkKCkpCisgIHJldHVybiBmJ1NIQTE6IHtoLmhleGRpZ2VzdCgpfScKKworCitkZWYgaXNfc29vbmdfcHJlYnVpbHRfbW9kdWxlKGZpbGVfbWV0YWRhdGEpOgorICByZXR1cm4gKGZpbGVfbWV0YWRhdGFbJ3Nvb25nX21vZHVsZV90eXBlJ10gYW5kCisgICAgICAgICAgZmlsZV9tZXRhZGF0YVsnc29vbmdfbW9kdWxlX3R5cGUnXSBpbiBTT09OR19QUkVCVUlMVF9NT0RVTEVfVFlQRVMpCisKKworZGVmIGlzX3NvdXJjZV9wYWNrYWdlKGZpbGVfbWV0YWRhdGEpOgorICBtb2R1bGVfcGF0aCA9IGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgcmV0dXJuIG1vZHVsZV9wYXRoLnN0YXJ0c3dpdGgoJ2V4dGVybmFsLycpIGFuZCBub3QgaXNfcHJlYnVpbHRfcGFja2FnZShmaWxlX21ldGFkYXRhKQorCisKK2RlZiBpc19wcmVidWlsdF9wYWNrYWdlKGZpbGVfbWV0YWRhdGEpOgorICBtb2R1bGVfcGF0aCA9IGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgaWYgbW9kdWxlX3BhdGg6CisgICAgcmV0dXJuIChtb2R1bGVfcGF0aC5zdGFydHN3aXRoKCdwcmVidWlsdHMvJykgb3IKKyAgICAgICAgICAgIGlzX3Nvb25nX3ByZWJ1aWx0X21vZHVsZShmaWxlX21ldGFkYXRhKSBvcgorICAgICAgICAgICAgZmlsZV9tZXRhZGF0YVsnaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUnXSkKKworICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgPSBmaWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXQorICBpZiBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgYW5kIG5vdCBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMuc3RhcnRzd2l0aCgnQU5EUk9JRC1HRU46Jyk6CisgICAgcmV0dXJuIFRydWUKKworICByZXR1cm4gRmFsc2UKKworCitkZWYgZ2V0X3NvdXJjZV9wYWNrYWdlX2luZm8oZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIHNvdXJjZSBwYWNrYWdlIGluZm8gZXhpc3RzIGluIGl0cyBNRVRBREFUQSBmaWxlLCBjdXJyZW50bHkgaW5jbHVkaW5nIG5hbWUsIHNlY3VyaXR5IHRhZworICBhbmQgZXh0ZXJuYWwgU0JPTSByZWZlcmVuY2UuCisKKyAgU2VlIGdvL2FuZHJvaWQtc3BkeCBhbmQgZ28vYW5kcm9pZC1zYm9tLWdlbiBmb3IgbW9yZSBkZXRhaWxzLgorICAiIiIKKyAgaWYgbm90IG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICByZXR1cm4gZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXSwgW10KKworICBtZXRhZGF0YV9wcm90byA9IG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0KKyAgZXh0ZXJuYWxfcmVmcyA9IFtdCisgIGZvciB0YWcgaW4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2VjdXJpdHkudGFnOgorICAgIGlmIHRhZy5sb3dlcigpLnN0YXJ0c3dpdGgoKE5WRF9DUEUyMyArICdjcGU6Mi4zOicpLmxvd2VyKCkpOgorICAgICAgZXh0ZXJuYWxfcmVmcy5hcHBlbmQoCisgICAgICAgICAgc2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZihjYXRlZ29yeT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmQ2F0ZWdvcnkuU0VDVVJJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZUeXBlLmNwZTIzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3I9dGFnLnJlbW92ZXByZWZpeChOVkRfQ1BFMjMpKSkKKyAgICBlbGlmIHRhZy5sb3dlcigpLnN0YXJ0c3dpdGgoKE5WRF9DUEUyMyArICdjcGU6LycpLmxvd2VyKCkpOgorICAgICAgZXh0ZXJuYWxfcmVmcy5hcHBlbmQoCisgICAgICAgICAgc2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZihjYXRlZ29yeT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmQ2F0ZWdvcnkuU0VDVVJJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZUeXBlLmNwZTIyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3I9dGFnLnJlbW92ZXByZWZpeChOVkRfQ1BFMjMpKSkKKworICBpZiBtZXRhZGF0YV9wcm90by5uYW1lOgorICAgIHJldHVybiBtZXRhZGF0YV9wcm90by5uYW1lLCBleHRlcm5hbF9yZWZzCisgIGVsc2U6CisgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUobWV0YWRhdGFfZmlsZV9wYXRoKSwgZXh0ZXJuYWxfcmVmcyAgIyByZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lIG9ubHkgYXMgcGFja2FnZSBuYW1lCisKKworZGVmIGdldF9wcmVidWlsdF9wYWNrYWdlX25hbWUoZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIG5hbWUgb2YgYSBwcmVidWlsdCBwYWNrYWdlLCB3aGljaCBjYW4gYmUgZnJvbSB0aGUgTUVUQURBVEEgZmlsZSwgbWV0YWRhdGEgZmlsZSBwYXRoLAorICBtb2R1bGUgcGF0aCBvciBrZXJuZWwgbW9kdWxlJ3Mgc291cmNlIHBhdGggaWYgdGhlIGluc3RhbGxlZCBmaWxlIGlzIGEga2VybmVsIG1vZHVsZS4KKworICBTZWUgZ28vYW5kcm9pZC1zcGR4IGFuZCBnby9hbmRyb2lkLXNib20tZ2VuIGZvciBtb3JlIGRldGFpbHMuCisgICIiIgorICBuYW1lID0gTm9uZQorICBpZiBtZXRhZGF0YV9maWxlX3BhdGg6CisgICAgbWV0YWRhdGFfcHJvdG8gPSBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdCisgICAgaWYgbWV0YWRhdGFfcHJvdG8ubmFtZToKKyAgICAgIG5hbWUgPSBtZXRhZGF0YV9wcm90by5uYW1lCisgICAgZWxzZToKKyAgICAgIG5hbWUgPSBtZXRhZGF0YV9maWxlX3BhdGgKKyAgZWxpZiBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddOgorICAgIG5hbWUgPSBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgIGVsaWYgZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ106CisgICAgc3JjX3BhdGggPSBmaWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXS5zcGxpdCgnOicpWzBdCisgICAgbmFtZSA9IG9zLnBhdGguZGlybmFtZShzcmNfcGF0aCkKKworICByZXR1cm4gbmFtZS5yZW1vdmVwcmVmaXgoJ3ByZWJ1aWx0cy8nKS5yZXBsYWNlKCcvJywgJy0nKQorCisKK2RlZiBnZXRfbWV0YWRhdGFfZmlsZV9wYXRoKGZpbGVfbWV0YWRhdGEpOgorICAiIiJTZWFyY2ggZm9yIE1FVEFEQVRBIGZpbGUgb2YgYSBwYWNrYWdlIGFuZCByZXR1cm4gaXRzIHBhdGguIiIiCisgIG1ldGFkYXRhX3BhdGggPSAnJworICBpZiBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddOgorICAgIG1ldGFkYXRhX3BhdGggPSBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgIGVsaWYgZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ106CisgICAgbWV0YWRhdGFfcGF0aCA9IG9zLnBhdGguZGlybmFtZShmaWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXS5zcGxpdCgnOicpWzBdKQorCisgIHdoaWxlIG1ldGFkYXRhX3BhdGggYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhtZXRhZGF0YV9wYXRoICsgJy9NRVRBREFUQScpOgorICAgIG1ldGFkYXRhX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUobWV0YWRhdGFfcGF0aCkKKworICByZXR1cm4gbWV0YWRhdGFfcGF0aAorCisKK2RlZiBnZXRfcGFja2FnZV92ZXJzaW9uKG1ldGFkYXRhX2ZpbGVfcGF0aCk6CisgICIiIlJldHVybiBhIHBhY2thZ2UncyB2ZXJzaW9uIGluIGl0cyBNRVRBREFUQSBmaWxlLiIiIgorICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJldHVybiBOb25lCisgIG1ldGFkYXRhX3Byb3RvID0gbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXQorICByZXR1cm4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkudmVyc2lvbgorCisKK2RlZiBnZXRfcGFja2FnZV9ob21lcGFnZShtZXRhZGF0YV9maWxlX3BhdGgpOgorICAiIiJSZXR1cm4gYSBwYWNrYWdlJ3MgaG9tZXBhZ2UgVVJMIGluIGl0cyBNRVRBREFUQSBmaWxlLiIiIgorICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJldHVybiBOb25lCisgIG1ldGFkYXRhX3Byb3RvID0gbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXQorICBpZiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5ob21lcGFnZToKKyAgICByZXR1cm4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuaG9tZXBhZ2UKKyAgZm9yIHVybCBpbiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS51cmw6CisgICAgaWYgdXJsLnR5cGUgPT0gbWV0YWRhdGFfZmlsZV9wYjIuVVJMLlR5cGUuSE9NRVBBR0U6CisgICAgICByZXR1cm4gdXJsLnZhbHVlCisKKyAgcmV0dXJuIE5vbmUKKworCitkZWYgZ2V0X3BhY2thZ2VfZG93bmxvYWRfbG9jYXRpb24obWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIGEgcGFja2FnZSdzIGNvZGUgcmVwb3NpdG9yeSBVUkwgaW4gaXRzIE1FVEFEQVRBIGZpbGUuIiIiCisgIGlmIG5vdCBtZXRhZGF0YV9maWxlX3BhdGg6CisgICAgcmV0dXJuIE5vbmUKKyAgbWV0YWRhdGFfcHJvdG8gPSBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdCisgIGlmIG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnVybDoKKyAgICB1cmxzID0gc29ydGVkKG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnVybCwga2V5PWxhbWJkYSB1cmw6IHVybC50eXBlKQorICAgIGlmIHVybHNbMF0udHlwZSAhPSBtZXRhZGF0YV9maWxlX3BiMi5VUkwuVHlwZS5IT01FUEFHRToKKyAgICAgIHJldHVybiB1cmxzWzBdLnZhbHVlCisgICAgZWxpZiBsZW4odXJscykgPiAxOgorICAgICAgcmV0dXJuIHVybHNbMV0udmFsdWUKKworICByZXR1cm4gTm9uZQorCisKK2RlZiBnZXRfbGljZW5zZV90ZXh0KGxpY2Vuc2VfZmlsZXMpOgorICBsaWNlbnNlX3RleHQgPSAnJworICBmb3IgbGljZW5zZV9maWxlIGluIGxpY2Vuc2VfZmlsZXM6CisgICAgaWYgYXJncy5kZWJ1ZzoKKyAgICAgIGxpY2Vuc2VfdGV4dCArPSAnIyMjIyBDb250ZW50IGZyb20gJyArIGxpY2Vuc2VfZmlsZSArICdcbicKKyAgICBlbHNlOgorICAgICAgbGljZW5zZV90ZXh0ICs9IHBhdGhsaWIuUGF0aChsaWNlbnNlX2ZpbGUpLnJlYWRfdGV4dChlcnJvcnM9J3JlcGxhY2UnKSArICdcblxuJworICByZXR1cm4gbGljZW5zZV90ZXh0CisKKworZGVmIGdldF9zYm9tX2ZyYWdtZW50cyhpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIFNQRFggZnJhZ21lbnQgb2Ygc291cmNlL3ByZWJ1aWx0IHBhY2thZ2VzLCB3aGljaCB1c3VhbGx5IGNvbnRhaW5zIGEgU09VUkNFL1BSRUJVSUxUCisgIHBhY2thZ2UsIGEgVVBTVFJFQU0gcGFja2FnZSBhbmQgYW4gZXh0ZXJuYWwgU0JPTSBkb2N1bWVudCByZWZlcmVuY2UgaWYgc2JvbV9yZWYgZGVmaW5lZCBpbiBpdHMKKyAgTUVUQURBVEEgZmlsZS4KKworICBTZWUgZ28vYW5kcm9pZC1zcGR4IGFuZCBnby9hbmRyb2lkLXNib20tZ2VuIGZvciBtb3JlIGRldGFpbHMuCisgICIiIgorICBleHRlcm5hbF9kb2NfcmVmID0gTm9uZQorICBwYWNrYWdlcyA9IFtdCisgIHJlbGF0aW9uc2hpcHMgPSBbXQorICBsaWNlbnNlcyA9IFtdCisKKyAgIyBJbmZvIGZyb20gTUVUQURBVEEgZmlsZQorICBob21lcGFnZSA9IGdldF9wYWNrYWdlX2hvbWVwYWdlKG1ldGFkYXRhX2ZpbGVfcGF0aCkKKyAgdmVyc2lvbiA9IGdldF9wYWNrYWdlX3ZlcnNpb24obWV0YWRhdGFfZmlsZV9wYXRoKQorICBkb3dubG9hZF9sb2NhdGlvbiA9IGdldF9wYWNrYWdlX2Rvd25sb2FkX2xvY2F0aW9uKG1ldGFkYXRhX2ZpbGVfcGF0aCkKKworICBsaWNzID0gZGIuZ2V0X3BhY2thZ2VfbGljZW5zZXMoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10pCisgIGlmIG5vdCBsaWNzOgorICAgIGxpY3MgPSBkYi5nZXRfcGFja2FnZV9saWNlbnNlcyhtZXRhZGF0YV9maWxlX3BhdGgpCisKKyAgaWYgbGljczoKKyAgICBmb3IgbGljZW5zZV9uYW1lLCBsaWNlbnNlX2ZpbGVzIGluIGxpY3MuaXRlbXMoKToKKyAgICAgIGlmIG5vdCBsaWNlbnNlX2ZpbGVzOgorICAgICAgICBjb250aW51ZQorICAgICAgbGljZW5zZV9pZCA9IG5ld19saWNlbnNlX2lkKGxpY2Vuc2VfbmFtZSkKKyAgICAgIGlmIGxpY2Vuc2VfbmFtZSBub3QgaW4gbGljZW5zZXNfdGV4dDoKKyAgICAgICAgbGljZW5zZXNfdGV4dFtsaWNlbnNlX25hbWVdID0gZ2V0X2xpY2Vuc2VfdGV4dChsaWNlbnNlX2ZpbGVzLnNwbGl0KCcgJykpCisgICAgICBsaWNlbnNlcy5hcHBlbmQoc2JvbV9kYXRhLkxpY2Vuc2UoaWQ9bGljZW5zZV9pZCwgbmFtZT1saWNlbnNlX25hbWUsIHRleHQ9bGljZW5zZXNfdGV4dFtsaWNlbnNlX25hbWVdKSkKKworICBpZiBpc19zb3VyY2VfcGFja2FnZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSk6CisgICAgIyBTb3VyY2UgZm9yayBwYWNrYWdlcworICAgIG5hbWUsIGV4dGVybmFsX3JlZnMgPSBnZXRfc291cmNlX3BhY2thZ2VfaW5mbyhpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKQorICAgIHNvdXJjZV9wYWNrYWdlX2lkID0gbmV3X3BhY2thZ2VfaWQobmFtZSwgUEtHX1NPVVJDRSkKKyAgICBzb3VyY2VfcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXNvdXJjZV9wYWNrYWdlX2lkLCBuYW1lPW5hbWUsIHZlcnNpb249YXJncy5idWlsZF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX3JlZnM9ZXh0ZXJuYWxfcmVmcykKKworICAgIHVwc3RyZWFtX3BhY2thZ2VfaWQgPSBuZXdfcGFja2FnZV9pZChuYW1lLCBQS0dfVVBTVFJFQU0pCisgICAgdXBzdHJlYW1fcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXVwc3RyZWFtX3BhY2thZ2VfaWQsIG5hbWU9bmFtZSwgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPcmdhbml6YXRpb246ICcgKyBob21lcGFnZSkgaWYgaG9tZXBhZ2UgZWxzZSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPWRvd25sb2FkX2xvY2F0aW9uKQorICAgIHBhY2thZ2VzICs9IFtzb3VyY2VfcGFja2FnZSwgdXBzdHJlYW1fcGFja2FnZV0KKyAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1zb3VyY2VfcGFja2FnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5WQVJJQU5UX09GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPXVwc3RyZWFtX3BhY2thZ2VfaWQpKQorCisgICAgZm9yIGxpY2Vuc2UgaW4gbGljZW5zZXM6CisgICAgICBzb3VyY2VfcGFja2FnZS5kZWNsYXJlZF9saWNlbnNlX2lkcy5hcHBlbmQobGljZW5zZS5pZCkKKyAgICAgIHVwc3RyZWFtX3BhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2UuaWQpCisKKyAgZWxpZiBpc19wcmVidWlsdF9wYWNrYWdlKGluc3RhbGxlZF9maWxlX21ldGFkYXRhKToKKyAgICAjIFByZWJ1aWx0IGZvcmsgcGFja2FnZXMKKyAgICBuYW1lID0gZ2V0X3ByZWJ1aWx0X3BhY2thZ2VfbmFtZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKQorICAgIHByZWJ1aWx0X3BhY2thZ2VfaWQgPSBuZXdfcGFja2FnZV9pZChuYW1lLCBQS0dfUFJFQlVJTFQpCisgICAgcHJlYnVpbHRfcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXByZWJ1aWx0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiBpZiB2ZXJzaW9uIGVsc2UgYXJncy5idWlsZF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mcikKKworICAgIHVwc3RyZWFtX3BhY2thZ2VfaWQgPSBuZXdfcGFja2FnZV9pZChuYW1lLCBQS0dfVVBTVFJFQU0pCisgICAgdXBzdHJlYW1fcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXVwc3RyZWFtX3BhY2thZ2VfaWQsIG5hbWU9bmFtZSwgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPcmdhbml6YXRpb246ICcgKyBob21lcGFnZSkgaWYgaG9tZXBhZ2UgZWxzZSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPWRvd25sb2FkX2xvY2F0aW9uKQorICAgIHBhY2thZ2VzICs9IFtwcmVidWlsdF9wYWNrYWdlLCB1cHN0cmVhbV9wYWNrYWdlXQorICAgIHJlbGF0aW9uc2hpcHMuYXBwZW5kKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPXByZWJ1aWx0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuVkFSSUFOVF9PRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj11cHN0cmVhbV9wYWNrYWdlX2lkKSkKKyAgICBmb3IgbGljZW5zZSBpbiBsaWNlbnNlczoKKyAgICAgIHByZWJ1aWx0X3BhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2UuaWQpCisgICAgICB1cHN0cmVhbV9wYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLmFwcGVuZChsaWNlbnNlLmlkKQorCisgIGlmIG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICBtZXRhZGF0YV9wcm90byA9IG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0KKyAgICBpZiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5XaGljaE9uZW9mKCdzYm9tJykgPT0gJ3Nib21fcmVmJzoKKyAgICAgIHNib21fdXJsID0gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2JvbV9yZWYudXJsCisgICAgICBzYm9tX2NoZWNrc3VtID0gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2JvbV9yZWYuY2hlY2tzdW0KKyAgICAgIHVwc3RyZWFtX2VsZW1lbnRfaWQgPSBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5zYm9tX3JlZi5lbGVtZW50X2lkCisgICAgICBpZiBzYm9tX3VybCBhbmQgc2JvbV9jaGVja3N1bSBhbmQgdXBzdHJlYW1fZWxlbWVudF9pZDoKKyAgICAgICAgZG9jX3JlZl9pZCA9IGYnRG9jdW1lbnRSZWYte1BLR19VUFNUUkVBTX0te3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChuYW1lKX0nCisgICAgICAgIGV4dGVybmFsX2RvY19yZWYgPSBzYm9tX2RhdGEuRG9jdW1lbnRFeHRlcm5hbFJlZmVyZW5jZShpZD1kb2NfcmVmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpPXNib21fdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW09c2JvbV9jaGVja3N1bSkKKyAgICAgICAgcmVsYXRpb25zaGlwcy5hcHBlbmQoCisgICAgICAgICAgICBzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT11cHN0cmVhbV9wYWNrYWdlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuVkFSSUFOVF9PRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPWRvY19yZWZfaWQgKyAnOicgKyB1cHN0cmVhbV9lbGVtZW50X2lkKSkKKworICByZXR1cm4gZXh0ZXJuYWxfZG9jX3JlZiwgcGFja2FnZXMsIHJlbGF0aW9uc2hpcHMsIGxpY2Vuc2VzCisKKworZGVmIHNhdmVfcmVwb3J0KHJlcG9ydF9maWxlX3BhdGgsIHJlcG9ydCk6CisgIHdpdGggb3BlbihyZXBvcnRfZmlsZV9wYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHJlcG9ydF9maWxlOgorICAgIGZvciB0eXBlLCBpc3N1ZXMgaW4gcmVwb3J0Lml0ZW1zKCk6CisgICAgICByZXBvcnRfZmlsZS53cml0ZSh0eXBlICsgJ1xuJykKKyAgICAgIGZvciBpc3N1ZSBpbiBpc3N1ZXM6CisgICAgICAgIHJlcG9ydF9maWxlLndyaXRlKCdcdCcgKyBpc3N1ZSArICdcbicpCisgICAgICByZXBvcnRfZmlsZS53cml0ZSgnXG4nKQorCisKKyMgVmFsaWRhdGUgdGhlIG1ldGFkYXRhIGdlbmVyYXRlZCBieSBNYWtlIGZvciBpbnN0YWxsZWQgZmlsZXMgYW5kIHJlcG9ydCBpZiB0aGVyZSBpcyBubyBtZXRhZGF0YS4KK2RlZiBpbnN0YWxsZWRfZmlsZV9oYXNfbWV0YWRhdGEoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CisgIGluc3RhbGxlZF9maWxlID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2luc3RhbGxlZF9maWxlJ10KKyAgbW9kdWxlX3BhdGggPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXQorICBwcm9kdWN0X2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsncHJvZHVjdF9jb3B5X2ZpbGVzJ10KKyAga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyddCisgIGlzX3BsYXRmb3JtX2dlbmVyYXRlZCA9IGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpc19wbGF0Zm9ybV9nZW5lcmF0ZWQnXQorCisgIGlmIChub3QgbW9kdWxlX3BhdGggYW5kCisgICAgICBub3QgcHJvZHVjdF9jb3B5X2ZpbGVzIGFuZAorICAgICAgbm90IGtlcm5lbF9tb2R1bGVfY29weV9maWxlcyBhbmQKKyAgICAgIG5vdCBpc19wbGF0Zm9ybV9nZW5lcmF0ZWQgYW5kCisgICAgICBub3QgaW5zdGFsbGVkX2ZpbGUuZW5kc3dpdGgoJy5mc3ZfbWV0YScpKToKKyAgICByZXBvcnRbSVNTVUVfTk9fTUVUQURBVEFdLmFwcGVuZChpbnN0YWxsZWRfZmlsZSkKKyAgICByZXR1cm4gRmFsc2UKKworICByZXR1cm4gVHJ1ZQorCisKKyMgVmFsaWRhdGUgaWRlbnRpZmllcnMgaW4gYSBwYWNrYWdlJ3MgTUVUQURBVEEuCisjIDEpIE9ubHkga25vd24gaWRlbnRpZmllciB0eXBlIGlzIGFsbG93ZWQKKyMgMikgT25seSBvbmUgaWRlbnRpZmllcidzIHByaW1hcnlfc291cmNlIGNhbiBiZSB0cnVlCitkZWYgdmFsaWRhdGVfcGFja2FnZV9tZXRhZGF0YShtZXRhZGF0YV9maWxlX3BhdGgsIHBhY2thZ2VfbWV0YWRhdGEpOgorICBwcmltYXJ5X3NvdXJjZV9mb3VuZCA9IEZhbHNlCisgIGZvciBpZGVudGlmaWVyIGluIHBhY2thZ2VfbWV0YWRhdGEudGhpcmRfcGFydHkuaWRlbnRpZmllcjoKKyAgICBpZiBpZGVudGlmaWVyLnR5cGUgbm90IGluIFRISVJEX1BBUlRZX0lERU5USUZJRVJfVFlQRVM6CisgICAgICBzeXMuZXhpdChmJ1Vua25vd24gdmFsdWUgb2YgdGhpcmRfcGFydHkuaWRlbnRpZmllci50eXBlIGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBOiB7aWRlbnRpZmllci50eXBlfS4nKQorICAgIGlmIHByaW1hcnlfc291cmNlX2ZvdW5kIGFuZCBpZGVudGlmaWVyLnByaW1hcnlfc291cmNlOgorICAgICAgc3lzLmV4aXQoCisgICAgICAgICAgZidGaWVsZCAicHJpbWFyeV9zb3VyY2UiIGlzIHNldCB0byB0cnVlIGluIG11bHRpcGxlIHRoaXJkX3BhcnR5LmlkZW50aWZpZXIgaW4ge21ldGFkYXRhX2ZpbGVfcGF0aH0vTUVUQURBVEEuJykKKyAgICBwcmltYXJ5X3NvdXJjZV9mb3VuZCA9IGlkZW50aWZpZXIucHJpbWFyeV9zb3VyY2UKKworCitkZWYgcmVwb3J0X21ldGFkYXRhX2ZpbGUobWV0YWRhdGFfZmlsZV9wYXRoLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgcmVwb3J0KToKKyAgaWYgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJlcG9ydFtJTkZPX01FVEFEQVRBX0ZPVU5EX0ZPUl9QQUNLQUdFXS5hcHBlbmQoCisgICAgICAgICdpbnN0YWxsZWRfZmlsZToge30sIG1vZHVsZV9wYXRoOiB7fSwgTUVUQURBVEEgZmlsZToge30nLmZvcm1hdCgKKyAgICAgICAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpbnN0YWxsZWRfZmlsZSddLAorICAgICAgICAgICAgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10sCisgICAgICAgICAgICBtZXRhZGF0YV9maWxlX3BhdGggKyAnL01FVEFEQVRBJykpCisKKyAgICBwYWNrYWdlX21ldGFkYXRhID0gbWV0YWRhdGFfZmlsZV9wYjIuTWV0YWRhdGEoKQorICAgIHdpdGggb3BlbihtZXRhZGF0YV9maWxlX3BhdGggKyAnL01FVEFEQVRBJywgJ3J0JykgYXMgZjoKKyAgICAgIHRleHRfZm9ybWF0LlBhcnNlKGYucmVhZCgpLCBwYWNrYWdlX21ldGFkYXRhKQorCisgICAgdmFsaWRhdGVfcGFja2FnZV9tZXRhZGF0YShtZXRhZGF0YV9maWxlX3BhdGgsIHBhY2thZ2VfbWV0YWRhdGEpCisKKyAgICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoIGluIG1ldGFkYXRhX2ZpbGVfcHJvdG9zOgorICAgICAgbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXSA9IHBhY2thZ2VfbWV0YWRhdGEKKyAgICAgIGlmIG5vdCBwYWNrYWdlX21ldGFkYXRhLm5hbWU6CisgICAgICAgIHJlcG9ydFtJU1NVRV9NRVRBREFUQV9GSUxFX0lOQ09NUExFVEVdLmFwcGVuZChmJ3ttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBIGRvZXMgbm90IGhhcyAibmFtZSInKQorCisgICAgICBpZiBub3QgcGFja2FnZV9tZXRhZGF0YS50aGlyZF9wYXJ0eS52ZXJzaW9uOgorICAgICAgICByZXBvcnRbSVNTVUVfTUVUQURBVEFfRklMRV9JTkNPTVBMRVRFXS5hcHBlbmQoCisgICAgICAgICAgICBmJ3ttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBIGRvZXMgbm90IGhhcyAidGhpcmRfcGFydHkudmVyc2lvbiInKQorCisgICAgICBmb3IgdGFnIGluIHBhY2thZ2VfbWV0YWRhdGEudGhpcmRfcGFydHkuc2VjdXJpdHkudGFnOgorICAgICAgICBpZiBub3QgdGFnLnN0YXJ0c3dpdGgoTlZEX0NQRTIzKToKKyAgICAgICAgICByZXBvcnRbSVNTVUVfVU5LTk9XTl9TRUNVUklUWV9UQUdfVFlQRV0uYXBwZW5kKAorICAgICAgICAgICAgICBmJ1Vua25vd24gc2VjdXJpdHkgdGFnIHR5cGU6IHt0YWd9IGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBJykKKyAgZWxzZToKKyAgICByZXBvcnRbSVNTVUVfTk9fTUVUQURBVEFfRklMRV0uYXBwZW5kKAorICAgICAgICAiaW5zdGFsbGVkX2ZpbGU6IHt9LCBtb2R1bGVfcGF0aDoge30iLmZvcm1hdCgKKyAgICAgICAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpbnN0YWxsZWRfZmlsZSddLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXSkpCisKKworIyBJZiBhIGZpbGUgaXMgZnJvbSBhIHNvdXJjZSBmb3JrIG9yIHByZWJ1aWx0IGZvcmsgcGFja2FnZSwgYWRkIGl0cyBwYWNrYWdlIGluZm9ybWF0aW9uIHRvIFNCT00KK2RlZiBhZGRfcGFja2FnZV9vZl9maWxlKGZpbGVfaWQsIGZpbGVfbWV0YWRhdGEsIGRvYywgcmVwb3J0KToKKyAgbWV0YWRhdGFfZmlsZV9wYXRoID0gZ2V0X21ldGFkYXRhX2ZpbGVfcGF0aChmaWxlX21ldGFkYXRhKQorICByZXBvcnRfbWV0YWRhdGFfZmlsZShtZXRhZGF0YV9maWxlX3BhdGgsIGZpbGVfbWV0YWRhdGEsIHJlcG9ydCkKKworICBleHRlcm5hbF9kb2NfcmVmLCBwa2dzLCByZWxzLCBsaWNlbnNlcyA9IGdldF9zYm9tX2ZyYWdtZW50cyhmaWxlX21ldGFkYXRhLCBtZXRhZGF0YV9maWxlX3BhdGgpCisgIGlmIGxlbihwa2dzKSA+IDA6CisgICAgaWYgZXh0ZXJuYWxfZG9jX3JlZjoKKyAgICAgIGRvYy5hZGRfZXh0ZXJuYWxfcmVmKGV4dGVybmFsX2RvY19yZWYpCisgICAgZm9yIHAgaW4gcGtnczoKKyAgICAgIGRvYy5hZGRfcGFja2FnZShwKQorICAgIGZvciByZWwgaW4gcmVsczoKKyAgICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHJlbCkKKyAgICBmb3JrX3BhY2thZ2VfaWQgPSBwa2dzWzBdLmlkICAjIFRoZSBmaXJzdCBwYWNrYWdlIHNob3VsZCBiZSB0aGUgc291cmNlL3ByZWJ1aWx0IGZvcmsgcGFja2FnZQorICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9Zm9ya19wYWNrYWdlX2lkKSkKKyAgICBmb3IgbGljZW5zZSBpbiBsaWNlbnNlczoKKyAgICAgIGRvYy5hZGRfbGljZW5zZShsaWNlbnNlKQorCisKKyMgQWRkIFNUQVRJQ19MSU5LIHJlbGF0aW9uc2hpcCBmb3Igc3RhdGljIGRlcGVuZGVuY2llcyBvZiBhIGZpbGUKK2RlZiBhZGRfc3RhdGljX2RlcHNfb2ZfZmlsZShmaWxlX2lkLCBmaWxlX21ldGFkYXRhLCBkb2MpOgorICBpZiBub3QgZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddIGFuZCBub3QgZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddOgorICAgIHJldHVybgorICBzdGF0aWNfZGVwX2ZpbGVzID0gW10KKyAgaWYgZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddOgorICAgIHN0YXRpY19kZXBfZmlsZXMgKz0gZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJykKKyAgaWYgZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddOgorICAgIHN0YXRpY19kZXBfZmlsZXMgKz0gZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJykKKworICBmb3IgZGVwX2ZpbGUgaW4gc3RhdGljX2RlcF9maWxlczoKKyAgICAjIFN0YXRpYyBsaWJzIGFyZSBub3Qgc2hpcHBlZCBvbiBkZXZpY2VzLCBzbyBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIC5pbnRlcm1lZGlhdGVzIHBhdGhzLgorICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuU1RBVElDX0xJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9bmV3X2ZpbGVfaWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcF9maWxlLnJlbW92ZXByZWZpeChhcmdzLnNvb25nX291dCArICcvLmludGVybWVkaWF0ZXMvJykpKSkKKworCitkZWYgYWRkX2xpY2Vuc2VzX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jKToKKyAgbGljcyA9IGRiLmdldF9tb2R1bGVfbGljZW5zZXMoZmlsZV9tZXRhZGF0YS5nZXQoJ25hbWUnLCAnJyksIGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10pCisgIGlmIGxpY3M6CisgICAgZmlsZSA9IG5leHQoZiBmb3IgZiBpbiBkb2MuZmlsZXMgaWYgZmlsZV9pZCA9PSBmLmlkKQorICAgIGZvciBsaWNlbnNlX25hbWUsIGxpY2Vuc2VfZmlsZXMgaW4gbGljcy5pdGVtcygpOgorICAgICAgaWYgbm90IGxpY2Vuc2VfZmlsZXM6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBsaWNlbnNlX2lkID0gbmV3X2xpY2Vuc2VfaWQobGljZW5zZV9uYW1lKQorICAgICAgZmlsZS5jb25jbHVkZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2VfaWQpCisgICAgICBpZiBsaWNlbnNlX25hbWUgbm90IGluIGxpY2Vuc2VzX3RleHQ6CisgICAgICAgIGxpY2Vuc2VfdGV4dCA9IGdldF9saWNlbnNlX3RleHQobGljZW5zZV9maWxlcy5zcGxpdCgnICcpKQorICAgICAgICBsaWNlbnNlc190ZXh0W2xpY2Vuc2VfbmFtZV0gPSBsaWNlbnNlX3RleHQKKworICAgICAgZG9jLmFkZF9saWNlbnNlKHNib21fZGF0YS5MaWNlbnNlKGlkPWxpY2Vuc2VfaWQsIG5hbWU9bGljZW5zZV9uYW1lLCB0ZXh0PWxpY2Vuc2VzX3RleHRbbGljZW5zZV9uYW1lXSkpCisKKworZGVmIGdldF9hbGxfdHJhbnNpdGl2ZV9zdGF0aWNfZGVwX2ZpbGVzX29mX2luc3RhbGxlZF9maWxlcyhpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEsIGRiLCByZXBvcnQpOgorICAjIEZpbmQgYWxsIHRyYW5zaXRpdmUgc3RhdGljIGRlcCBmaWxlcyBvZiBhbGwgaW5zdGFsbGVkIGZpbGVzCisgIHEgPSBxdWV1ZS5RdWV1ZSgpCisgIGZvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSBpbiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGE6CisgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICAgIGZvciBmIGluIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzdGF0aWNfZGVwX2ZpbGVzJ10uc3BsaXQoJyAnKToKKyAgICAgICAgcS5wdXQoZikKKyAgICBpZiBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddOgorICAgICAgZm9yIGYgaW4gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpOgorICAgICAgICBxLnB1dChmKQorCisgIGFsbF9zdGF0aWNfZGVwX2ZpbGVzID0ge30KKyAgd2hpbGUgbm90IHEuZW1wdHkoKToKKyAgICBkZXBfZmlsZSA9IHEuZ2V0KCkKKyAgICBpZiBkZXBfZmlsZSBpbiBhbGxfc3RhdGljX2RlcF9maWxlczoKKyAgICAgICMgSXQgaGFzIGJlZW4gcHJvY2Vzc2VkCisgICAgICBjb250aW51ZQorCisgICAgYWxsX3N0YXRpY19kZXBfZmlsZXNbZGVwX2ZpbGVdID0gVHJ1ZQorICAgIHNvb25nX21vZHVsZSA9IGRiLmdldF9zb29uZ19tb2R1bGVfb2ZfYnVpbHRfZmlsZShkZXBfZmlsZSkKKyAgICBpZiBub3Qgc29vbmdfbW9kdWxlOgorICAgICAgIyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBhZGQgdG8gcmVwb3J0W0lTU1VFX05PX01PRFVMRV9GT1VORF9GT1JfU1RBVElDX0RFUF0KKyAgICAgIHJlcG9ydFtJU1NVRV9OT19NT0RVTEVfRk9VTkRfRk9SX1NUQVRJQ19ERVBdLmFwcGVuZChmKQorICAgICAgY29udGludWUKKworICAgIGlmIHNvb25nX21vZHVsZVsnc3RhdGljX2RlcF9maWxlcyddOgorICAgICAgZm9yIGYgaW4gc29vbmdfbW9kdWxlWydzdGF0aWNfZGVwX2ZpbGVzJ10uc3BsaXQoJyAnKToKKyAgICAgICAgaWYgZiBub3QgaW4gYWxsX3N0YXRpY19kZXBfZmlsZXM6CisgICAgICAgICAgcS5wdXQoZikKKyAgICBpZiBzb29uZ19tb2R1bGVbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICAgIGZvciBmIGluIHNvb25nX21vZHVsZVsnd2hvbGVfc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJyk6CisgICAgICAgIGlmIGYgbm90IGluIGFsbF9zdGF0aWNfZGVwX2ZpbGVzOgorICAgICAgICAgIHEucHV0KGYpCisKKyAgcmV0dXJuIHNvcnRlZChhbGxfc3RhdGljX2RlcF9maWxlcy5rZXlzKCkpCisKKworZGVmIG1haW4oKToKKyAgZ2xvYmFsIGFyZ3MKKyAgYXJncyA9IGdldF9hcmdzKCkKKyAgbG9nKCdBcmdzOicsIHZhcnMoYXJncykpCisKKyAgZ2xvYmFsIGRiCisgIGRiID0gY29tcGxpYW5jZV9tZXRhZGF0YS5NZXRhZGF0YURiKGFyZ3MubWV0YWRhdGEpCisgIGlmIGFyZ3MuZGVidWc6CisgICAgZGIuZHVtcF9kZWJ1Z19kYihvcy5wYXRoLmRpcm5hbWUoYXJncy5vdXRwdXRfZmlsZSkgKyAnL2NvbXBsaWFuY2UtbWV0YWRhdGEtZGVidWcuZGInKQorCisgIGdsb2JhbCBtZXRhZGF0YV9maWxlX3Byb3RvcworICBtZXRhZGF0YV9maWxlX3Byb3RvcyA9IHt9CisgIGdsb2JhbCBsaWNlbnNlc190ZXh0CisgIGxpY2Vuc2VzX3RleHQgPSB7fQorCisgIHByb2R1Y3RfcGFja2FnZV9pZCA9IHNib21fZGF0YS5TUERYSURfUFJPRFVDVAorICBwcm9kdWN0X3BhY2thZ2VfbmFtZSA9IHNib21fZGF0YS5QQUNLQUdFX05BTUVfUFJPRFVDVAorICBwcm9kdWN0X3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD1wcm9kdWN0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9cHJvZHVjdF9wYWNrYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPWFyZ3MuYnVpbGRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9J09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzX2FuYWx5emVkPVRydWUpCisgIGRvY19uYW1lID0gYXJncy5idWlsZF92ZXJzaW9uCisgIGRvYyA9IHNib21fZGF0YS5Eb2N1bWVudChuYW1lPWRvY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPWYnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zYm9tL3NwZHgvYW5kcm9pZC97ZG9jX25hbWV9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JzPVsnT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZXM9cHJvZHVjdF9wYWNrYWdlX2lkKQorCisgIGRvYy5wYWNrYWdlcy5hcHBlbmQocHJvZHVjdF9wYWNrYWdlKQorICBkb2MucGFja2FnZXMuYXBwZW5kKHNib21fZGF0YS5QYWNrYWdlKGlkPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1zYm9tX2RhdGEuUEFDS0FHRV9OQU1FX1BMQVRGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249YXJncy5idWlsZF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPSdPcmdhbml6YXRpb246ICcgKyBhcmdzLnByb2R1Y3RfbWZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXSkpCisKKyAgIyBSZXBvcnQgb24gc29tZSBpc3N1ZXMgYW5kIGluZm9ybWF0aW9uCisgIHJlcG9ydCA9IHsKKyAgICAgIElTU1VFX05PX01FVEFEQVRBOiBbXSwKKyAgICAgIElTU1VFX05PX01FVEFEQVRBX0ZJTEU6IFtdLAorICAgICAgSVNTVUVfTUVUQURBVEFfRklMRV9JTkNPTVBMRVRFOiBbXSwKKyAgICAgIElTU1VFX1VOS05PV05fU0VDVVJJVFlfVEFHX1RZUEU6IFtdLAorICAgICAgSVNTVUVfSU5TVEFMTEVEX0ZJTEVfTk9UX0VYSVNUOiBbXSwKKyAgICAgIElTU1VFX05PX01PRFVMRV9GT1VORF9GT1JfU1RBVElDX0RFUDogW10sCisgICAgICBJTkZPX01FVEFEQVRBX0ZPVU5EX0ZPUl9QQUNLQUdFOiBbXSwKKyAgfQorCisgICMgR2V0IGluc3RhbGxlZCBmaWxlcyBhbmQgY29ycmVzcG9uZGluZyBtYWtlIG1vZHVsZXMnIG1ldGFkYXRhIGlmIGFuIGluc3RhbGxlZCBmaWxlIGlzIGZyb20gYSBtYWtlIG1vZHVsZS4KKyAgaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhID0gZGIuZ2V0X2luc3RhbGxlZF9maWxlcygpCisKKyAgIyBGaW5kIHdoaWNoIFNvb25nIG1vZHVsZSBhbiBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIGFuZCBtZXJnZSBtZXRhZGF0YSBmcm9tIE1ha2UgYW5kIFNvb25nCisgIGZvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSBpbiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGE6CisgICAgc29vbmdfbW9kdWxlID0gZGIuZ2V0X3Nvb25nX21vZHVsZV9vZl9pbnN0YWxsZWRfZmlsZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXSkKKyAgICBpZiBzb29uZ19tb2R1bGU6CisgICAgICAjIE1lcmdlIHNvb25nIG1ldGFkYXRhIHRvIG1ha2UgbWV0YWRhdGEKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhLnVwZGF0ZShzb29uZ19tb2R1bGUpCisgICAgZWxzZToKKyAgICAgICMgRm9yIG1ha2UgbW9kdWxlcyBzb29uZ19tb2R1bGVfdHlwZSBzaG91bGQgYmUgZW1wdHkKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzb29uZ19tb2R1bGVfdHlwZSddID0gJycKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzdGF0aWNfZGVwX2ZpbGVzJ10gPSAnJworICAgICAgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXSA9ICcnCisKKyAgIyBTY2FuIHRoZSBtZXRhZGF0YSBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UgYW5kIGZpbGUgcmVjb3JkcyBpbiBTUERYCisgIGZvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSBpbiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGE6CisgICAgaW5zdGFsbGVkX2ZpbGUgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXQorICAgIG1vZHVsZV9wYXRoID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgICBwcm9kdWN0X2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsncHJvZHVjdF9jb3B5X2ZpbGVzJ10KKyAgICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10KKyAgICBidWlsZF9vdXRwdXRfcGF0aCA9IGluc3RhbGxlZF9maWxlCisgICAgaW5zdGFsbGVkX2ZpbGUgPSBpbnN0YWxsZWRfZmlsZS5yZW1vdmVwcmVmaXgoYXJncy5wcm9kdWN0X291dCkKKworICAgIGlmIG5vdCBpbnN0YWxsZWRfZmlsZV9oYXNfbWV0YWRhdGEoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CisgICAgICBjb250aW51ZQorICAgIGlmIG5vdCAob3MucGF0aC5pc2xpbmsoYnVpbGRfb3V0cHV0X3BhdGgpIG9yIG9zLnBhdGguaXNmaWxlKGJ1aWxkX291dHB1dF9wYXRoKSk6CisgICAgICByZXBvcnRbSVNTVUVfSU5TVEFMTEVEX0ZJTEVfTk9UX0VYSVNUXS5hcHBlbmQoaW5zdGFsbGVkX2ZpbGUpCisgICAgICBjb250aW51ZQorCisgICAgZmlsZV9pZCA9IG5ld19maWxlX2lkKGluc3RhbGxlZF9maWxlKQorICAgIHNoYTEgPSBjaGVja3N1bShidWlsZF9vdXRwdXRfcGF0aCkKKyAgICBmID0gc2JvbV9kYXRhLkZpbGUoaWQ9ZmlsZV9pZCwgbmFtZT1pbnN0YWxsZWRfZmlsZSwgY2hlY2tzdW09c2hhMSkKKyAgICBkb2MuZmlsZXMuYXBwZW5kKGYpCisgICAgcHJvZHVjdF9wYWNrYWdlLmZpbGVfaWRzLmFwcGVuZChmaWxlX2lkKQorCisgICAgaWYgaXNfc291cmNlX3BhY2thZ2UoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEpIG9yIGlzX3ByZWJ1aWx0X3BhY2thZ2UoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEpOgorICAgICAgYWRkX3BhY2thZ2Vfb2ZfZmlsZShmaWxlX2lkLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgZG9jLCByZXBvcnQpCisKKyAgICBlbGlmIG1vZHVsZV9wYXRoIG9yIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpc19wbGF0Zm9ybV9nZW5lcmF0ZWQnXToKKyAgICAgICMgRmlsZSBmcm9tIFBMQVRGT1JNIHBhY2thZ2UKKyAgICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5HRU5FUkFURURfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0pKQorICAgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2lzX3BsYXRmb3JtX2dlbmVyYXRlZCddOgorICAgICAgICBmLmNvbmNsdWRlZF9saWNlbnNlX2lkcyA9IFtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXQorCisgICAgZWxpZiBwcm9kdWN0X2NvcHlfZmlsZXM6CisgICAgICAjIEZvcm1hdCBvZiBwcm9kdWN0X2NvcHlfZmlsZXM6IDxzb3VyY2UgcGF0aD46PGRlc3QgcGF0aD4KKyAgICAgIHNyY19wYXRoID0gcHJvZHVjdF9jb3B5X2ZpbGVzLnNwbGl0KCc6JylbMF0KKyAgICAgICMgU28gZmFyIHByb2R1Y3RfY29weV9maWxlcyBhcmUgY29waWVkIGZyb20gZGlyZWN0b3J5IHN5c3RlbSwga2VybmVsLCBoYXJkd2FyZSwgZnJhbWV3b3JrcyBhbmQgZGV2aWNlLAorICAgICAgIyBzbyBwcm9jZXNzIHRoZW0gYXMgZmlsZXMgZnJvbSBQTEFURk9STSBwYWNrYWdlCisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKKyAgICAgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydsaWNlbnNlX3RleHQnXToKKyAgICAgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2xpY2Vuc2VfdGV4dCddID09ICdidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFJzoKKyAgICAgICAgICBmLmNvbmNsdWRlZF9saWNlbnNlX2lkcyA9IFtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXQorCisgICAgZWxpZiBpbnN0YWxsZWRfZmlsZS5lbmRzd2l0aCgnLmZzdl9tZXRhJyk6CisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKKyAgICAgIGYuY29uY2x1ZGVkX2xpY2Vuc2VfaWRzID0gW3Nib21fZGF0YS5TUERYSURfTElDRU5TRV9BUEFDSEVdCisKKyAgICBlbGlmIGtlcm5lbF9tb2R1bGVfY29weV9maWxlcy5zdGFydHN3aXRoKCdBTkRST0lELUdFTicpOgorICAgICAgIyBGb3IgdGhlIGZvdXIgZmlsZXMgZ2VuZXJhdGVkIGZvciBfZGxrbSwgX3JhbWRpc2sgcGFydGl0aW9ucworICAgICAgZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9ZmlsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9c2JvbV9kYXRhLlNQRFhJRF9QTEFURk9STSkpCisKKyAgICAjIFByb2Nlc3Mgc3RhdGljIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5zdGFsbGVkIGZpbGUKKyAgICBhZGRfc3RhdGljX2RlcHNfb2ZfZmlsZShmaWxlX2lkLCBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgZG9jKQorCisgICAgIyBBZGQgbGljZW5zZXMgb2YgdGhlIGluc3RhbGxlZCBmaWxlCisgICAgYWRkX2xpY2Vuc2VzX29mX2ZpbGUoZmlsZV9pZCwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIGRvYykKKworICAjIEFkZCBhbGwgc3RhdGljIGxpYnJhcnkgZmlsZXMgdG8gU0JPTQorICBmb3IgZGVwX2ZpbGUgaW4gZ2V0X2FsbF90cmFuc2l0aXZlX3N0YXRpY19kZXBfZmlsZXNfb2ZfaW5zdGFsbGVkX2ZpbGVzKGluc3RhbGxlZF9maWxlc19tZXRhZGF0YSwgZGIsIHJlcG9ydCk6CisgICAgZmlsZXBhdGggPSBkZXBfZmlsZS5yZW1vdmVwcmVmaXgoYXJncy5zb29uZ19vdXQgKyAnLy5pbnRlcm1lZGlhdGVzLycpCisgICAgZmlsZV9pZCA9IG5ld19maWxlX2lkKGZpbGVwYXRoKQorICAgICMgU0hBMSBvZiBlbXB0eSBzdHJpbmcuIFNvbWV0aW1lcyAuYSBmaWxlcyBtaWdodCBub3QgYmUgYnVpbHQuCisgICAgc2hhMSA9ICdTSEExOiBkYTM5YTNlZTVlNmI0YjBkMzI1NWJmZWY5NTYwMTg5MGFmZDgwNzA5JworICAgIGlmIG9zLnBhdGguaXNsaW5rKGRlcF9maWxlKSBvciBvcy5wYXRoLmlzZmlsZShkZXBfZmlsZSk6CisgICAgICBzaGExID0gY2hlY2tzdW0oZGVwX2ZpbGUpCisgICAgZG9jLmZpbGVzLmFwcGVuZChzYm9tX2RhdGEuRmlsZShpZD1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1maWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPXNoYTEpKQorICAgIGZpbGVfbWV0YWRhdGEgPSB7CisgICAgICAgICdpbnN0YWxsZWRfZmlsZSc6IGRlcF9maWxlLAorICAgICAgICAnaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUnOiBGYWxzZQorICAgIH0KKyAgICBmaWxlX21ldGFkYXRhLnVwZGF0ZShkYi5nZXRfc29vbmdfbW9kdWxlX29mX2J1aWx0X2ZpbGUoZGVwX2ZpbGUpKQorICAgIGFkZF9wYWNrYWdlX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jLCByZXBvcnQpCisKKyAgICAjIEFkZCByZWxhdGlvbnNoaXBzIGZvciBzdGF0aWMgZGVwcyBvZiBzdGF0aWMgbGlicmFyaWVzCisgICAgYWRkX3N0YXRpY19kZXBzX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jKQorCisgICAgIyBBZGQgbGljZW5zZXMgb2YgdGhlIHN0YXRpYyBsaWIKKyAgICBhZGRfbGljZW5zZXNfb2ZfZmlsZShmaWxlX2lkLCBmaWxlX21ldGFkYXRhLCBkb2MpCisKKyAgIyBTYXZlIFNCT00gcmVjb3JkcyB0byBvdXRwdXQgZmlsZQorICBkb2MuZ2VuZXJhdGVfcGFja2FnZXNfdmVyaWZpY2F0aW9uX2NvZGUoKQorICBkb2MuY3JlYXRlZCA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdyh0ej1kYXRldGltZS50aW1lem9uZS51dGMpLnN0cmZ0aW1lKCclWS0lbS0lZFQlSDolTTolU1onKQorICBwcmVmaXggPSBhcmdzLm91dHB1dF9maWxlCisgIGlmIHByZWZpeC5lbmRzd2l0aCgnLnNwZHgnKToKKyAgICBwcmVmaXggPSBwcmVmaXgucmVtb3Zlc3VmZml4KCcuc3BkeCcpCisgIGVsaWYgcHJlZml4LmVuZHN3aXRoKCcuc3BkeC5qc29uJyk6CisgICAgcHJlZml4ID0gcHJlZml4LnJlbW92ZXN1ZmZpeCgnLnNwZHguanNvbicpCisKKyAgb3V0cHV0X2ZpbGUgPSBwcmVmaXggKyAnLnNwZHgnCisgIHdpdGggb3BlbihvdXRwdXRfZmlsZSwgJ3cnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlOgorICAgIHNib21fd3JpdGVycy5UYWdWYWx1ZVdyaXRlci53cml0ZShkb2MsIGZpbGUpCisgIGlmIGFyZ3MuanNvbjoKKyAgICB3aXRoIG9wZW4ocHJlZml4ICsgJy5zcGR4Lmpzb24nLCAndycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZpbGU6CisgICAgICBzYm9tX3dyaXRlcnMuSlNPTldyaXRlci53cml0ZShkb2MsIGZpbGUpCisKKyAgc2F2ZV9yZXBvcnQocHJlZml4ICsgJy1nZW4tcmVwb3J0LnR4dCcsIHJlcG9ydCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzLnB5IGIvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKaW5kZXggZDBkMjMyZC4uMjdmM2QyZSAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKKysrIGIvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKQEAgLTgwLDcgKzgwLDggQEAKIAogICByZXNvdXJjZV9maWxlX3NwZHhpZHMgPSBbXQogICBmb3IgZmlsZSBpbiBsYXlvdXRsaWJfc2JvbVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLkZJTEVTXToKLSAgICBpZiBmaWxlW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuRklMRV9OQU1FXS5zdGFydHN3aXRoKCdkYXRhL3Jlcy8nKToKKyAgICBmaWxlX3BhdGggPSBmaWxlW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuRklMRV9OQU1FXQorICAgIGlmIGZpbGVfcGF0aC5zdGFydHN3aXRoKCdkYXRhL3Jlcy8nKSBvciBmaWxlX3BhdGguc3RhcnRzd2l0aCgnZGF0YS9vdmVybGF5cy8nKToKICAgICAgIHJlc291cmNlX2ZpbGVfc3BkeGlkcy5hcHBlbmQoZmlsZVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLlNQRFhJRF0pCiAKICAgZG9jLnJlbGF0aW9uc2hpcHMgPSBbCmRpZmYgLS1naXQgYS90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YSBiL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhCmluZGV4IDZiMjM0MWIuLjY1NGUxOTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhCisrKyBiL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhCkBAIC0zMDIsNyArMzAyLDYgQEAKICAgICAgICAgICAgIGZpbmFsIEtleVN0b3JlIGtleVN0b3JlLCBmaW5hbCBTdHJpbmcga2V5TmFtZSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiwgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgS2V5IGtleSA9IGtleVN0b3JlLmdldEtleShrZXlOYW1lLCByZWFkUGFzc3dvcmQoa2V5TmFtZSkpOwogICAgICAgICBmaW5hbCBQcml2YXRlS2V5RW50cnkgcHJpdmF0ZUtleUVudHJ5ID0gKFByaXZhdGVLZXlFbnRyeSkga2V5U3RvcmUuZ2V0RW50cnkoa2V5TmFtZSwgbnVsbCk7CiAgICAgICAgIGlmIChwcml2YXRlS2V5RW50cnkgPT0gbnVsbCkgewogICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCg==